[MERGE] forward port of branch 8.0 up to 591e329
[odoo/odoo.git] / addons / website_crm / controllers / main.py
1 # -*- coding: utf-8 -*-
2 import base64
3
4 import werkzeug
5 import werkzeug.urls
6
7 from openerp import http, SUPERUSER_ID
8 from openerp.http import request
9 from openerp.tools.translate import _
10
11
12 class contactus(http.Controller):
13
14     def generate_google_map_url(self, street, city, city_zip, country_name):
15         url = "http://maps.googleapis.com/maps/api/staticmap?center=%s&sensor=false&zoom=8&size=298x298" % werkzeug.url_quote_plus(
16             '%s, %s %s, %s' % (street, city, city_zip, country_name)
17         )
18         return url
19
20     @http.route(['/page/website.contactus', '/page/contactus'], type='http', auth="public", website=True)
21     def contact(self, **kwargs):
22         values = {}
23         for field in ['description', 'partner_name', 'phone', 'contact_name', 'email_from', 'name']:
24             if kwargs.get(field):
25                 values[field] = kwargs.pop(field)
26         values.update(kwargs=kwargs.items())
27         return request.website.render("website.contactus", values)
28
29     def create_lead(self, request, values, kwargs):
30         """ Allow to be overrided """
31         return request.registry['crm.lead'].create(request.cr, SUPERUSER_ID, values, request.context)
32
33     def preRenderThanks(self, values, kwargs):
34         """ Allow to be overrided """
35         company = request.website.company_id
36         return {
37             'google_map_url': self.generate_google_map_url(company.street, company.city, company.zip, company.country_id and company.country_id.name_get()[0][1] or ''),
38             '_values': values,
39             '_kwargs': kwargs,
40         }
41
42     def get_contactus_response(self, values, kwargs):
43         values = self.preRenderThanks(values, kwargs)
44         return request.website.render(kwargs.get("view_callback", "website_crm.contactus_thanks"), values)
45
46     @http.route(['/crm/contactus'], type='http', auth="public", website=True)
47     def contactus(self, **kwargs):
48         def dict_to_str(title, dictvar):
49             ret = "\n\n%s" % title
50             for field in dictvar:
51                 ret += "\n%s" % field
52             return ret
53
54         _TECHNICAL = ['show_info', 'view_from', 'view_callback']  # Only use for behavior, don't stock it
55         _BLACKLIST = ['id', 'create_uid', 'create_date', 'write_uid', 'write_date', 'user_id', 'active']  # Allow in description
56         _REQUIRED = ['name', 'contact_name', 'email_from', 'description']  # Could be improved including required from model
57
58         post_file = []  # List of file to add to ir_attachment once we have the ID
59         post_description = []  # Info to add after the message
60         values = {}
61
62         for field_name, field_value in kwargs.items():
63             if hasattr(field_value, 'filename'):
64                 post_file.append(field_value)
65             elif field_name in request.registry['crm.lead']._fields and field_name not in _BLACKLIST:
66                 values[field_name] = field_value
67             elif field_name not in _TECHNICAL:  # allow to add some free fields or blacklisted field like ID
68                 post_description.append("%s: %s" % (field_name, field_value))
69
70         if "name" not in kwargs and values.get("contact_name"):  # if kwarg.name is empty, it's an error, we cannot copy the contact_name
71             values["name"] = values.get("contact_name")
72         # fields validation : Check that required field from model crm_lead exists
73         error = set(field for field in _REQUIRED if not values.get(field))
74
75         if error:
76             values = dict(values, error=error, kwargs=kwargs.items())
77             return request.website.render(kwargs.get("view_from", "website.contactus"), values)
78
79         try:
80             values['medium_id'] = request.registry['ir.model.data'].get_object_reference(request.cr, SUPERUSER_ID, 'crm', 'crm_tracking_medium_website')[1]
81             values['team_id'] = request.registry['ir.model.data'].xmlid_to_res_id(request.cr, SUPERUSER_ID, 'website.salesteam_website_sales')
82         except ValueError:
83             pass
84
85         # description is required, so it is always already initialized
86         if post_description:
87             values['description'] += dict_to_str(_("Custom Fields: "), post_description)
88
89         if kwargs.get("show_info"):
90             post_description = []
91             environ = request.httprequest.headers.environ
92             post_description.append("%s: %s" % ("IP", environ.get("REMOTE_ADDR")))
93             post_description.append("%s: %s" % ("USER_AGENT", environ.get("HTTP_USER_AGENT")))
94             post_description.append("%s: %s" % ("ACCEPT_LANGUAGE", environ.get("HTTP_ACCEPT_LANGUAGE")))
95             post_description.append("%s: %s" % ("REFERER", environ.get("HTTP_REFERER")))
96             values['description'] += dict_to_str(_("Environ Fields: "), post_description)
97
98         lead_id = self.create_lead(request, dict(values, user_id=False), kwargs)
99         values.update(lead_id=lead_id)
100         if lead_id:
101             for field_value in post_file:
102                 attachment_value = {
103                     'name': field_value.filename,
104                     'res_name': field_value.filename,
105                     'res_model': 'crm.lead',
106                     'res_id': lead_id,
107                     'datas': base64.encodestring(field_value.read()),
108                     'datas_fname': field_value.filename,
109                 }
110                 request.registry['ir.attachment'].create(request.cr, SUPERUSER_ID, attachment_value, context=request.context)
111
112         return self.get_contactus_response(values, kwargs)