A portal user couldn't change his address details if he was of type `contact` This happens because users usually have no access to write their parent company. opw-688192 Closes #13430
106 lines
4.1 KiB
Python
106 lines
4.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
from openerp import http
|
|
from openerp.http import request
|
|
from openerp import tools
|
|
from openerp.tools.translate import _
|
|
|
|
|
|
class website_account(http.Controller):
|
|
@http.route(['/my', '/my/home'], type='http', auth="public", website=True)
|
|
def account(self, **kw):
|
|
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 request.website.render("website_portal.account", 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', '')})
|
|
if partner.type == "contact":
|
|
address_fields = {
|
|
'city': post.pop('city'),
|
|
'street': post.pop('street'),
|
|
'street2': post.pop('street2'),
|
|
'zip': post.pop('zip'),
|
|
'country_id': post.pop('country_id'),
|
|
'state_id': post.pop('state_id')
|
|
}
|
|
partner.commercial_partner_id.sudo().write(address_fields)
|
|
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"]
|
|
optional_billing_fields = ["zipcode", "state_id", "vat", "street"]
|
|
|
|
# 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.'))
|
|
|
|
unknown = [k for k in data.iterkeys() if k not in mandatory_billing_fields + optional_billing_fields]
|
|
if unknown:
|
|
error['common'] = 'Unknown field'
|
|
error_message.append("Unknown field '%s'" % ','.join(unknown))
|
|
|
|
return error, error_message
|