You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
7.4 KiB

  1. # -*- coding: utf-8 -*-
  2. from odoo import api, fields, models, tools, _
  3. from odoo.addons.website_form.controllers import main as parent_controller
  4. from odoo import http
  5. from odoo.http import request
  6. import json
  7. from odoo.exceptions import ValidationError
  8. from psycopg2 import IntegrityError
  9. import base64
  10. class CrmLead(models.Model):
  11. _inherit = "crm.lead"
  12. email_link = fields.Char("Email verification link")
  13. class ResContacts(models.Model):
  14. _inherit = "res.partner"
  15. contact_type = fields.Selection(
  16. [('no_contact', 'I do not want to be contacted.'),
  17. ('email_contact', 'I only want to be contacted by Email.'),
  18. ('phone_contact', 'I only want to be contacted by Phone.'),
  19. ('email_phone_contact', 'You can contact me by Email or Phone.')
  20. ], string='Contact Type',
  21. default='email_contact',
  22. help="Which way user want to be contacted.")
  23. letter_contact = fields.Boolean("Letter Contact")
  24. phone_contact = fields.Boolean("Phone Contact")
  25. email_contact = fields.Boolean("Email Contact")
  26. is_verified = fields.Boolean("Verified Email")
  27. last_updated = fields.Datetime("Letzte Aktualisierung")
  28. class VerifyController(http.Controller):
  29. @http.route('/verify_email', type='http', auth="public", methods=['GET'], website=True)
  30. def verify_email(self, **kwargs):
  31. if kwargs:
  32. link_data = base64.b64decode(kwargs.get("data")).decode("utf-8").split("####")
  33. email = link_data[0]
  34. contact_name = link_data[1]
  35. email_name = link_data[2]
  36. phone_name = link_data[3]
  37. letter_name = link_data[4]
  38. link_date = link_data[5]
  39. link_date = link_date.split(" ")[0].replace("-","")
  40. import datetime
  41. today = datetime.date.today()
  42. link = datetime.datetime.strptime(link_date,"%Y%m%d").date()
  43. diff = today - link
  44. if diff.days > 5 or diff.days < 0:
  45. 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>"
  46. partner = request.env['res.partner'].sudo().search([('email','=',email),('name','=',contact_name)])
  47. if partner:
  48. for part in partner:
  49. part.is_verified = True
  50. part.last_updated = part.write_date
  51. if email_name == "True":
  52. part.email_contact = True
  53. else:
  54. part.email_contact = False
  55. if phone_name == "True":
  56. part.phone_contact = True
  57. else:
  58. part.phone_contact = False
  59. if letter_name == "True":
  60. part.letter_contact = True
  61. else:
  62. part.letter_contact = False
  63. template = request.env.ref('itis_gdpr_extension.confirmation_email_template').sudo().send_mail(part.id)
  64. return "<center style='color:green'>Vielen Dank! Ihre E-Mail-Adresse wurde verifiziert!</center>"
  65. else:
  66. 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>"
  67. class MyFilter(parent_controller.WebsiteForm):
  68. @http.route('/website_form/<string:model_name>', type='http', auth="public", methods=['POST'], website=True)
  69. def website_form(self, model_name, **kwargs):
  70. model_record = request.env['ir.model'].sudo().search([('model', '=', model_name), ('website_form_access', '=', True)])
  71. if not model_record:
  72. return json.dumps(False)
  73. need_send_email = False
  74. try:
  75. data = self.extract_data(model_record, request.params)
  76. contact_type=False
  77. phone_contact = False
  78. letter_contact = False
  79. email_contact = False
  80. send_mail = True
  81. index = 0
  82. for field_name, field_value in request.params.items():
  83. if field_name=="contact_type":
  84. contact_type = field_value
  85. if field_name=="send_mail" and field_value=="send_mail":
  86. send_mail=True
  87. if field_name=="phone_contact" and field_value=="phone_contact":
  88. phone_contact=True
  89. if field_name=="letter_contact" and field_value=="letter_contact":
  90. letter_contact=True
  91. if field_name=="email_contact" and field_value=="email_contact":
  92. email_contact=True
  93. index = index + 1
  94. contact_name = data.get("record").get("contact_name")
  95. email_from = data.get("record").get("email_from")
  96. #if data.get("record",False):
  97. #partner_records = request.env['res.partner'].sudo().search([('name', '=', contact_name), ('email', '=', email_from)])
  98. #for partner_record in partner_records:
  99. #if partner_record:
  100. #if partner_record.is_verified:
  101. #partner_record.contact_type = contact_type
  102. #partner_record.phone_contact = phone_contact
  103. #partner_record.email_contact = email_contact
  104. #partner_record.letter_contact = letter_contact
  105. #if not partner_record.is_verified:
  106. # need_send_email = True
  107. # If we encounter an issue while extracting data
  108. except ValidationError as e:
  109. # I couldn't find a cleaner way to pass data to an exception
  110. return json.dumps({'error_fields' : e.args[0]})
  111. try:
  112. id_record = self.insert_record(request, model_record, data['record'], data['custom'], data.get('meta'))
  113. if id_record:
  114. self.insert_attachment(model_record, id_record, data['attachments'])
  115. if id_record and send_mail and model_name=="crm.lead":
  116. crm_lead_obj = request.env['crm.lead'].sudo().search([('id','=',id_record)])
  117. 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)
  118. ency_email = base64.b64encode(email_data.encode()).decode("utf-8")
  119. action_url = '%s/verify_email/?data=%s'%(
  120. request.env['ir.config_parameter'].sudo().get_param('web.base.url'),
  121. ency_email,
  122. )
  123. if crm_lead_obj:
  124. crm_lead_obj.email_link = action_url
  125. template = request.env.ref('itis_gdpr_extension.verification_email_template').send_mail(id_record)
  126. # Some fields have additional SQL constraints that we can't check generically
  127. # Ex: crm.lead.probability which is a float between 0 and 1
  128. # TODO: How to get the name of the erroneous field ?
  129. except IntegrityError:
  130. return json.dumps(False)
  131. request.session['form_builder_model_model'] = model_record.model
  132. request.session['form_builder_model'] = model_record.name
  133. request.session['form_builder_id'] = id_record
  134. return json.dumps({'id': id_record})