diff --git a/easy_my_coop/models/partner.py b/easy_my_coop/models/partner.py index 24a3574..dd7dea8 100644 --- a/easy_my_coop/models/partner.py +++ b/easy_my_coop/models/partner.py @@ -1,170 +1,181 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Coop IT Easy SCRL fs -# Houssine Bakkali -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -from odoo import api, fields, models - - -class ResPartner(models.Model): - _inherit = 'res.partner' - - @api.multi - def _invoice_total(self): - account_invoice_report = self.env['account.invoice.report'] - if not self.ids: - self.total_invoiced = 0.0 - return True - - all_partners_and_children = {} - all_partner_ids = [] - for partner in self: - # price_total is in the company currency - all_partners_and_children[partner] = self.search([('id', 'child_of', partner.id)]).ids - all_partner_ids += all_partners_and_children[partner] - - # searching account.invoice.report via the orm is comparatively - # expensive (generates queries "id in []" forcing to build the - # full table). - # In simple cases where all invoices are in the same currency than - # the user's company access directly these elements - - # generate where clause to include multicompany rules - where_query = account_invoice_report._where_calc([ - ('partner_id', 'in', all_partner_ids), - ('state', 'not in', ['draft', 'cancel']), - ('company_id', '=', self.env.user.company_id.id), - ('type', 'in', ('out_invoice', 'out_refund')), - ('release_capital_request', '=', False), - ]) - account_invoice_report._apply_ir_rules(where_query, 'read') - from_clause, where_clause, where_clause_params = where_query.get_sql() - - # price_total is in the company currency - query = """ - SELECT SUM(price_total) as total, partner_id - FROM account_invoice_report account_invoice_report - WHERE %s - GROUP BY partner_id - """ % where_clause - self.env.cr.execute(query, where_clause_params) - price_totals = self.env.cr.dictfetchall() - for partner, child_ids in all_partners_and_children.items(): - partner.total_invoiced = sum(price['total'] for price in price_totals if price['partner_id'] in child_ids) - - @api.multi - @api.depends('share_ids') - def _compute_effective_date(self): - # TODO change it to compute it from the share register - for partner in self: - if partner.share_ids: - partner.effective_date = partner.share_ids[0].effective_date - - @api.multi - def _get_share_type(self): - shares = ( - self.env['product.product'] - .search([('is_share', '=', True)]) - ) - share_types = [(share.default_code, share.short_name) for share in shares] - return [('', '')] + share_types - - @api.multi - @api.depends('share_ids') - def _compute_cooperator_type(self): - for partner in self: - share_type = '' - for line in partner.share_ids: - share_type = line.share_product_id.default_code - if share_type: - partner.cooperator_type = share_type - - @api.multi - @api.depends('share_ids') - def _compute_share_info(self): - for partner in self: - number_of_share = 0 - total_value = 0.0 - for line in partner.share_ids: - number_of_share += line.share_number - total_value += line.share_unit_price * line.share_number - partner.number_of_share = number_of_share - partner.total_value = total_value - - cooperator = fields.Boolean(string='Cooperator', - help="Check this box if this contact is a" - " cooperator (effective or not).") - member = fields.Boolean(string='Effective cooperator', - help="Check this box if this cooperator" - " is an effective member.") - coop_candidate = fields.Boolean(string="Cooperator candidate", - compute="_compute_coop_candidate", - store=True, - readonly=True) - old_member = fields.Boolean(string='Old cooperator', - help="Check this box if this cooperator is" - " no more an effective member.") - # todo use oca partner_contact_gender - gender = fields.Selection([('male', 'Male'), - ('female', 'Female'), - ('other', 'Other')], - string='Gender') - share_ids = fields.One2many('share.line', - 'partner_id', - string='Share Lines') - cooperator_register_number = fields.Integer(string='Cooperator Number') - number_of_share = fields.Integer(compute="_compute_share_info", - multi='share', - string='Number of share', - readonly=True) - total_value = fields.Float(compute="_compute_share_info", - multi='share', - string='Total value of shares', - readonly=True) - company_register_number = fields.Char(string='Company Register Number') - cooperator_type = fields.Selection(selection='_get_share_type', - compute=_compute_cooperator_type, - string='Cooperator Type', - store=True) - effective_date = fields.Date(sting="Effective Date", - compute=_compute_effective_date, - store=True) - representative = fields.Boolean(string="Legal Representative") - subscription_request_ids = fields.One2many('subscription.request', - 'partner_id', - string="Subscription request") - legal_form = fields.Selection([('', '')], - string="Legal form") - data_policy_approved = fields.Boolean(string="Approved Data Policy") - internal_rules_approved = fields.Boolean(string="Approved Internal Rules") - - @api.multi - @api.depends('subscription_request_ids.state') - def _compute_coop_candidate(self): - for partner in self: - if partner.member: - is_candidate = False - else: - if len(partner.subscription_request_ids.filtered(lambda record: record.state == 'done')) > 0: - is_candidate = True - else: - is_candidate = False - - partner.coop_candidate = is_candidate - - def has_representative(self): - if self.child_ids.filtered('representative'): - return True - return False - - def get_representative(self): - return self.child_ids.filtered('representative') - - def get_cooperator_from_email(self, email): - return self.search([('cooperator', '=', True), - ('email', '=', email)]) - - def get_cooperator_from_crn(self, company_register_number): - return self.search([('cooperator', '=', True), - ('company_register_number', '=', company_register_number)]) +# -*- coding: utf-8 -*- +# Copyright 2019 Coop IT Easy SCRL fs +# Houssine Bakkali +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + + +from odoo import api, fields, models + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + @api.multi + def _get_report_base_filename(self): + self.ensure_one() + if self.member: + return "Cooperator Certificate - %s" % self.name + else: + return 'unknown' + + @api.multi + def _invoice_total(self): + account_invoice_report = self.env['account.invoice.report'] + if not self.ids: + self.total_invoiced = 0.0 + return True + + all_partners_and_children = {} + all_partner_ids = [] + for partner in self: + # price_total is in the company currency + all_partners_and_children[partner] = self.search([('id', 'child_of', partner.id)]).ids + all_partner_ids += all_partners_and_children[partner] + + # searching account.invoice.report via the orm is comparatively + # expensive (generates queries "id in []" forcing to build the + # full table). + # In simple cases where all invoices are in the same currency than + # the user's company access directly these elements + + # generate where clause to include multicompany rules + where_query = account_invoice_report._where_calc([ + ('partner_id', 'in', all_partner_ids), + ('state', 'not in', ['draft', 'cancel']), + ('company_id', '=', self.env.user.company_id.id), + ('type', 'in', ('out_invoice', 'out_refund')), + ('release_capital_request', '=', False), + ]) + account_invoice_report._apply_ir_rules(where_query, 'read') + from_clause, where_clause, where_clause_params = where_query.get_sql() + + # price_total is in the company currency + query = """ + SELECT SUM(price_total) as total, partner_id + FROM account_invoice_report account_invoice_report + WHERE %s + GROUP BY partner_id + """ % where_clause + self.env.cr.execute(query, where_clause_params) + price_totals = self.env.cr.dictfetchall() + for partner, child_ids in all_partners_and_children.items(): + partner.total_invoiced = sum(price['total'] for price in price_totals if price['partner_id'] in child_ids) + + @api.multi + @api.depends('share_ids') + def _compute_effective_date(self): + # TODO change it to compute it from the share register + for partner in self: + if partner.share_ids: + partner.effective_date = partner.share_ids[0].effective_date + + @api.multi + def _get_share_type(self): + shares = ( + self.env['product.product'] + .search([('is_share', '=', True)]) + ) + share_types = [(share.default_code, share.short_name) for share in shares] + return [('', '')] + share_types + + @api.multi + @api.depends('share_ids') + def _compute_cooperator_type(self): + for partner in self: + share_type = '' + for line in partner.share_ids: + share_type = line.share_product_id.default_code + if share_type: + partner.cooperator_type = share_type + + @api.multi + @api.depends('share_ids') + def _compute_share_info(self): + for partner in self: + number_of_share = 0 + total_value = 0.0 + for line in partner.share_ids: + number_of_share += line.share_number + total_value += line.share_unit_price * line.share_number + partner.number_of_share = number_of_share + partner.total_value = total_value + + cooperator = fields.Boolean(string='Cooperator', + help="Check this box if this contact is a" + " cooperator (effective or not).") + member = fields.Boolean(string='Effective cooperator', + help="Check this box if this cooperator" + " is an effective member.") + coop_candidate = fields.Boolean(string="Cooperator candidate", + compute="_compute_coop_candidate", + store=True, + readonly=True) + old_member = fields.Boolean(string='Old cooperator', + help="Check this box if this cooperator is" + " no more an effective member.") + # todo use oca partner_contact_gender + gender = fields.Selection([('male', 'Male'), + ('female', 'Female'), + ('other', 'Other')], + string='Gender') + share_ids = fields.One2many('share.line', + 'partner_id', + string='Share Lines') + cooperator_register_number = fields.Integer(string='Cooperator Number') + number_of_share = fields.Integer(compute="_compute_share_info", + multi='share', + string='Number of share', + readonly=True) + total_value = fields.Float(compute="_compute_share_info", + multi='share', + string='Total value of shares', + readonly=True) + company_register_number = fields.Char(string='Company Register Number') + cooperator_type = fields.Selection(selection='_get_share_type', + compute=_compute_cooperator_type, + string='Cooperator Type', + store=True) + effective_date = fields.Date(sting="Effective Date", + compute=_compute_effective_date, + store=True) + representative = fields.Boolean(string="Legal Representative") + subscription_request_ids = fields.One2many('subscription.request', + 'partner_id', + string="Subscription request") + legal_form = fields.Selection([('', '')], + string="Legal form") + data_policy_approved = fields.Boolean(string="Approved Data Policy") + internal_rules_approved = fields.Boolean(string="Approved Internal Rules") + + @api.multi + @api.depends('subscription_request_ids.state') + def _compute_coop_candidate(self): + for partner in self: + if partner.member: + is_candidate = False + else: + sub_requests = partner.subscription_request_ids.filtered( + lambda record: record.state == 'done') + is_candidate = bool(sub_requests) + + partner.coop_candidate = is_candidate + + @api.multi + def has_representative(self): + self.ensure_one() + if self.child_ids.filtered('representative'): + return True + return False + + @api.multi + def get_representative(self): + self.ensure_one() + return self.child_ids.filtered('representative') + + def get_cooperator_from_email(self, email): + return self.env['res.partner'].search([('cooperator', '=', True), + ('email', '=', email)]) + + def get_cooperator_from_crn(self, company_register_number): + return self.env['res.partner'].search([('cooperator', '=', True), + ('company_register_number', '=', company_register_number)]) diff --git a/easy_my_coop_website/views/subscription_template.xml b/easy_my_coop_website/views/subscription_template.xml index e85aeb5..b4cf9a3 100644 --- a/easy_my_coop_website/views/subscription_template.xml +++ b/easy_my_coop_website/views/subscription_template.xml @@ -57,6 +57,11 @@

