[IMP] website: refactoring + create method pager and template pager. Used by website_...
[odoo/odoo.git] / addons / website / website.py
1 # -*- coding: utf-8 -*-
2 import simplejson
3
4 import openerp
5 from openerp.osv import osv
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
12
13 def auth_method_public():
14     registry = openerp.modules.registry.RegistryManager.get(request.db)
15     if not request.session.uid:
16         request.uid = registry['website'].get_public_user().id
17     else:
18         request.uid = request.session.uid
19 http.auth_methods['public'] = auth_method_public
20
21
22 def urlplus(url, params):
23     if not params:
24         return url
25     url += "?"
26     for k,v in params.items():
27         url += "%s=%s&" % (k, urllib.quote_plus(v))
28     return url
29
30 class website(osv.osv):
31     _name = "website" # Avoid website.website convention for conciseness (for new api). Got a special authorization from xmo and rco
32     _description = "Website"
33
34     public_user = None
35
36     def get_public_user(self):
37         if not self.public_user:
38             ref = request.registry['ir.model.data'].get_object_reference(request.cr, openerp.SUPERUSER_ID, 'website', 'public_user')
39             self.public_user = request.registry[ref[0]].browse(request.cr, openerp.SUPERUSER_ID, ref[1])
40         return self.public_user
41
42     def get_rendering_context(self, additional_values=None):
43         debug = 'debug' in request.params
44         is_public_user = request.uid == self.get_public_user().id
45         values = {
46             'debug': debug,
47             'is_public_user': is_public_user,
48             'editable': not is_public_user,
49             'request': request,
50             'registry': request.registry,
51             'cr': request.cr,
52             'uid': request.uid,
53             'host_url': request.httprequest.host_url,
54             'res_company': request.registry['res.company'].browse(request.cr, openerp.SUPERUSER_ID, 1),
55             'json': simplejson,
56         }
57         if values['editable']:
58             values.update({
59                 'script': "\n".join(['<script type="text/javascript" src="%s"></script>' % i for i in main.manifest_list('js', db=request.db, debug=debug)]),
60                 'css': "\n".join('<link rel="stylesheet" href="%s">' % i for i in main.manifest_list('css', db=request.db, debug=debug))
61             })
62         if additional_values:
63             values.update(additional_values)
64         return values
65
66     def render(self, template, values={}):
67         context = {
68             'inherit_branding': values.get('editable', False),
69         }
70         return request.registry.get("ir.ui.view").render(request.cr, request.uid, template, values, context=context)
71
72     def pager(self, url, total, page=1, step=30, scope=5):
73         # Compute Pager
74         d = {}
75         d["page_count"] = int(math.ceil(total / step))
76
77         page = max(1, min(int(page), d["page_count"]))
78
79         d["offset"] = (page-1) * step
80         scope -= 1
81
82         pmin = max(page - int(math.floor(scope/2)), 1)
83         pmax = min(pmin + scope, d["page_count"])
84
85         if pmax - pmin < scope:
86             pmin = pmax - scope > 0 and pmax - scope or 1
87
88
89         d["page"] = {'url': "%spage/%s/" % (url, page), 'num': page}
90         d["page_start"] = {'url': "%spage/%s/" % (url, pmin), 'num': pmin}
91         d["page_end"] = {'url': "%spage/%s/" % (url, min(pmax, page+1)), 'num': min(pmax, page+1)}
92         d["pages"] = []
93         for page in range(pmin, pmax+1):
94             d["pages"].append({'url': "%spage/%s/" % (url, page), 'num': page})
95
96         return d