[IMP] rma: more functionality in portal, include ACL's for wizards

This commit is contained in:
Jared Kipe
2021-03-20 13:27:19 -07:00
parent 2c3fbe20b3
commit f76cd697f2
4 changed files with 129 additions and 68 deletions

View File

@@ -2,7 +2,7 @@
{ {
'name': 'Hibou RMAs', 'name': 'Hibou RMAs',
'version': '14.0.1.0.0', 'version': '14.0.1.0.1',
'category': 'Warehouse', 'category': 'Warehouse',
'author': 'Hibou Corp.', 'author': 'Hibou Corp.',
'license': 'OPL-1', 'license': 'OPL-1',

View File

@@ -1,14 +1,68 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. # Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from collections import OrderedDict from operator import itemgetter
from odoo import http, fields from odoo import http, fields
from odoo.exceptions import AccessError, MissingError, ValidationError from odoo.exceptions import AccessError, MissingError, UserError, ValidationError
from odoo.http import request from odoo.http import request
from odoo.tools import groupby as groupbyelem
from odoo.tools.translate import _ from odoo.tools.translate import _
from odoo.addons.portal.controllers.portal import pager as portal_pager, CustomerPortal from odoo.addons.portal.controllers.portal import pager as portal_pager, CustomerPortal
def rma_portal_searchbar_sortings():
# Override to add more sorting
return {
'date': {'label': _('Newest'), 'order': 'create_date desc, id desc'},
'name': {'label': _('Name'), 'order': 'name asc, id asc'},
}
def rma_portal_searchbar_filters():
# Override to add more filters
return {
'all': {'label': _('All'), 'domain': [('state', 'in', ['draft', 'confirmed', 'done', 'cancel'])]},
'draft': {'label': _('Draft'), 'domain': [('state', '=', 'draft')]},
'confirmed': {'label': _('Confirmed'), 'domain': [('state', '=', 'confirmed')]},
'cancel': {'label': _('Cancelled'), 'domain': [('state', '=', 'cancel')]},
'done': {'label': _('Done'), 'domain': [('state', '=', 'done')]},
}
def rma_portal_searchbar_inputs():
# Override to add more search fields
return {
'name': {'input': 'name', 'label': _('Search in Name')},
'all': {'input': 'all', 'label': _('Search in All')},
}
def rma_portal_searchbar_groupby():
# Override to add more options for grouping
return {
'none': {'input': 'none', 'label': _('None')},
'state': {'input': 'state', 'label': _('State')},
'template': {'input': 'template', 'label': _('Type')},
}
def rma_portal_search_domain(search_in, search):
# Override if you added search inputs
search_domain = []
if search_in in ('name', 'all'):
search_domain.append(('name', 'ilike', search))
return search_domain
def rma_portal_group_rmas(rmas, groupby):
# Override to check groupby and perform a different grouping
if groupby == 'state':
return [request.env['rma.rma'].concat(*g) for k, g in groupbyelem(rmas, itemgetter('state'))]
if groupby == 'template':
return [request.env['rma.rma'].concat(*g) for k, g in groupbyelem(rmas, itemgetter('template_id'))]
return [rmas]
class CustomerPortal(CustomerPortal): class CustomerPortal(CustomerPortal):
def _prepare_portal_layout_values(self): def _prepare_portal_layout_values(self):
@@ -25,72 +79,58 @@ class CustomerPortal(CustomerPortal):
return self._get_page_view_values(rma, access_token, values, 'my_rma_history', True, **kwargs) return self._get_page_view_values(rma, access_token, values, 'my_rma_history', True, **kwargs)
@http.route(['/my/rma', '/my/rma/page/<int:page>'], type='http', auth="user", website=True) @http.route(['/my/rma', '/my/rma/page/<int:page>'], type='http', auth="user", website=True)
def portal_my_rma(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, **kw): def portal_my_rma(self, page=1, date_begin=None, date_end=None, sortby='date', filterby='all', groupby='none', search_in='all', search=None, **kw):
values = self._prepare_portal_layout_values() values = self._prepare_portal_layout_values()
RMA = request.env['rma.rma']
domain = [] searchbar_sortings = rma_portal_searchbar_sortings()
fields = ['name', 'create_date'] searchbar_filters = rma_portal_searchbar_filters()
searchbar_inputs = rma_portal_searchbar_inputs()
searchbar_groupby = rma_portal_searchbar_groupby()
archive_groups = self._get_archive_groups('rma.rma', domain, fields) if sortby not in searchbar_sortings:
raise UserError(_("Unknown sorting option."))
order = searchbar_sortings[sortby]['order']
if filterby not in searchbar_filters:
raise UserError(_("Unknown filter option."))
domain = searchbar_filters[filterby]['domain']
if date_begin and date_end: if date_begin and date_end:
domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)]
searchbar_sortings = { if search_in and search:
'date': {'label': _('Newest'), 'order': 'create_date desc, id desc'}, domain += rma_portal_search_domain(search_in, search)
'name': {'label': _('Name'), 'order': 'name asc, id asc'},
}
# default sort by value
if not sortby:
sortby = 'date'
order = searchbar_sortings[sortby]['order']
searchbar_filters = { RMA = request.env['rma.rma']
'all': {'label': _('All'), 'domain': [('state', 'in', ['draft', 'confirmed', 'done', 'cancel'])]}, rma_count = len(RMA.search(domain))
'draft': {'label': _('Draft'), 'domain': [('state', '=', 'draft')]},
'purchase': {'label': _('Confirmed'), 'domain': [('state', '=', 'confirmed')]},
'cancel': {'label': _('Cancelled'), 'domain': [('state', '=', 'cancel')]},
'done': {'label': _('Done'), 'domain': [('state', '=', 'done')]},
}
# default filter by value
if not filterby:
filterby = 'all'
domain += searchbar_filters[filterby]['domain']
# count for pager
rma_count = RMA.search_count(domain)
# make pager
pager = portal_pager( pager = portal_pager(
url="/my/rma", url="/my/rma",
url_args={'date_begin': date_begin, 'date_end': date_end}, url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'search_in': search_in, 'search': search},
total=rma_count, total=rma_count,
page=page, page=page,
step=self._items_per_page step=self._items_per_page
) )
# search the rmas to display, according to the pager data rmas = RMA.search(domain, order=order, limit=self._items_per_page, offset=pager['offset'])
rmas = RMA.search(
domain,
order=order,
limit=self._items_per_page,
offset=pager['offset']
)
request.session['my_rma_history'] = rmas.ids[:100] request.session['my_rma_history'] = rmas.ids[:100]
rma_templates = request.env['rma.template'].sudo().search([('portal_ok', '=', True)]) rma_templates = request.env['rma.template'].sudo().search([('portal_ok', '=', True)])
grouped_rmas = rma_portal_group_rmas(rmas, groupby)
values.update({ values.update({
'request': request,
'date': date_begin,
'rma_list': rmas,
'rma_templates': rma_templates, 'rma_templates': rma_templates,
'date': date_begin,
'grouped_rmas': grouped_rmas,
'page_name': 'rma', 'page_name': 'rma',
'pager': pager,
'archive_groups': archive_groups,
'searchbar_sortings': searchbar_sortings,
'sortby': sortby,
'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())),
'filterby': filterby,
'default_url': '/my/rma', 'default_url': '/my/rma',
'pager': pager,
'searchbar_sortings': searchbar_sortings,
'searchbar_filters': searchbar_filters,
'searchbar_inputs': searchbar_inputs,
'searchbar_groupby': searchbar_groupby,
'sortby': sortby,
'groupby': groupby,
'search_in': search_in,
'search': search,
'filterby': filterby,
}) })
return request.render("rma.portal_my_rma", values) return request.render("rma.portal_my_rma", values)