+ +
+ You want to modify your personnal information ? +
+
You have already an account? @@ -177,8 +182,8 @@ - + t-attf-value="#{city or ''}" placeholder="Bruxelles"/> +
@@ -292,7 +297,7 @@ +
-

+

@@ -300,7 +305,7 @@
-
diff --git a/easy_my_coop_website_portal/__manifest__.py b/easy_my_coop_website_portal/__manifest__.py index 0063c6f..95345cf 100644 --- a/easy_my_coop_website_portal/__manifest__.py +++ b/easy_my_coop_website_portal/__manifest__.py @@ -1,14 +1,15 @@ -# Copyright 2018-Coop IT Easy SCRLfs () +# Copyright 2018 Coop IT Easy SCRLfs () # - Rémy Taymans +# - Houssine Bakkali # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { 'name': 'Easy My Coop Website Portal', "version": "12.0.1.0.0", 'depends': [ - 'website', - 'website_portal_v10', 'easy_my_coop', - 'report', + 'website', + 'account', + 'portal', ], 'description': """ Show cooperator information in the website portal. @@ -20,6 +21,5 @@ 'data': [ 'views/easy_my_coop_website_portal_templates.xml', ], - 'installable': False, - 'application': False, + 'installable': True, } diff --git a/easy_my_coop_website_portal/controllers/main.py b/easy_my_coop_website_portal/controllers/main.py index 1f154f9..1d2b2b4 100644 --- a/easy_my_coop_website_portal/controllers/main.py +++ b/easy_my_coop_website_portal/controllers/main.py @@ -1,66 +1,115 @@ -# -*- coding: utf-8 -*- - -# Copyright 2015-2016 Odoo S.A. # Copyright 2016 Jairo Llopis -# Copyright 2017-2018 Rémy Taymans +# Copyright 2017-2018 Rémy Taymans +# Copyright 2019 Houssine Bakkali # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from werkzeug.exceptions import Forbidden, NotFound - -from openerp import http -from openerp.exceptions import AccessError, MissingError -from openerp.fields import Date -from openerp.http import request +from odoo.exceptions import AccessError, MissingError +from odoo.fields import Date +from odoo.http import request, route +from odoo import _ -from openerp.addons.website_portal_v10.controllers.main import WebsiteAccount +from odoo.addons.portal.controllers.portal import CustomerPortal +from odoo.addons.portal.controllers.portal import pager as portal_pager +from odoo.addons.payment.controllers.portal import PaymentProcessing -class CooperatorWebsiteAccount(WebsiteAccount): +class CooperatorPortalAccount(CustomerPortal): + CustomerPortal.MANDATORY_BILLING_FIELDS.extend(["iban", + "birthdate_date", + "gender"]) def _prepare_portal_layout_values(self): - values = super(CooperatorWebsiteAccount, + values = super(CooperatorPortalAccount, self)._prepare_portal_layout_values() # We assume that commercial_partner_id always point to the # partner itself or to the linked partner. So there is no # need to check if the partner is a "contact" or not. - coop = request.env.user.partner_id.commercial_partner_id + partner = request.env.user.partner_id + coop = partner.commercial_partner_id + partner_obj = request.env['res.partner'] coop_bank = request.env['res.partner.bank'].sudo().search( [('partner_id', 'in', [coop.id])], limit=1 ) - values.update({ - 'coop': coop, - 'coop_bank': coop_bank, - }) - return values - - @http.route() - def account(self): - """ Add Release Capital Request to main account page """ - response = super(CooperatorWebsiteAccount, self).account() - partner = request.env.user.partner_id - invoice_mgr = request.env['account.invoice'] - capital_request_count = invoice_mgr.sudo().search_count([ - ('partner_id', 'in', - [partner.commercial_partner_id.id]), + capital_request_count = invoice_mgr.search_count([ ('state', 'in', ['open', 'paid', 'cancelled']), # Get only the release capital request ('release_capital_request', '=', True), ]) - response.qcontext.update({ + invoice_count = invoice_mgr.search_count([ + ('release_capital_request', '=', False) + ]) + iban = '' + if partner.bank_ids: + iban = partner.bank_ids[0].acc_number + + fields_desc = partner_obj.sudo().fields_get(['gender']) + + values.update({ + 'coop': coop, + 'coop_bank': coop_bank, 'capital_request_count': capital_request_count, + 'invoice_count': invoice_count, + 'iban': iban, + 'genders': fields_desc['gender']['selection'] }) - return response + return values - @http.route( + def details_form_validate(self, data): + error, error_message = super(CooperatorPortalAccount, + self).details_form_validate(data) + sub_req_obj = request.env['subscription.request'] + iban = data.get("iban") + valid = sub_req_obj.check_iban(iban) + + if not valid: + error['iban'] = 'error' + error_message.append(_("You iban account number is not valid")) + return error, error_message + + @route(['/my/account'], type='http', auth='user', website=True) + def account(self, redirect=None, **post): + res = super(CooperatorPortalAccount, self).account( + redirect, **post) + if not res.qcontext.get('error'): + partner = request.env.user.partner_id + partner_bank = request.env['res.partner.bank'] + iban = post.get('iban') + if iban: + if partner.bank_ids: + bank_account = partner.bank_ids[0] + bank_account.acc_number = iban + else: + partner_bank.sudo().create({ + 'partner_id': partner.id, + 'acc_number': iban + }) + return res + + @route(['/my/invoices', '/my/invoices/page/'], type='http', + auth="user", website=True) + def portal_my_invoices(self, page=1, date_begin=None, date_end=None, + sortby=None, **kw): + res = super(CooperatorPortalAccount, self).portal_my_invoices( + page, date_begin, date_end, sortby, **kw) + invoice_obj = request.env['account.invoice'] + qcontext = res.qcontext + if qcontext: + invoices = invoice_obj.search([('release_capital_request', '=', False)]) + invoice_count = len(invoices) + qcontext['invoices'] = invoices + qcontext['pager']['invoice_count'] = invoice_count + return res + + @route( ['/my/release_capital_request', '/my/release_capital_request/page/'], type='http', auth="user", website=True) def portal_my_release_capital_request(self, page=1, date_begin=None, - date_end=None, **kw): + date_end=None, sortby=None, **kw): """Render a page with the list of release capital request. A release capital request is an invoice with a flag that tell if it's a capital request or not. @@ -85,9 +134,10 @@ class CooperatorWebsiteAccount(WebsiteAccount): # count for pager capital_request_count = invoice_mgr.sudo().search_count(domain) # pager - pager = request.website.pager( + pager = portal_pager( url="/my/release_capital_request", - url_args={'date_begin': date_begin, 'date_end': date_end}, + url_args={'date_begin': date_begin, 'date_end': date_end, + 'sortby': sortby}, total=capital_request_count, page=page, step=self._items_per_page @@ -98,53 +148,54 @@ class CooperatorWebsiteAccount(WebsiteAccount): values.update({ 'date': date_begin, 'capital_requests': invoices, - 'page_name': 'invoice', + 'page_name': 'Release request', 'pager': pager, 'archive_groups': archive_groups, 'default_url': '/my/release_capital_request', }) - return request.website.render( + return request.render( "easy_my_coop_website_portal.portal_my_capital_releases", values ) - @http.route(['/my/release_capital_request/pdf/'], - type='http', auth="user", website=True) - def get_release_capital_request(self, oid=-1, **kw): - """Render the pdf of the given release capital request""" - # Get the release capital request and raise an error if the user - # is not allowed to access to it or if the object is not found. - partner = request.env.user.partner_id - invoice_mgr = request.env['account.invoice'] - capital_request = invoice_mgr.sudo().browse(oid) + @route(['/my/invoices/'], + type='http', auth="public", website=True) + def portal_my_invoice_detail(self, invoice_id, access_token=None, + report_type=None, download=False, **kw): + # override in order to not retrieve release capital request as invoices try: - if capital_request.partner_id != partner: - raise Forbidden() - except AccessError: - raise Forbidden() - except MissingError: - raise NotFound() - # Get the pdf - report_mgr = request.env['report'] - pdf = report_mgr.sudo().get_pdf( - capital_request, - 'easy_my_coop.theme_invoice_G002' - ) - filename = "Release Capital Request - %d" % capital_request.id - return self._render_pdf(pdf, filename) - - @http.route(['/my/cooperator_certificate/pdf'], - type='http', auth="user", website=True) + invoice_sudo = self._document_check_access('account.invoice', + invoice_id, + access_token) + except (AccessError, MissingError): + return request.redirect('/my') + if invoice_sudo.release_capital_request: + report_ref = 'easy_my_coop.action_cooperator_invoices' + else: + report_ref = 'account.account_invoices' + if report_type in ('html', 'pdf', 'text'): + return self._show_report(model=invoice_sudo, + report_type=report_type, + report_ref=report_ref, + download=download) + + values = self._invoice_get_page_view_values(invoice_sudo, access_token, + **kw) + PaymentProcessing.remove_payment_transaction(invoice_sudo.transaction_ids) + return request.render("account.portal_invoice_page", values) + + @route(['/my/cooperator_certificate/pdf'], + type='http', auth="user", website=True) def get_cooperator_certificat(self, **kw): """Render the cooperator certificate pdf of the current user""" partner = request.env.user.partner_id - report_mgr = request.env['report'] - pdf = report_mgr.sudo().get_pdf( - partner, - 'easy_my_coop.cooperator_certificat_G001' - ) - filename = "Cooperator Certificate - %s" % partner.name - return self._render_pdf(pdf, filename) + + return self._show_report( + model=partner, + report_type='pdf', + report_ref='easy_my_coop.action_cooperator_report_certificat', + download=True + ) def _render_pdf(self, pdf, filename): """Render a http response for a pdf""" diff --git a/easy_my_coop_website_portal/views/easy_my_coop_website_portal_templates.xml b/easy_my_coop_website_portal/views/easy_my_coop_website_portal_templates.xml index 02fd5bf..4b552c0 100644 --- a/easy_my_coop_website_portal/views/easy_my_coop_website_portal_templates.xml +++ b/easy_my_coop_website_portal/views/easy_my_coop_website_portal_templates.xml @@ -1,18 +1,47 @@ - - + + + - - + + - - + + - - + diff --git a/website_portal_extend/__init__.py b/website_portal_extend/__init__.py deleted file mode 100644 index 2fa08e5..0000000 --- a/website_portal_extend/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf8 -*- -import controllers diff --git a/website_portal_extend/__openerp__.py b/website_portal_extend/__openerp__.py deleted file mode 100644 index 507afb6..0000000 --- a/website_portal_extend/__openerp__.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- 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 deleted file mode 100644 index 757b12a..0000000 --- a/website_portal_extend/controllers/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -from . import main diff --git a/website_portal_extend/controllers/main.py b/website_portal_extend/controllers/main.py deleted file mode 100644 index 0a37ddd..0000000 --- a/website_portal_extend/controllers/main.py +++ /dev/null @@ -1,188 +0,0 @@ -# -*- 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 deleted file mode 100644 index 2e54ced..0000000 --- a/website_portal_extend/views/portal_website_templates.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -