portal-oddajanje-solar/app.py

142 lines
4.5 KiB
Python

import os
import configparser
from pathlib import Path
from flask import Flask, render_template, request
from flask_dropzone import Dropzone
import portal.base
# TODO: Put all the stuff in base.py into a class, so it can have a state of it's own, to avoid passing a bunch of arguments at each function call.
######################
# Load configuration #
######################
config = configparser.ConfigParser()
config.read('config.ini')
config = config['DEFAULT']
MAIL_HOST = config['MAIL_HOST']
MAIL_LOGIN = config['MAIL_LOGIN']
MAIL_PASS = config['MAIL_PASS']
SMTP_PORT = int(config['SMTP_PORT'])
IMAP_PORT = int(config['IMAP_PORT'])
MAX_UPLOAD_SIZE = int(config['MAX_UPLOAD_SIZE']) # Bytes
CONTRACT_CLIENT_CONTACT = config['CONTRACT_CLIENT_CONTACT']
MAIL_SUBJECT = config['MAIL_SUBJECT']
MAIL_BODY = config['MAIL_BODY']
if 'UPLOADS_DIR' in config:
UPLOADS_DIR = Path(config['UPLOADS_DIR'])
else:
UPLOADS_DIR = Path(__file__).resolve().parent / 'uploads'
if not UPLOADS_DIR.exists:
UPLOADS_DIR.mkdir(parents=True)
if 'DATA_DIR' in config:
DATA_DIR = Path(config['DATA_DIR'])
else:
DATA_DIR = Path(__file__).resolve().parent / 'data'
if not DATA_DIR.exists:
DATA_DIR.mkdir(parents=True)
# Override configs with environment variables, if set
if 'PORTALDS4DS1_MAIL_HOST' in os.environ:
MAIL_HOST = os.environ['PORTALDS4DS1_MAIL_HOST']
if 'PORTALDS4DS1_MAIL_LOGIN' in os.environ:
MAIL_LOGIN = os.environ['PORTALDS4DS1_MAIL_LOGIN']
if 'PORTALDS4DS1_MAIL_PASS' in os.environ:
MAIL_PASS = os.environ['PORTALDS4DS1_MAIL_PASS']
if 'PORTALDS4DS1_SMTP_PORT' in os.environ:
SMTP_PORT = int(os.environ['PORTALDS4DS1_SMTP_PORT'])
if 'PORTALDS4DS1_IMAP_PORT' in os.environ:
IMAP_PORT = int(os.environ['PORTALDS4DS1_IMAP_PORT'])
if 'PORTALDS4DS1_MAX_UPLOAD_SIZE' in os.environ:
MAX_UPLOAD_SIZE = int(os.environ['PORTALDS4DS1_MAX_UPLOAD_SIZE'])
if 'PORTALDS4DS1_CONTRACT_CLIENT_CONTACT' in os.environ:
CONTRACT_CLIENT_CONTACT = os.environ['PORTALDS4DS1_CONTRACT_CLIENT_CONTACT']
if 'PORTALDS4DS1_UPLOADS_DIR' in os.environ:
UPLOADS_DIR = os.environ['PORTALDS4DS1_UPLOADS_DIR']
if 'PORTALDS4DS1_DATA_DIR' in os.environ:
DATA_DIR = os.environ['PORTALDS4DS1_DATA_DIR']
if 'PORTALDS4DS1_MAIL_SUBJECT' in os.environ:
MAIL_SUBJECT = os.environ['PORTALDS4DS1_MAIL_SUBJECT']
if 'PORTALDS4DS1_MAIL_BODY' in os.environ:
MAIL_BODY = os.environ['PORTALDS4DS1_MAIL_BODY']
VALID_CORPUS_NAMES = ['prevodi', 'gigafida', 'solar']
######################
app = Flask(__name__)
app.config.update(
UPLOADED_PATH = UPLOADS_DIR,
MAX_CONTENT_LENGTH = MAX_UPLOAD_SIZE,
TEMPLATES_AUTO_RELOAD = True
)
dropzone = Dropzone(app)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/<corpus_name>')
def index_corpus(corpus_name):
if corpus_name not in VALID_CORPUS_NAMES:
return 'Korpus "{}" ne obstaja.'.format(corpus_name), 404
if corpus_name == 'prevodi':
subtitle = 'KORPUS PARALELNIH BESEDIL ANG-SLO'
elif corpus_name == 'gigafida':
subtitle = 'KORPUS GIGAFIDA'
return render_template('basic.html', subtitle=subtitle, corpus_name=corpus_name)
@app.route('/<corpus_name>/upload', methods=['POST'])
def handle_upload(corpus_name):
if corpus_name not in VALID_CORPUS_NAMES:
return 404
files = request.files
if len(files) > 20:
return 'Naložite lahko do 20 datotek hkrati.', 400
elif len(files) < 1:
return 'Priložena ni bila nobena datoteka.', 400
print('one')
err = portal.base.check_suffixes(files)
if err:
return err, 400
print('two')
err = portal.base.check_form(request.form)
if err:
return err, 400
print('three')
upload_metadata = portal.base.get_upload_metadata(corpus_name, request)
contract_file_name = portal.base.generate_contract_pdf(UPLOADS_DIR, upload_metadata, CONTRACT_CLIENT_CONTACT)
# Add contract_file_name to metadata TODO: move somewhere else
upload_metadata['contract'] = contract_file_name
portal.base.store_datafiles(UPLOADS_DIR, files, upload_metadata)
portal.base.store_metadata(UPLOADS_DIR, upload_metadata)
portal.base.send_confirm_mail(
subject=MAIL_SUBJECT,
body=MAIL_BODY,
uploads_path=UPLOADS_DIR,
upload_metadata=upload_metadata,
mail_host=MAIL_HOST, mail_login=MAIL_LOGIN, mail_pass=MAIL_PASS,
imap_port=IMAP_PORT, smtp_port=SMTP_PORT)
return 'Uspešno ste oddali datotek(e). Št. datotek: {}'.format(len(files))
if __name__ == '__main__':
app.run(debug=True)