diff --git a/website_portal_extend/__init__.py b/website_portal_extend/__init__.py new file mode 100644 index 0000000..2fa08e5 --- /dev/null +++ b/website_portal_extend/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf8 -*- +import controllers diff --git a/website_portal_extend/__openerp__.py b/website_portal_extend/__openerp__.py new file mode 100644 index 0000000..507afb6 --- /dev/null +++ b/website_portal_extend/__openerp__.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Rémy Taymans +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Website Portal Extend', + + 'summary': """ + Extension of Website Portal that show correctly information about + companies + """, + 'description': """ + """, + + 'author': 'Rémy Taymans', + 'license': 'AGPL-3', + 'version': '9.0.1.0', + 'website': "https://github.com/houssine78/vertical-cooperative", + + 'category': 'Website', + + 'depends': [ + 'website', + 'website_portal_v10', + ], + + 'data': [ + 'views/portal_website_templates.xml', + ] +} diff --git a/website_portal_extend/controllers/__init__.py b/website_portal_extend/controllers/__init__.py new file mode 100644 index 0000000..757b12a --- /dev/null +++ b/website_portal_extend/controllers/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import main diff --git a/website_portal_extend/controllers/main.py b/website_portal_extend/controllers/main.py new file mode 100644 index 0000000..0a37ddd --- /dev/null +++ b/website_portal_extend/controllers/main.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- + +# Copyright 2017-2018 Rémy Taymans +# Copyright 2018 Odoo SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from openerp import fields, models, http +from openerp.http import request +from openerp import tools +from openerp.tools.translate import _ + +from openerp.addons.website_portal_v10.controllers.main import WebsiteAccount + + +class ExtendWebsiteAccountController(WebsiteAccount): + + mandatory_billing_fields = [ + "name", + "phone", + "email", + "city", + "country_id", + "street", + ] + optional_billing_fields = [ + "zipcode", + "state_id", + "vat", + ] + + @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': [] + } + + self._set_mandatory_fields(post) + self._set_optional_fields(post) + + all_fields = ( + self.mandatory_billing_fields + + self.optional_billing_fields + ) + + if post: + error, error_message = self.details_form_validate(post) + values.update({'error': error, 'error_message': error_message}) + values.update(post) + if not error: + # Change zipcode to zip as it is stored as zip in the + # partner + if 'zipcode' in all_fields: + post.update({'zip': post.pop('zipcode', '')}) + + if partner.type == "contact": + address_fields = {} + if 'city' in all_fields: + address_fields.update({ + 'city': post.pop('city'), + }) + if 'street' in all_fields: + address_fields.update({ + 'street': post.pop('street'), + }) + if 'vat' in all_fields: + address_fields.update({ + 'vat': post['vat'], + }) + if 'zipcode' in all_fields: + address_fields.update({ + 'zip': post.pop('zip'), + }) + if 'country_id' in all_fields: + address_fields.update({ + 'country_id': post.pop('country_id'), + }) + if 'state_id' in all_fields: + address_fields.update({ + 'state_id': post.pop('state_id') + }) + + company_fields = {} + if 'company_name' in all_fields: + company_fields.update({ + 'name': post.pop('company_name'), + }) + if 'vat' in all_fields: + company_fields.update({ + # The VAT must be updated on the company and on + # the partner, so pop is not used. + 'vat': post['vat'], + }) + + partner.commercial_partner_id.sudo().write(address_fields) + partner.commercial_partner_id.sudo().write(company_fields) + # Write the rest of the info in the partner + 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 _set_mandatory_fields(self, data): + """Change mandatory billing fields of the form. + Overwrite this function if mandatory fields must be changed + depending on the value of the data or any other value. + Here it mark the field 'company_name' as need or not depending + on the current user. + """ + partner = request.env['res.users'].browse(request.uid).partner_id + if (partner.parent_id + and 'company_name' not in self.mandatory_billing_fields): + self.mandatory_billing_fields.append('company_name') + if (not partner.parent_id + and 'company_name' in self.mandatory_billing_fields): + self.mandatory_billing_fields.remove('company_name') + + def _set_optional_fields(self, data): + """Same as set_mandatory_fields but for optional ones. + Here this does nothing. + """ + pass + + def details_form_validate(self, data): + """Validate the form""" + error = dict() + error_message = [] + + all_fields = ( + self.mandatory_billing_fields + + self.optional_billing_fields + ) + + # Validation + for field_name in self.mandatory_billing_fields: + if not data.get(field_name): + error[field_name] = 'missing' + + # email validation + if ('email' in all_fields + and 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 ('vat' in all_fields + and 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 all_fields] + if unknown: + error['common'] = 'Unknown field' + error_message.append("Unknown field '%s'" % ','.join(unknown)) + + return error, error_message diff --git a/website_portal_extend/views/portal_website_templates.xml b/website_portal_extend/views/portal_website_templates.xml new file mode 100644 index 0000000..2e54ced --- /dev/null +++ b/website_portal_extend/views/portal_website_templates.xml @@ -0,0 +1,117 @@ + + + + + + + +