[ADD] Added website osv object + refactoring

bzr revid: fme@openerp.com-20130805161600-abms35e0vk47f3i1
This commit is contained in:
Fabien Meghazi 2013-08-05 18:16:00 +02:00
parent 81d707978e
commit af08367290
8 changed files with 135 additions and 164 deletions

View File

@ -17,30 +17,6 @@ import werkzeug.wrappers
logger = logging.getLogger(__name__)
def template_values():
script = "\n".join(['<script type="text/javascript" src="%s"></script>' % i for i in manifest_list('js', db=request.db)])
css = "\n".join('<link rel="stylesheet" href="%s">' % 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/<path:path>', 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/<path:path>', type='http', auth="admin")
def page(self, path):
#def get_html_head():
# head += ['<link rel="stylesheet" href="%s">' % 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

View File

@ -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(['<script type="text/javascript" src="%s"></script>' % i for i in main.manifest_list('js', db=request.db, debug=debug)])
css = "\n".join('<link rel="stylesheet" href="%s">' % 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(['<script type="text/javascript" src="%s"></script>' % i for i in main.manifest_list('js', db=request.db, debug=debug)]),
'css': "\n".join('<link rel="stylesheet" href="%s">' % 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)

View File

@ -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:

View File

@ -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/<int:event_id>'], 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/<int:event_id>/add_cart'], type='http', auth="public")
def add_cart(self, event_id=None, **post):

View File

@ -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):

View File

@ -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/<int:mail_group_id>', '/blog/<int:mail_group_id>/<int:blog_id>'], 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):

View File

@ -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/<cat_id>'], 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/<product_id>'], 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):

View File

@ -56,7 +56,7 @@
<div class="row">
<div class="span4 css_noprint">
<ul class="nav nav-list">
<t t-foreach="categories" t-as="category">
<t t-foreach="website_sale_get_categories()" t-as="category">
<t t-call="website_sale.categories_recursive"/>
</t>
</ul>