View File

@@ -8,3 +8,7 @@
access_rma_portal,rma.rma.portal,rma.model_rma_rma,base.group_portal,1,0,0,0 access_rma_portal,rma.rma.portal,rma.model_rma_rma,base.group_portal,1,0,0,0
access_rma_line_portal,rma.line.portal,rma.model_rma_line,base.group_portal,1,0,0,0 access_rma_line_portal,rma.line.portal,rma.model_rma_line,base.group_portal,1,0,0,0
access_rma_template_portal,rma.template.portal,rma.model_rma_template,base.group_portal,1,0,0,0 access_rma_template_portal,rma.template.portal,rma.model_rma_template,base.group_portal,1,0,0,0
"access_rma_picking_make_lines","access rma.picking.make.lines","rma.model_rma_picking_make_lines","stock.group_stock_user",1,1,1,1
"access_rma_picking_make_lines_line","access rma.picking.make.lines.line","rma.model_rma_picking_make_lines_line","stock.group_stock_user",1,1,1,1
"access_rma_make_rtv","access rma.make.rtv","rma.model_rma_make_rtv","stock.group_stock_user",1,1,1,1
"access_rma_make_rtv_line","access rma.make.rtv.line","rma.model_rma_make_rtv_line","stock.group_stock_user",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
8 access_rma_portal rma.rma.portal rma.model_rma_rma base.group_portal 1 0 0 0
9 access_rma_line_portal rma.line.portal rma.model_rma_line base.group_portal 1 0 0 0
10 access_rma_template_portal rma.template.portal rma.model_rma_template base.group_portal 1 0 0 0
11 access_rma_picking_make_lines access rma.picking.make.lines rma.model_rma_picking_make_lines stock.group_stock_user 1 1 1 1
12 access_rma_picking_make_lines_line access rma.picking.make.lines.line rma.model_rma_picking_make_lines_line stock.group_stock_user 1 1 1 1
13 access_rma_make_rtv access rma.make.rtv rma.model_rma_make_rtv stock.group_stock_user 1 1 1 1
14 access_rma_make_rtv_line access rma.make.rtv.line rma.model_rma_make_rtv_line stock.group_stock_user 1 1 1 1

