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.

348 lines
14 KiB

  1. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  2. from odoo.addons.website_form.controllers import main as parent_controller
  3. from odoo import http
  4. from odoo.http import request
  5. from odoo.exceptions import ValidationError
  6. from psycopg2 import IntegrityError
  7. import base64
  8. import json
  9. class VerifyController(http.Controller):
  10. @http.route('/verify_email',
  11. type='http',
  12. auth="public",
  13. methods=['GET'],
  14. website=True)
  15. def verify_email(self, **kwargs):
  16. print(kwargs)
  17. if kwargs:
  18. contact_url = '%s/contact_by/%s' % (
  19. request.env['ir.config_parameter'].
  20. sudo().get_param('web.base.url'),
  21. kwargs.get("data"))
  22. link_data = base64.b64decode(kwargs.get("data")).decode("utf-8")\
  23. .split("####")
  24. email = link_data[0]
  25. contact_name = link_data[1]
  26. email_name = link_data[2]
  27. phone_name = link_data[3]
  28. letter_name = link_data[4]
  29. personal_data = link_data[5]
  30. request_gdpdr = link_data[6]
  31. crm_id = link_data[7]
  32. link_date = link_data[8]
  33. link_date = link_date.split(" ")[0].replace("-", "")
  34. import datetime
  35. today = datetime.date.today()
  36. link = datetime.datetime.strptime(link_date, "%Y%m%d").date()
  37. diff = today - link
  38. if diff.days > 5 or diff.days < 0:
  39. return "<center style='color:red'>Not valid!<br/>"\
  40. "The link you entered is either not valid or expired."\
  41. "<br/>Please request a new link.</center>"
  42. partner = request.env['res.partner'].sudo().search([
  43. ('email', '=', email),
  44. ('name', '=', contact_name)
  45. ])
  46. if not partner:
  47. partner = request.env['res.partner'].sudo().create({'name':contact_name,'email':email})
  48. if partner:
  49. for part in partner:
  50. part.is_verified = True
  51. part.last_updated = part.write_date
  52. if email_name == "True":
  53. part.email_contact = True
  54. else:
  55. part.email_contact = False
  56. if phone_name == "True":
  57. part.phone_contact = True
  58. else:
  59. part.phone_contact = False
  60. if letter_name == "True":
  61. part.letter_contact = True
  62. else:
  63. part.letter_contact = False
  64. request.env.ref(
  65. 'website_contact_extend.confirmation_email_template'
  66. ).sudo().send_mail(part.id)
  67. page_render_html = "<center style='color:green'>"\
  68. "Thank You! Your email address has been verified!"\
  69. "</center>"
  70. # print(request_gdpdr)
  71. if request_gdpdr == "True":
  72. # print("Hit")
  73. page_render_html = page_render_html + "<br/>"\
  74. "<div style='text-align: center'>Click <a href='" + contact_url + "'>here</a> to choose how you want to be contacted</div>"
  75. if personal_data == "True":
  76. request.env.ref(
  77. 'website_contact_extend.email_template_information_request'
  78. ).sudo().send_mail(int(crm_id))
  79. request.env.ref(
  80. 'website_contact_extend.requested_info_email_template'
  81. ).sudo().send_mail(int(crm_id))
  82. return page_render_html
  83. else:
  84. return "<center style='color:red'>Not valid!<br/>"\
  85. "The link you entered is either not valid or expired."\
  86. "<br/>Please request a new link.</center>"
  87. class MyFilter(parent_controller.WebsiteForm):
  88. @http.route('/website_form/<string:model_name>',
  89. type='http',
  90. auth="public",
  91. methods=['POST'],
  92. website=True)
  93. def website_form(self, model_name, **kwargs):
  94. model_record = request.env['ir.model'].sudo().search([
  95. ('model', '=', model_name),
  96. ('website_form_access', '=', True)
  97. ])
  98. request.session['review_form'] = ""
  99. request.session['form_data'] = ""
  100. request.session['form_data_dict'] = ""
  101. # request.clear_caches()
  102. if not model_record:
  103. return json.dumps(False)
  104. # need_send_email = False
  105. try:
  106. data = self.extract_data(model_record, request.params)
  107. print(data)
  108. # contact_type = False
  109. phone_contact = False
  110. letter_contact = False
  111. email_contact = False
  112. send_mail = False
  113. request_gdpdr = False
  114. index = 0
  115. for field_name, field_value in request.params.items():
  116. # if field_name == "contact_type":
  117. # contact_type = field_value
  118. if field_name == "send_mail" and field_value == "send_mail":
  119. send_mail = True
  120. if field_name == "phone_contact" \
  121. and field_value == "phone_contact":
  122. phone_contact = True
  123. if field_name == "letter_contact" \
  124. and field_value == "letter_contact":
  125. letter_contact = True
  126. if field_name == "email_contact" \
  127. and field_value == "email_contact":
  128. email_contact = True
  129. if field_name == "send_mail" \
  130. and field_value == "send_mail":
  131. send_mail = True
  132. index += 1
  133. # contact_name = data.get("record").get("contact_name")
  134. # email_from = data.get("record").get("email_from")
  135. # If we encounter an issue while extracting data
  136. except ValidationError as e:
  137. # I couldn't find a cleaner way to pass data to an exception
  138. return json.dumps({'error_fields': e.args[0]})
  139. res_partner_data = data['record']
  140. try:
  141. contact_name = data.get("record").get("contact_name")
  142. email = data.get("record").get("email_from")
  143. company = data.get("record").get("partner_name")
  144. res_part_rec = request.env['res.partner'].sudo().search([
  145. ('email', '=', email),
  146. ('company_name', '=', company)])
  147. # ('name', '=', contact_name)])
  148. # ('company_name', '=', company)
  149. res_part_email = request.env['res.partner'].sudo().search([
  150. ('email', '=', email)])
  151. if len(res_part_rec) > 0 or len(res_part_rec) == 0 and len(res_part_email) > 0:
  152. request.session['review_form'] = "/contact-us-form-review"
  153. print('Display review')
  154. for chkbx_val_out in data['custom'].split('\n'):
  155. if chkbx_val_out != '':
  156. for chkbx_val_in in chkbx_val_out.split(':'):
  157. print(chkbx_val_in)
  158. if chkbx_val_in.strip() == "request_gdpdr":
  159. request_gdpdr = True
  160. break
  161. id_record = res_part_email[0].id
  162. rec_form = data.get('record')
  163. print(rec_form)
  164. # if 'phone' not in data.get('record'):
  165. # rec_form['phone'] = ""
  166. lst_form_rec = []
  167. lst_form_rec.append(rec_form['email_from'])
  168. lst_form_rec.append(rec_form['name'])
  169. lst_form_rec.append(rec_form['partner_name'])
  170. lst_form_rec.append(rec_form['medium_id'])
  171. lst_form_rec.append(rec_form['contact_name'])
  172. lst_form_rec.append(rec_form['team_id'])
  173. lst_form_rec.append(rec_form['description'])
  174. lst_form_rec.append(rec_form['user_id'])
  175. lst_form_rec.append(request_gdpdr)
  176. lst_form_rec.append(send_mail)
  177. rec_form['send_mail'] = send_mail
  178. rec_form['request_gdpdr'] = request_gdpdr
  179. if 'phone' in rec_form:
  180. lst_form_rec.append(rec_form['phone'])
  181. else:
  182. lst_form_rec.append('')
  183. request.session['form_data'] = lst_form_rec
  184. request.session['form_data_dict'] = rec_form
  185. print(request.session['form_data'])
  186. # Some fields have additional SQL constraints
  187. # that we can't check generically
  188. # Ex: crm.lead.probability which is a float between 0 and 1
  189. # TODO: How to get the name of the erroneous field ?
  190. else:
  191. # code for adding new customer
  192. print('Hello')
  193. request.session['review_form'] = "/contactus-thank-you"
  194. res_cat = request.env['res.partner.category'].search([('name', '=', 'New')])
  195. print(res_cat)
  196. cat_id = 0
  197. if len(res_cat) == 0:
  198. print('Hit')
  199. id_part_res_cat = self.insert_record(
  200. request,
  201. request.env['ir.model'].search([('model', '=', 'res.partner.category')]),
  202. {'name': 'New', 'create_uid': request.env.uid},
  203. '',
  204. ''
  205. )
  206. cat_id = id_part_res_cat
  207. print(id_part_res_cat)
  208. else:
  209. cat_id = res_cat[0].id
  210. res_partner_dict = {}
  211. # if 'phone' not in res_partner_data:
  212. # res_partner_data['phone'] = ""
  213. res_partner_dict['name'] = res_partner_data['contact_name']
  214. res_partner_dict['display_name'] = res_partner_data['contact_name']
  215. res_partner_dict['email'] = res_partner_data['email_from']
  216. if 'phone' in res_partner_data:
  217. res_partner_dict['phone'] = res_partner_data['phone']
  218. res_partner_dict['company_name'] = res_partner_data['partner_name']
  219. res_partner_dict['category_id'] = [[6, False, [cat_id]]]
  220. res_partner_company_dict = res_partner_dict.copy()
  221. res_partner_company_dict.pop('email')
  222. res_partner_company_dict.pop('company_name')
  223. if 'phone' in res_partner_company_dict:
  224. res_partner_company_dict.pop('phone')
  225. res_partner_company_dict['name'] = res_partner_data['partner_name']
  226. res_partner_company_dict['display_name'] = res_partner_data['partner_name']
  227. res_partner_company_dict['customer'] = False
  228. res_partner_company_dict['is_company'] = True
  229. res_partner_company_dict['company_type'] = 'company'
  230. id_record_res_company = self.insert_record(
  231. request,
  232. request.env['ir.model'].search([('model', '=', 'res.partner')]),
  233. res_partner_company_dict,
  234. '',
  235. data.get('meta')
  236. )
  237. res_partner_dict['parent_id'] = id_record_res_company
  238. id_record_res = self.insert_record(
  239. request,
  240. request.env['ir.model'].search([('model', '=', 'res.partner')]),
  241. res_partner_dict,
  242. '',
  243. data.get('meta')
  244. )
  245. id_record = self.insert_record(
  246. request,
  247. model_record,
  248. data['record'],
  249. data['custom'],
  250. data.get('meta')
  251. )
  252. if id_record:
  253. self.insert_attachment(
  254. model_record,
  255. id_record,
  256. data['attachments']
  257. )
  258. for chkbx_val_out in data['custom'].split('\n'):
  259. if chkbx_val_out != '':
  260. for chkbx_val_in in chkbx_val_out.split(':'):
  261. print(chkbx_val_in)
  262. if chkbx_val_in.strip() == "request_gdpdr":
  263. request_gdpdr = True
  264. break
  265. print("RGPDR" + str(request_gdpdr))
  266. # if request_gdpdr == True:
  267. if request_gdpdr == True or send_mail == True:
  268. if id_record and model_name == "crm.lead":
  269. crm_lead_obj = request.env['crm.lead'].sudo().search([
  270. ('id', '=', id_record)]
  271. )
  272. email_data = crm_lead_obj.email_from + "####" + \
  273. crm_lead_obj.contact_name + "####" + \
  274. str(email_contact) + "####" + \
  275. str(phone_contact) + "####" + \
  276. str(letter_contact) + "####" + \
  277. str(send_mail) + "####" + \
  278. str(request_gdpdr) + "####" + \
  279. str(id_record) + "####" + \
  280. str(crm_lead_obj.create_date)
  281. print(email_data)
  282. ency_email = base64.b64encode(email_data.encode()).decode(
  283. "utf-8"
  284. )
  285. action_url = '%s/verify_email/?data=%s' % (
  286. request.env['ir.config_parameter'].
  287. sudo().get_param('web.base.url'),
  288. ency_email,
  289. )
  290. if crm_lead_obj:
  291. crm_lead_obj.email_link = action_url
  292. request.env.ref(
  293. 'website_contact_extend.verification_email_template'
  294. ).sudo().send_mail(id_record)
  295. except IntegrityError:
  296. return json.dumps(False)
  297. print(request.session['review_form'])
  298. request.session['form_builder_model_model'] = model_record.model
  299. request.session['form_builder_model'] = model_record.name
  300. request.session['form_builder_id'] = id_record
  301. return json.dumps({'id': id_record})