[IMP] add new module website_project
[odoo/odoo.git] / addons / website / website.py
1 # -*- coding: utf-8 -*-
2 import simplejson
3
4 import openerp
5 from openerp.osv import osv, orm
6 from openerp.addons.web import http
7 from openerp.addons.web.controllers import main
8 from openerp.addons.web.http import request
9 import urllib
10 import math
11 import traceback
12
13 import logging
14 logger = logging.getLogger(__name__)
15
16
17 def auth_method_public():
18     registry = openerp.modules.registry.RegistryManager.get(request.db)
19     if not request.session.uid:
20         request.uid = registry['website'].get_public_user().id
21     else:
22         request.uid = request.session.uid
23 http.auth_methods['public'] = auth_method_public
24
25
26 def urlplus(url, params):
27     if not params:
28         return url
29     url += "?"
30     for k,v in params.items():
31         url += "%s=%s&" % (k, urllib.quote_plus(str(v)))
32     return url
33
34
35 class website(osv.osv):
36     _name = "website" # Avoid website.website convention for conciseness (for new api). Got a special authorization from xmo and rco
37     _description = "Website"
38
39     public_user = None
40
41     def get_public_user(self):
42         if not self.public_user:
43             ref = request.registry['ir.model.data'].get_object_reference(request.cr, openerp.SUPERUSER_ID, 'website', 'public_user')
44             self.public_user = request.registry[ref[0]].browse(request.cr, openerp.SUPERUSER_ID, ref[1])
45         return self.public_user
46
47     def get_rendering_context(self, additional_values=None):
48         debug = 'debug' in request.params
49         is_public_user = request.uid == self.get_public_user().id
50         values = {
51             'debug': debug,
52             'is_public_user': is_public_user,
53             'editable': not is_public_user,
54             'request': request,
55             'registry': request.registry,
56             'cr': request.cr,
57             'uid': request.uid,
58             'host_url': request.httprequest.host_url,
59             'res_company': request.registry['res.company'].browse(request.cr, openerp.SUPERUSER_ID, 1),
60             'json': simplejson,
61         }
62         if values['editable']:
63             values.update({
64                 'script': "\n".join(['<script type="text/javascript" src="%s"></script>' % i for i in main.manifest_list('js', db=request.db, debug=debug)]),
65                 'css': "\n".join('<link rel="stylesheet" href="%s">' % i for i in main.manifest_list('css', db=request.db, debug=debug))
66             })
67         if additional_values:
68             values.update(additional_values)
69         return values
70
71     def render(self, template, values={}):
72         context = {
73             'inherit_branding': values.get('editable', False),
74         }
75         try:
76             return request.registry.get("ir.ui.view").render(request.cr, request.uid, template, values, context=context)
77         except (osv.except_osv, orm.except_orm), err:
78             logger.error(err)
79             values['error'] = err[1]
80             return self.render('website.401', values)
81         # except ValueError:
82         #     logger.error("Website Rendering Error.\n\n%s" % (traceback.format_exc()))
83         #     return self.render('website.404', values)
84         except Exception:
85             logger.error("Website Rendering Error.\n\n%s" % (traceback.format_exc()))
86             if values['editable']:
87                 values['traceback'] = traceback.format_exc()
88                 return self.render('website.500', values)
89             else:
90                 return self.render('website.404', values)
91
92     def pager(self, url, total, page=1, step=30, scope=5, url_args=None):
93         # Compute Pager
94         d = {}
95         d["page_count"] = int(math.ceil(float(total) / step))
96
97         page = max(1, min(int(page), d["page_count"]))
98
99         d["offset"] = (page-1) * step
100         scope -= 1
101
102         pmin = max(page - int(math.floor(scope/2)), 1)
103         pmax = min(pmin + scope, d["page_count"])
104
105         if pmax - pmin < scope:
106             pmin = pmax - scope > 0 and pmax - scope or 1
107
108         def get_url(page):
109             _url = "%spage/%s/" % (url, page)
110             if url_args:
111                 _url = "%s?%s" % (_url, urllib.urlencode(url_args))
112             return _url
113
114         d["page"] = {'url': get_url(page), 'num': page}
115         d["page_start"] = {'url': get_url(pmin), 'num': pmin}
116         d["page_end"] = {'url': get_url(min(pmax, page+1)), 'num': min(pmax, page+1)}
117         d["pages"] = []
118         for page in range(pmin, pmax+1):
119             d["pages"].append({'url': get_url(page), 'num': page})
120
121         return d
122
123
124 class res_partner(osv.osv):
125     _inherit = "res.partner"
126
127     def google_map_img(self, cr, uid, ids, zoom=8, width=298, height=298, context=None):
128         partner = self.browse(cr, uid, ids[0], context=context)
129         params = {
130             'center': '%s, %s %s, %s' % (partner.street, partner.city, partner.zip, partner.country_id and partner.country_id.name_get()[0][1] or ''),
131             'size': "%sx%s" % (height, width),
132             'zoom': zoom,
133             'sensor': 'false',
134         }
135         return urlplus('http://maps.googleapis.com/maps/api/staticmap' , params)
136
137     def google_map_link(self, cr, uid, ids, zoom=8, context=None):
138         partner = self.browse(cr, uid, ids[0], context=context)
139         params = {
140             'q': '%s, %s %s, %s' % (partner.street, partner.city, partner.zip, partner.country_id and partner.country_id.name_get()[0][1] or ''),
141         }
142         return urlplus('https://maps.google.be/maps' , params)