123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- import werkzeug
- from openerp.http import request
- from openerp.addons.web import http
- from openerp.addons.website.controllers.main import Website
- from openerp.addons.base.ir.ir_qweb import QWebTemplateNotFound
- from openerp.addons.website_less.ir_qweb import AssetsBundle
- from openerp.addons.web.controllers.main import Home, make_conditional, BUNDLE_MAXAGE
- class Home_less(Home):
- @http.route([
- '/web/js/<xmlid>',
- '/web/js/<xmlid>/<version>',
- ], type='http', auth='public')
- def js_bundle(self, xmlid, version=None, **kw):
- try:
- bundle = AssetsBundle(xmlid)
- except QWebTemplateNotFound:
- return request.not_found()
- response = request.make_response(bundle.js(), [('Content-Type', 'application/javascript')])
- return make_conditional(response, bundle.last_modified, max_age=BUNDLE_MAXAGE)
- @http.route([
- '/web/css/<xmlid>',
- '/web/css/<xmlid>/<version>',
- ], type='http', auth='public')
- def css_bundle(self, xmlid, version=None, **kw):
- try:
- bundle = AssetsBundle(xmlid)
- except QWebTemplateNotFound:
- return request.not_found()
- response = request.make_response(bundle.css(), [('Content-Type', 'text/css')])
- return make_conditional(response, bundle.last_modified, max_age=BUNDLE_MAXAGE)
- class Website_less(Website):
- #------------------------------------------------------
- # Themes
- #------------------------------------------------------
- def get_view_ids(self, xml_ids):
- ids = []
- imd = request.registry['ir.model.data']
- for xml_id in xml_ids:
- if "." in xml_id:
- xml = xml_id.split(".")
- view_model, id = imd.get_object_reference(request.cr, request.uid, xml[0], xml[1])
- else:
- id = int(xml_id)
- ids.append(id)
- return ids
- @http.route(['/website/theme_customize_get'], type='json', auth="public", website=True)
- def theme_customize_get(self, xml_ids):
- view = request.registry["ir.ui.view"]
- enable = []
- disable = []
- ids = self.get_view_ids(xml_ids)
- context = dict(request.context or {}, active_test=True)
- for v in view.browse(request.cr, request.uid, ids, context=context):
- if v.active:
- enable.append(v.xml_id)
- else:
- disable.append(v.xml_id)
- return [enable, disable]
- @http.route(['/website/theme_customize'], type='json', auth="public", website=True)
- def theme_customize(self, enable, disable):
- """ enable or Disable lists of ``xml_id`` of the inherit templates
- """
- cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
- view = pool["ir.ui.view"]
- context = dict(request.context or {}, active_test=True)
- def set_active(ids, active):
- if ids:
- view.write(cr, uid, self.get_view_ids(ids), {'active': active}, context=context)
- set_active(disable, False)
- set_active(enable, True)
- return True
- @http.route(['/website/theme_customize_reload'], type='http', auth="public", website=True)
- def theme_customize_reload(self, href, enable, disable):
- self.theme_customize(enable and enable.split(",") or [], disable and disable.split(",") or [])
- return request.redirect(href + ("&theme=true" if "#" in href else "#theme=true"))
- @http.route(['/website/multi_render'], type='json', auth="public", website=True)
- def multi_render(self, ids_or_xml_ids, values=None):
- res = {}
- for id_or_xml_id in ids_or_xml_ids:
- res[id_or_xml_id] = request.registry["ir.ui.view"].render(request.cr, request.uid,
- id_or_xml_id, values=values, engine='ir.qweb', context=request.context)
- return res
- @http.route([
- '/website/image',
- '/website/image/<xmlid>',
- '/website/image/<xmlid>/<field>',
- '/website/image/<xmlid>/<int:max_width>x<int:max_height>',
- '/website/image/<xmlid>/<field>/<int:max_width>x<int:max_height>',
- '/website/image/<model>/<id>/<field>',
- '/website/image/<model>/<id>/<field>/<int:max_width>x<int:max_height>',
- ], auth="public", website=True)
- def website_image(self, model=None, id=None, field=None, xmlid=None, max_width=None, max_height=None):
- """ Fetches the requested field and ensures it does not go above
- (max_width, max_height), resizing it if necessary.
- If the record is not found or does not have the requested field,
- returns a placeholder image via :meth:`~.placeholder`.
- Sets and checks conditional response parameters:
- * :mailheader:`ETag` is always set (and checked)
- * :mailheader:`Last-Modified is set iif the record has a concurrency
- field (``__last_update``)
- The requested field is assumed to be base64-encoded image data in
- all cases.
- xmlid can be used to load the image. But the field image must by base64-encoded
- """
- if xmlid and "." in xmlid:
- try:
- record = request.env['ir.model.data'].xmlid_to_object(xmlid)
- model, id = record._name, record.id
- except:
- raise werkzeug.exceptions.NotFound()
- env.ref
- if model == 'ir.attachment' and not field:
- if record.sudo().type == 'url':
- field = "url"
- else:
- field = "datas"
- elif model and id and field:
- idsha = id.split('_')
- try:
- id = idsha[0]
- except IndexError:
- raise werkzeug.exceptions.NotFound()
- else:
- raise werkzeug.exceptions.NotFound()
- response = werkzeug.wrappers.Response()
- return request.registry['website']._image(
- request.cr, request.uid, model, id, field, response, max_width, max_height)
|