[IMP] website: create method pager and template pager. Used by website_sale and website_event

bzr revid: chm@openerp.com-20130812134312-jmy2je288b4ofazy
This commit is contained in:
Christophe Matthieu 2013-08-12 15:43:12 +02:00
parent a82f0fa1df
commit 8523e66bc4
6 changed files with 79 additions and 53 deletions

View File

@ -434,5 +434,23 @@
</t> </t>
</template> </template>
<template id="pager">
<div t-if="pager['page_count'] != 1" t-attf-class="#{ classname or '' } pagination">
<ul>
<li t-att-class=" 'disabled' if pager['page']['num'] == 1 else '' " >
<a t-att-href=" pager['page_start']['url'] if pager['page']['num'] != 1 else '' ">Prev</a>
</li>
<t t-foreach="pager['pages']">
<li t-att-class=" 'active' if num == pager['page']['num'] else '' ">
<a t-att-href="url" t-raw="num"></a>
</li>
</t>
<li t-att-class=" 'disabled' if pager['page']['num'] == pager['page_count'] else '' " >
<a t-att-href=" pager['page_end']['url'] if pager['page']['num'] != pager['page_count'] else '' ">Next</a>
</li>
</ul>
</div>
</template>
</data> </data>
</openerp> </openerp>

View File

@ -5,6 +5,8 @@ from openerp.osv import osv
from openerp.addons.web import http from openerp.addons.web import http
from openerp.addons.web.controllers import main from openerp.addons.web.controllers import main
from openerp.addons.web.http import request from openerp.addons.web.http import request
import urllib
import math
def auth_method_public(): def auth_method_public():
@ -16,6 +18,14 @@ def auth_method_public():
http.auth_methods['public'] = auth_method_public http.auth_methods['public'] = auth_method_public
def urlplus(url, params):
if not params:
return url
url += "?"
for k,v in params.items():
url += "%s=%s&" % (k, urllib.quote_plus(v))
return url
class website(osv.osv): class website(osv.osv):
_name = "website" # Avoid website.website convention for conciseness (for new api). Got a special authorization from xmo and rco _name = "website" # Avoid website.website convention for conciseness (for new api). Got a special authorization from xmo and rco
_description = "Website" _description = "Website"
@ -56,3 +66,29 @@ class website(osv.osv):
'inherit_branding': values.get('editable', False), 'inherit_branding': values.get('editable', False),
} }
return request.registry.get("ir.ui.view").render(request.cr, request.uid, template, values, context=context) return request.registry.get("ir.ui.view").render(request.cr, request.uid, template, values, context=context)
def pager(self, url, total, page=1, step=30, scope=5):
# Compute Pager
d = {}
d["page_count"] = int(math.ceil(total / step))
page = max(1, min(int(page), d["page_count"]))
d["offset"] = (page-1) * step
scope -= 1
pmin = max(page - int(math.floor(scope/2)), 1)
pmax = min(pmin + scope, d["page_count"])
if pmax - pmin < scope:
pmin = pmax - scope > 0 and pmax - scope or 1
d["page"] = {'url': "%spage/%s/" % (url, page), 'num': page}
d["page_start"] = {'url': "%spage/%s/" % (url, pmin), 'num': pmin}
d["page_end"] = {'url': "%spage/%s/" % (url, min(pmax, page+1)), 'num': min(pmax, page+1)}
d["pages"] = []
for page in range(pmin, pmax+1):
d["pages"].append({'url': "%spage/%s/" % (url, page), 'num': page})
return d

View File

