131 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import logging
 | |
| import re
 | |
| import traceback
 | |
| from datetime import datetime
 | |
| 
 | |
| from portal.base import UploadHandler, ContractCreator, REGEX_EMAIL
 | |
| from portal.model import db, UploadRegular
 | |
| 
 | |
| 
 | |
| class UploadHandlerRegular(UploadHandler):
 | |
| 
 | |
|     def __init__(self, **kwargs):
 | |
|         super().__init__(**kwargs)
 | |
|         self.contract_creator = ContractCreator(base_path=self.get_uploads_subdir('contracts'),
 | |
|                                                     template_path='contract/regular.html')
 | |
| 
 | |
|     def generate_upload_contract_pdf(self, upload_metadata):
 | |
|         base = self.get_uploads_subdir('contracts')
 | |
|         form_data = upload_metadata['form_data']
 | |
| 
 | |
|         files_table_str = []
 | |
|         for file_name in upload_metadata['file_names']:
 | |
|             files_table_str.append('<tr><td style="text-align: center;">')
 | |
|             files_table_str.append(file_name)
 | |
|             files_table_str.append('</td></tr>')
 | |
|         files_table_str = ''.join(files_table_str)
 | |
| 
 | |
|         data = {
 | |
|             'ime_priimek': form_data['ime'],
 | |
|             'naslov': form_data.get('naslov', ''),
 | |
|             'posta': form_data.get('posta', ''),
 | |
|             'kontakt_narocnik': self.config['CONTRACT_CLIENT_CONTACT'],
 | |
|             'kontakt_imetnikpravic': 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, corpus_name):
 | |
|         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 = UploadRegular(
 | |
|                     upload_hash=upload_metadata['upload_id'],
 | |
|                     timestamp=timestamp,
 | |
|                     name=form_data['ime'],
 | |
|                     org=form_data.get('podjetje'),
 | |
|                     address=form_data.get('naslov'),
 | |
|                     zipcode=form_data.get('posta'),
 | |
|                     email=form_data['email'],
 | |
|                     file_contract=upload_metadata['contract_file'],
 | |
|                     upload_file_hashes=sorted_f_hashes,
 | |
|                     corpus_name=corpus_name
 | |
|                    )
 | |
| 
 | |
|             db.session.add(model_obj)
 | |
|             db.session.commit()
 | |
|         except Exception:
 | |
|             traceback.print_exc()
 | |
| 
 | |
|  
 | |
|     def handle_upload(self, request, corpus_name):
 | |
|         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(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.
 | |
|         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, corpus_name)
 | |
| 
 | |
|         # Send confirmation mail along with the contract to the submitted email address.
 | |
|         self.send_confirm_mail(upload_metadata, attach_contract_file=True)
 | |
| 
 | |
|         return 'Uspešno ste oddali datotek(e). Št. datotek: {}'.format(len(request.files))
 | |
| 
 | |
|     @staticmethod
 | |
|     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 not ime:
 | |
|             return 'Prazno polje za ime.'
 | |
|         if len(ime) > 100:
 | |
|             return 'Predolgo ime.'
 | |
| 
 | |
|         if podjetje and len(podjetje) > 100:
 | |
|             return 'Predolgo ime institucije.'
 | |
| 
 | |
|         if not email:
 | |
|             return 'Prazno polje za elektronsko pošto.'
 | |
|         if len(email) > 100:
 | |
|             return 'Predolgi email naslov'
 | |
|         elif not re.search(REGEX_EMAIL, email):
 | |
|             return 'Email napačnega formata.'
 | |
| 
 | |
|         if telefon and len(telefon) > 100:
 | |
|             return 'Predolga telefonska št.'
 | |
| 
 | |
|         if naslov and len(naslov) > 100:
 | |
|             return 'Predolg  naslov.'
 | |
| 
 | |
|         if posta and len(posta) > 100:
 | |
|             return 'Predolga pošta'
 | |
| 
 | |
|         return None
 | |
| 
 |