[IMP] website_portal*, website_project*, website_quote, website_blog: add record pager in portal
+ fix re-use websitue_url in get_access_action
This commit is contained in:
@@ -223,7 +223,7 @@ class BlogPost(models.Model):
|
||||
return super(BlogPost, self).get_access_action()
|
||||
return {
|
||||
'type': 'ir.actions.act_url',
|
||||
'url': '/blog/%s/post/%s' % (self.blog_id.id, self.id),
|
||||
'url': self.url,
|
||||
'target': 'self',
|
||||
'res_id': self.id,
|
||||
}
|
||||
|
||||
@@ -9,6 +9,16 @@ from odoo.tools.translate import _
|
||||
from odoo.fields import Date
|
||||
|
||||
|
||||
def get_records_pager(ids, current):
|
||||
if current.id in ids:
|
||||
idx = ids.index(current.id)
|
||||
return {
|
||||
'prev_record': idx != 0 and current.browse(ids[idx - 1]).website_url,
|
||||
'next_record': idx < len(ids) - 1 and current.browse(ids[idx + 1]).website_url
|
||||
}
|
||||
return {}
|
||||
|
||||
|
||||
class website_account(http.Controller):
|
||||
|
||||
MANDATORY_BILLING_FIELDS = ["name", "phone", "email", "street", "city", "country_id"]
|
||||
|
||||
@@ -245,4 +245,13 @@
|
||||
</xpath>
|
||||
</template>
|
||||
|
||||
<template id="record_pager" name="Portal Record Pager">
|
||||
<t t-if='prev_record or next_record'>
|
||||
<div class="ml8 record_pager btn-group btn-group-xs pull-right" role="group">
|
||||
<a t-att-class="'btn btn-default %s' % ('disabled' if not prev_record else '')" t-att-href="prev_record or '#'" ><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
|
||||
<a t-att-class="'btn btn-default %s' % ('disabled' if not next_record else '')" t-att-href="next_record or '#'" ><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
|
||||
</div>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -5,7 +5,7 @@ from odoo import http, _
|
||||
from odoo.exceptions import AccessError
|
||||
from odoo.http import request
|
||||
|
||||
from odoo.addons.website_portal.controllers.main import website_account
|
||||
from odoo.addons.website_portal.controllers.main import website_account, get_records_pager
|
||||
|
||||
|
||||
class website_account(website_account):
|
||||
@@ -80,6 +80,7 @@ class website_account(website_account):
|
||||
)
|
||||
# search the count to display, according to the pager data
|
||||
quotations = SaleOrder.search(domain, order=sort_order, limit=self._items_per_page, offset=pager['offset'])
|
||||
request.session['my_quotes_history'] = quotations.ids[:100]
|
||||
|
||||
values.update({
|
||||
'date': date_begin,
|
||||
@@ -129,6 +130,7 @@ class website_account(website_account):
|
||||
)
|
||||
# content according to pager and archive selected
|
||||
orders = SaleOrder.search(domain, order=sort_order, limit=self._items_per_page, offset=pager['offset'])
|
||||
request.session['my_orders_history'] = orders.ids[:100]
|
||||
|
||||
values.update({
|
||||
'date': date_begin,
|
||||
@@ -151,10 +153,14 @@ class website_account(website_account):
|
||||
except AccessError:
|
||||
return request.render("website.403")
|
||||
order_invoice_lines = {il.product_id.id: il.invoice_id for il in order.invoice_ids.mapped('invoice_line_ids')}
|
||||
return request.render("website_portal_sale.orders_followup", {
|
||||
history = request.session.get('my_orders_history', [])
|
||||
|
||||
values = {
|
||||
'order': order.sudo(),
|
||||
'order_invoice_lines': order_invoice_lines,
|
||||
})
|
||||
}
|
||||
values.update(get_records_pager(history, order))
|
||||
return request.render("website_portal_sale.orders_followup", values)
|
||||
|
||||
#
|
||||
# Invoices
|
||||
|
||||
@@ -8,6 +8,12 @@ class SaleOrder(models.Model):
|
||||
|
||||
_inherit = 'sale.order'
|
||||
|
||||
website_url = fields.Char('Website URL', compute='_website_url', help='The full URL to access the document through the website.')
|
||||
|
||||
def _website_url(self):
|
||||
for so in self:
|
||||
so.website_url = '/my/orders/%s' % (so.id)
|
||||
|
||||
@api.multi
|
||||
def get_access_action(self):
|
||||
""" Instead of the classic form view, redirect to the online quote for
|
||||
|
||||
@@ -248,6 +248,7 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h4>
|
||||
<t t-call='website_portal.record_pager'/>
|
||||
<t t-if="order.state == 'sent'">
|
||||
Quotation
|
||||
</t>
|
||||
@@ -358,26 +359,26 @@
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="row">
|
||||
<div class="col-md-10 col-xs-8 text-right">
|
||||
<div class="col-md-9 col-xs-8 text-right">
|
||||
Untaxed Amount:
|
||||
</div>
|
||||
<div class="col-md-2 col-xs-4 text-right">
|
||||
<div class="col-md-3 col-xs-4 text-right">
|
||||
<span t-field="order.amount_untaxed" t-options='{"widget": "monetary", "display_currency": order.pricelist_id.currency_id}'/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-10 col-xs-8 text-right">
|
||||
<div class="col-md-9 col-xs-8 text-right">
|
||||
Taxes:
|
||||
</div>
|
||||
<div class="col-md-2 col-xs-4 text-right">
|
||||
<div class="col-md-3 col-xs-4 text-right">
|
||||
<span t-field="order.amount_tax" t-options='{"widget": "monetary", "display_currency": order.pricelist_id.currency_id}'/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-10 col-xs-8 text-right">
|
||||
<div class="col-md-9 col-xs-8 text-right">
|
||||
<strong>Total:</strong>
|
||||
</div>
|
||||
<div class="col-md-2 col-xs-4 text-right">
|
||||
<div class="col-md-3 col-xs-4 text-right">
|
||||
<strong><span t-field="order.amount_total" t-options='{"widget": "monetary", "display_currency": order.pricelist_id.currency_id}'/></strong>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,7 +6,7 @@ from collections import OrderedDict
|
||||
from odoo import http, _
|
||||
from odoo.http import request
|
||||
|
||||
from odoo.addons.website_portal.controllers.main import website_account
|
||||
from odoo.addons.website_portal.controllers.main import website_account, get_records_pager
|
||||
|
||||
|
||||
class WebsiteAccount(website_account):
|
||||
@@ -51,6 +51,7 @@ class WebsiteAccount(website_account):
|
||||
|
||||
# content according to pager and archive selected
|
||||
projects = Project.search(domain, order=order, limit=self._items_per_page, offset=pager['offset'])
|
||||
request.session['my_projects_history'] = projects.ids[:100]
|
||||
|
||||
values.update({
|
||||
'date': date_begin,
|
||||
@@ -67,7 +68,10 @@ class WebsiteAccount(website_account):
|
||||
|
||||
@http.route(['/my/project/<model("project.project"):project>'], type='http', auth="user", website=True)
|
||||
def my_project(self, project=None, **kw):
|
||||
return request.render("website_project.my_project", {'project': project})
|
||||
vals = {'project': project, }
|
||||
history = request.session.get('my_projects_history', [])
|
||||
vals.update(get_records_pager(history, project))
|
||||
return request.render("website_project.my_project", vals)
|
||||
|
||||
@http.route(['/my/tasks', '/my/tasks/page/<int:page>'], type='http', auth="user", website=True)
|
||||
def my_tasks(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, **kw):
|
||||
@@ -116,6 +120,7 @@ class WebsiteAccount(website_account):
|
||||
)
|
||||
# content according to pager and archive selected
|
||||
tasks = request.env['project.task'].search(domain, order=order, limit=self._items_per_page, offset=pager['offset'])
|
||||
request.session['my_tasks_history'] = tasks.ids[:100]
|
||||
|
||||
values.update({
|
||||
'date': date_begin,
|
||||
@@ -135,4 +140,7 @@ class WebsiteAccount(website_account):
|
||||
|
||||
@http.route(['/my/task/<model("project.task"):task>'], type='http', auth="user", website=True)
|
||||
def my_task(self, task=None, **kw):
|
||||
return request.render("website_project.my_task", {'task': task, 'user': request.env.user})
|
||||
vals = {'task': task, 'user': request.env.user}
|
||||
history = request.session.get('my_tasks_history', [])
|
||||
vals.update(get_records_pager(history, task))
|
||||
return request.render("website_project.my_task", vals)
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import api, exceptions, models
|
||||
from odoo import api, exceptions, models, fields
|
||||
from odoo.addons.website.models.website import slug
|
||||
|
||||
|
||||
class Project(models.Model):
|
||||
_inherit = ['project.project']
|
||||
@@ -38,6 +40,12 @@ class Project(models.Model):
|
||||
class Task(models.Model):
|
||||
_inherit = ['project.task']
|
||||
|
||||
website_url = fields.Char('Website URL', compute='_compute_website_url', help='The full URL to access the document through the website.')
|
||||
|
||||
def _compute_website_url(self):
|
||||
for task in self:
|
||||
task.website_url = '/my/task/%s' % task.id
|
||||
|
||||
@api.multi
|
||||
def get_access_action(self):
|
||||
""" Instead of the classic form view, redirect to website for portal users
|
||||
@@ -51,7 +59,7 @@ class Task(models.Model):
|
||||
else:
|
||||
return {
|
||||
'type': 'ir.actions.act_url',
|
||||
'url': '/my/task/%s' % self.id,
|
||||
'url': self.website_url,
|
||||
'target': 'self',
|
||||
'res_id': self.id,
|
||||
}
|
||||
|
||||
@@ -103,6 +103,7 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h4>
|
||||
<t t-call='website_portal.record_pager'/>
|
||||
Project - <span t-field="project.name"/>
|
||||
</h4>
|
||||
</div>
|
||||
@@ -213,6 +214,7 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h4>
|
||||
<t t-call='website_portal.record_pager'/>
|
||||
Task - <span t-field="task.name"/>
|
||||
<span t-field="task.stage_id.name" class="pull-right label label-info" title="Current stage of this task"/>
|
||||
<a class="btn btn-info" t-att-href="'/web#return_label=Website&model=project.task&id=%s&view_type=form' % (task.id)" groups="project.group_project_user">Edit Task</a>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
from collections import OrderedDict
|
||||
|
||||
from odoo import http, _
|
||||
from odoo.addons.website_portal.controllers.main import website_account
|
||||
from odoo.addons.website_portal.controllers.main import website_account, get_records_pager
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
@@ -70,6 +70,7 @@ class WebsiteAccount(website_account):
|
||||
)
|
||||
# content according to pager and archive selected
|
||||
project_issues = request.env['project.issue'].search(domain, order=order, limit=self._items_per_page, offset=pager['offset'])
|
||||
request.session['my_issues_history'] = project_issues.ids[:100]
|
||||
|
||||
values.update({
|
||||
'date': date_begin,
|
||||
@@ -90,4 +91,7 @@ class WebsiteAccount(website_account):
|
||||
@http.route(['/my/issues/<int:issue_id>'], type='http', auth="user", website=True)
|
||||
def my_issues_issue(self, issue_id=None, **kw):
|
||||
issue = request.env['project.issue'].browse(issue_id)
|
||||
return request.render("website_project_issue.my_issues_issue", {'issue': issue})
|
||||
vals = {'issue': issue}
|
||||
history = request.session.get('my_issues_history', [])
|
||||
vals.update(get_records_pager(history, issue))
|
||||
return request.render("website_project_issue.my_issues_issue", vals)
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import api, exceptions, models, _
|
||||
from odoo import api, exceptions, models, fields
|
||||
|
||||
|
||||
class Issue(models.Model):
|
||||
_name = "project.issue"
|
||||
_inherit = ['project.issue']
|
||||
|
||||
website_url = fields.Char('Website URL', compute='_compute_website_url', help='The full URL to access the document through the website.')
|
||||
|
||||
def _compute_website_url(self):
|
||||
for issue in self:
|
||||
issue.website_url = '/my/issues/%s' % issue.id
|
||||
|
||||
@api.multi
|
||||
def get_access_action(self):
|
||||
""" Instead of the classic form view, redirect to website for portal users
|
||||
@@ -21,7 +27,7 @@ class Issue(models.Model):
|
||||
else:
|
||||
return {
|
||||
'type': 'ir.actions.act_url',
|
||||
'url': '/my/issues/%s' % self.id,
|
||||
'url': self.website_url,
|
||||
'target': 'self',
|
||||
'res_id': self.id,
|
||||
}
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h4>
|
||||
<t t-call='website_portal.record_pager'/>
|
||||
Issue <span t-field="issue.id"/> - <span t-field="issue.name"/>
|
||||
<a class="btn btn-info" t-att-href="'/web#return_label=Website&model=project.issue&id=%s&view_type=form' % (issue.id)" groups="project.group_project_user">Edit Issue</a>
|
||||
<span t-field="issue.stage_id.name" class="pull-right label label-info" title="Current stage of this issue"/>
|
||||
|
||||
@@ -6,6 +6,7 @@ import werkzeug
|
||||
from odoo import fields, http, _
|
||||
from odoo.http import request
|
||||
from odoo.addons.website_mail.controllers.main import _message_post_helper
|
||||
from odoo.addons.website_portal.controllers.main import get_records_pager
|
||||
|
||||
|
||||
class sale_quote(http.Controller):
|
||||
@@ -76,6 +77,8 @@ class sale_quote(http.Controller):
|
||||
'alias_usage': _('If we store your payment information on our server, subscription payments will be made automatically.'),
|
||||
'partner_id': Order.partner_id.id,
|
||||
})
|
||||
history = request.session.get('my_quotes_history', [])
|
||||
values.update(get_records_pager(history, Order))
|
||||
return request.render('website_quote.so_quotation', values)
|
||||
|
||||
@http.route(['/quote/accept'], type='json', auth="public", website=True)
|
||||
|
||||
@@ -46,6 +46,12 @@ class SaleOrderLine(models.Model):
|
||||
class SaleOrder(models.Model):
|
||||
_inherit = 'sale.order'
|
||||
|
||||
def _website_url(self):
|
||||
super(SaleOrder, self)._website_url()
|
||||
for so in self:
|
||||
if so.state not in ['sale', 'done']:
|
||||
so.website_url = '/quote/%s' % (so.id)
|
||||
|
||||
def _get_default_template_id(self):
|
||||
return self.env.ref('website_quote.website_quote_template_default', raise_if_not_found=False)
|
||||
|
||||
|
||||
@@ -478,6 +478,9 @@
|
||||
<li>
|
||||
<a class="btn btn-info" target="_blank" t-att-href="'/quote/%s/%s' % (quotation.id,quotation.access_token)+'?pdf=True'">Print</a>
|
||||
</li>
|
||||
<li>
|
||||
<t t-call='website_portal.record_pager'/>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</h1>
|
||||
|
||||
Reference in New Issue
Block a user