[MOV] rma: from Hibou Suite Enterprise for 13.0

This commit is contained in:
Jared Kipe
2020-07-03 08:53:24 -07:00
parent 852330625c
commit d43d0330b3
24 changed files with 1936 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from . import main
from . import portal

51
rma/controllers/main.py Normal file
View File

@@ -0,0 +1,51 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import http, exceptions
from base64 import b64decode
import hmac
from hashlib import sha256
from datetime import datetime
from time import mktime
def create_hmac(secret, a_attchment_id, e_expires):
return hmac.new(secret.encode(), str(str(a_attchment_id) + str(e_expires)).encode(), sha256).hexdigest()
def check_hmac(secret, hash_, a_attachment_id, e_expires):
myh = hmac.new(secret.encode(), str(str(a_attachment_id) + str(e_expires)).encode(), sha256)
return hmac.compare_digest(str(hash_), myh.hexdigest())
class RMAController(http.Controller):
@http.route(['/rma_label'], type='http', auth='public', website=True)
def index(self, *args, **request):
a_attachment_id = request.get('a')
e_expires = request.get('e')
hash = request.get('h')
if not all([a_attachment_id, e_expires, hash]):
return http.Response('Invalid Request', status=400)
now = datetime.utcnow()
now = int(mktime(now.timetuple()))
config = http.request.env['ir.config_parameter'].sudo()
secret = str(config.search([('key', '=', 'database.secret')], limit=1).value)
if not check_hmac(secret, hash, a_attachment_id, e_expires):
return http.Response('Invalid Request', status=400)
if now > int(e_expires):
return http.Response('Expired', status=404)
attachment = http.request.env['ir.attachment'].sudo().search([('id', '=', int(a_attachment_id))], limit=1)
if attachment:
data = attachment.datas
filename = attachment.name
mimetype = attachment.mimetype
return http.request.make_response(b64decode(data), [
('Content-Type', mimetype),
('Content-Disposition', 'attachment; filename="' + filename + '"')])
return http.Response('Invalid Attachment', status=404)

137
rma/controllers/portal.py Normal file
View File

@@ -0,0 +1,137 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from collections import OrderedDict
from odoo import http, fields
from odoo.exceptions import AccessError, MissingError, ValidationError
from odoo.http import request
from odoo.tools.translate import _
from odoo.addons.portal.controllers.portal import pager as portal_pager, CustomerPortal
class CustomerPortal(CustomerPortal):
def _prepare_portal_layout_values(self):
values = super(CustomerPortal, self)._prepare_portal_layout_values()
values['rma_count'] = request.env['rma.rma'].search_count([
])
return values
def _rma_get_page_view_values(self, rma, access_token, **kwargs):
values = {
'rma': rma,
'current_date': fields.Datetime.now(),
}
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)
def portal_my_rma(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, **kw):
values = self._prepare_portal_layout_values()
RMA = request.env['rma.rma']
domain = []
fields = ['name', 'create_date']
archive_groups = self._get_archive_groups('rma.rma', domain, fields)
if date_begin and date_end:
domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)]
searchbar_sortings = {
'date': {'label': _('Newest'), 'order': 'create_date desc, id desc'},
'name': {'label': _('Name'), 'order': 'name asc, id asc'},
}
# default sort by value
if not sortby:
sortby = 'date'
order = searchbar_sortings[sortby]['order']
searchbar_filters = {
'all': {'label': _('All'), 'domain': [('state', 'in', ['draft', 'confirmed', 'done', 'cancel'])]},
'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(
url="/my/rma",
url_args={'date_begin': date_begin, 'date_end': date_end},
total=rma_count,
page=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']
)
request.session['my_rma_history'] = rmas.ids[:100]
rma_templates = request.env['rma.template'].sudo().search([('portal_ok', '=', True)])
values.update({
'request': request,
'date': date_begin,
'rma_list': rmas,
'rma_templates': rma_templates,
'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',
})
return request.render("rma.portal_my_rma", values)
@http.route(['/my/rma/<int:rma_id>'], type='http', auth="public", website=True)
def portal_my_rma_rma(self, rma_id=None, access_token=None, **kw):
try:
rma_sudo = self._document_check_access('rma.rma', rma_id, access_token=access_token)
except (AccessError, MissingError):
return request.redirect('/my')
values = self._rma_get_page_view_values(rma_sudo, access_token, **kw)
return request.render("rma.portal_my_rma_rma", values)
@http.route(['/my/rma/new/<int:rma_template_id>',
'/my/rma/new/<int:rma_template_id>/res/<int:res_id>'], type='http', auth='public', website=True)
def portal_rma_new(self, rma_template_id=None, res_id=None, **kw):
if request.env.user.has_group('base.group_public'):
return request.redirect('/my')
rma_template = request.env['rma.template'].sudo().browse(rma_template_id)
if not rma_template.exists() or not rma_template.portal_ok:
return request.redirect('/my')
error = None
try:
if res_id:
# Even if res_id is not important to the RMA type, some sort of number
# should be submitted to indicate that a selection has occurred.
rma = rma_template._portal_try_create(request.env.user, res_id, **kw)
if rma:
return request.redirect('/my/rma/' + str(rma.id))
except ValidationError as e:
error = e.name
template_name = rma_template._portal_template(res_id=res_id)
if not template_name:
return request.redirect('/my')
values = rma_template._portal_values(request.env.user, res_id=res_id)
values.update({
'request': request,
'error': error,
'current_date': fields.Datetime.now(),
})
return request.render(template_name, values)