This commit adds controller to list documents of customer, with pager and archive widget to sort documents. Impacted documents are : quotations, sale order, invoices, and issues. Portal breadcrumd is improved too : add the home icon, and keep the query params when using archive widget. Some editable zones were added to templates, allowing people to customize their frontend portal.
117 lines
4.3 KiB
Python
117 lines
4.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
from openerp import http
|
|
from openerp.http import request
|
|
from openerp import tools
|
|
from openerp.tools.translate import _
|
|
|
|
from odoo.fields import Date
|
|
|
|
|
|
class website_account(http.Controller):
|
|
|
|
_items_per_page = 10
|
|
|
|
def _prepare_portal_layout_values(self):
|
|
""" prepare the values to render portal layout """
|
|
partner = request.env.user.partner_id
|
|
# get customer sales rep
|
|
if partner.user_id:
|
|
sales_rep = partner.user_id
|
|
else:
|
|
sales_rep = False
|
|
values = {
|
|
'sales_rep': sales_rep,
|
|
'company': request.website.company_id,
|
|
'user': request.env.user
|
|
}
|
|
return values
|
|
|
|
def _get_archive_groups(self, model, domain=None, fields=None, groupby="create_date", order="create_date desc"):
|
|
if not model:
|
|
return []
|
|
if domain is None:
|
|
domain = []
|
|
if fields is None:
|
|
fields = ['name', 'create_date']
|
|
groups = []
|
|
for group in request.env[model]._read_group_raw(domain, fields=fields, groupby=groupby, orderby=order):
|
|
dates, label = group[groupby]
|
|
date_begin, date_end = dates.split('/')
|
|
groups.append({
|
|
'date_begin': Date.to_string(Date.from_string(date_begin)),
|
|
'date_end': Date.to_string(Date.from_string(date_end)),
|
|
'name': label,
|
|
'item_count': group[groupby + '_count']
|
|
})
|
|
return groups
|
|
|
|
@http.route(['/my', '/my/home'], type='http', auth="public", website=True)
|
|
def account(self):
|
|
values = self._prepare_portal_layout_values()
|
|
return request.website.render("website_portal.portal_my_home", values)
|
|
|
|
@http.route(['/my/account'], type='http', auth='user', website=True)
|
|
def details(self, redirect=None, **post):
|
|
partner = request.env['res.users'].browse(request.uid).partner_id
|
|
values = {
|
|
'error': {},
|
|
'error_message': []
|
|
}
|
|
|
|
if post:
|
|
error, error_message = self.details_form_validate(post)
|
|
values.update({'error': error, 'error_message': error_message})
|
|
values.update(post)
|
|
if not error:
|
|
post.update({'zip': post.pop('zipcode', '')})
|
|
partner.sudo().write(post)
|
|
if redirect:
|
|
return request.redirect(redirect)
|
|
return request.redirect('/my/home')
|
|
|
|
countries = request.env['res.country'].sudo().search([])
|
|
states = request.env['res.country.state'].sudo().search([])
|
|
|
|
values.update({
|
|
'partner': partner,
|
|
'countries': countries,
|
|
'states': states,
|
|
'has_check_vat': hasattr(request.env['res.partner'], 'check_vat'),
|
|
'redirect': redirect,
|
|
})
|
|
|
|
return request.website.render("website_portal.details", values)
|
|
|
|
def details_form_validate(self, data):
|
|
error = dict()
|
|
error_message = []
|
|
|
|
mandatory_billing_fields = ["name", "phone", "email", "street2", "city", "country_id"]
|
|
|
|
# Validation
|
|
for field_name in mandatory_billing_fields:
|
|
if not data.get(field_name):
|
|
error[field_name] = 'missing'
|
|
|
|
# email validation
|
|
if data.get('email') and not tools.single_email_re.match(data.get('email')):
|
|
error["email"] = 'error'
|
|
error_message.append(_('Invalid Email! Please enter a valid email address.'))
|
|
|
|
# vat validation
|
|
if data.get("vat") and hasattr(request.env["res.partner"], "check_vat"):
|
|
if request.website.company_id.vat_check_vies:
|
|
# force full VIES online check
|
|
check_func = request.env["res.partner"].vies_vat_check
|
|
else:
|
|
# quick and partial off-line checksum validation
|
|
check_func = request.env["res.partner"].simple_vat_check
|
|
vat_country, vat_number = request.env["res.partner"]._split_vat(data.get("vat"))
|
|
if not check_func(vat_country, vat_number): # simple_vat_check
|
|
error["vat"] = 'error'
|
|
# error message for empty required fields
|
|
if [err for err in error.values() if err == 'missing']:
|
|
error_message.append(_('Some required fields are empty.'))
|
|
|
|
return error, error_message
|