@ -14,8 +14,8 @@ import werkzeug
class website_event(http.Controller): class website_event(http.Controller):
@http.route(['/event'], type='http', auth="public") @http.route(['/event/', '/event/page/<int:page>/'], type='http', auth="public")
def events(self, **searches): def events(self, page=1, **searches):
website = request.registry['website'] website = request.registry['website']
event_obj = request.registry['event.event'] event_obj = request.registry['event.event']
@ -80,13 +80,17 @@ class website_event(http.Controller):
countries = event_obj.read_group(request.cr, request.uid, domain, ["id", "country_id"], groupby="country_id", orderby="country_id") countries = event_obj.read_group(request.cr, request.uid, domain, ["id", "country_id"], groupby="country_id", orderby="country_id")
countries.insert(0, {'country_id_count': event_obj.search(request.cr, request.uid, domain, count=True), 'country_id': ("all", _("All Countries"))}) countries.insert(0, {'country_id_count': event_obj.search(request.cr, request.uid, domain, count=True), 'country_id': ("all", _("All Countries"))})
step = 5
event_count = event_obj.search(request.cr, request.uid, dom_without("none"), count=True)
pager = website.pager(url="/event/", total=event_count, page=page, step=step, scope=5)
obj_ids = event_obj.search(request.cr, request.uid, dom_without("none"), limit=step, offset=pager['offset'], order="date_begin DESC")
obj_ids = event_obj.search(request.cr, request.uid, dom_without("none"), order="date_begin DESC")
values = website.get_rendering_context({ values = website.get_rendering_context({
'event_ids': event_obj.browse(request.cr, request.uid, obj_ids), 'event_ids': event_obj.browse(request.cr, request.uid, obj_ids),
'dates': dates, 'dates': dates,
'types': types, 'types': types,
'countries': countries, 'countries': countries,
'pager': pager,
'searches': searches, 'searches': searches,
'search_path': "?%s" % urllib.urlencode(searches), 'search_path': "?%s" % urllib.urlencode(searches),
}) })

View File

@ -50,8 +50,15 @@
</t> </t>
</ul> </ul>
</div> </div>
<div class='span8 navbar navbar-inverse'>
<div class='navbar-inner'>
<t t-call="website.pager" >
<t t-set="classname">pull-left</t>
</t>
</div>
</div>
<div class="span8"> <div class="span8">
<ul class="media-list mt32"> <ul class="media-list">
<li t-foreach="event_ids" t-as="event_id" class="media thumbnail"> <li t-foreach="event_ids" t-as="event_id" class="media thumbnail">
<div class="media-body"> <div class="media-body">
<span t-if="not event_id.event_ticket_ids" class="label pull-right">No tickets needed.</span> <span t-if="not event_id.event_ticket_ids" class="label pull-right">No tickets needed.</span>
@ -87,6 +94,9 @@
</li> </li>
</ul> </ul>
</div> </div>
<div class="span8 offset4 text-center">
<t t-call="website.pager" />
</div>
</div> </div>
</div> </div>
</t> </t>

View File

