diff --git a/addons/website_crm_partner_assign/controllers/main.py b/addons/website_crm_partner_assign/controllers/main.py index 46267ee55c4..9edc425e69a 100644 --- a/addons/website_crm_partner_assign/controllers/main.py +++ b/addons/website_crm_partner_assign/controllers/main.py @@ -5,6 +5,7 @@ import datetime import werkzeug from collections import OrderedDict +from werkzeug.exceptions import NotFound from odoo import fields from odoo import http @@ -93,13 +94,13 @@ class WebsiteAccount(website_account): this_week_end_date = fields.Date.to_string(fields.Date.from_string(today) + datetime.timedelta(days=7)) searchbar_filters = { - 'all': {'label': _('All'), 'domain': []}, + 'all': {'label': _('Active'), 'domain': []}, 'today': {'label': _('Today Activities'), 'domain': [('activity_date_deadline', '=', today)]}, 'week': {'label': _('This Week Activities'), 'domain': [('activity_date_deadline', '>=', today), ('activity_date_deadline', '<=', this_week_end_date)]}, 'overdue': {'label': _('Overdue Activities'), 'domain': [('activity_date_deadline', '<', today)]}, - 'won': {'label': _('Won'), 'domain': [('stage_id.probability', '=', 100), ('stage_id.fold', '=', True)]}, - 'lost': {'label': _('Lost'), 'domain': [('active', '=', False)]}, + 'won': {'label': _('Won'), 'domain': [('stage_id.probability', '=', 100), ('stage_id.on_change', '=', True)]}, + 'lost': {'label': _('Lost'), 'domain': [('active', '=', False), ('probability', '=', 0)]}, } searchbar_sortings = { 'date': {'label': _('Newest'), 'order': 'create_date desc'}, @@ -118,6 +119,8 @@ class WebsiteAccount(website_account): if not filterby: filterby = 'all' domain += searchbar_filters[filterby]['domain'] + if filterby == 'lost': + CrmLead = CrmLead.with_context(active_test=False) # archive groups - Default Group By 'create_date' archive_groups = self._get_archive_groups('crm.lead', domain) @@ -149,16 +152,21 @@ class WebsiteAccount(website_account): }) return request.render("website_crm_partner_assign.portal_my_opportunities", values) - @http.route(['/my/lead/'], type='http', auth="user", website=True) - def portal_my_lead(self, lead=None, **kw): + @http.route(['''/my/lead/'''], type='http', auth="user", website=True) + def portal_my_lead(self, lead, **kw): + if lead.type != 'lead': + raise NotFound() return request.render("website_crm_partner_assign.portal_my_lead", {'lead': lead}) - @http.route(['/my/opportunity/'], type='http', auth="user", website=True) - def portal_my_opportunity(self, lead=None, **kw): + @http.route(['''/my/opportunity/'''], type='http', auth="user", website=True) + def portal_my_opportunity(self, opp, **kw): + if opp.type != 'opportunity': + raise NotFound() + return request.render( "website_crm_partner_assign.portal_my_opportunity", { - 'opportunity': lead, - 'user_activity': lead.activity_ids.filtered(lambda activity: activity.user_id == request.env.user)[:1], + 'opportunity': opp, + 'user_activity': opp.activity_ids.filtered(lambda activity: activity.user_id == request.env.user)[:1], 'stages': request.env['crm.stage'].search([('probability', '!=', '100')], order='sequence desc'), 'activity_types': request.env['mail.activity.type'].sudo().search([]), 'states': request.env['res.country.state'].sudo().search([]), diff --git a/addons/website_crm_partner_assign/models/crm_lead.py b/addons/website_crm_partner_assign/models/crm_lead.py index 95cf731c869..6556deeec70 100644 --- a/addons/website_crm_partner_assign/models/crm_lead.py +++ b/addons/website_crm_partner_assign/models/crm_lead.py @@ -232,26 +232,29 @@ class CrmLead(models.Model): 'planned_revenue': values['planned_revenue'], 'probability': values['probability'], 'priority': values['priority'], + 'date_deadline': values['date_deadline'] or False, } # As activities may belong to several users, only the current portal user activity # will be modified by the portal form. If no activity exist we create a new one instead # that we assign to the portal user. + user_activity = lead.activity_ids.filtered(lambda activity: activity.user_id == self.env.user)[:1] - if user_activity: - user_activity.sudo().write({ - 'activity_type_id': values['activity_type_id'], - 'summary': values['activity_summary'], - 'date_deadline': values['activity_date_deadline'], - }) - else: - self.env['mail.activity'].sudo().create({ - 'res_model_id': self.env.ref('crm.model_crm_lead').id, - 'res_id': lead.id, - 'user_id': self.env.user.id, - 'activity_type_id': values['activity_type_id'], - 'summary': values['activity_summary'], - 'date_deadline': values['activity_date_deadline'], - }) + if values['activity_date_deadline']: + if user_activity: + user_activity.sudo().write({ + 'activity_type_id': values['activity_type_id'], + 'summary': values['activity_summary'], + 'date_deadline': values['activity_date_deadline'], + }) + else: + self.env['mail.activity'].sudo().create({ + 'res_model_id': self.env.ref('crm.model_crm_lead').id, + 'res_id': lead.id, + 'user_id': self.env.user.id, + 'activity_type_id': values['activity_type_id'], + 'summary': values['activity_summary'], + 'date_deadline': values['activity_date_deadline'], + }) lead.write(lead_values) @api.model diff --git a/addons/website_crm_partner_assign/static/src/js/crm_partner_assign.js b/addons/website_crm_partner_assign/static/src/js/crm_partner_assign.js index 3357c9d9384..b5920cb31ee 100644 --- a/addons/website_crm_partner_assign/static/src/js/crm_partner_assign.js +++ b/addons/website_crm_partner_assign/static/src/js/crm_partner_assign.js @@ -101,6 +101,8 @@ $('.edit_contact_confirm').on('click',function(){ }); $('.new_opp_confirm').on('click',function(e){ + var $btn = $(this); + $btn.prop('disabled', true); new Model('crm.lead') .call("create_opp_portal", [{ contact_name: $('.new_opp_form .contact_name').val(), @@ -111,10 +113,15 @@ $('.new_opp_confirm').on('click',function(e){ if (response.errors) { $('#new-opp-dialog .alert').remove(); $('#new-opp-dialog div:first').prepend("
" + response.errors + "
"); + $btn.prop('disabled', false); + } else { window.location = '/my/opportunity/' + response.id; } + }) + .fail(function() { + $btn.prop('disabled', false); }); return false; }); @@ -124,6 +131,7 @@ $('.edit_opp_confirm').on('click',function(){ $btn.prop('disabled', true); new Model('crm.lead') .call("update_lead_portal", [[parseInt($('.edit_opp_form .opportunity_id').val())],{ + date_deadline: $('.edit_opp_form .date_deadline').val(), planned_revenue: parseFloat($('.edit_opp_form .planned_revenue').val()), probability: parseFloat($('.edit_opp_form .probability').val()), activity_type_id: parseInt($('.edit_opp_form .next_activity').find(":selected").attr('data')), diff --git a/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml b/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml index df60fa3eac8..668848908ab 100644 --- a/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml +++ b/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml @@ -215,7 +215,7 @@ - There are currently no leads for your account. + There are currently no leads. @@ -227,7 +227,7 @@ - There are currently no opportunities for your account. + There are currently no opportunities. @@ -307,13 +307,13 @@ -
- - - - + + + +
+
diff --git a/addons/website_payment/controllers/main.py b/addons/website_payment/controllers/main.py index dd4ef720e16..31244b87cda 100644 --- a/addons/website_payment/controllers/main.py +++ b/addons/website_payment/controllers/main.py @@ -78,8 +78,15 @@ class WebsitePayment(http.Controller): tx_id = request.session.pop('website_payment_tx_id', False) if tx_id: tx = request.env['payment.transaction'].browse(tx_id) - status = (tx.state == 'done' and 'success') or 'danger' - message = (tx.state == 'done' and 'Your payment was successful! It may take some time to be validated on our end.') or 'OOps! There was a problem with your payment.' + if tx.state == 'done': + status = 'success' + message = tx.acquirer_id.done_msg + elif tx.state == 'pending': + status = 'warning' + message = tx.acquirer_id.pending_msg + else: + status = 'danger' + message = tx.acquirer_id.error_msg return request.render('website_payment.confirm', {'tx': tx, 'status': status, 'message': message}) else: return request.redirect('/my/home') diff --git a/addons/website_payment/views/website_payment_templates.xml b/addons/website_payment/views/website_payment_templates.xml index bf01e712999..a7ec331cc59 100644 --- a/addons/website_payment/views/website_payment_templates.xml +++ b/addons/website_payment/views/website_payment_templates.xml @@ -136,7 +136,7 @@
-
+
diff --git a/addons/website_portal/static/src/js/website_portal_tour.js b/addons/website_portal/static/src/js/website_portal_tour.js new file mode 100644 index 00000000000..9b63d711a29 --- /dev/null +++ b/addons/website_portal/static/src/js/website_portal_tour.js @@ -0,0 +1,24 @@ +odoo.define('website_portal.tour', function (require) { +'use strict'; + +var tour = require("web_tour.tour"); +var base = require("web_editor.base"); + +tour.register('portal_load_homepage', { + test: true, + url: '/my', + wait_for: base.ready() +}, + [ + { + content: "Check portal is loaded", + trigger: 'a[href*="/my/account"]:contains("Change"):first', + }, + { + content: "Load my account details", + trigger: 'body:contains("Contact Details")', + } + ] +); + +}); diff --git a/addons/website_portal/static/src/less/website_portal.less b/addons/website_portal/static/src/less/website_portal.less index 11f4219abbd..ef62ecbc2f5 100644 --- a/addons/website_portal/static/src/less/website_portal.less +++ b/addons/website_portal/static/src/less/website_portal.less @@ -9,3 +9,7 @@ .o_my_home_content > .page-header > a:hover { text-decoration: none; } + +.portal-wrap table.table tr { + word-wrap: break-word; +} \ No newline at end of file diff --git a/addons/website_portal/tests/__init__.py b/addons/website_portal/tests/__init__.py new file mode 100644 index 00000000000..a2e745ce861 --- /dev/null +++ b/addons/website_portal/tests/__init__.py @@ -0,0 +1 @@ +import test_load_process \ No newline at end of file diff --git a/addons/website_portal/tests/test_load_process.py b/addons/website_portal/tests/test_load_process.py new file mode 100644 index 00000000000..25b139e6dfc --- /dev/null +++ b/addons/website_portal/tests/test_load_process.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +import odoo.tests + + +@odoo.tests.common.at_install(False) +@odoo.tests.common.post_install(True) +class TestUi(odoo.tests.HttpCase): + def test_01_portal_load_tour(self): + self.phantom_js( + "/", + "odoo.__DEBUG__.services['web_tour.tour'].run('portal_load_homepage')", + "", + login="portal" + ) + diff --git a/addons/website_portal/views/website_portal_templates.xml b/addons/website_portal/views/website_portal_templates.xml index 3e5924938a7..cc6005e5640 100644 --- a/addons/website_portal/views/website_portal_templates.xml +++ b/addons/website_portal/views/website_portal_templates.xml @@ -5,6 +5,7 @@ + @@ -90,7 +91,7 @@
-
+
diff --git a/addons/website_portal_sale/views/website_portal_sale_templates.xml b/addons/website_portal_sale/views/website_portal_sale_templates.xml index 9f491fa0e77..a93159ceb1b 100644 --- a/addons/website_portal_sale/views/website_portal_sale_templates.xml +++ b/addons/website_portal_sale/views/website_portal_sale_templates.xml @@ -9,7 +9,7 @@
Date