Progress on solar.
This commit is contained in:
129
portal/base.py
129
portal/base.py
@@ -18,7 +18,11 @@ from email.mime.application import MIMEApplication
|
||||
import pdfkit
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
from . model import db, UploadUnauthenticated
|
||||
from . model import db, UploadUnauthenticated, UploadSolar
|
||||
|
||||
|
||||
ENABLED_FILETYPES = ['txt', 'csv', 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'xml', 'mxliff', 'tmx']
|
||||
REGEX_EMAIL = re.compile('^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$')
|
||||
|
||||
|
||||
class ContractCreator:
|
||||
@@ -74,7 +78,6 @@ class UploadHandler:
|
||||
|
||||
return upload_metadata
|
||||
|
||||
|
||||
def get_uploads_subdir(self, dir_name):
|
||||
subdir = Path(self.config['UPLOADS_DIR']) / dir_name
|
||||
if not subdir.exists():
|
||||
@@ -118,15 +121,16 @@ class UploadHandler:
|
||||
|
||||
try:
|
||||
upload_unauthenticated = UploadUnauthenticated(
|
||||
upload_hash=upload_metadata['upload_id'],
|
||||
timestamp=timestamp,
|
||||
form_name=form_data['ime'],
|
||||
form_org=form_data['podjetje'],
|
||||
form_address=form_data['naslov'],
|
||||
form_zipcode=form_data['posta'],
|
||||
form_email=form_data['email'],
|
||||
file_contract=upload_metadata['contract_file'],
|
||||
upload_file_hashes=sorted_f_hashes
|
||||
upload_hash=upload_metadata['upload_id'],
|
||||
timestamp=timestamp,
|
||||
form_name=form_data['ime'],
|
||||
form_org=form_data['podjetje'],
|
||||
form_address=form_data['naslov'],
|
||||
form_zipcode=form_data['posta'],
|
||||
form_email=form_data['email'],
|
||||
file_contract=upload_metadata['contract_file'],
|
||||
upload_file_hashes=sorted_f_hashes,
|
||||
corpus_name=todo
|
||||
)
|
||||
|
||||
db.session.add(upload_unauthenticated)
|
||||
@@ -134,8 +138,31 @@ class UploadHandler:
|
||||
except Exception:
|
||||
traceback.print_exc()
|
||||
|
||||
def store_metadata_authenticated(self, upload_metadata):
|
||||
pass
|
||||
def store_metadata_solar(self, upload_metadata):
|
||||
timestamp = datetime.fromtimestamp(upload_metadata['timestamp'])
|
||||
form_data = upload_metadata['form_data']
|
||||
file_hashes = upload_metadata['file_hashes_dict']
|
||||
sorted_f_hashes = list(file_hashes.values())
|
||||
sorted_f_hashes.sort()
|
||||
|
||||
try:
|
||||
upload_solar = UploadSolar(
|
||||
upload_user = todo,
|
||||
institution = todo,
|
||||
upload_hash=upload_metadata['upload_id'],
|
||||
timestamp=timestamp,
|
||||
form_program=form_data['program'],
|
||||
form_subject=form_data['subject'],
|
||||
form_grade=form_data['grade'],
|
||||
form_text_type=form_data['text_type'],
|
||||
form_school_year=form_data['school_year'],
|
||||
form_grammar_corrections=form_data['grammar_corrections'],
|
||||
upload_file_hashes=sorted_f_hashes
|
||||
)
|
||||
db.session.add(upload_unauthenticated)
|
||||
db.session.commit()
|
||||
except Exception:
|
||||
traceback.print_exc()
|
||||
|
||||
def store_datafiles(self, files, upload_metadata):
|
||||
base = self.get_uploads_subdir('files')
|
||||
@@ -206,3 +233,79 @@ class UploadHandler:
|
||||
imap.append('Sent', '\\Seen', imaplib.Time2Internaldate(time.time()), text.encode('utf8'))
|
||||
imap.logout()
|
||||
|
||||
|
||||
def handle_upload_unauthenticated(request, corpus_name, upload_handler):
|
||||
files = request.files
|
||||
if len(files) > upload_handler.MAX_FILES_PER_UPLOAD:
|
||||
return 'Naložite lahko do {} datotek hkrati.'.format(upload_handler.MAX_FILES_PER_UPLOAD), 400
|
||||
elif len(files) < 1:
|
||||
return 'Priložena ni bila nobena datoteka.', 400
|
||||
|
||||
err = check_suffixes(files)
|
||||
if err:
|
||||
return err, 400
|
||||
|
||||
err = check_form(request.form)
|
||||
if err:
|
||||
return err, 400
|
||||
|
||||
# Parse request.
|
||||
upload_metadata = upload_handler.extract_upload_metadata(corpus_name, request)
|
||||
|
||||
logging.info('Upload with id "{}" supplied form data: {}'.format(upload_metadata['upload_id'],
|
||||
str(upload_metadata['form_data'])))
|
||||
|
||||
# Generate contract PDF file based on the uploads metadata.
|
||||
upload_handler.generate_upload_contract_pdf(upload_metadata)
|
||||
|
||||
# Store uploaded files to disk.
|
||||
upload_handler.store_datafiles(files, upload_metadata)
|
||||
|
||||
# Store metadata to database.
|
||||
upload_handler.store_metadata_unauthenticated(upload_metadata)
|
||||
|
||||
# Send confirmation mail along with the contract to the submitted email address.
|
||||
upload_handler.send_confirm_mail(upload_metadata)
|
||||
|
||||
return 'Uspešno ste oddali datotek(e). Št. datotek: {}'.format(len(files))
|
||||
|
||||
|
||||
def check_suffixes(files):
|
||||
for key, f in files.items():
|
||||
if key.startswith('file'):
|
||||
suffix = f.filename.split('.')[-1]
|
||||
if suffix not in ENABLED_FILETYPES:
|
||||
return 'Datoteka "{}" ni pravilnega formata.'.format(f.filename)
|
||||
return None
|
||||
|
||||
|
||||
def check_form(form):
|
||||
ime = form.get('ime')
|
||||
podjetje = form.get('podjetje')
|
||||
naslov = form.get('naslov')
|
||||
posta = form.get('posta')
|
||||
email = form.get('email')
|
||||
telefon = form.get('telefon')
|
||||
|
||||
if len(ime) > 100:
|
||||
return 'Predolgo ime.'
|
||||
|
||||
if len(podjetje) > 100:
|
||||
return 'Predolgo ime institucije.'
|
||||
|
||||
if len(email) > 100:
|
||||
return 'Predolgi email naslov'
|
||||
elif not re.search(REGEX_EMAIL, email):
|
||||
return 'Email napačnega formata.'
|
||||
|
||||
if len(telefon) > 100:
|
||||
return 'Predolga telefonska št.'
|
||||
|
||||
if len(naslov) > 100:
|
||||
return 'Predolg naslov.'
|
||||
|
||||
if len(posta) > 100:
|
||||
return 'Predolga pošta'
|
||||
|
||||
return None
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
from datetime import datetime
|
||||
import sqlalchemy
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_login import UserMixin
|
||||
|
||||
|
||||
###########################################
|
||||
# Model classes for describing SQL tables #
|
||||
@@ -23,4 +25,43 @@ class UploadUnauthenticated(db.Model):
|
||||
form_email = db.Column(db.String)
|
||||
file_contract = db.Column(db.String)
|
||||
upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String))
|
||||
corpus_name = db.Column(db.String)
|
||||
|
||||
|
||||
class UploadSolar(db.Model):
|
||||
__tablename__ = 'upload_solar'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
upload_user = db.Column(db.Integer, sqlalchemy.ForeignKey('registered_user.id'))
|
||||
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'))
|
||||
upload_hash = db.Column(db.String)
|
||||
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
corpus_name = db.Column(db.String)
|
||||
form_program = db.Column(db.String)
|
||||
form_subject = db.Column(db.String)
|
||||
form_grade = db.Column(db.Integer)
|
||||
form_text_type = db.Column(db.String)
|
||||
form_school_year = db.Column(db.String)
|
||||
form_grammar_corrections = db.Column(db.String)
|
||||
upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String))
|
||||
|
||||
|
||||
class RegisteredUser(UserMixin, db.Model):
|
||||
__tablename__ = 'registered_user'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String)
|
||||
email = db.Column(db.String)
|
||||
role = db.Column(db.String)
|
||||
pass_hash = db.Column(db.String)
|
||||
active = db.Column(db.Boolean)
|
||||
last_login = db.Column(db.DateTime)
|
||||
registered = db.Column(db.DateTime)
|
||||
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'))
|
||||
|
||||
|
||||
class Institution(db.Model):
|
||||
__tablename__ = 'institution'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String)
|
||||
region = db.Column(db.String)
|
||||
file_contract = db.Column(db.String)
|
||||
|
||||
|
||||
41
portal/solar.py
Normal file
41
portal/solar.py
Normal file
@@ -0,0 +1,41 @@
|
||||
import portal.base
|
||||
|
||||
|
||||
def handle_upload(request, upload_handler):
|
||||
files = request.files
|
||||
if len(files) > upload_handler.MAX_FILES_PER_UPLOAD:
|
||||
return 'Naložite lahko do {} datotek hkrati.'.format(upload_handler.MAX_FILES_PER_UPLOAD), 400
|
||||
elif len(files) < 1:
|
||||
return 'Priložena ni bila nobena datoteka.', 400
|
||||
|
||||
err = portal.base.check_suffixes(files)
|
||||
if err:
|
||||
return err, 400
|
||||
|
||||
err = check_form(request.form)
|
||||
if err:
|
||||
return err, 400
|
||||
|
||||
# Parse request.
|
||||
upload_metadata = upload_handler.extract_upload_metadata(corpus_name, request)
|
||||
|
||||
logging.info('Upload from user "{}" with upload id "{}" supplied form data: {}'.format(
|
||||
request.user,
|
||||
upload_metadata['upload_id'],
|
||||
str(upload_metadata['form_data']
|
||||
)))
|
||||
|
||||
# Store uploaded files to disk.
|
||||
upload_handler.store_datafiles(files, upload_metadata)
|
||||
|
||||
# Store metadata to database.
|
||||
upload_handler.store_metadata_solar(upload_metadata)
|
||||
|
||||
# Send confirmation mail along with the contract to the submitted email address.
|
||||
upload_handler.send_confirm_mail(upload_metadata)
|
||||
|
||||
return 'Uspešno ste oddali datotek(e). Št. datotek: {}'.format(len(files))
|
||||
|
||||
|
||||
def check_form(form):
|
||||
pass
|
||||
Reference in New Issue
Block a user