Rémy Taymans
6 years ago
5 changed files with 250 additions and 0 deletions
-
2beesdoo_website_pos_order/__init__.py
-
32beesdoo_website_pos_order/__openerp__.py
-
2beesdoo_website_pos_order/controllers/__init__.py
-
112beesdoo_website_pos_order/controllers/main.py
-
102beesdoo_website_pos_order/views/beesdoo_website_pos_order_templates.xml
@ -0,0 +1,2 @@ |
|||
# -*- coding: utf8 -*- |
|||
import controllers |
@ -0,0 +1,32 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
# Copyright 2018 Rémy Taymans <remytaymans@gmail.com> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
{ |
|||
'name': 'BEES coop Website POS Order', |
|||
|
|||
'summary': """ |
|||
Allow a user to access to his POS Order in the website. |
|||
""", |
|||
'description': """ |
|||
""", |
|||
|
|||
'author': 'Rémy Taymans', |
|||
'license': 'AGPL-3', |
|||
'version': '9.0.1.0', |
|||
'website': "https://github.com/beescoop/Obeesdoo", |
|||
|
|||
'category': 'Website', |
|||
|
|||
'depends': [ |
|||
'website', |
|||
'website_portal_v10', |
|||
'report', |
|||
'point_of_sale', |
|||
], |
|||
|
|||
'data': [ |
|||
'views/beesdoo_website_pos_order_templates.xml', |
|||
] |
|||
} |
@ -0,0 +1,2 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from . import main |
@ -0,0 +1,112 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
# Copyright 2015-2016 Odoo S.A. |
|||
# Copyright 2016 Jairo Llopis <jairo.llopis@tecnativa.com> |
|||
# Copyright 2017-2018 Rémy Taymans <remytaymans@gmail.com> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
|
|||
from werkzeug.exceptions import Forbidden, NotFound |
|||
|
|||
from openerp import http |
|||
from openerp.exceptions import AccessError, MissingError |
|||
from openerp.http import request |
|||
|
|||
from openerp.addons.website_portal_v10.controllers.main import WebsiteAccount |
|||
|
|||
|
|||
class CooperatorWebsiteAccount(WebsiteAccount): |
|||
|
|||
@http.route() |
|||
def account(self): |
|||
""" Add POS Order to main account page """ |
|||
response = super(CooperatorWebsiteAccount, self).account() |
|||
partner = request.env.user.partner_id |
|||
|
|||
pos_order_mgr = request.env['pos.order'].sudo() |
|||
pos_order_count = pos_order_mgr.search_count([ |
|||
('partner_id', 'in', [partner.commercial_partner_id.id]), |
|||
]) |
|||
|
|||
response.qcontext.update({ |
|||
'pos_order_count': pos_order_count, |
|||
}) |
|||
return response |
|||
|
|||
@http.route( |
|||
['/my/pos_order', |
|||
'/my/pos_order/page/<int:page>'], |
|||
type='http', auth="user", website=True) |
|||
def portal_my_pos_order(self, page=1, date_begin=None, |
|||
date_end=None, **kw): |
|||
"""Render a page that lits the POS order of the connected user.""" |
|||
values = self._prepare_portal_layout_values() |
|||
partner = request.env.user.partner_id |
|||
pos_order_mgr = request.env['pos.order'].sudo() |
|||
|
|||
domain = [ |
|||
('partner_id', 'in', [partner.commercial_partner_id.id]), |
|||
] |
|||
|
|||
if date_begin and date_end: |
|||
domain += [('create_date', '>=', date_begin), |
|||
('create_date', '<', date_end)] |
|||
|
|||
# count for pager |
|||
pos_order_count = pos_order_mgr.search_count(domain) |
|||
# pager |
|||
pager = request.website.pager( |
|||
url="/my/pos_order", |
|||
url_args={'date_begin': date_begin, 'date_end': date_end}, |
|||
total=pos_order_count, |
|||
page=page, |
|||
step=self._items_per_page |
|||
) |
|||
# content according to pager and archive selected |
|||
pos_orders = pos_order_mgr.search( |
|||
domain, limit=self._items_per_page, offset=pager['offset']) |
|||
values.update({ |
|||
'date': date_begin, |
|||
'pos_orders': pos_orders, |
|||
'page_name': 'invoice', |
|||
'pager': pager, |
|||
'default_url': '/my/pos_order', |
|||
}) |
|||
return request.website.render( |
|||
'beesdoo_website_pos_order.portal_my_pos_order', |
|||
values |
|||
) |
|||
|
|||
@http.route(['/my/pos_order_receipt/pdf/<int:oid>'], |
|||
type='http', auth="user", website=True) |
|||
def get_pos_order_receipt(self, oid=-1): |
|||
"""Render the receipt for a POS order""" |
|||
# Get the POS order and raise an error if the user |
|||
# is not allowed to access to it or if the object is not found. |
|||
partner = request.env.user.partner_id |
|||
pos_order_mgr = request.env['pos.order'].sudo() |
|||
pos_order = pos_order_mgr.browse(oid) |
|||
try: |
|||
if pos_order.partner_id != partner.commercial_partner_id: |
|||
raise Forbidden() |
|||
except AccessError: |
|||
raise Forbidden() |
|||
except MissingError: |
|||
raise NotFound() |
|||
# Get the pdf |
|||
report_mgr = request.env['report'].sudo() |
|||
pdf = report_mgr.get_pdf( |
|||
pos_order, |
|||
'point_of_sale.report_receipt' |
|||
) |
|||
filename = pos_order.pos_reference |
|||
return self._render_pdf(pdf, filename) |
|||
|
|||
def _render_pdf(self, pdf, filename): |
|||
"""Render a http response for a pdf""" |
|||
pdfhttpheaders = [ |
|||
('Content-Disposition', 'inline; filename="%s.pdf"' % filename), |
|||
('Content-Type', 'application/pdf'), |
|||
('Content-Length', len(pdf)) |
|||
] |
|||
return request.make_response(pdf, headers=pdfhttpheaders) |
@ -0,0 +1,102 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<!-- |
|||
Copyright 2015-2016 Odoo S.A. |
|||
Copyright 2016 Jairo Llopis <jairo.llopis@tecnativa.com> |
|||
Copyright 2018 Rémy Taymans <remytaymans@gmail.com> |
|||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
--> |
|||
<openerp> |
|||
|
|||
<!-- POS Order in the menu --> |
|||
<template |
|||
id="portal_my_home_menu_pos_order" |
|||
name="Portal Menu: POS Order" |
|||
inherit_id="website_portal_v10.portal_layout" |
|||
priority="28"> |
|||
<xpath expr="//ul[contains(@class,'o_portal_submenu')]" |
|||
position="inside"> |
|||
<li> |
|||
<a href="/my/pos_order"> |
|||
POS Orders |
|||
</a> |
|||
</li> |
|||
</xpath> |
|||
</template> |
|||
|
|||
<!-- POS Order on the main page --> |
|||
<template |
|||
id="portal_my_home_pos_order" |
|||
name="Portal My Home : POS Order" |
|||
inherit_id="website_portal_v10.portal_my_home" |
|||
priority="28"> |
|||
<xpath expr="//div[contains(@class,'o_my_home_content')]" |
|||
position="inside"> |
|||
<h3 class="page-header"> |
|||
<a href="/my/pos_order"> |
|||
Your POS Orders |
|||
<small class="ml8"> |
|||
<t t-if="pos_order_count"> |
|||
<span class='badge'> |
|||
<t t-esc="pos_order_count"/> |
|||
</span> |
|||
</t> |
|||
<t t-if="not pos_order_count"> |
|||
There are currently no POS order for your account. |
|||
</t> |
|||
</small> |
|||
</a> |
|||
</h3> |
|||
</xpath> |
|||
</template> |
|||
|
|||
<!-- POS Order page --> |
|||
<template id="portal_my_pos_order" name="My POS Order"> |
|||
<t t-call="website_portal_v10.portal_layout"> |
|||
<h3 class="page-header">Your POS Orders</h3> |
|||
<t t-if="not pos_orders"> |
|||
<p> |
|||
There are currently no POS order for your account. |
|||
</p> |
|||
</t> |
|||
<t t-if="pos_orders"> |
|||
<table class="table table-hover o_my_status_table"> |
|||
<thead> |
|||
<tr class="active"> |
|||
<th>Receipt</th> |
|||
<th>Name</th> |
|||
<th>Date</th> |
|||
<th>Total Amount</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr t-foreach="pos_orders" t-as="pos_order"> |
|||
<td> |
|||
<a t-att-href="'/my/pos_order_receipt/pdf/%s' |
|||
% pos_order.id"> |
|||
<t t-esc="pos_order.pos_reference"/> |
|||
</a> |
|||
</td> |
|||
<td> |
|||
<t t-esc="pos_order.name"/> |
|||
</td> |
|||
<td> |
|||
<span t-field="pos_order.date_order"/> |
|||
</td> |
|||
<td> |
|||
<span t-field="pos_order.amount_total" |
|||
t-field-options='{ |
|||
"widget": "monetary", |
|||
"display_currency": "pos_order.partner_id.company_id.currency_id" |
|||
}'/> |
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
<div t-if="pager" class="o_portal_pager text-center"> |
|||
<t t-call="website.pager"/> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
</template> |
|||
|
|||
</openerp> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue