big clean up of Options -> States, total rework, now actually handles pa_user_state -> States as Import/Storage/Bin/Search or View. If Search has orig_search_term saved. If view, has orig_ptype (and orig_search_term if orig_ptype is Search) -- removed OPT.paths -> these are now worked out when we GetEntries based on pa_user_state. This now allows us to GET all URLs for image viewing allowing me to use the back-button without issues in PROD - well we will see once I commit :)

This commit is contained in:
2022-01-20 17:25:01 +11:00
parent 5461cb4036
commit 78acb9bd66
5 changed files with 132 additions and 76 deletions

138
states.py
View File

@@ -23,79 +23,102 @@ class PA_UserState(db.Model):
fullscreen = db.Column(db.Boolean, unique=False, nullable=False )
root = db.Column(db.String, unique=False, nullable=False )
cwd = db.Column(db.String, unique=False, nullable=False )
## for now being lazy and not doing a separate table until I settle on needed fields and when
# only used if ptype == View
view_eid = db.Column(db.Integer, unique=False, nullable=False )
orig_ptype = db.Column(db.String, unique=False, nullable=False )
# only used if view and orig_ptype was search
orig_search_term = db.Column(db.String, unique=False, nullable=False )
def __repr__(self):
return f"<pa_user_dn: {self.pa_user_dn}, path_type: {self.path_type}, noo: {self.noo}, grouping: {self.grouping}, how_many: {self.how_many}, st_offset: {self.st_offset}, size: {self.size}, folders: {self.folders}, root: {self.root}, cwd: {self.cwd}>"
return f"<pa_user_dn: {self.pa_user_dn}, path_type: {self.path_type}, noo: {self.noo}, grouping: {self.grouping}, how_many: {self.how_many}, st_offset: {self.st_offset}, size: {self.size}, folders: {self.folders}, root: {self.root}, cwd: {self.cwd}, view_eid: {self.view_eid}, orig_ptype: {self.orig_ptype}, orig_search_term: {self.orig_search_term}>"
################################################################################
# Options: class to store set of default values for viewing (order/size, etc.)
# States: class to store set of default values for viewing (order/size, etc.)
# and if a request object (from a POST) is passed in, it returns those instead
# it also handles the cwd appropriately, paths, fullscreen, search, etc.
################################################################################
class Options(PA):
class States(PA):
def __init__(self, request):
self.path_type=''
self.url = request.path
# this occurs ONLY when a POST to /view/<id> occurs (at this stage orig_url will be from an import, storage, bin or search)
if 'orig_url' in request.form:
self.path_type='View'
# use orig url to define defaults/look up states for 'last' import/storage/bin/search
url = request.form['orig_url']
# get the eid out of the url /view/<id>
self.view_eid = request.path[6:]
else:
url = request.path
self.orig_url=url
if 'files_sp' in url:
self.path_type = 'Storage'
self.paths = SettingsSPath()
pref=PA_UserState.query.filter(PA_UserState.pa_user_dn==current_user.dn,PA_UserState.path_type==self.path_type).first()
if pref:
self.folders=pref.folders
self.noo=pref.noo
self.view_eid = None
if 'files_ip' in url or 'file_list_ip' in url:
if self.path_type == "View":
self.orig_ptype = 'Import'
else:
self.folders=True
self.noo="A to Z"
self.path_type = 'Import'
elif 'files_sp' in url:
if self.path_type == "View":
self.orig_ptype = 'Storage'
else:
self.path_type = 'Storage'
elif 'files_rbp' in url:
self.path_type = 'Bin'
self.paths = []
self.paths.append(SettingsRBPath())
pref=PA_UserState.query.filter(PA_UserState.pa_user_dn==current_user.dn,PA_UserState.path_type==self.path_type).first()
if pref:
self.folders=pref.folders
self.noo=pref.noo
if self.path_type == "View":
self.orig_ptype = 'Bin'
else:
self.folders=True
self.noo="A to Z"
self.path_type = 'Bin'
elif 'search' in url:
self.path_type = 'Search'
self.paths = None
pref=PA_UserState.query.filter(PA_UserState.pa_user_dn==current_user.dn,PA_UserState.path_type==self.path_type).first()
if pref:
self.folders=pref.folders
self.noo=pref.noo
# okay if we are a search, but came from a view then get last_search_state form prefs and use it
if self.path_type == "View":
last_search_state = PA_UserState.query.filter(PA_UserState.pa_user_dn==current_user.dn,PA_UserState.path_type=='Search').first()
self.orig_search_term = last_search_state.orig_search_term
self.orig_ptype = 'Search'
else:
self.folders=False
self.noo="Oldest"
self.orig_search_term = url[8:]
self.path_type = 'Search'
elif 'view' in url:
# use url to get eid of viewed entry
self.view_eid = self.url[6:]
self.path_type="View"
else:
print( f"ERROR: DDP messed up, failed to match URL {url} for settings this will fail, redirecting to home" )
return
if self.path_type == 'View':
pref=PA_UserState.query.filter(PA_UserState.pa_user_dn==current_user.dn,PA_UserState.path_type==self.path_type,PA_UserState.view_eid==self.view_eid).first()
else:
self.path_type = 'Import'
self.paths = SettingsIPath()
pref=PA_UserState.query.filter(PA_UserState.pa_user_dn==current_user.dn,PA_UserState.path_type==self.path_type).first()
if pref:
self.folders=pref.folders
self.noo=pref.noo
else:
self.folders=False
self.noo="Oldest"
if pref:
self.folders=pref.folders
self.noo=pref.noo
self.grouping=pref.grouping
self.how_many=pref.how_many
self.offset=pref.st_offset
self.size=pref.size
self.root=pref.root
self.cwd=pref.cwd
self.orig_ptype=pref.orig_ptype
self.orig_search_term=pref.orig_search_term
else:
self.folders=False
self.noo="Oldest"
self.grouping="None"
self.how_many="50"
self.offset="0"
self.size="128"
self.root='static/' + self.path_type
if self.path_type == "View":
self.root='static/' + self.orig_ptype
else:
self.root='static/' + self.path_type
self.cwd=self.root
if not hasattr(self, 'orig_ptype'):
self.orig_ptype=None
if not hasattr(self, 'orig_search_term'):
self.orig_search_term=None
# the above are defaults, if we are here, then we have current values, use them instead if they are set -- AI: searches dont set them so then we use those in the DB first
@@ -135,22 +158,29 @@ class Options(PA):
if 'next' in request.form:
self.offset += int(self.how_many)
pref=PA_UserState.query.filter(PA_UserState.pa_user_dn==current_user.dn,PA_UserState.path_type==self.path_type).first()
if not pref:
pref=PA_UserState( pa_user_dn=current_user.dn, path_type=self.path_type, noo=self.noo, grouping=self.grouping, how_many=self.how_many,
st_offset=self.offset, size=self.size, folders=self.folders, root=self.root, cwd=self.cwd )
else:
pref.noo=self.noo
pref.grouping=self.grouping
pref.how_many=self.how_many
pref.st_offset=self.offset
pref.size=self.size
pref.folders=self.folders
pref.root = self.root
pref.cwd = self.cwd
# now save pref
if not pref:
# if there is an PA_UserState( pa_user_dn=current_user.dn, # path_type=self.path_type ), then its for a different view_eid and we are viewing, delete it before we insert the new
old_pref=PA_UserState.query.filter(PA_UserState.pa_user_dn==current_user.dn,PA_UserState.path_type==self.path_type).delete()
pref=PA_UserState( pa_user_dn=current_user.dn, path_type=self.path_type, view_eid=self.view_eid, noo=self.noo, grouping=self.grouping, how_many=self.how_many,
st_offset=self.offset, size=self.size, folders=self.folders, root=self.root, cwd=self.cwd, orig_ptype=self.orig_ptype, orig_search_term=self.orig_search_term )
else:
pref.pa_user_dn=current_user.dn
pref.path_type=self.path_type
pref.view_eid=self.view_eid
pref.noo=self.noo
pref.grouping=self.grouping
pref.how_many=self.how_many
pref.st_offset=self.offset
pref.size=self.size
pref.folders=self.folders
pref.root = self.root
pref.cwd = self.cwd
pref.orig_ptype = self.orig_ptype
pref.orig_search_term = self.orig_search_term
db.session.add(pref)
db.session.commit()
db.session.add(pref)
db.session.commit()
return