diff --git a/addons/event/views/event_config_settings_views.xml b/addons/event/views/event_config_settings_views.xml index 6b18bb9d71d..67601b1274d 100644 --- a/addons/event/views/event_config_settings_views.xml +++ b/addons/event/views/event_config_settings_views.xml @@ -24,14 +24,14 @@ -
+
-
diff --git a/addons/event_sale/models/__init__.py b/addons/event_sale/models/__init__.py index 988d9523f9b..a55c87dd5a6 100644 --- a/addons/event_sale/models/__init__.py +++ b/addons/event_sale/models/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +import account_invoice import sale_order import product import event diff --git a/addons/event_sale/models/account_invoice.py b/addons/event_sale/models/account_invoice.py new file mode 100644 index 00000000000..b8f4e309bb4 --- /dev/null +++ b/addons/event_sale/models/account_invoice.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, models + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + @api.multi + def action_invoice_paid(self): + """ When an invoice linked to a sales order selling registrations is + paid confirm attendees. Attendees should indeed not be confirmed before + full payment. """ + res = super(AccountInvoice, self).action_invoice_paid() + self.mapped('invoice_line_ids.sale_line_ids')._update_registrations(confirm=True) + return res diff --git a/addons/event_sale/models/sale_order.py b/addons/event_sale/models/sale_order.py index d917254fb34..ec9bbe2ffae 100644 --- a/addons/event_sale/models/sale_order.py +++ b/addons/event_sale/models/sale_order.py @@ -10,7 +10,7 @@ class SaleOrder(models.Model): def action_confirm(self): self.ensure_one() res = super(SaleOrder, self).action_confirm() - self.order_line._update_registrations(confirm=True) + self.order_line._update_registrations(confirm=False, cancel_to_draft=False) if any(self.order_line.filtered(lambda line: line.event_id)): return self.env['ir.actions.act_window'].with_context(default_sale_order_id=self.id).for_xml_id('event_sale', 'action_sale_order_event_registration') return res @@ -35,7 +35,7 @@ class SaleOrderLine(models.Model): return res @api.multi - def _update_registrations(self, confirm=True, registration_data=None): + def _update_registrations(self, confirm=True, cancel_to_draft=False, registration_data=None): """ Create or update registrations linked to a sales order line. A sale order line has a product_uom_qty attribute that will be the number of registrations linked to this line. This method update existing registrations @@ -46,7 +46,7 @@ class SaleOrderLine(models.Model): existing_registrations = registrations.filtered(lambda self: self.sale_order_line_id.id == so_line.id) if confirm: existing_registrations.filtered(lambda self: self.state != 'open').confirm_registration() - else: + if cancel_to_draft: existing_registrations.filtered(lambda self: self.state == 'cancel').do_draft() for count in range(int(so_line.product_uom_qty) - len(existing_registrations)): diff --git a/addons/event_sale/wizard/event_edit_registration.py b/addons/event_sale/wizard/event_edit_registration.py index 0ae579bc693..f03623d91ad 100644 --- a/addons/event_sale/wizard/event_edit_registration.py +++ b/addons/event_sale/wizard/event_edit_registration.py @@ -55,7 +55,7 @@ class RegistrationEditor(models.TransientModel): self.env['event.registration'].create(values) if self.env.context.get('active_model') == 'sale.order': for order in self.env['sale.order'].browse(self.env.context.get('active_ids', [])): - order.order_line._update_registrations(confirm=True) + order.order_line._update_registrations(confirm=False) return {'type': 'ir.actions.act_window_close'} diff --git a/addons/website_event/README.md b/addons/website_event/README.md index 862c44a685c..e4691d2619b 100644 --- a/addons/website_event/README.md +++ b/addons/website_event/README.md @@ -10,7 +10,7 @@ Create Awesome Event Pages ### Get rid of old WYSIWYG editors -Create beautiful event pages by drag & droping well designed *'Building Blocks'*. Publish event photos, speakers, agenda, etc. +Create beautiful event pages by drag & droping well designed *'Building Blocks'*. Publish event photos, speakers, schedule, etc. Odoo's unique *'edit inline'* approach makes website creation surprisingly easy. "Want to introduce a speaker? to change the price of a ticket? to update a banner? promote sponsors?" just click and change. diff --git a/addons/website_event/__manifest__.py b/addons/website_event/__manifest__.py index bd467c9b02a..6811d586e16 100644 --- a/addons/website_event/__manifest__.py +++ b/addons/website_event/__manifest__.py @@ -4,7 +4,7 @@ 'name': 'Online Events', 'category': 'Marketing', 'sequence': 135, - 'summary': 'Schedule, Promote and Sell Events', + 'summary': 'Publish Events and Manage Online Registrations on your Website', 'website': 'https://www.odoo.com/page/website-builder', 'description': """ Online Events diff --git a/addons/website_event/static/description/index.html b/addons/website_event/static/description/index.html index 8ef92f0377c..5648a814172 100644 --- a/addons/website_event/static/description/index.html +++ b/addons/website_event/static/description/index.html @@ -1,7 +1,7 @@

Create your own events

-

Organize, publish, promote and sell.

+

Organize, publish and promote.

@@ -15,7 +15,7 @@

Host events that resonates with your audience

Easily create live or online events

- One platform to manage it all. Odoo Events covers all aspects of an event manager's work: organization, visibility, promotion and sale. Use it with any kind of event, including conferences, meetings, seminars, training and webinars. + One platform to manage it all. Odoo Events covers all aspects of an event manager's work: organization, visibility, promotion. Use it with any kind of event, including conferences, meetings, seminars, training and webinars.

