|
|
# -*- coding: utf-8 -*- from odoo import api, fields, models, tools, _ from odoo.addons.website_form.controllers import main as parent_controller from odoo import http from odoo.http import request import json from odoo.exceptions import ValidationError from psycopg2 import IntegrityError import base64
class CrmLead(models.Model): _inherit = "crm.lead"
email_link = fields.Char("Email verification link")
class ResContacts(models.Model): _inherit = "res.partner"
contact_type = fields.Selection( [('no_contact', 'I do not want to be contacted.'), ('email_contact', 'I only want to be contacted by Email.'), ('phone_contact', 'I only want to be contacted by Phone.'), ('email_phone_contact', 'You can contact me by Email or Phone.') ], string='Contact Type', default='email_contact', help="Which way user want to be contacted.") letter_contact = fields.Boolean("Letter Contact") phone_contact = fields.Boolean("Phone Contact") email_contact = fields.Boolean("Email Contact") is_verified = fields.Boolean("Verified Email") last_updated = fields.Datetime("Letzte Aktualisierung")
class VerifyController(http.Controller): @http.route('/verify_email', type='http', auth="public", methods=['GET'], website=True) def verify_email(self, **kwargs): if kwargs: link_data = base64.b64decode(kwargs.get("data")).decode("utf-8").split("####") email = link_data[0] contact_name = link_data[1] email_name = link_data[2] phone_name = link_data[3] letter_name = link_data[4] link_date = link_data[5] link_date = link_date.split(" ")[0].replace("-","") import datetime today = datetime.date.today() link = datetime.datetime.strptime(link_date,"%Y%m%d").date() diff = today - link if diff.days > 5 or diff.days < 0: return "<center style='color:red'>Der link ist leider nicht gültig.<br/>Der von Ihnen eingegebene Link ist nicht gültig, oder ist abgelaufen.<br/>Bitte fordern Sie einen neuen Link an.</center>" partner = request.env['res.partner'].sudo().search([('email','=',email),('name','=',contact_name)]) if partner: for part in partner: part.is_verified = True part.last_updated = part.write_date if email_name == "True": part.email_contact = True else: part.email_contact = False if phone_name == "True": part.phone_contact = True else: part.phone_contact = False if letter_name == "True": part.letter_contact = True else: part.letter_contact = False template = request.env.ref('itis_gdpr_extension.confirmation_email_template').sudo().send_mail(part.id) return "<center style='color:green'>Vielen Dank! Ihre E-Mail-Adresse wurde verifiziert!</center>" else: return "<center style='color:red'>Der link ist leider nicht gültig.<br/>Der von Ihnen eingegebene Link ist nicht gültig, oder ist abgelaufen.<br/>Bitte fordern Sie einen neuen Link an.</center>"
class MyFilter(parent_controller.WebsiteForm):
@http.route('/website_form/<string:model_name>', type='http', auth="public", methods=['POST'], website=True) def website_form(self, model_name, **kwargs): model_record = request.env['ir.model'].sudo().search([('model', '=', model_name), ('website_form_access', '=', True)]) if not model_record: return json.dumps(False) need_send_email = False try: data = self.extract_data(model_record, request.params) contact_type=False phone_contact = False letter_contact = False email_contact = False send_mail = True index = 0 for field_name, field_value in request.params.items(): if field_name=="contact_type": contact_type = field_value if field_name=="send_mail" and field_value=="send_mail": send_mail=True if field_name=="phone_contact" and field_value=="phone_contact": phone_contact=True if field_name=="letter_contact" and field_value=="letter_contact": letter_contact=True if field_name=="email_contact" and field_value=="email_contact": email_contact=True index = index + 1 contact_name = data.get("record").get("contact_name") email_from = data.get("record").get("email_from") #if data.get("record",False): #partner_records = request.env['res.partner'].sudo().search([('name', '=', contact_name), ('email', '=', email_from)]) #for partner_record in partner_records: #if partner_record: #if partner_record.is_verified: #partner_record.contact_type = contact_type #partner_record.phone_contact = phone_contact #partner_record.email_contact = email_contact #partner_record.letter_contact = letter_contact #if not partner_record.is_verified: # need_send_email = True
# If we encounter an issue while extracting data except ValidationError as e: # I couldn't find a cleaner way to pass data to an exception return json.dumps({'error_fields' : e.args[0]})
try: id_record = self.insert_record(request, model_record, data['record'], data['custom'], data.get('meta')) if id_record: self.insert_attachment(model_record, id_record, data['attachments']) if id_record and send_mail and model_name=="crm.lead": crm_lead_obj = request.env['crm.lead'].sudo().search([('id','=',id_record)]) email_data = crm_lead_obj.email_from +"####"+crm_lead_obj.contact_name+"####"+str(email_contact)+"####"+str(phone_contact)+"####"+str(letter_contact)+"####"+str(crm_lead_obj.create_date) ency_email = base64.b64encode(email_data.encode()).decode("utf-8") action_url = '%s/verify_email/?data=%s'%( request.env['ir.config_parameter'].sudo().get_param('web.base.url'), ency_email, ) if crm_lead_obj: crm_lead_obj.email_link = action_url template = request.env.ref('itis_gdpr_extension.verification_email_template').send_mail(id_record) # Some fields have additional SQL constraints that we can't check generically # Ex: crm.lead.probability which is a float between 0 and 1 # TODO: How to get the name of the erroneous field ? except IntegrityError: return json.dumps(False)
request.session['form_builder_model_model'] = model_record.model request.session['form_builder_model'] = model_record.name request.session['form_builder_id'] = id_record
return json.dumps({'id': id_record})
|