from csv import reader as csv_reader
import collections.abc
import ast
-import attr
import attrs
import markupsafe
import hashlib
# Setup default values for forms.
-@attr.s
+@attrs.define(slots=False)
class UserInitialPost():
- db = attr.ib(default='')
- user = attr.ib(default='')
- password = attr.ib(default='')
+ db = attrs.field(default='')
+ user = attrs.field(default='')
+ password = attrs.field(default='')
def build(self, settings={}):
self.db = settings['pgwui'].get('default_db', '')
return self
-@attr.s
+@attrs.define(slots=False)
class UploadFileInitialPost(UserInitialPost):
- upload_fmt = attr.ib(default=CSV)
- trim_upload = attr.ib(default=True)
- literal_col_headings = attr.ib(default=False)
- datafile = attr.ib(default='')
+ upload_fmt = attrs.field(default=CSV)
+ trim_upload = attrs.field(default=True)
+ literal_col_headings = attrs.field(default=False)
+ datafile = attrs.field(default='')
-@attr.s
+@attrs.define(slots=False)
class UploadNullFileInitialPost(UploadFileInitialPost):
- upload_null = attr.ib(default=True)
- null_rep = attr.ib(default='')
+ upload_null = attrs.field(default=True)
+ null_rep = attrs.field(default='')
-@attr.s
+@attrs.define(slots=False)
class UploadTableInitialPostMixin():
- table = attr.ib(default='')
+ table = attrs.field(default='')
-@attr.s
+@attrs.define(slots=False)
class UploadTableInitialPost(UploadNullFileInitialPost,
UploadTableInitialPostMixin):
pass
table = StringField('Table or View:')
-@attr.s
+@attrs.define(slots=False)
class LoadedForm(collections.abc.MutableMapping):
'''
Abstract class representing an upload form.
_form Instantaiated html form object (WTForms)
_fc Class handling html form
'''
- fc_default = attr.ib(default=None)
- ip_default = attr.ib(default=None)
- uh = attr.ib(default=None)
- _store = attr.ib(factory=dict)
- _fc = attr.ib(default=None)
- _form = attr.ib(default=None)
- ivals = attr.ib(default=None)
+ fc_default = attrs.field(default=None)
+ ip_default = attrs.field(default=None)
+ uh = attrs.field(default=None)
+ _store = attrs.field(factory=dict)
+ _fc = attrs.field(default=None)
+ _form = attrs.field(default=None)
+ ivals = attrs.field(default=None)
def build(self, uh, fc=None, ip=None, data={}, **kwargs):
'''Form initialization
return response
-@attr.s
+@attrs.define(slots=False)
class CredsLoadedForm(LoadedForm):
'''
Acts like a dict, but with extra methods.
Methods:
read() Load form from pyramid request object.
'''
- fc_default = attr.ib(default=UserWTForm)
- ip_default = attr.ib(factory=UserInitialPost)
- user = attr.ib(default=None)
- password = attr.ib(default=None)
- action = attr.ib(default=None)
+ fc_default = attrs.field(default=UserWTForm)
+ ip_default = attrs.field(factory=UserInitialPost)
+ user = attrs.field(default=None)
+ password = attrs.field(default=None)
+ action = attrs.field(default=None)
def session_put(self, key, value):
'''
return response
-@attr.s
+@attrs.define(slots=False)
class AuthLoadedForm(CredsLoadedForm):
'''
Acts like a dict, but with extra methods.
_form Instantaiated html form object (WXForms)
'''
- db = attr.ib(default=None)
+ db = attrs.field(default=None)
def read(self):
'''
return response
-@attr.s
+@attrs.define(slots=False)
class UploadFileForm(AuthLoadedForm):
'''
Acts like a dict, but with extra methods.
Methods:
read() Load form from pyramid request object.
'''
- fc_default = attr.ib(default=UploadFileWTForm)
- ip_default = attr.ib(factory=UploadFileInitialPost)
- upload_fmt = attr.ib(default=None)
- trim_upload = attr.ib(default=None)
- literal_col_headings = attr.ib(default=None)
- filename = attr.ib(default=None)
- localfh = attr.ib(default=None)
+ fc_default = attrs.field(default=UploadFileWTForm)
+ ip_default = attrs.field(factory=UploadFileInitialPost)
+ upload_fmt = attrs.field(default=None)
+ trim_upload = attrs.field(default=None)
+ literal_col_headings = attrs.field(default=None)
+ filename = attrs.field(default=None)
+ localfh = attrs.field(default=None)
def read(self):
'''
return response
-@attr.s
+@attrs.define(slots=False)
class UploadDoubleFileFormMixin(UploadFormBaseMixin):
'''
Adds a last_key attribute to self, from POST
Methods:
read() Load form from pyramid request object.
'''
- last_key = attr.ib(default=None)
+ last_key = attrs.field(default=None)
def read(self):
'''
return super().write_response(response)
-@attr.s
+@attrs.define(slots=False)
class UploadDoubleFileForm(UploadDoubleFileFormMixin, UploadFileForm):
'''
Acts like a dict, but with extra methods.
return super().write_response(response)
-@attr.s
+@attrs.define(slots=False)
class UploadNullMixin(UploadFormBaseMixin):
'''
Acts like a dict, but with extra methods.
return super().write_response(response)
-@attr.s
+@attrs.define(slots=False)
class UploadTableForm(UploadNullMixin, UploadFileForm):
'''
Acts like a dict, but with extra methods.
Methods:
read() Load form from pyramid request object.
'''
- fc_default = attr.ib(default=UploadTableWTForm)
- ip_default = attr.ib(factory=UploadTableInitialPost)
+ fc_default = attrs.field(default=UploadTableWTForm)
+ ip_default = attrs.field(factory=UploadTableInitialPost)
def read(self):
'''
return super().write_response(response)
-@attr.s
+@attrs.define(slots=False)
class UploadDoubleTableForm(UploadDoubleFileFormMixin, UploadTableForm):
'''
Acts like a dict, but with extra methods.
return seq + ['' for i in range(len(seq) + 1, self.cols)]
-@attr.s
+@attrs.define(slots=False)
class ParameterExecutor():
'''Execute a parameterized psycopg3 statement
Must be mixed in with a DataLineProcessor. Unless all parameters
sqlc.execute(self.cur)
-@attr.s
+@attrs.define(slots=False)
class DBHandler():
'''
Abstract class of a handler that modifies the db.
uf An UploadForm instance
data Something (beyond what's on the form) that goes into db
'''
- request = attr.ib()
- uf = attr.ib(default=None)
- data = attr.ib(default=None)
+ request = attrs.field()
+ uf = attrs.field(default=None)
+ data = attrs.field(default=None)
def init(self):
'''Initialize handler
return response
-@attr.s
+@attrs.define(slots=False)
class SessionDBHandler(DBHandler):
'''
A DBHandler that supports sessions.
uf An UploadForm instance
session A pyramid session instance
'''
- session = attr.ib(default=None)
+ session = attrs.field(default=None)
def init(self):
'''
return response
-@attr.s
+@attrs.define(slots=False)
class UploadHandler(SessionDBHandler):
'''
Handler for uploading a file.
return response
-@attr.s
+@attrs.define(slots=False)
class TabularFileUploadHandler(UploadHandler):
'''
Handler for uploading a file with rows and columns and column headings.