From af08367290e15f61a1c14cb1010f2941a0eaf1e2 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 5 Aug 2013 18:16:00 +0200 Subject: [PATCH] [ADD] Added website osv object + refactoring bzr revid: fme@openerp.com-20130805161600-abms35e0vk47f3i1 --- addons/website/controllers/main.py | 63 ++-------- addons/website/website.py | 37 ++++-- addons/website_crm/controllers/main.py | 12 +- addons/website_event/controllers/main.py | 20 ++-- addons/website_hr/controllers/main.py | 13 +-- addons/website_mail/controllers/main.py | 9 +- addons/website_sale/controllers/main.py | 143 ++++++++++++----------- addons/website_sale/views/ecommerce.xml | 2 +- 8 files changed, 135 insertions(+), 164 deletions(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 83af820b976..a347f789f7c 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -17,30 +17,6 @@ import werkzeug.wrappers logger = logging.getLogger(__name__) -def template_values(): - script = "\n".join(['' % i for i in manifest_list('js', db=request.db)]) - css = "\n".join('' % i for i in manifest_list('css', db=request.db)) - try: - request.session.check_security() - loggued = True - uid = request.session._uid - except http.SessionExpiredException: - loggued = False - uid = openerp.SUPERUSER_ID - - values = { - 'loggued': loggued, - 'editable': loggued, - 'request': request, - 'registry': request.registry, - 'cr': request.cr, - 'uid': uid, - 'script': script, - 'css': css, - 'host_url': request.httprequest.host_url, - } - return values - class Website(openerp.addons.web.controllers.main.Home): @http.route('/', type='http', auth="admin") def index(self, **kw): @@ -52,13 +28,11 @@ class Website(openerp.addons.web.controllers.main.Home): @http.route('/pagenew/', type='http', auth="admin") def pagenew(self, path): - values = template_values() - uid = values['uid'] imd = request.registry['ir.model.data'] view = request.registry['ir.ui.view'] - view_model, view_id = imd.get_object_reference(request.cr, uid, 'website', 'default_page') - newview_id = view.copy(request.cr, uid, view_id) - newview = view.browse(request.cr, uid, newview_id, context={}) + view_model, view_id = imd.get_object_reference(request.cr, request.uid, 'website', 'default_page') + newview_id = view.copy(request.cr, request.uid, view_id) + newview = view.browse(request.cr, request.uid, newview_id, context={}) newview.write({ 'arch': newview.arch.replace("website.default_page", path), 'name': "page/%s" % path @@ -68,7 +42,7 @@ class Website(openerp.addons.web.controllers.main.Home): else: module = False idname = path - imd.create(request.cr, uid, { + imd.create(request.cr, request.uid, { 'name': idname, 'module': module, 'model': 'ir.ui.view', @@ -79,29 +53,14 @@ class Website(openerp.addons.web.controllers.main.Home): @http.route('/page/', type='http', auth="admin") def page(self, path): - #def get_html_head(): - # head += ['' % i for i in manifest_list('css', db=request.db)] - #modules = request.registry.get("ir.module.module").search_read(request.cr, openerp.SUPERUSER_ID, fields=['id', 'shortdesc', 'summary', 'icon_image'], limit=50) - values = template_values() - uid = values['uid'] - context = { - 'inherit_branding': values['editable'], - } - company = request.registry['res.company'].browse(request.cr, uid, 1, context=context) - values.update( - res_company=company, - path=path, - google_map_url="http://maps.googleapis.com/maps/api/staticmap?" + urllib.urlencode({ - 'center': '%s, %s %s, %s' % (company.street, company.city, company.zip, company.country_id and company.country_id.name_get()[0][1] or ''), - 'sensor': 'false', - 'zoom': '8', - 'size': '298x298', - }), - ) + website = request.registry.get("website") + values = website.get_rendering_context({ + 'path': path + }) try: - html = request.registry.get("ir.ui.view").render(request.cr, uid, path, values, context) - except ValueError, e: - html = request.registry.get("ir.ui.view").render(request.cr, uid, 'website.404', values, context) + html = website.render(path, values) + except ValueError: + html = website.render('website.404', values) return html @http.route('/website/attach', type='http', auth='admin') # FIXME: auth diff --git a/addons/website/website.py b/addons/website/website.py index ef2464983ab..ebb66ab6e4c 100644 --- a/addons/website/website.py +++ b/addons/website/website.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import openerp +from openerp.osv import osv from openerp.addons.web import http from openerp.addons.web.controllers import main from openerp.addons.web.http import request @@ -18,22 +19,36 @@ def auth_method_public(): http.auth_methods['public'] = auth_method_public -class website(object): - def render(self, template, add_values={}): +class website(osv.osv): + _name = "website" # Avoid website.website convention for conciseness (for new api). Got a special authorization from xmo and rco + _description = "Website" + + def get_rendering_context(self, additional_values=None): debug = 'debug' in request.params - script = "\n".join(['' % i for i in main.manifest_list('js', db=request.db, debug=debug)]) - css = "\n".join('' % i for i in main.manifest_list('css', db=request.db, debug=debug)) - _values = { - 'editable': request.uid != request.public_uid, + editable = False + if request.uid or (request.public_uid and request.uid != request.public_uid): + editable = True + values = { + 'debug': debug, + 'editable': editable, 'request': request, 'registry': request.registry, 'cr': request.cr, 'uid': request.uid, - 'script': script, - 'css': css, 'host_url': request.httprequest.host_url, 'res_company': request.registry['res.company'].browse(request.cr, openerp.SUPERUSER_ID, 1), } - _values.update(add_values) - return request.registry.get("ir.ui.view").render(request.cr, request.uid, template, _values) -website = website() + if editable: + values.update({ + 'script': "\n".join(['' % i for i in main.manifest_list('js', db=request.db, debug=debug)]), + 'css': "\n".join('' % i for i in main.manifest_list('css', db=request.db, debug=debug)) + }) + if additional_values: + values.update(additional_values) + return values + + def render(self, template, values={}): + # context = { + # 'inherit_branding': values['editable'], + # } + return request.registry.get("ir.ui.view").render(request.cr, request.uid, template, values) diff --git a/addons/website_crm/controllers/main.py b/addons/website_crm/controllers/main.py index 37e921b029b..83613e108d4 100644 --- a/addons/website_crm/controllers/main.py +++ b/addons/website_crm/controllers/main.py @@ -1,9 +1,7 @@ # -*- coding: utf-8 -*- -import openerp from openerp.addons.web import http from openerp.addons.web.http import request -from openerp.addons.website.controllers.main import template_values from urllib import quote_plus @@ -11,16 +9,14 @@ class contactus(http.Controller): @http.route(['/crm/contactus'], type='http', auth="admin") def contactus(self, *arg, **post): + website = request.registry['website'] post['user_id'] = False request.registry['crm.lead'].create(request.cr, request.uid, post) - values = template_values() - company = request.registry['res.company'].browse(request.cr, request.uid, 1) + values = website.get_rendering_context() + company = values['res_company'] values.update({ - 'res_company': company, 'google_map_url': "http://maps.googleapis.com/maps/api/staticmap?center=%s&sensor=false&zoom=8&size=298x298" % quote_plus('%s, %s %s, %s' % (company.street, company.city, company.zip, company.country_id and company.country_id.name_get()[0][1] or '')) }) - html = request.registry.get("ir.ui.view").render(request.cr, request.uid, "website_crm.thanks", values) - return html - + return website.render("website_crm.thanks", values) # vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/website_event/controllers/main.py b/addons/website_event/controllers/main.py index 68cc2f73718..cca132dca36 100644 --- a/addons/website_event/controllers/main.py +++ b/addons/website_event/controllers/main.py @@ -1,9 +1,7 @@ # -*- coding: utf-8 -*- -from openerp import SUPERUSER_ID from openerp.addons.web import http from openerp.addons.web.http import request -from openerp.addons.website import website from openerp.tools.translate import _ from datetime import datetime @@ -13,10 +11,11 @@ import urllib import werkzeug -class website_hr(http.Controller): +class website_event(http.Controller): @http.route(['/event'], type='http', auth="public") def events(self, **searches): + website = request.registry['website'] event_obj = request.registry['event.event'] searches.setdefault('date', 'all') @@ -83,27 +82,26 @@ class website_hr(http.Controller): obj_ids = event_obj.search(request.cr, request.uid, dom_without("none"), order="date_begin DESC") - values = { + values = website.get_rendering_context({ 'event_ids': event_obj.browse(request.cr, request.uid, obj_ids), 'dates': dates, 'types': types, 'countries': countries, 'searches': searches, 'search_path': "?%s" % urllib.urlencode(searches), - } + }) - html = website.render("website_event.index", values) - return html + return website.render("website_event.index", values) @http.route(['/event/'], type='http', auth="public") def event(self, event_id=None, **post): + website = request.registry['website'] event = request.registry['event.event'].browse(request.cr, request.uid, event_id) - values = { + values = website.get_rendering_context({ 'event_id': event, 'google_map_url': "http://maps.googleapis.com/maps/api/staticmap?center=%s&sensor=false&zoom=12&size=298x298" % urllib.quote_plus('%s, %s %s, %s' % (event.street, event.city, event.zip, event.country_id and event.country_id.name_get()[0][1] or '')) - } - html = website.render("website_event.detail", values) - return html + }) + return website.render("website_event.detail", values) @http.route(['/event//add_cart'], type='http', auth="public") def add_cart(self, event_id=None, **post): diff --git a/addons/website_hr/controllers/main.py b/addons/website_hr/controllers/main.py index cf5d33325bc..968ec607269 100644 --- a/addons/website_hr/controllers/main.py +++ b/addons/website_hr/controllers/main.py @@ -2,21 +2,18 @@ from openerp.addons.web import http from openerp.addons.web.http import request -from openerp.addons.website import website class website_hr(http.Controller): @http.route(['/hr'], type='http', auth="public") def blog(self, **post): + website = request.registry['website'] hr_obj = request.registry['hr.employee'] - employee_ids = hr_obj.search(request.cr, request.uid, [(1, "=", 1)]) - values = { - 'employee_ids': hr_obj.browse(request.cr, request.uid, employee_ids), - } - - html = website.render("website_hr.index", values) - return html + values = website.get_rendering_context({ + 'employee_ids': hr_obj.browse(request.cr, request.uid, employee_ids) + }) + return website.render("website_hr.index", values) @http.route(['/hr/publish'], type='http', auth="public") def publish(self, **post): diff --git a/addons/website_mail/controllers/main.py b/addons/website_mail/controllers/main.py index 7bc35f1fe4a..2c67e3c6ba8 100644 --- a/addons/website_mail/controllers/main.py +++ b/addons/website_mail/controllers/main.py @@ -2,7 +2,6 @@ from openerp.addons.web import http from openerp.addons.web.http import request -from openerp.addons.website import website import werkzeug from openerp.tools.translate import _ from openerp.tools.safe_eval import safe_eval @@ -15,17 +14,18 @@ class website_mail(http.Controller): @http.route(['/blog', '/blog/', '/blog//'], type='http', auth="public") def blog(self, mail_group_id=None, blog_id=None, **post): + website = request.registry['website'] group_obj = request.registry['mail.group'] message_obj = request.registry['mail.message'] - values = { + values = website.get_rendering_context({ 'blog_ids': None, 'blog_id': None, 'nav_list': dict(), 'prev_date': None, 'next_date': None, 'mail_group_id': mail_group_id, - } + }) domain = mail_group_id and [("res_id", "=", mail_group_id)] or [] for group in message_obj.read_group(request.cr, request.uid, domain + group_obj.get_public_blog(request.cr, request.uid), ['subject', 'date'], groupby="date", orderby="create_date asc"): @@ -50,8 +50,7 @@ class website_mail(http.Controller): if blog_id: values['blog_id'] = message_obj.browse(request.cr, request.uid, blog_id) - html = website.render("website_mail.index", values) - return html + return website.render("website_mail.index", values) @http.route(['/blog/nav'], type='http', auth="public") def nav(self, **post): diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index bae6b8b0758..33110a2bc1c 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -2,54 +2,57 @@ import openerp import simplejson +from openerp.osv import osv from openerp.addons.web import http -from openerp.addons.website import website from openerp.addons.web.http import request +def get_order(order_id=None): + order_obj = request.registry.get('sale.order') + # check if order allready exists + if order_id: + try: + order_obj.browse(request.cr, openerp.SUPERUSER_ID, order_id).pricelist_id + except: + order_id = None + if not order_id: + fields = [k for k, v in order_obj._columns.items()] + order_value = order_obj.default_get(request.cr, openerp.SUPERUSER_ID, fields) + order_value['partner_id'] = openerp.SUPERUSER_ID != request.public_uid and \ + request.registry.get('res.users').browse(request.cr, openerp.SUPERUSER_ID, request.uid).partner_id.id or \ + None + order_value.update(order_obj.onchange_partner_id(request.cr, openerp.SUPERUSER_ID, [], request.uid, context={})['value']) + order_id = order_obj.create(request.cr, openerp.SUPERUSER_ID, order_value) + return order_obj.browse(request.cr, openerp.SUPERUSER_ID, order_id) + +def get_current_order(): + order = get_order(request.httprequest.session.get('ecommerce_order_id')) + request.httprequest.session['ecommerce_order_id'] = order.id + return order + +def get_categories(): + category_obj = request.registry.get('pos.category') + category_ids = category_obj.search(request.cr, openerp.SUPERUSER_ID, [('parent_id', '=', False)]) + return category_obj.browse(request.cr, openerp.SUPERUSER_ID, category_ids) + + +class website(osv.osv): + _inherit = "website" + def get_rendering_context(self, additional_values=None): + values = { + 'website_sale_get_categories': get_categories, + 'order': get_current_order(), + # 'website_sale_get_current_order': get_current_order, # TODO: replace 'order' key in templates + } + if additional_values: + values.update(additional_values) + return super(website, self).get_rendering_context(values) class Ecommerce(http.Controller): - def get_categories(self): - category_obj = request.registry.get('pos.category') - category_ids = category_obj.search(request.cr, openerp.SUPERUSER_ID, [('parent_id', '=', False)]) - return category_obj.browse(request.cr, openerp.SUPERUSER_ID, category_ids) - - def get_current_order(self): - order = self.get_order(request.httprequest.session.get('ecommerce_order_id')) - request.httprequest.session['ecommerce_order_id'] = order.id - return order - - def get_order(self, order_id=None): - - order_obj = request.registry.get('sale.order') - # check if order allready exists - if order_id: - try: - order_obj.browse(request.cr, openerp.SUPERUSER_ID, order_id).pricelist_id - except: - order_id = None - if not order_id: - fields = [k for k, v in order_obj._columns.items()] - order_value = order_obj.default_get(request.cr, openerp.SUPERUSER_ID, fields) - order_value['partner_id'] = openerp.SUPERUSER_ID != request.public_uid and \ - request.registry.get('res.users').browse(request.cr, openerp.SUPERUSER_ID, request.uid).partner_id.id or \ - None - order_value.update(order_obj.onchange_partner_id(request.cr, openerp.SUPERUSER_ID, [], request.uid, context={})['value']) - order_id = order_obj.create(request.cr, openerp.SUPERUSER_ID, order_value) - return order_obj.browse(request.cr, openerp.SUPERUSER_ID, order_id) - - def render(self, template, values={}): - _values = { - 'order': self.get_current_order(), - 'categories': self.get_categories(), - } - _values.update(values) - return website.render(template, _values) - def recommended_product(self, my_pids): if not my_pids: return [] - + my_pids = str(my_pids)[1:-1] product_ids = [] query = """ @@ -70,6 +73,7 @@ class Ecommerce(http.Controller): @http.route(['/shop', '/shop/category/'], type='http', auth="public") def category(self, cat_id=0, offset=0, **post): + website = request.registry['website'] domain = [("sale_ok", "=", True)] if post.get("search"): @@ -81,17 +85,17 @@ class Ecommerce(http.Controller): product_obj = request.registry.get('product.product') product_ids = product_obj.search(request.cr, request.uid, domain, limit=20, offset=offset) - values = { + values = website.get_rendering_context({ 'current_category': cat_id, 'products': product_obj.browse(request.cr, request.uid, product_ids), 'search': post.get("search"), - } - html = self.render("website_sale.products", values) - return html + }) + return website.render("website_sale.products", values) @http.route(['/shop/product/'], type='http', auth="public") def product(self, cat_id=0, product_id=0): - order = self.get_current_order() + website = request.registry['website'] + order = get_current_order() product_id = product_id and int(product_id) or 0 product_obj = request.registry.get('product.product') @@ -99,17 +103,17 @@ class Ecommerce(http.Controller): line = [line for line in order.order_line if line.product_id.id == product_id] quantity = line and int(line[0].product_uom_qty) or 0 - values = { + values = website.get_rendering_context({ 'product': product_obj.browse(request.cr, request.uid, product_id), 'quantity': quantity, 'recommended_products': self.recommended_product([product_id]), - } - html = self.render("website_sale.product", values) - return html + }) + return website.render("website_sale.product", values) @http.route(['/shop/mycart'], type='http', auth="public") def mycart(self, **post): - order = self.get_current_order() + website = request.registry['website'] + order = get_current_order() if post.get('code'): pricelist_obj = request.registry.get('product.pricelist') @@ -118,14 +122,16 @@ class Ecommerce(http.Controller): order.write({'pricelist_id': pricelist_ids[0]}) my_pids = [line.product_id.id for line in order.order_line] - values= {"recommended_products": self.recommended_product(my_pids)} + values = website.get_rendering_context({ + "recommended_products": self.recommended_product(my_pids) + }) - html = self.render("website_sale.mycart", values) - return html + return website.render("website_sale.mycart", values) @http.route(['/shop/add_cart'], type='http', auth="public") def add_cart(self, product_id=0, remove=False): - + website = request.registry['website'] + values = website.get_rendering_context() context = {} order_obj = request.registry.get('sale.order') @@ -133,13 +139,12 @@ class Ecommerce(http.Controller): user_obj = request.registry.get('res.users') product_id = product_id and int(product_id) or 0 - order = self.get_current_order() + order = get_current_order() quantity = 0 # values initialisation order_line_ids = order_line_obj.search(request.cr, openerp.SUPERUSER_ID, [('order_id', '=', order.id), ('product_id', '=', product_id)], context=context) - values = {} if order_line_ids: order_line = order_line_obj.read(request.cr, openerp.SUPERUSER_ID, order_line_ids, [], context=context)[0] quantity = order_line['product_uom_qty'] + (remove and -1 or 1) @@ -165,8 +170,7 @@ class Ecommerce(http.Controller): order_line_id = order_line_obj.create(request.cr, openerp.SUPERUSER_ID, values, context=context) order.write({'order_line': [(4, order_line_id)]}, context=context) - html = self.render("website_sale.total") - + html = website.render("website_sale.total", values) return simplejson.dumps({"quantity": quantity, "totalHTML": html}) @http.route(['/shop/remove_cart'], type='http', auth="public") @@ -175,7 +179,11 @@ class Ecommerce(http.Controller): @http.route(['/shop/checkout'], type='http', auth="public") def checkout(self, **post): - order = self.get_current_order() + website = request.registry['website'] + values = website.get_rendering_context({ + 'partner': False + }) + order = get_current_order() if order.state != 'draft': return self.confirmed(**post) @@ -188,7 +196,6 @@ class Ecommerce(http.Controller): country_state_obj = request.registry.get('res.country.state') payment_obj = request.registry.get('portal.payment.acquirer') - values = {'partner': False} if request.uid != request.public_uid: values['partner'] = user_obj.browse(request.cr, request.uid, request.uid).partner_id @@ -206,12 +213,12 @@ class Ecommerce(http.Controller): content = payment_obj.render(request.cr, openerp.SUPERUSER_ID, payment.id, order, order.name, order.pricelist_id.currency_id, order.amount_total) payment._content = content - return self.render("website_sale.checkout", values) + return website.render("website_sale.checkout", values) @http.route(['/shop/confirm_order'], type='http', auth="public") def confirm_order(self, **post): - order = self.get_current_order() - + order = get_current_order() + json = {'error': [], 'validation': False} partner_obj = request.registry.get('res.partner') user_obj = request.registry.get('res.users') @@ -296,23 +303,23 @@ class Ecommerce(http.Controller): @http.route(['/shop/confirmed'], type='http', auth="public") def confirmed(self, **post): + website = request.registry['website'] if request.httprequest.session.get('ecommerce_order_id'): - order = self.get_current_order() + order = get_current_order() if order.state != 'draft': request.httprequest.session['ecommerce_order_id_old'] = order.id request.httprequest.session['ecommerce_order_id'] = None - order_old = self.get_order(request.httprequest.session.get('ecommerce_order_id_old')) + order_old = get_order(request.httprequest.session.get('ecommerce_order_id_old')) if not order_old.order_line: return self.mycart(**post) - values = { + values = website.get_rendering_context({ 'temp': 0, 'order': order_old, - 'categories': self.get_categories(), - } - return self.render("website_sale.confirmed", values) + }) + return website.render("website_sale.confirmed", values) @http.route(['/shop/publish'], type='http', auth="public") def publish(self, **post): diff --git a/addons/website_sale/views/ecommerce.xml b/addons/website_sale/views/ecommerce.xml index bc848ec18e5..3a96895a457 100644 --- a/addons/website_sale/views/ecommerce.xml +++ b/addons/website_sale/views/ecommerce.xml @@ -56,7 +56,7 @@