created/tested an Undelete function and associated classes, it works but nothing calls it yet

This commit is contained in:
2021-06-08 21:17:38 +10:00
parent 060cf8acd2
commit 97a21cadab

View File

@@ -174,6 +174,15 @@ class File(Base):
def __repr__(self):
return f"<eid: {self.eid}, size_mb={self.size_mb}, hash={self.hash}, last_hash_date: {self.last_hash_date}>"
class DelFile(Base):
__tablename__ = "del_file"
file_eid = Column(Integer, ForeignKey("file.eid"), primary_key=True )
orig_path_prefix = Column(String, unique=False )
def __repr__(self):
return f"<file_eid: {self.file_eid}, orig_path_prefix={self.orig_path_prefix}>"
class FileType(Base):
__tablename__ = "file_type"
id = Column(Integer, Sequence('file_type_id_seq'), primary_key=True )
@@ -473,6 +482,7 @@ def JobScanStorageDir(job):
def JobForceScan(job):
JobProgressState( job, "In Progress" )
session.query(DelFile).delete()
session.query(FileRefimgLink).delete()
session.query(EntryDirLink).delete()
session.query(PathDirLink).delete()
@@ -594,7 +604,49 @@ def RemoveFileFromFS( del_me ):
print( f"ERROR: Failed to remove file from filesystem - which={src}, err: {e}")
return
# Functoin that moves a file we are "deleting" to the recycle bin, it moves the
# Function that undeletes a file that was deleted (moved into the Bin)
# it moves file on the filesystem back to its original path and then changes the database path from the Bin path
# to the original import or storage path and appropriate dir
def UnDeleteFile(job,restore_me):
try:
# rel_path for a file in the Bin, is like 'Import/images_to_process/1111', so just prepend static/
dst_dir='static/' + restore_me.in_dir.rel_path + '/'
os.makedirs( dst_dir,mode=0o777, exist_ok=True )
src=restore_me.FullPathOnFS()
dst=dst_dir + '/' + restore_me.name
os.replace( src, dst )
except Exception as e:
print( f"ERROR: Failed to undelete (mv) file on filesystem - which={src} to {dst}, err: {e}")
# need these for AddDir calls below to work
orig_file_details = session.query(DelFile).get(restore_me.id)
orig_path = session.query(Path).filter(Path.path_prefix==orig_file_details.orig_path_prefix).first()
parent_dir=session.query(Dir).join(PathDirLink).filter(PathDirLink.path_id==orig_path.id).first()
# e.g. restore_me's rel_path 'Import/images_to_process/1111', orig_path was 'static/Import/images_to_process', need new rel_path to be just the 1111 bit...
new_rel_path='static/'+restore_me.in_dir.rel_path
new_rel_path=new_rel_path.replace(orig_file_details.orig_path_prefix+'/', '')
new_rel_path='1111'
# okay, go through new relative path and AddDir any missing subdirs of this
# path (think Import/Dir1/Dir2) which b/c we have orig_path in AddDir will
# create static/Import, static/Import/Dir1, static/Import/Dir1/Dir2
part_rel_path=""
for dirname in new_rel_path.split("/"):
part_rel_path += f"{dirname}"
### DDP: when restoring, an original dir might have been removed, so need make it (if needed)
os.makedirs( dirname,mode=0o777, exist_ok=True )
new_dir=AddDir( job, dirname, parent_dir, part_rel_path, orig_path )
parent_dir=new_dir
part_rel_path += "/"
restore_me.in_dir = new_dir
session.query(DelFile).filter(DelFile.file_eid==restore_me.id).delete()
session.commit()
print("TODO: enqueue check_dups job")
return
# Function that moves a file we are "deleting" to the recycle bin, it moves the
# file on the filesystem and then changes the database path from the import or
# storage path over to the Bin path
def MoveFileToRecycleBin(job,del_me):
@@ -607,14 +659,26 @@ def MoveFileToRecycleBin(job,del_me):
os.replace( src, dst )
except Exception as e:
print( f"ERROR: Failed to remove file from filesystem - which={src}, err: {e}")
bin_path=session.query(Path).join(PathType).filter(PathType.name=='Bin').first()
new_rel_path=del_me.in_dir.in_path.path_prefix.replace('static/','')
# need these for AddDir calls below to work
bin_path=session.query(Path).join(PathType).filter(PathType.name=='Bin').first()
parent_dir=session.query(Dir).join(PathDirLink).filter(PathDirLink.path_id==bin_path.id).first()
print( f"need to keep this (ind): {del_me.in_dir.in_path.path_prefix}" )
# if we ever need to undelete, lets remember this file's original path
# (use a string in case the dir/path is ever deleted from FS (and then DB) and we need to recreate)
del_file_details = DelFile( file_eid=del_me.id, orig_path_prefix=del_me.in_dir.in_path.path_prefix )
session.add( del_file_details )
# remove static from rel path, as it will move to static/Bin anyway...
new_rel_path=del_me.in_dir.in_path.path_prefix.replace('static/','')
# if there is a relative path on this dir, add it to the new_rel_path as there is only ever 1 Bin path
if len(del_me.in_dir.rel_path):
new_rel_path += '/' + del_me.in_dir.rel_path
parent_dir=session.query(Dir).join(PathDirLink).filter(PathDirLink.path_id==bin_path.id).first()
# okay, go through new relative path and AddDir any missing subdirs of this
# path (think Import/Dir1/Dir2) which b/c we have bin_path in AddDir will
# create Bin/Import, Bin/Import/Dir1, Bin/Import/Dir1/Dir2
part_rel_path=""
for dirname in new_rel_path.split("/"):
part_rel_path += f"{dirname}"
@@ -1139,10 +1203,10 @@ if __name__ == "__main__":
ValidateSettingsPaths()
# now=datetime.now(pytz.utc)
# job=Job(start_time=now, last_update=now, name="scannow", state="New", wait_for=None, pa_job_state="New", current_file_num=0, num_files=0 )
# session.add(job)
# session.commit()
# restore_me=session.query(Entry).join(File).join(DelFile).first()
# if restore_me:
# UnDeleteFile(Job(),restore_me)
HandleJobs()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((PA_JOB_MANAGER_HOST, PA_JOB_MANAGER_PORT))