+
+
+
+
+
+
( to )
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
Status
+
diff --git a/addons/event_sale/wizard/__init__.py b/addons/event_sale/wizard/__init__.py
new file mode 100644
index 00000000000..f6bf2a429d9
--- /dev/null
+++ b/addons/event_sale/wizard/__init__.py
@@ -0,0 +1 @@
+import event_edit_registration
diff --git a/addons/event_sale/wizard/event_edit_registration.py b/addons/event_sale/wizard/event_edit_registration.py
new file mode 100644
index 00000000000..dfc43b0c4a2
--- /dev/null
+++ b/addons/event_sale/wizard/event_edit_registration.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+
+from openerp import models, fields, api
+
+
+class SaleOrderEventRegistration(models.TransientModel):
+ _name = "registration.editor"
+
+ sale_order_id = fields.Many2one('sale.order', 'Sale Order', required=True)
+ event_registration_ids = fields.One2many('registration.editor.line', 'editor_id', string='Registrations to Edit')
+
+ @api.model
+ def default_get(self, fields):
+ res = super(SaleOrderEventRegistration, self).default_get(fields)
+ if not res.get('sale_order_id'):
+ sale_order_id = res.get('sale_order_id', self._context.get('active_id'))
+ res['sale_order_id'] = sale_order_id
+ sale_order = self.env['sale.order'].browse(res.get('sale_order_id'))
+ registrations = self.env['event.registration'].search([('origin', '=', sale_order.name)])
+
+ attendee_list = []
+ for so_line in [l for l in sale_order.order_line if l.event_id]:
+ existing_registrations = [r for r in registrations if r.event_id == so_line.event_id]
+ for reg in existing_registrations:
+ attendee_list.append({
+ 'event_id': reg.event_id.id,
+ 'event_ticket_id': reg.event_ticket_id.id,
+ 'registration_id': reg.id,
+ 'name': reg.name,
+ 'email': reg.email,
+ 'phone': reg.phone,
+ })
+ for count in range(int(so_line.product_uom_qty) - len(existing_registrations)):
+ attendee_list.append({
+ 'event_id': so_line.event_id.id,
+ 'event_ticket_id': so_line.event_ticket_id.id,
+ })
+ res['event_registration_ids'] = attendee_list
+ return res
+
+ @api.multi
+ def action_make_registration(self):
+ Registration = self.env['event.registration']
+ for wizard in self:
+ for wiz_registration in wizard.event_registration_ids:
+ if wiz_registration.registration_id:
+ wiz_registration.registration_id.write(wiz_registration.get_registration_data()[0])
+ else:
+ Registration.create(wiz_registration.get_registration_data()[0])
+ return {'type': 'ir.actions.act_window_close'}
+
+
+class RegistrationEditorLine(models.TransientModel):
+ """Event Registration"""
+ _name = "registration.editor.line"
+
+ editor_id = fields.Many2one('registration.editor')
+ event_id = fields.Many2one('event.event', string='Event', required=True)
+ registration_id = fields.Many2one('event.registration', 'Original Registration')
+ event_ticket_id = fields.Many2one('event.event.ticket', string='Event Ticket')
+ email = fields.Char(string='Email')
+ phone = fields.Char(string='Phone')
+ name = fields.Char(string='Name', select=True)
+
+ @api.one
+ def get_registration_data(self):
+ return {
+ 'event_id': self.event_id.id,
+ 'event_ticket_id': self.event_ticket_id.id,
+ 'partner_id': self.editor_id.sale_order_id.partner_id.id,
+ 'name': self.name or self.editor_id.sale_order_id.partner_id.name,
+ 'phone': self.phone or self.editor_id.sale_order_id.partner_id.phone,
+ 'email': self.email or self.editor_id.sale_order_id.partner_id.email,
+ 'origin': self.editor_id.sale_order_id.name,
+ }
diff --git a/addons/event_sale/wizard/event_edit_registration.xml b/addons/event_sale/wizard/event_edit_registration.xml
new file mode 100644
index 00000000000..f9b572c2176
--- /dev/null
+++ b/addons/event_sale/wizard/event_edit_registration.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ registration.editor.form
+ registration.editor
+
+
+
+
+
+
+ Event Registrations
+ ir.actions.act_window
+ registration.editor
+ form
+ form
+
+ new
+ {'default_sale_order_id': context.get('default_sale_order_id')}
+
+
+
+
diff --git a/addons/payment_transfer/models/payment_acquirer.py b/addons/payment_transfer/models/payment_acquirer.py
index 63883b3df30..8b8dc7a9649 100644
--- a/addons/payment_transfer/models/payment_acquirer.py
+++ b/addons/payment_transfer/models/payment_acquirer.py
@@ -83,4 +83,4 @@ class TransferPaymentTransaction(osv.Model):
def _transfer_form_validate(self, cr, uid, tx, data, context=None):
_logger.info('Validated transfer payment for tx %s: set as pending' % (tx.reference))
- return tx.write({'state': 'pending'})
+ return tx.write({'state': 'done'})
diff --git a/addons/website_event/controllers/main.py b/addons/website_event/controllers/main.py
index da343c9fa3b..134371a3caf 100644
--- a/addons/website_event/controllers/main.py
+++ b/addons/website_event/controllers/main.py
@@ -4,9 +4,10 @@ import time
import werkzeug.urls
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
+from collections import OrderedDict
from openerp import http
-from openerp import tools
+from openerp import tools, SUPERUSER_ID
from openerp.addons.website.models.website import slug
from openerp.http import request
from openerp.tools.translate import _
@@ -195,6 +196,7 @@ class website_event(http.Controller):
'name': event_name,
'date_begin': date_begin.strftime('%Y-%m-%d'),
'date_end': (date_begin + timedelta(days=(1))).strftime('%Y-%m-%d'),
+ 'seats_available': 1000,
}
event_id = Event.create(request.cr, request.uid, vals, context=context)
event = Event.browse(request.cr, request.uid, event_id, context=context)
@@ -225,3 +227,48 @@ class website_event(http.Controller):
"event": event,
"url": event.website_url})
return request.website.render("website_event.country_events_list", result)
+
+ def _process_tickets_details(self, data):
+ nb_register = int(data.get('nb_register-0', 0))
+ if nb_register:
+ return [{'id': 0, 'name': 'Subscription', 'quantity': nb_register, 'price': 0}]
+ return []
+
+ @http.route(['/event/
/registration/new'], type='json', auth="public", methods=['POST'], website=True)
+ def registration_new(self, event, **post):
+ tickets = self._process_tickets_details(post)
+ if not tickets:
+ return request.redirect("/event/%s" % slug(event))
+ return request.website._render("website_event.registration_attendee_details", {'tickets': tickets, 'event': event})
+
+ def _process_registration_details(self, details):
+ ''' Process data posted from the attendee details form. '''
+ registrations = {}
+ for key, value in details.iteritems():
+ counter, field_name = key.split('-', 1)
+ registrations.setdefault(counter, dict())[field_name] = value
+ return registrations.values()
+
+ @http.route(['/event//registration/confirm'], type='http', auth="public", methods=['POST'], website=True)
+ def registration_confirm(self, event, **post):
+ cr, uid, context = request.cr, request.uid, request.context
+ Registration = request.registry['event.registration']
+ registrations = self._process_registration_details(post)
+
+ registration_ids = []
+ user = request.registry.get('res.users').browse(cr, uid, uid, context=context)
+ for registration in registrations:
+ registration_ids.append(
+ Registration.create(cr, SUPERUSER_ID, {
+ 'name': registration.get('name', user.name),
+ 'phone': registration.get('phone', user.phone),
+ 'email': registration.get('email', user.email),
+ 'partner_id': user.partner_id.id,
+ 'event_id': event.id,
+ }, context=context))
+
+ attendees = Registration.browse(cr, uid, registration_ids, context=context)
+ return request.website.render("website_event.registration_complete", {
+ 'attendees': attendees,
+ 'event': event,
+ })
diff --git a/addons/website_event/models/event.py b/addons/website_event/models/event.py
index 37b6d113aee..c633aae4cc2 100644
--- a/addons/website_event/models/event.py
+++ b/addons/website_event/models/event.py
@@ -4,6 +4,7 @@ from openerp import models, fields, api, _
# from openerp.osv import osv, fields
from openerp import SUPERUSER_ID
+from openerp.models import NewId
# from openerp.tools.translate import _
import re
@@ -31,11 +32,13 @@ class event(models.Model):
@api.one
@api.depends('name')
def _website_url(self):
- self.website_url = "/event/" + slug(self)
+ if isinstance(self.id, NewId):
+ self.website_url = ''
+ else:
+ self.website_url = "/event/" + slug(self)
- @api.one
def _default_hashtag(self):
- self.twitter_hashtag = re.sub("[- \\.\\(\\)\\@\\#\\&]+", "", self.env.user.company_id.name).lower()
+ return re.sub("[- \\.\\(\\)\\@\\#\\&]+", "", self.env.user.company_id.name).lower()
show_menu = fields.Boolean('Has Dedicated Menu', compute='_get_show_menu', inverse='_set_show_menu')
menu_id = fields.Many2one('website.menu', 'Event Menu')
diff --git a/addons/website_event/static/src/js/website_event.js b/addons/website_event/static/src/js/website_event.js
new file mode 100644
index 00000000000..f6a4328def4
--- /dev/null
+++ b/addons/website_event/static/src/js/website_event.js
@@ -0,0 +1,23 @@
+$(document).ready(function () {
+
+ // Catch registration form event, because of JS for attendee details
+ $('#registration_form .a-submit')
+ .off('click')
+ .removeClass('a-submit')
+ .click(function (ev) {
+ ev.preventDefault();
+ ev.stopPropagation();
+ var $form = $(ev.currentTarget).closest('form');
+ var post = {};
+ $("select").each(function() {
+ post[$(this)[0].name] = $(this).val();
+ });
+ openerp.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/website_event.xml b/addons/website_event/views/website_event.xml
index 5654a8eccb5..b0c8fbf64f7 100644
--- a/addons/website_event/views/website_event.xml
+++ b/addons/website_event/views/website_event.xml
@@ -5,6 +5,7 @@
+
@@ -289,6 +290,9 @@