View File

@@ -32,34 +32,51 @@
<template id="portal_my_rma" name="Portal: My RMAs"> <template id="portal_my_rma" name="Portal: My RMAs">
<t t-call="portal.portal_layout"> <t t-call="portal.portal_layout">
<t t-set="breadcrumbs_searchbar" t-value="True"/>
<t t-call="portal.portal_searchbar"> <t t-call="portal.portal_searchbar">
<t t-set="title">RMA</t> <t t-set="title">RMA</t>
</t> </t>
<t t-if="rma_list" t-call="portal.portal_table"> <div t-if="not grouped_rmas" class="alert alert-info">
There are currently no RMAs for your account.
</div>
<t t-else="" t-call="portal.portal_table">
<t t-foreach="grouped_rmas" t-as="rmas">
<thead> <thead>
<tr class="active"> <tr t-attf-class="{{'thead-light' if not groupby == 'none' else ''}}">
<th>RMA #</th> <th class="text-left">RMA #</th>
<th>Submitted Date</th> <th>Submitted Date</th>
<th>Status</th> <th class="rma-template">
<t t-if="groupby == 'template'">
<span t-field="rmas[0].template_id"/>
</t>
<t t-else="">
<span>Type</span>
</t>
</th>
<th class="rma-state">
<t t-if="groupby == 'state'">
<em class="font-weight-normal text-muted">RMAs in state:</em>
<span t-field="rmas[0].state"/>
</t>
<t t-else="">
<span>Status</span>
</t>
</th>
</tr> </tr>
</thead> </thead>
<tbody> <t t-foreach="rmas" t-as="rma">
<t t-foreach="rma_list" t-as="rma">
<tr> <tr>
<td> <td class="text-left"><a t-attf-href="/my/rma/#{rma.id}"><span t-field="rma.name"/></a></td>
<a t-attf-href="/my/rma/#{rma.id}?#{keep_query()}"> <td><span t-field="rma.create_date"/></td>
<t t-esc="rma.name"/> <td class="rma-template">
</a> <span t-if="groupby != 'template'" t-field="rma.template_id"/>
</td> </td>
<td> <td class="rma-state">
<span t-field="rma.create_date"/> <span t-if="groupby != 'state'" t-attf-class="badge badge-pill #{'badge-' + ('warning' if rma.state == 'draft' else 'success' if rma.state == 'confirmed' else 'info')}" t-field="rma.state"/>
</td>
<td>
<span t-field="rma.state"/>
</td> </td>
</tr> </tr>
</t> </t>
</tbody> </t>
</t> </t>
<div t-if="rma_templates" class="row"> <div t-if="rma_templates" class="row">
<div class="col-12"> <div class="col-12">