@@ -51,7 +51,7 @@
-

Automatically display your event's agenda in a clear, classy design on your website.

+

Automatically display your event's schedule in a clear, classy design on your website.

@@ -69,9 +69,9 @@

Get sponsors to come to you

-

Sell sponsorship, promote your sponsors

+

Promote your sponsors

- Easily manage existing and new sponsors with Odoo Events. Add sponsors to your events and publish sponsors per level (e.g., gold) on the bottom of every page of the event. Sell sponsorship packages online through Odoo eCommerce.

+ Easily manage existing and new sponsors with Odoo Events. Add sponsors to your events and publish sponsors per level (e.g., gold) on the bottom of every page of the event.

@@ -83,22 +83,16 @@
-
+
+

Total promotion tools

+

Promote events efficiently on all channels

- -

Total promotion tools

-

Promote events efficiently on all channels

-

- Segment your audience, leverage social media and email marketing to promote your events to the right audience. Odoo Events' smooth integration with countless Odoo apps simplifies promotion to the extreme. Setup automated campaigns for attendees, or automatically send timely emails to registrants. Optimize conversions with ad-hoc landing pages for your different marketing campaigns. -

+
- -

Sell tickets online

-

Automate the registration and payment process

- Manage registrations and sell tickets online to your events. Choose whether it is a free event or whether attendees need to register for a fee. Pick the paying method -pay online with a credit card or with the invoice. Define special conditions such as early-bird prices, member benefits or extra services with multiple tickets. All you need to boost your event attendance. + Segment your audience, leverage social media and email marketing to promote your events to the right audience. Odoo Events' smooth integration with countless Odoo apps simplifies promotion to the extreme. Setup automated campaigns for attendees, or automatically send timely emails to registrants. Optimize conversions with ad-hoc landing pages for your different marketing campaigns.

diff --git a/addons/website_event/static/src/js/website_event.js b/addons/website_event/static/src/js/website_event.js index cb531d0035a..2df7642c1a3 100644 --- a/addons/website_event/static/src/js/website_event.js +++ b/addons/website_event/static/src/js/website_event.js @@ -26,13 +26,21 @@ var EventRegistrationForm = Widget.extend({ $("#registration_form select").each(function() { post[$(this).attr('name')] = $(this).val(); }); - return ajax.jsonRpc($form.attr('action'), 'call', post).then(function (modal) { - var $modal = $(modal); - $modal.appendTo($form).modal(); - $modal.on('click', '.js_goto_event', function () { - $modal.modal('hide'); + var tickets_ordered = _.some(_.map(post, function(value, key) { return parseInt(value) })); + if (! tickets_ordered) { + return $('#registration_form table').after( + '
Please select at least one ticket.
' + ); + } + else { + return ajax.jsonRpc($form.attr('action'), 'call', post).then(function (modal) { + var $modal = $(modal); + $modal.appendTo($form).modal(); + $modal.on('click', '.js_goto_event', function () { + $modal.modal('hide'); + }); }); - }); + } }, }); diff --git a/addons/website_event/views/event_templates.xml b/addons/website_event/views/event_templates.xml index ea714ef45b5..a06e81e5ccb 100644 --- a/addons/website_event/views/event_templates.xml +++ b/addons/website_event/views/event_templates.xml @@ -438,7 +438,12 @@ Sold Out diff --git a/addons/website_event_sale/__manifest__.py b/addons/website_event_sale/__manifest__.py index 4311b952800..67beb8a1d41 100644 --- a/addons/website_event_sale/__manifest__.py +++ b/addons/website_event_sale/__manifest__.py @@ -3,7 +3,7 @@ { 'name': "Online Event's Tickets", 'category': 'Marketing', - 'summary': "Sell Your Event's Tickets", + 'summary': "Manage Events and Sell Tickets Online", 'website': 'https://www.odoo.com/page/events', 'description': """ Online Event's Tickets diff --git a/addons/website_event_sale/models/sale_order.py b/addons/website_event_sale/models/sale_order.py index edfb30e7e62..3cf2d253182 100644 --- a/addons/website_event_sale/models/sale_order.py +++ b/addons/website_event_sale/models/sale_order.py @@ -92,7 +92,7 @@ class SaleOrder(models.Model): # adding attendees elif ticket and new_qty > old_qty: line = OrderLine.browse(values['line_id']) - line._update_registrations(confirm=False, registration_data=kwargs.get('registration_data', [])) + line._update_registrations(confirm=False, cancel_to_draft=True, registration_data=kwargs.get('registration_data', [])) # add in return values the registrations, to display them on website (or not) values['attendee_ids'] = self.env['event.registration'].search([('sale_order_line_id', '=', line.id), ('state', '!=', 'cancel')]).ids return values diff --git a/addons/website_event_sale/views/event_templates.xml b/addons/website_event_sale/views/event_templates.xml index d0005892fd6..adcacf2ccb9 100644 --- a/addons/website_event_sale/views/event_templates.xml +++ b/addons/website_event_sale/views/event_templates.xml @@ -25,6 +25,7 @@ + @@ -74,7 +75,12 @@ - Sold Out @@ -84,8 +90,16 @@ + + class="btn btn-primary btn-lg pull-right a-submit" t-attf-id="#{event.id}"> + + Order Now + + + Register Now + + event.event_ticket_ids @@ -93,6 +107,12 @@