@ -1,12 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import math
import openerp import openerp
from openerp.osv import osv from openerp.osv import osv
from openerp.addons.web import http from openerp.addons.web import http
from openerp.addons.web.http import request from openerp.addons.web.http import request
import werkzeug import werkzeug
from urllib import urlencode
def get_order(order_id=None): def get_order(order_id=None):
order_obj = request.registry.get('sale.order') order_obj = request.registry.get('sale.order')
@ -50,7 +48,6 @@ class Ecommerce(http.Controller):
category_obj = request.registry.get('pos.category') category_obj = request.registry.get('pos.category')
category_ids = category_obj.search(request.cr, openerp.SUPERUSER_ID, [('parent_id', '=', False)]) category_ids = category_obj.search(request.cr, openerp.SUPERUSER_ID, [('parent_id', '=', False)])
categories = category_obj.browse(request.cr, openerp.SUPERUSER_ID, category_ids) categories = category_obj.browse(request.cr, openerp.SUPERUSER_ID, category_ids)
print categories
return categories return categories
def render(self, template, values={}): def render(self, template, values={}):
@ -87,7 +84,7 @@ class Ecommerce(http.Controller):
product_ids = product_obj.search(request.cr, request.uid, [("id", "in", product_ids)]) product_ids = product_obj.search(request.cr, request.uid, [("id", "in", product_ids)])
return product_obj.browse(request.cr, request.uid, product_ids) return product_obj.browse(request.cr, request.uid, product_ids)
@http.route(['/shop/', '/shop/category/<cat_id>/', '/shop/category/<cat_id>/page/<page>/', '/shop/page/<page>/'], type='http', auth="public") @http.route(['/shop/', '/shop/category/<cat_id>/', '/shop/category/<cat_id>/page/<int:page>/', '/shop/page/<int:page>/'], type='http', auth="public")
def category(self, cat_id=0, page=0, **post): def category(self, cat_id=0, page=0, **post):
website = request.registry['website'] website = request.registry['website']
@ -101,36 +98,17 @@ class Ecommerce(http.Controller):
cat_id = int(cat_id) cat_id = int(cat_id)
domain = [('pos_categ_id.id', 'child_of', cat_id)] + domain domain = [('pos_categ_id.id', 'child_of', cat_id)] + domain
step = 20
product_count = len(product_obj.search(request.cr, request.uid, domain)) product_count = len(product_obj.search(request.cr, request.uid, domain))
page_count = int(math.ceil(product_count / 20.0)) pager = website.pager(url="/shop/category/%s/" % cat_id, total=product_count, page=page, step=step, scope=7)
#if post.get("search"): product_ids = product_obj.search(request.cr, request.uid, domain, limit=step, offset=pager['offset'])
# domain += ['|', '|', ('name', 'ilike', "%%%s%%" % post.get("search")), ('description', 'ilike', "%%%s%%" % post.get("search")), ('pos_categ_id.name', 'ilike', "%%%s%%" % post.get("search"))]
page = max(1,min(int(page),page_count))
offset = (page-1) * 20
if page_count <= 5 or page <= 3:
pmin = 1
pmax = min(page_count,5)
elif page >= page_count - 2:
pmin = page_count - 4
pmax = page_count
else:
pmin = page - 2
pmax = page + 2
pages = range(pmin, pmax+1)
product_ids = product_obj.search(request.cr, request.uid, domain, limit=20, offset=offset)
values = website.get_rendering_context({ values = website.get_rendering_context({
'current_category': cat_id, 'current_category': cat_id,
'products': product_obj.browse(request.cr, request.uid, product_ids), 'products': product_obj.browse(request.cr, request.uid, product_ids),
'search': post.get("search"), 'search': post.get("search"),
'page_count': page_count, 'pager': pager,
'pages': pages,
'page': page,
}) })
return self.render("website_sale.products", values) return self.render("website_sale.products", values)

View File

@ -87,33 +87,13 @@
<!-- Product list --> <!-- Product list -->
<template id="product_pager">
<div t-if="page_count != 1" t-attf-class="#{ classname or '' } pagination">
<ul>
<li t-att-class=" 'disabled' if page == 1 else '' " >
<t t-set="alt_url" t-valuef="/shop/category/#{ current_category }/page/#{ max(0, page - 1) }/"/>
<a t-att-href=" '#' if page == 1 else alt_url ">Prev</a>
</li>
<t t-foreach="pages" t-as="p">
<li t-att-class=" 'active' if p == page else '' ">
<a t-attf-href="/shop/category/#{ current_category }/page/#{ p }/" t-raw='p'></a>
</li>
</t>
<li t-att-class=" 'disabled' if page == page_count else '' ">
<t t-set="alt_url" t-valuef="/shop/category/#{ current_category }/page/#{ min(page_count, page + 1) }/"/>
<a t-att-href=" '#' if page == page_count else alt_url ">Next</a>
</li>
</ul>
</div>
</template>
<template id="products"> <template id="products">
<t t-call="website_sale.page"> <t t-call="website_sale.page">
<t t-set="title">Product</t> <t t-set="title">Product</t>
<t t-set="shop_content"> <t t-set="shop_content">
<div class='span8 navbar navbar-inverse'> <div class='span8 navbar navbar-inverse'>
<div class='navbar-inner'> <div class='navbar-inner'>
<t t-call="website_sale.product_pager" > <t t-call="website.pager" >
<t t-set="classname">pull-left</t> <t t-set="classname">pull-left</t>
</t> </t>
<form action="/shop/" method="get" class="navbar-search pull-right"> <form action="/shop/" method="get" class="navbar-search pull-right">
@ -132,7 +112,7 @@
</div> </div>
</div> </div>
<div class="span8 offset4 text-center"> <div class="span8 offset4 text-center">
<t t-call="website_sale.product_pager" /> <t t-call="website.pager" />
</div> </div>
</t> </t>
</t> </t>