import logging
import traceback
import re
from datetime import datetime
import portal.base
from portal.base import UploadHandler, ContractCreator, REGEX_EMAIL
from portal.model import db, UploadPredavanja
MAXLEN_FORM = 150
class UploadHandlerPredavanja(UploadHandler):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.contract_creator = ContractCreator(base_path=self.get_uploads_subdir('contracts'),
                                                    template_path='contract/predavanja.html')
    def generate_upload_contract_pdf(self, upload_metadata):
        form_data = upload_metadata['form_data']
        files_table_str = []
        for file_name in upload_metadata['file_names']:
            files_table_str.append('
| ')
            files_table_str.append(file_name)
            files_table_str.append(' | 
')
        files_table_str = ''.join(files_table_str)
        data = {
            'ime_priimek': form_data['ime'],
            'files_table_str': files_table_str
            }
        self.contract_creator.create_pdf(upload_metadata['contract_file'], data)
    @staticmethod
    def store_metadata(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:
            model_obj = UploadPredavanja(
                    upload_hash=upload_metadata['upload_id'],
                    timestamp=timestamp,
                    name=form_data['ime'],
                    address=form_data['naslov-predavanja'],
                    subject=form_data['predmet'],
                    faculty=form_data['fakulteta'],
                    email=form_data['email'],
                    phone=form_data.get('phone'),
                    keywords=form_data['kljucne-besede'],
                    agree_publish=True if 'kljucne-besde' in form_data else False,
                    file_contract=upload_metadata['contract_file'],
                    upload_file_hashes=sorted_f_hashes,
                   )
            db.session.add(model_obj)
            db.session.commit()
        except Exception:
            traceback.print_exc()
    def handle_upload(self, request):
        err = self.check_upload_request(request)
        if err:
            return err, 400
        err = self.check_form(request.form)
        if err:
            return err, 400
        # Parse request.
        upload_metadata = self.extract_upload_metadata('predavanja', request)
        logging.info('Upload for "predavanja" with id "{}" supplied form data: {}'.format(
                        upload_metadata['upload_id'], str(upload_metadata['form_data'])))
        # Generate contract PDF file based on the uploads metadata.
        self.generate_upload_contract_pdf(upload_metadata)
        # Store uploaded files to disk.
        self.store_datafiles(request.files, upload_metadata)
        # Store metadata to database.
        self.store_metadata(upload_metadata)
        # Send confirmation mail along with the contract to the submitted email address.
        self.send_confirm_mail(upload_metadata)
        return 'Uspešno ste oddali datotek(e). Št. datotek: {}'.format(len(request.files))
    @staticmethod
    def check_form(form):
        name = form.get('ime')
        address = form.get('naslov-predavanja')
        subject = form.get('predmet')
        faculty = form.get('fakulteta')
        email = form.get('email')
        phone = form.get('telefon')
        keywords = form.get('kljucne-besede')
        if not name \
                or not address \
                or not subject \
                or not faculty \
                or not email \
                or not keywords:
            return 'Izpolnite vsa obvezna polja.'
        for keyword in keywords.split():
            if not keyword.isalpha():
                return 'Ključna beseda "{}" ni pravilnega formata.'.format(keyword)
        if not re.search(REGEX_EMAIL, email):
            return 'Email napačnega formata.'
        for key, val in form.items():
            if len(val) > MAXLEN_FORM:
                return 'Polje "{}" presega dolžino {} znakov.'.format(key, MAXLEN_FORM)