moved to storing DB ids rather than names of files/dirs for deletions

This commit is contained in:
2021-02-14 16:20:48 +11:00
parent 7fa0d3e02b
commit 9e84236f49

View File

@@ -19,7 +19,7 @@ import time
################################################################################
# Local Class imports
################################################################################
from job import Job, Joblog, NewJob
from job import Job, JobExtra, Joblog, NewJob
from person import Person, PersonRefimgLink
from refimg import Refimg
from settings import Settings
@@ -166,8 +166,8 @@ def TrimmedPath( prefix, path ):
def AddDup( prefix, row, dups ):
if row.hash not in dups:
dups[row.hash]=[]
dups[row.hash].append( { 'f': row.fname1, 'd':TrimmedPath(prefix, row.path1) } )
dups[row.hash].append( { 'f': row.fname2, 'd':TrimmedPath(prefix, row.path2) } )
dups[row.hash].append( { 'f': row.fname1, 'd':TrimmedPath(prefix, row.path1), 'did': row.did1, 'h':row.hash, 'id':row.id1 } )
dups[row.hash].append( { 'f': row.fname2, 'd':TrimmedPath(prefix, row.path2), 'did': row.did2, 'h':row.hash, 'id':row.id2 } )
else:
# process path1 / fname1 -- if that combo is not in the dups[hash], add it
found=0
@@ -176,7 +176,7 @@ def AddDup( prefix, row, dups ):
found=1
continue
if not found:
dups[row.hash].append( { 'f': row.fname1, 'd':TrimmedPath(prefix, row.path1) } )
dups[row.hash].append( { 'f': row.fname1, 'd':TrimmedPath(prefix, row.path1), 'did': row.did1, 'h':row.hash, 'id':row.id1 } )
# process path2 / fname2 -- if that combo is not in the dups[hash], add it
found=0
@@ -185,12 +185,12 @@ def AddDup( prefix, row, dups ):
found=1
continue
if not found:
dups[row.hash].append( { 'f': row.fname2, 'd':TrimmedPath(prefix, row.path2) } )
dups[row.hash].append( { 'f': row.fname2, 'd':TrimmedPath(prefix, row.path2), 'did': row.did2, 'h':row.hash, 'id':row.id2 } )
return
@app.route("/fix_dups", methods=["GET"])
@app.route("/fix_dups", methods=["POST"])
def fix_dups():
rows = db.engine.execute( "select f1.hash, d1.path_prefix as path1, e1.name as fname1, d2.path_prefix as path2, e2.name as fname2 from entry e1, file f1, dir d1, entry_dir_link edl1, entry e2, file f2, dir d2, entry_dir_link edl2 where e1.id = f1.eid and e2.id = f2.eid and d1.eid = edl1.dir_eid and edl1.entry_id = e1.id and edl2.dir_eid = d2.eid and edl2.entry_id = e2.id and f1.hash = f2.hash and e1.id != e2.id order by path1, fname1;" )
rows = db.engine.execute( "select e1.id as id1, f1.hash, d1.path_prefix as path1, d1.eid as did1, e1.name as fname1, e2.id as id2, d2.path_prefix as path2, d2.eid as did2, e2.name as fname2 from entry e1, file f1, dir d1, entry_dir_link edl1, entry e2, file f2, dir d2, entry_dir_link edl2 where e1.id = f1.eid and e2.id = f2.eid and d1.eid = edl1.dir_eid and edl1.entry_id = e1.id and edl2.dir_eid = d2.eid and edl2.entry_id = e2.id and f1.hash = f2.hash and e1.id != e2.id order by path1, fname1;" )
if rows.returns_rows == False:
st.SetAlert("success")
@@ -200,7 +200,6 @@ def fix_dups():
# use import_path setting to remove the dup path prefix of static/basename(<import_path>)
# -- static isn't really seen, and the import path basename is always going to be the same
s=Settings.query.first()
print (s.import_path)
if s.import_path[-1] == '/':
prefix = os.path.basename(s.import_path[0:-1])
else:
@@ -212,10 +211,13 @@ def fix_dups():
d1=""
d2=""
did1=""
did2=""
str=""
dup_cnt=1
per_file_dups=[]
per_path_dups=[]
hashes=""
for hash in dups:
if len(dups[hash]) > 2:
per_file_dups.append(dups[hash])
@@ -228,15 +230,46 @@ def fix_dups():
elif d1 != dups[hash][0]['d']:
if d1 != '':
dup_cnt=1
per_path_dups.append({'count': dup_cnt, 'd1': d1, 'd2': d2 })
per_path_dups.append({'count': dup_cnt, 'd1': d1, 'd2': d2, 'did1': did1, 'did2': did2, 'hashes' : hashes })
d1 = dups[hash][0]['d']
d2 = dups[hash][1]['d']
did1 = dups[hash][0]['did']
did2 = dups[hash][1]['did']
str=f"duplicates found in {d1} and {d2}"
hashes = f"{hash},"
else:
dup_cnt += 1
hashes += f"{hash},"
per_path_dups.append({'count': dup_cnt, 'd1': d1, 'd2': d2 })
return render_template("dups.html", per_file_dups=per_file_dups, per_path_dups=per_path_dups)
per_path_dups.append({'count': dup_cnt, 'd1': d1, 'd2': d2, 'did1': did1, 'did2': did2, 'hashes' : hashes })
print( f"msg={request.form['fe_msg_id']}" )
return render_template("dups.html", per_file_dups=per_file_dups, per_path_dups=per_path_dups, fe_msg_id=request.form['fe_msg_id'] )
@app.route("/rm_dups", methods=["POST"])
def rm_dups():
jex=[]
for el in request.form:
if 'kfhash-' in el:
# get which row/number kf it is...
pfx, which = el.split('-')
jex.append( JobExtra( name=f"kfid-{which}", value=request.form['kfname-'+which] ) )
jex.append( JobExtra( name=f"kfhash-{which}", value=request.form[el] ) )
if 'kdhash-' in el:
# get which row/number kd it is...
pfx, which = el.split('-')
jex.append( JobExtra( name=f"kdid-{which}", value=request.form['kdid-'+which] ) )
jex.append( JobExtra( name=f"kdhash-{which}", value=request.form[el] ) )
fe_msg_id=request.form['fe_msg_id']
# allow backend to delete FE message once delete is being processed
jex.append( JobExtra( name="fe_msg_id", value=fe_msg_id ) )
job=NewJob( "rmdups", 0, None, jex )
st.SetAlert("success")
st.SetMessage("created job to delete duplicate files")
return render_template("base.html")
@app.route("/move_files", methods=["POST"])
def move_files():