diff --git a/files.py b/files.py index cad9c5e..7c5234a 100644 --- a/files.py +++ b/files.py @@ -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() # -- 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():