from flask import request, render_template, redirect, url_for from settings import Settings, SettingsIPath, SettingsSPath, SettingsRBPath from flask_login import login_required, current_user from main import db, app, ma from shared import PA from user import PAUser from datetime import datetime from job import SetFELog from shared import SymlinkName import pytz import re ################################################################################ # PA_UserState: preference data for a given user / path_type combo, so a given user # and their prefs for say the import path(s) and storage path(s) etc, each # path_type has different defaults, and keeping those works better ################################################################################ class PA_UserState(db.Model): __tablename__ = "pa_user_state" id = db.Column(db.Integer, db.Sequence('pa_user_state_id_seq'), primary_key=True ) pa_user_dn = db.Column(db.String, db.ForeignKey('pa_user.dn'), primary_key=True ) last_used = db.Column(db.DateTime(timezone=True)) path_type = db.Column(db.String, primary_key=True, unique=False, nullable=False ) noo = db.Column(db.String, unique=False, nullable=False ) grouping = db.Column(db.String, unique=False, nullable=False ) how_many = db.Column(db.Integer, unique=False, nullable=False ) st_offset = db.Column(db.Integer, unique=False, nullable=False ) size = db.Column(db.Integer, unique=False, nullable=False ) folders = 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 ) orig_url = db.Column(db.String, unique=False, nullable=False ) current = db.Column(db.Integer) first_eid = db.Column(db.Integer) last_eid = db.Column(db.Integer) num_entries = db.Column(db.Integer) def __repr__(self): return f"" ################################################################################ # 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, search, etc. ################################################################################ class States(PA): def __init__(self, request): self.url = request.path # set the prefix based on path path=None if 'files_ip' in self.url or 'file_list_ip' in self.url: self.path_type = 'Import' path = SettingsIPath() elif 'files_sp' in self.url: self.path_type = 'Storage' path = SettingsSPath() elif 'files_rbp' in self.url: self.path_type = 'Bin' path = SettingsRBPath() elif 'search' in self.url: self.path_type = 'Search' self.search_term = '' else: self.path_type='' if path: self.prefix = SymlinkName(self.path_type,path,path+'/') else: self.prefix=None # retreive defaults from 'PAUser' where defaults are stored u=PAUser.query.filter(PAUser.dn==current_user.dn).one() self.grouping=u.default_grouping self.how_many=u.default_how_many self.size=u.default_size self.root='static/' + self.path_type if self.path_type == 'Import': self.noo = u.default_import_noo self.folders = u.default_import_folders elif self.path_type == 'Storage': self.noo = u.default_storage_noo self.folders = u.default_storage_folders else: # search so force folders to be false (rather see images, # than series of folders that dont match search themselves) self.noo=u.default_search_noo self.folders=False self.default_flat_noo=u.default_import_noo self.default_folder_noo=u.default_storage_noo self.default_search_noo=u.default_search_noo self.cwd=self.root return ################################################################################ # /states -> GET only -> prints out list of all prefs (simple for now) ################################################################################ @app.route("/states", methods=["GET"]) @login_required def states(): user = PAUser.query.filter( PAUser.dn==current_user.dn ).one() states = PA_UserState.query.filter( PA_UserState.pa_user_dn==current_user.dn ).all() return render_template("states.html", user=user, states=states )