contact.py (2524B)
1 from datetime import datetime 2 3 from flask import request 4 from flask_restx import Namespace, Resource, fields 5 6 from MessageTagging.spam_detector import SpamDetector 7 from WebAPI.utils.mailer import Mailer 8 from database.models.messages import MessageModel 9 from database.models.spam import SpamModel 10 from database.repository import DbRepository 11 12 contact_ns = Namespace('contact', description='Contact namespace, used for integration with external sites.') 13 14 db_repository = DbRepository() 15 message_model = MessageModel() 16 spam_model = SpamModel() 17 mailer = Mailer() 18 sd = SpamDetector() 19 20 message_create_model = contact_ns.model('Contact', { 21 'name': fields.String(required=True, description='The senders name'), 22 'email': fields.String(required=True, description='The email address of the sender'), 23 'content': fields.String(required=True, description='The content of the message'), 24 }) 25 26 27 @contact_ns.route('/') 28 class ContactResource(Resource): 29 30 @contact_ns.expect(message_create_model) 31 def post(self): 32 """Contact form endpoint""" 33 try: 34 data, subject, content = prepare_data() 35 inverted_relevance = calculate_relevance(data['content']) 36 except Exception as e: 37 return {'message': 'Invalid data'}, 400 38 39 try: 40 parameters = ( 41 data['name'], 42 data['email'], 43 data.get('subject', 'No subject'), 44 data['content'], 45 inverted_relevance 46 ) 47 48 if inverted_relevance > 0.5: 49 message_model.create(parameters) 50 mailer.send_notification(subject, content) 51 else: 52 spam_model.create(parameters) 53 54 return {'message': 'Message saved successfully'}, 201 55 except Exception as e: 56 print(f"An error occurred: {e}") 57 return {'message': 'An error occurred while processing your request'}, 500 58 59 60 def calculate_relevance(content): 61 try: 62 relevance = float(sd.detect_spam(content)) 63 return round(1 - relevance, 2) 64 except Exception as e: 65 print(f"An error occurred in relevance calculation: {e}") 66 return 1 67 68 69 def prepare_data(): 70 if request.json: 71 form_data = request.json 72 else: 73 form_data = request.form 74 75 name = form_data['name'] 76 email = form_data['email'] 77 content = form_data['content'] 78 79 subject = f"{name} Has contacted you from {email} at {datetime.now().time()}" 80 return form_data, subject, content