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.

152 lines
6.7 KiB

  1. from odoo.addons.website_form.controllers import main as parent_controller
  2. from odoo import http
  3. from odoo.http import request
  4. from odoo.exceptions import ValidationError
  5. from psycopg2 import IntegrityError
  6. import base64
  7. import json
  8. class VerifyController(http.Controller):
  9. @http.route('/verify_email',
  10. type='http',
  11. auth="public",
  12. methods=['GET'],
  13. website=True)
  14. def verify_email(self, **kwargs):
  15. if kwargs:
  16. link_data = base64.b64decode(kwargs.get("data")).decode("utf-8")\
  17. .split("####")
  18. email = link_data[0]
  19. contact_name = link_data[1]
  20. email_name = link_data[2]
  21. phone_name = link_data[3]
  22. letter_name = link_data[4]
  23. link_date = link_data[5]
  24. link_date = link_date.split(" ")[0].replace("-", "")
  25. import datetime
  26. today = datetime.date.today()
  27. link = datetime.datetime.strptime(link_date, "%Y%m%d").date()
  28. diff = today - link
  29. if diff.days > 5 or diff.days < 0:
  30. return "<center style='color:red'>Not valid!<br/>" \
  31. "The link you entered is either not valid or expired."\
  32. "<br/>Please request a new link.</center>"
  33. partner = request.env['res.partner'].sudo().search\
  34. ([('email', '=', email), ('name', '=', contact_name)])
  35. if partner:
  36. for part in partner:
  37. part.is_verified = True
  38. part.last_updated = part.write_date
  39. if email_name == "True":
  40. part.email_contact = True
  41. else:
  42. part.email_contact = False
  43. if phone_name == "True":
  44. part.phone_contact = True
  45. else:
  46. part.phone_contact = False
  47. if letter_name == "True":
  48. part.letter_contact = True
  49. else:
  50. part.letter_contact = False
  51. template = request.env.ref('website_contact_extend.'
  52. 'confirmation_email_template')\
  53. .sudo().send_mail(part.id)
  54. return "<center style='color:green'>" \
  55. "Thank You! Your email address has been verified!" \
  56. "</center>"
  57. else:
  58. return "<center style='color:red'>Not valid!<br/>" \
  59. "The link you entered is either not valid or expired."\
  60. "<br/>Please request a new link.</center>"
  61. class MyFilter(parent_controller.WebsiteForm):
  62. @http.route('/website_form/<string:model_name>',
  63. type='http',
  64. auth="public",
  65. methods=['POST'],
  66. website=True)
  67. def website_form(self, model_name, **kwargs):
  68. model_record = request.env['ir.model'].sudo()\
  69. .search([('model', '=', model_name),
  70. ('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" \
  88. and field_value == "phone_contact":
  89. phone_contact = True
  90. if field_name == "letter_contact" \
  91. and field_value == "letter_contact":
  92. letter_contact = True
  93. if field_name == "email_contact" \
  94. and field_value == "email_contact":
  95. email_contact = True
  96. index += 1
  97. contact_name = data.get("record").get("contact_name")
  98. email_from = data.get("record").get("email_from")
  99. # If we encounter an issue while extracting data
  100. except ValidationError as e:
  101. # I couldn't find a cleaner way to pass data to an exception
  102. return json.dumps({'error_fields': e.args[0]})
  103. try:
  104. id_record = self.insert_record(request,
  105. model_record,
  106. data['record'],
  107. data['custom'],
  108. data.get('meta'))
  109. if id_record:
  110. self.insert_attachment(model_record,
  111. id_record,
  112. data['attachments'])
  113. if id_record and send_mail and model_name == "crm.lead":
  114. crm_lead_obj = request.env['crm.lead'].sudo()\
  115. .search([('id', '=', id_record)])
  116. email_data = crm_lead_obj.email_from + "####" +\
  117. crm_lead_obj.contact_name + "####" +\
  118. str(email_contact) + "####" +\
  119. str(phone_contact) + "####" +\
  120. str(letter_contact)+"####" +\
  121. str(crm_lead_obj.create_date)
  122. ency_email = base64.b64encode(email_data.encode())\
  123. .decode("utf-8")
  124. action_url = '%s/verify_email/?data=%s' % (
  125. request.env['ir.config_parameter'].
  126. sudo().get_param('web.base.url'),
  127. ency_email,
  128. )
  129. if crm_lead_obj:
  130. crm_lead_obj.email_link = action_url
  131. template = request.env.ref('website_contact_extend.'
  132. 'verification_email_template')\
  133. .send_mail(id_record)
  134. # Some fields have additional SQL constraints
  135. # that we can't check generically
  136. # Ex: crm.lead.probability which is a float between 0 and 1
  137. # TODO: How to get the name of the erroneous field ?
  138. except IntegrityError:
  139. return json.dumps(False)
  140. request.session['form_builder_model_model'] = model_record.model
  141. request.session['form_builder_model'] = model_record.name
  142. request.session['form_builder_id'] = id_record
  143. return json.dumps({'id': id_record})