from csv import reader as csv_reader
import collections.abc
import ast
+import attr
import markupsafe
import hashlib
sqlc.execute(self.cur)
-class DBHandler(object):
+@attr.s
+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
'''
- def __init__(self, request):
- '''
- request A pyramid request instance
+ request = attr.ib()
+ uf = attr.ib(default=None)
+ data = attr.ib(default=None)
+
+ def init(self):
+ '''Initialize handler
'''
- super(DBHandler, self).__init__()
- self.request = request
self.uf = self.make_form()
+ return self
def make_form(self):
'''
return response
+@attr.s
class SessionDBHandler(DBHandler):
'''
A DBHandler that supports sessions.
uf An UploadForm instance
session A pyramid session instance
'''
- def __init__(self, request):
+ session = attr.ib(default=None)
+
+ def init(self):
'''
- request A pyramid request instance
+ Initialize session db handler
'''
- super(SessionDBHandler, self).__init__(request)
self.session = self.request.session
+ return super().init()
def write(self, result, errors):
'''
return response
+@attr.s
class UploadHandler(SessionDBHandler):
'''
Handler for uploading a file.
uf An UploadForm instance
data (optional) A DBData instance
'''
- def __init__(self, request):
- '''
- request A pyramid request instance
- '''
- super(UploadHandler, self).__init__(request)
-
def factory(self, ue):
'''
Takes an UploadEngine instance
e_cnt Number of errors.
db_changed Boolean. Whether the db was changed.
'''
- response = super(UploadHandler, self).write(result, errors)
- if hasattr(self, 'data'):
+ response = super().write(result, errors)
+ if self.data is not None:
response['lines'] = self.data.lineno
response['e_cnt'] = len(errors)
response['db_changed'] = (not response['errors']
return response
+@attr.s
class TabularFileUploadHandler(UploadHandler):
'''
Handler for uploading a file with rows and columns and column headings.
uf An UploadForm instance
data An UploadData instance
'''
- def __init__(self, request):
- '''
- request A pyramid request instance
- '''
- super(TabularFileUploadHandler, self).__init__(request)
-
def cleanup(self):
'''Finish after processing all lines.'''
lines = self.ue.data.lineno