Merge lp:~openerp-dev/openobject-addons/trunk-imp-event-psa into lp:openobject-addons

Proposed by Paramjit Singh Sahota(OpenERP)
Status: Work in progress
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-imp-event-psa
Merge into: lp:openobject-addons
Diff against target: 2247 lines (+875/-343)
43 files modified
event/__openerp__.py (+3/-2)
event/email_template.xml (+2/-2)
event/event.py (+179/-27)
event/event_data.xml (+15/-1)
event/event_demo.xml (+34/-6)
event/event_view.xml (+111/-119)
event/report/report_event_registration.py (+5/-5)
event/report/report_event_registration_view.xml (+15/-5)
event/res_config_view.xml (+24/-0)
event/security/event_security.xml (+2/-2)
event/security/ir.model.access.csv (+4/-3)
event/static/src/css/event.css (+9/-20)
event/static/src/js/event.js (+29/-0)
event/test/process/event_draft2done.yml (+10/-10)
event/test/ui/demo_data.yml (+3/-3)
event/test/ui/duplicate_event.yml (+1/-1)
event/views/event.xml (+1/-0)
event_sale/__init__.py (+1/-0)
event_sale/__openerp__.py (+2/-0)
event_sale/event_sale.py (+23/-7)
event_sale/event_sale_data.xml (+12/-2)
event_sale/event_sale_view.xml (+37/-25)
event_sale/res_config.py (+11/-0)
event_sale/res_config_view.xml (+23/-0)
event_sale/security/event_sale_security.xml (+11/-0)
event_sale/test/confirm.yml (+3/-1)
marketing/res_config_view.xml (+24/-20)
website_event/__openerp__.py (+2/-1)
website_event/models/__init__.py (+1/-0)
website_event/models/res_config.py (+14/-0)
website_event/security/website_event.xml (+13/-0)
website_event/static/src/js/website.tour.event.js (+2/-2)
website_event/views/res_config_view.xml (+25/-0)
website_event/views/website_event.xml (+12/-3)
website_event/views/website_event_sale_backend.xml (+19/-7)
website_event_sale/__openerp__.py (+0/-1)
website_event_sale/controllers/main.py (+42/-9)
website_event_sale/models/sale_order.py (+29/-0)
website_event_sale/static/src/js/website.tour.event_sale.js (+26/-11)
website_event_sale/views/website_event_sale.xml (+87/-5)
website_event_track/views/event_backend.xml (+0/-40)
website_event_track/views/website_event.xml (+1/-1)
website_sale/models/sale_order.py (+8/-2)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-imp-event-psa
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+215602@code.launchpad.net
To post a comment you must log in.
9328. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code by adding some fields in event,
improving the view of event to make the available tickets, published/unpublished button and reminders make available at single place,
added from website_event whole promotion group which consists sharing no twitter and fb.

9329. By Paramjit Singh Sahota(OpenERP)

[ADD] Added qweb reports and svg images for flags and little bit improvemnt.

9330. By Paramjit Singh Sahota(OpenERP)

[MERGE] Merged lp:openobject-addons.

9331. By Paramjit Singh Sahota(OpenERP)

[IMP] Added div name in marketing and according set path in website_event

9332. By Paramjit Singh Sahota(OpenERP)

[FIX] FIxed syntx error

9333. By Paramjit Singh Sahota(OpenERP)

[REM] Removed some code bcz notebook is now not available in event form and replaced event_backend.xml code in website_event with vid's changes

9334. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code 'History of Order' in the event form to see the status of the orders.

9335. By Paramjit Singh Sahota(OpenERP)

[ADD] In website : dynamic form for attendee first name, last name and email address

9336. By Paramjit Singh Sahota(OpenERP)

[ADD] Added cron for event reminder.

9337. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved demo data bcz its showing bad result in kanban view.
> Created an action to open the mass_mailing wizard on send email invitation button.

9338. By Paramjit Singh Sahota(OpenERP)

[IMP] Reordered the mass_mailing action.

9339. By Paramjit Singh Sahota(OpenERP)

[IMP] Resolved the errors of reports,
> rename event.registration into event.registration_attendee,

9340. By Paramjit Singh Sahota(OpenERP)

[MERGE] Merged lp:openobject-addons.

9341. By Paramjit Singh Sahota(OpenERP)

Added the rights for event.reminder.

9342. By Paramjit Singh Sahota(OpenERP)

[FIx] Fixed warning where it must be view_id rather than inherit_id

9343. By Paramjit Singh Sahota(OpenERP)

[MERGE] MErged lp:openobject-addons.

9344. By Paramjit Singh Sahota(OpenERP)

[REM] Removed the code related to reports and made another branch for that.
Removed all svg image flags
Removed reports.

9345. By Paramjit Singh Sahota(OpenERP)

[Fix] Fixed the issue of cron where in event.event wrong object was passed.

9346. By Paramjit Singh Sahota(OpenERP)

Removed unwanted code.

9347. By Paramjit Singh Sahota(OpenERP)

[MERGE] Merged lp:openobject-addons.

9348. By Paramjit Singh Sahota(OpenERP)

[REM] REmoved the store from the fields.

9349. By Paramjit Singh Sahota(OpenERP)

[REM] Removed unwanted code improved indentation.

9350. By Paramjit Singh Sahota(OpenERP)

[FIX] Fixed indent issue.

9351. By Mehul Mehta(OpenERP)

[IMP] Now in setting of event management when you tick the 'pulish your events' than the published/unpublished are visible

9352. By Mehul Mehta(OpenERP)

[IMP] Now in setting of event management when you tick the 'Manage Event Tickets' than the Manage Ticket are visible and group_publish_events apply only for published button

9353. By Pariket Trivedi(OpenERP)

[IMP] groups are apply for 'agenda' and 'locatoin'

9354. By Paramjit Singh Sahota(OpenERP)

[MERGE] MErged lp:openobject-addons

9355. By Paramjit Singh Sahota(OpenERP)

[IMP] Added implied_ids and groups for publish event in website

9356. By Pariket Trivedi(OpenERP)

[IMP]: change for report class name and store seats_max in event_sale.

9357. By Paramjit Singh Sahota(OpenERP)

Added the send_reminder_mail method to send the mails to the attendees and fixed the issue of not working cron and removed badge_layout field bcz reporting has been to some other task.

9358. By Paramjit Singh Sahota(OpenERP)

[MERGE] Merged lp:openobject-addons.

9359. By Paramjit Singh Sahota(OpenERP)

Missed to remove from the defaults.

9360. By Paramjit Singh Sahota(OpenERP)

[MERGE] Merged lp:openobject-addons & removed conflicts.

9361. By Paramjit Singh Sahota(OpenERP)

[IMP] Some changes missed out while merging.

9362. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved the form view of event ' https://openerp.mybalsamiq.com/mockups/1815495.png'
add security file for event_sale for creating a group rights for tickets and added same in res_config.

9363. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved the o2m of Automated reminders
'Email to Send | Timing | | When '.

9364. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved
>In settings/marketing,
>>event section should come before marketing campaign
>Rename Marketing campaign into lead automation
>>under lead Automation, rename Settings into 'Feature'.
>>rename 'Marketing campaign feature' into 'Automate leads accquisition'.

9365. By Paramjit Singh Sahota(OpenERP)

[MERGE] Merged lp:openobject-addons.

9366. By Paramjit Singh Sahota(OpenERP)

Resolved conflicts

9367. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code
> Creating product from the event_ticket_ids the event_ok must be true.
> Improved the xpath.
> Typo.

9368. By Paramjit Singh Sahota(OpenERP)

 Proper fix will be done afterwards, fix for right now.

9369. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved the res_config issue.

9370. By Paramjit Singh Sahota(OpenERP)

[MERGE] Merged lp:openobject-addons.

9371. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved the views issues.

9372. By Pariket Trivedi(OpenERP)

[IMP]: Manage Event Tickets groups implied for all user.

9373. By Pariket Trivedi(OpenERP)

[IMP]: Manage Event Tickets groups remove implied for all user and Publish your event groups implied for all user.

9374. By Paramjit Singh Sahota(OpenERP)

[MERGE] Merged lp:openobject-addons.

9375. By Paramjit Singh Sahota(OpenERP)

[IMP] Added the kanban view.

9376. By Paramjit Singh Sahota(OpenERP)

[MERGE] MErged lp:openobject-addons.

9377. By Paramjit Singh Sahota(OpenERP)

[IMP] Applied sparkline_bar widget for getting the attendees in the event kanban view and added the code accordingly..

9378. By Paramjit Singh Sahota(OpenERP)

[MERGE] MErged lp:openobject-addons.

9379. By Paramjit Singh Sahota(OpenERP)

Added for loop for event.

9380. By Paramjit Singh Sahota(OpenERP)

[IMP]If there is email configured on event type, the autmated reminder should be prefilled

9381. By Paramjit Singh Sahota(OpenERP)

[IMP] Make the ticket booking working through website.
[WIP] Event kanban using Sparkline

9382. By Paramjit Singh Sahota(OpenERP)

[IMP]Improved code for pie chart using sparkline. :( Still data is not perfect.

9383. By Paramjit Singh Sahota(OpenERP)

[MERGE] MERGED lp:openobject-addons.

9384. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code 'registration per day' using sparkline.

9385. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code and added gauge meter and removed unwanted functional fields.

9386. By Pariket Trivedi(OpenERP)

[IMP] make gauge view for No. of seates registrated.

9387. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code and make the sparkline data comes properly.

9388. By Paramjit Singh Sahota(OpenERP)

[MERGE] MERGED lp:openobject-addons.

9389. By Pariket Trivedi(OpenERP)

[IMP] add template file and change html code to qweb render template.

9390. By Pariket Trivedi(OpenERP)

[IMP]: change for input fild name and define res value.

9391. By Paramjit Singh Sahota(OpenERP)

[IMP] Added event_graph widget for the piechart in the event kanban.
Removed unwanted css class
Added functional fields for the pie charts.

9392. By Pariket Trivedi(OpenERP)

[IMP]: set date group_begin_date in __get_bar_values method.

9393. By Paramjit Singh Sahota(OpenERP)

[IMP] Typo change and fixed the issue of sold out tickets.

9394. By Paramjit Singh Sahota(OpenERP)

[MERGE] MERGED lp:openobject-addons.

9395. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved test case according to new attendees feature.

9396. By Paramjit Singh Sahota(OpenERP)

[IMP] Removed unwanted code and imprved test case.

9397. By Paramjit Singh Sahota(OpenERP)

Revert unwanted diff.

9398. By Paramjit Singh Sahota(OpenERP)

[IMP]Improved the list view strings like
| Creation Date | Customer | Name | Email | Event | Ticket | Source | Status |

9399. By Mehul Mehta(OpenERP)

[IMP] Removed a _defaults from event_sale

9400. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code
>When subscibe the attendee screen shouldn't be in the event page.
>>when selecting teckets, the button should be 'Select Attendees and Order'
>>a screen with attendees
>>then, order teckets the button should be 'Order Now'.

9401. By Paramjit Singh Sahota(OpenERP)

[IMP] Fixed the issue where the quantity is not updated when selecting the attendees.
Improved test cases.

9402. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved the test case.

9403. By Paramjit Singh Sahota(OpenERP)

[MERGE] MERGED lp:openobject-addons

9404. By Paramjit Singh Sahota(OpenERP)

[IMP] Added form for the FREE tickets.

9405. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code and remove unwanted code.

9406. By Paramjit Singh Sahota(OpenERP)

[FIX] Fixed the issue of TICKET NAME not properly displayed in online event.

9407. By Paramjit Singh Sahota(OpenERP)

[FIX] Fixed the missed out collections.

9408. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved package names.

9409. By Paramjit Singh Sahota(OpenERP)

Removed the base.group_user which is setting implied_ids

9410. By Paramjit Singh Sahota(OpenERP)

[IMP] TYPO changes and 'If there is email configured on event type, the autmated reminder should be prefilled'

9411. By Paramjit Singh Sahota(OpenERP)

[FIx]
Traceback when cron run :
          AttributeError: Got KeyError('' Field 'reminder_sended' does not exist in object 'browse_record(event.registration_attendee, 1)' '',) while trying to get attribute reminder_sended on a event.registration_attendee record.

9412. By Paramjit Singh Sahota(OpenERP)

[FIx] 'Type of Event'.

9413. By Paramjit Singh Sahota(OpenERP)

ADDED action for attendees from event kanban.

9414. By Jitendra Prajapati(OpenERP)

Added demo data.

9415. By Pariket Trivedi(OpenERP)

[IMP]: add action for click sparkline_bar in event.

9416. By Paramjit Singh Sahota(OpenERP)

Added groups and typo changes

9417. By Paramjit Singh Sahota(OpenERP)

[IMP] Reordered the action, loaded tthe report xml before view xml, little css improvement and made event_ok true when record created from event_ticket_ids.

9418. By Jitendra Prajapati(OpenERP)

[IMP]created sale order line one by one as per selected quantity

9419. By Paramjit Singh Sahota(OpenERP)

[IMP] Added the attendee name into and sale order line.

9420. By Pariket Trivedi(OpenERP)

[IMP]: check condition and after concat string.

9421. By Pariket Trivedi(OpenERP)

[IMP]: genrated SO in descriptin.

9422. By Pariket Trivedi(OpenERP)

[IMP]:remove registration_date field and change cron job for create_date.

9423. By Paramjit Singh Sahota(OpenERP)

[FIX] Fixed the issue 'if i add one attendee then sys will add two attendee(one from SO) that is wrong.'

9424. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code and removed the test case bcz we can't get the request.

9425. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved the attendee form and added event details on attendee page.

9426. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code for button_confirm method through which the test cases are failed.

9427. By Paramjit Singh Sahota(OpenERP)

Testing for test cases.

9428. By Pariket Trivedi(OpenERP)

[IMP] Improved code to inhibits the session stuffs when SO is created manually.
Reverted the test cases

9429. By Paramjit Singh Sahota(OpenERP)

TEST

9430. By Pariket Trivedi(OpenERP)

[IMP]: change condition.

9431. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved test case and improved code for the free tickets and little bit improvement.

Unmerged revisions

9431. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved test case and improved code for the free tickets and little bit improvement.

9430. By Pariket Trivedi(OpenERP)

[IMP]: change condition.

9429. By Paramjit Singh Sahota(OpenERP)

TEST

9428. By Pariket Trivedi(OpenERP)

[IMP] Improved code to inhibits the session stuffs when SO is created manually.
Reverted the test cases

9427. By Paramjit Singh Sahota(OpenERP)

Testing for test cases.

9426. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code for button_confirm method through which the test cases are failed.

9425. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved the attendee form and added event details on attendee page.

9424. By Paramjit Singh Sahota(OpenERP)

[IMP] Improved code and removed the test case bcz we can't get the request.

9423. By Paramjit Singh Sahota(OpenERP)

[FIX] Fixed the issue 'if i add one attendee then sys will add two attendee(one from SO) that is wrong.'

9422. By Pariket Trivedi(OpenERP)

[IMP]:remove registration_date field and change cron job for create_date.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'event/__openerp__.py'
2--- event/__openerp__.py 2014-04-29 15:41:04 +0000
3+++ event/__openerp__.py 2014-06-09 06:19:49 +0000
4@@ -38,17 +38,18 @@
5 * Use emails to automatically confirm and send acknowledgements for any event registration
6 """,
7 'author': 'OpenERP SA',
8- 'depends': ['base_setup', 'board', 'email_template', 'marketing'],
9+ 'depends': ['base_setup', 'board', 'email_template', 'marketing', 'web_kanban_sparkline', ],
10 'data': [
11 'security/event_security.xml',
12 'security/ir.model.access.csv',
13 'wizard/event_confirm_view.xml',
14+ 'report/report_event_registration_view.xml',
15 'event_view.xml',
16 'event_data.xml',
17- 'report/report_event_registration_view.xml',
18 'res_partner_view.xml',
19 'email_template.xml',
20 'views/event.xml',
21+ 'res_config_view.xml',
22 ],
23 'demo': [
24 'event_demo.xml',
25
26=== modified file 'event/email_template.xml'
27--- event/email_template.xml 2014-05-09 12:18:27 +0000
28+++ event/email_template.xml 2014-06-09 06:19:49 +0000
29@@ -3,7 +3,7 @@
30 <data>
31 <record id="confirmation_event" model="email.template">
32 <field name="name">Confirmation of the Event</field>
33- <field name="model_id" ref="event.model_event_registration"/>
34+ <field name="model_id" ref="event.model_event_registration_attendee"/>
35 <field name="email_from" >${(object.user_id.email or object.company_id.email or 'noreply@' + object.company_id.name + '.com')|safe}</field>
36 <field name="email_to" >${object.email|safe}</field>
37 <field name="subject">Your registration at ${object.event_id.name}</field>
38@@ -20,7 +20,7 @@
39
40 <record id="confirmation_registration" model="email.template">
41 <field name="name">Confirmation of the Registration</field>
42- <field name="model_id" ref="event.model_event_registration"/>
43+ <field name="model_id" ref="event.model_event_registration_attendee"/>
44 <field name="email_from" >${(object.user_id.email or object.company_id.email or 'noreply@' + object.company_id.name + '.com')|safe}</field>
45 <field name="email_to" >${object.email|safe}</field>
46 <field name="subject">Your registration at ${object.event_id.name}</field>
47
48=== modified file 'event/event.py'
49--- event/event.py 2014-05-12 07:23:31 +0000
50+++ event/event.py 2014-06-09 06:19:49 +0000
51@@ -21,9 +21,12 @@
52 import pytz
53 from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
54 from datetime import datetime, timedelta
55+from dateutil import relativedelta
56 from openerp.osv import fields, osv
57 from openerp.tools.translate import _
58 from openerp import SUPERUSER_ID
59+from openerp import tools
60+import json
61
62 class event_type(osv.osv):
63 """ Event Type """
64@@ -46,6 +49,7 @@
65 """Event"""
66 _name = 'event.event'
67 _description = __doc__
68+ _period_number = 5
69 _order = 'date_begin'
70 _inherit = ['mail.thread', 'ir.needaction_mixin']
71
72@@ -81,7 +85,7 @@
73 return self.write(cr, uid, ids, {'state': 'draft'}, context=context)
74
75 def button_cancel(self, cr, uid, ids, context=None):
76- registration = self.pool.get('event.registration')
77+ registration = self.pool.get('event.registration_attendee')
78 reg_ids = registration.search(cr, uid, [('event_id','in',ids)], context=context)
79 for event_reg in registration.browse(cr,uid,reg_ids,context=context):
80 if event_reg.state == 'done':
81@@ -93,7 +97,7 @@
82 return self.write(cr, uid, ids, {'state': 'done'}, context=context)
83
84 def confirm_event(self, cr, uid, ids, context=None):
85- register_pool = self.pool.get('event.registration')
86+ register_pool = self.pool.get('event.registration_attendee')
87 for event in self.browse(cr, uid, ids, context=context):
88 if event.email_confirmation_id:
89 #send reminder that will confirm the event for all the people that were already confirmed
90@@ -116,7 +120,7 @@
91 res = {}
92 for event_id in ids:
93 res[event_id] = {key:0 for key in keys.values()}
94- query = "SELECT state, sum(nb_register) FROM event_registration WHERE event_id = %s AND state IN ('draft','open','done') GROUP BY state"
95+ query = "SELECT state, sum(nb_register) FROM event_registration_attendee WHERE event_id = %s AND state IN ('draft','open','done') GROUP BY state"
96 for event in self.pool.get('event.event').browse(cr, uid, ids, context=context):
97 cr.execute(query, (event.id,))
98 reg_states = cr.fetchall()
99@@ -132,14 +136,14 @@
100 @return: Dictionary of function field values.
101 """
102 event_ids=set()
103- for registration in self.pool['event.registration'].browse(cr, uid, ids, context=context):
104+ for registration in self.pool['event.registration_attendee'].browse(cr, uid, ids, context=context):
105 event_ids.add(registration.event_id.id)
106 return list(event_ids)
107
108 def _subscribe_fnc(self, cr, uid, ids, fields, args, context=None):
109 """This functional fields compute if the current user (uid) is already subscribed or not to the event passed in parameter (ids)
110 """
111- register_pool = self.pool.get('event.registration')
112+ register_pool = self.pool.get('event.registration_attendee')
113 res = {}
114 for event in self.browse(cr, uid, ids, context=context):
115 res[event.id] = False
116@@ -150,13 +154,74 @@
117 res[event.id]= True
118 continue
119 return res
120-
121+
122 def _count_registrations(self, cr, uid, ids, field_name, arg, context=None):
123 return {
124 event.id: len(event.registration_ids)
125 for event in self.browse(cr, uid, ids, context=context)
126 }
127
128+ def __get_bar_values(self, cr, uid, obj, domain, read_fields, value_field, groupby_field, date_begin, context=None):
129+ """ Generic method to generate data for bar chart values using SparklineBarWidget.
130+ This method performs obj.read_group(cr, uid, domain, read_fields, groupby_field).
131+
132+ :param obj: the target model (i.e. crm_lead)
133+ :param domain: the domain applied to the read_group
134+ :param list read_fields: the list of fields to read in the read_group
135+ :param str value_field: the field used to compute the value of the bar slice
136+ :param str groupby_field: the fields used to group
137+
138+ :return list section_result: a list of dicts: [
139+ { 'value': (int) bar_column_value,
140+ 'tootip': (str) bar_column_tooltip,
141+ }
142+ ]
143+ """
144+ section_result = [{'value': 0,
145+ 'tooltip': (date_begin + relativedelta.relativedelta(days=i)).strftime('%d %B %Y'),
146+ } for i in range(0, self._period_number)]
147+ group_obj = obj.read_group(cr, uid, domain, read_fields, groupby_field, context=context)
148+ field_col_info = obj._all_columns.get(groupby_field.split(':')[0])
149+ pattern = tools.DEFAULT_SERVER_DATE_FORMAT if field_col_info.column._type == 'date' else tools.DEFAULT_SERVER_DATETIME_FORMAT
150+ for group in group_obj:
151+ group_begin_date = datetime.strptime(group['__domain'][3][2], pattern).date() + relativedelta.relativedelta(days=4)
152+ timedelta = relativedelta.relativedelta(group_begin_date, date_begin)
153+ section_result[timedelta.days] = {'value': group.get(value_field, 0), 'tooltip': group.get(groupby_field)}
154+ return section_result
155+
156+ def _count_registrations_per_day(self, cr, uid, ids, field_name, arg, context=None):
157+ obj = self.pool['event.registration_attendee']
158+ res = {}
159+ for count in self.browse(cr, uid, ids, context=context):
160+ res[count.id] = {}
161+ date_begin = datetime.now().date() + relativedelta.relativedelta(days=-4)
162+ date_end = datetime.today() + relativedelta.relativedelta(days=self._period_number - 1)
163+ domain = [('event_id', '=', count.id), ('create_date', '>=', date_begin.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)), ('create_date', '<=', date_end.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT))]
164+ res[count.id] = self.__get_bar_values(cr, uid, obj, domain, ['create_date','nb_register'], 'nb_register', 'create_date:day', date_begin, context=context)
165+ return res
166+
167+ def _get_registered_seats(self, cr, uid, ids, field_name, arg, context=None):
168+ res = dict.fromkeys(ids, False)
169+ for event in self.browse(cr, uid, ids, context=context):
170+ data = []
171+ group_obj = self.read_group(cr, uid, [('id','=',event.id)], ['seats_reserved', 'seats_max'], ['seats_reserved', 'seats_max'], context=context)
172+ for group in group_obj:
173+ data.append({'label' : 'Seat Reserved', 'value': group['seats_reserved']})
174+ data.append({'label' : 'Seat Max', 'value': group['seats_max']})
175+ res[event.id] = data
176+ return res
177+
178+ def _get_sold_tickets(self, cr, uid, ids, field_name, arg, context=None):
179+ res = dict.fromkeys(ids, False)
180+ for event in self.browse(cr, uid, ids, context=context):
181+ data = []
182+ group_obj = self.read_group(cr, uid, [('id','=',event.id)], ['seats_reserved', 'seats_unconfirmed'], ['seats_reserved', 'seats_unconfirmed'], context=context)
183+ for group in group_obj:
184+ data.append({'label' : 'Sold Tickets', 'value': group['seats_reserved']})
185+ data.append({'label' : 'Unconfirmed Tickets', 'value': group['seats_unconfirmed']})
186+ res[event.id] = data
187+ return res
188+
189 def _compute_date_tz(self, cr, uid, ids, fld, arg, context=None):
190 if context is None:
191 context = {}
192@@ -180,19 +245,22 @@
193 'seats_max': fields.integer('Maximum Avalaible Seats', oldname='register_max', help="You can for each event define a maximum registration level. If you have too much registrations you are not able to confirm your event. (put 0 to ignore this rule )", readonly=True, states={'draft': [('readonly', False)]}),
194 'seats_min': fields.integer('Minimum Reserved Seats', oldname='register_min', help="You can for each event define a minimum registration level. If you do not enough registrations you are not able to confirm your event. (put 0 to ignore this rule )", readonly=True, states={'draft': [('readonly', False)]}),
195 'seats_reserved': fields.function(_get_seats, oldname='register_current', string='Reserved Seats', type='integer', multi='seats_reserved',
196- store={'event.registration': (_get_events_from_registrations, ['state'], 10),
197+ store={'event.registration_attendee': (_get_events_from_registrations, ['state'], 10),
198 'event.event': (lambda self, cr, uid, ids, c = {}: ids, ['seats_max', 'registration_ids'], 20)}),
199 'seats_available': fields.function(_get_seats, oldname='register_avail', string='Available Seats', type='integer', multi='seats_reserved',
200- store={'event.registration': (_get_events_from_registrations, ['state'], 10),
201+ store={'event.registration_attendee': (_get_events_from_registrations, ['state'], 10),
202 'event.event': (lambda self, cr, uid, ids, c = {}: ids, ['seats_max', 'registration_ids'], 20)}),
203 'seats_unconfirmed': fields.function(_get_seats, oldname='register_prospect', string='Unconfirmed Seat Reservations', type='integer', multi='seats_reserved',
204- store={'event.registration': (_get_events_from_registrations, ['state'], 10),
205+ store={'event.registration_attendee': (_get_events_from_registrations, ['state'], 10),
206 'event.event': (lambda self, cr, uid, ids, c = {}: ids, ['seats_max', 'registration_ids'], 20)}),
207 'seats_used': fields.function(_get_seats, oldname='register_attended', string='Number of Participations', type='integer', multi='seats_reserved',
208- store={'event.registration': (_get_events_from_registrations, ['state'], 10),
209+ store={'event.registration_attendee': (_get_events_from_registrations, ['state'], 10),
210 'event.event': (lambda self, cr, uid, ids, c = {}: ids, ['seats_max', 'registration_ids'], 20)}),
211- 'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),
212+ 'seats_registered': fields.function(_get_registered_seats, string='Number of Seats Registered', type='string'),
213+ 'sold_ticket': fields.function(_get_sold_tickets, string='Sold Tickets on Unconfirmed Tickets', type='string'),
214+ 'registration_ids': fields.one2many('event.registration_attendee', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),
215 'date_tz': fields.selection(_tz_get, string='Timezone'),
216+ 'track_ids': fields.one2many('event.track', 'event_id', 'Tracks', readonly=False),
217 'date_begin': fields.datetime('Start Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
218 'date_end': fields.datetime('End Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
219 'date_begin_located': fields.function(_compute_date_tz, string='Start Date Located', type="datetime"),
220@@ -218,6 +286,12 @@
221 'is_subscribed' : fields.function(_subscribe_fnc, type="boolean", string='Subscribed'),
222 'organizer_id': fields.many2one('res.partner', "Organizer"),
223 'count_registrations': fields.function(_count_registrations, type="integer", string="Registrations"),
224+ 'registration_per_day': fields.function(_count_registrations_per_day, type="string", string="Registrations per day"),
225+ 'location': fields.selection([("online", "Online Event"),
226+ ("physical", "Physical Event")], "Location"),
227+ 'event_reminder_ids': fields.one2many('event.reminder', 'event_id', "Event Reminders"),
228+ 'attendee_ids': fields.one2many('event.registration_attendee', 'event_id', "Attendees"),
229+ 'color': fields.integer('Color Index'),
230 }
231 _defaults = {
232 'state': 'draft',
233@@ -226,6 +300,7 @@
234 'organizer_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, context=c).company_id.partner_id.id,
235 'address_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, context=c).company_id.partner_id.id,
236 'date_tz': lambda self, cr, uid, ctx: ctx.get('tz', "UTC"),
237+ 'color': 0,
238 }
239
240 def _check_seats_limit(self, cr, uid, ids, context=None):
241@@ -239,7 +314,7 @@
242 ]
243
244 def subscribe_to_event(self, cr, uid, ids, context=None):
245- register_pool = self.pool.get('event.registration')
246+ register_pool = self.pool.get('event.registration_attendee')
247 user_pool = self.pool.get('res.users')
248 num_of_seats = int(context.get('ticket', 1))
249 user = user_pool.browse(cr, uid, uid, context=context)
250@@ -252,7 +327,7 @@
251 return register_pool.confirm_registration(cr, SUPERUSER_ID, curr_reg_ids, context=context)
252
253 def unsubscribe_to_event(self, cr, uid, ids, context=None):
254- register_pool = self.pool.get('event.registration')
255+ register_pool = self.pool.get('event.registration_attendee')
256 #the unsubscription is done with SUPERUSER_ID because in case we share the kanban view, we want anyone to be able to unsubscribe
257 curr_reg_ids = register_pool.search(cr, SUPERUSER_ID, [('user_id', '=', uid), ('event_id', '=', ids[0])])
258 return register_pool.button_reg_cancel(cr, SUPERUSER_ID, curr_reg_ids, context=context)
259@@ -267,19 +342,13 @@
260 (_check_closing_date, 'Error ! Closing Date cannot be set before Beginning Date.', ['date_end']),
261 ]
262
263- def onchange_event_type(self, cr, uid, ids, type_event, context=None):
264- values = {}
265- if type_event:
266- type_info = self.pool.get('event.type').browse(cr,uid,type_event,context)
267- dic ={
268- 'reply_to': type_info.default_reply_to,
269- 'email_registration_id': type_info.default_email_registration.id,
270- 'email_confirmation_id': type_info.default_email_event.id,
271- 'seats_min': type_info.default_registration_min,
272- 'seats_max': type_info.default_registration_max,
273- }
274- values.update(dic)
275- return values
276+ def onchange_event_type(self, cr, uid, ids, event_type_id, context=None):
277+ event_reminder_ids = False
278+ if event_type_id:
279+ type_info = self.pool.get('event.type').browse(cr, uid, event_type_id, context)
280+ if type_info.default_email_event:
281+ event_reminder_ids = [(0, 0, {'email_template': type_info.default_email_event.id,'unit': 'days', 'element': 'after_subscription' })]
282+ return {'value': {'event_reminder_ids': event_reminder_ids}}
283
284 def onchange_start_date(self, cr, uid, ids, date_begin=False, date_end=False, context=None):
285 res = {'value':{}}
286@@ -291,10 +360,35 @@
287 res['value'] = {'date_end': date_end.strftime("%Y-%m-%d %H:%M:%S")}
288 return res
289
290+ def send_reminder_mail(self, cr, uid, ids, template_id, context={}):
291+ """
292+ Send mail reminder to event attendees.
293+ @param ids: ids of event.event.
294+ @param template-id: id of the template to send
295+ """
296+ if not isinstance(ids, (tuple, list)):
297+ ids = [ids]
298+ res = False
299+ vals = {}
300+ mail_ids = []
301+ mail_pool = self.pool.get('mail.mail')
302+ mailmessage_pool = self.pool.get('mail.message')
303+ emailtemplate_pool = self.pool.get('email.template')
304+ for event in self.browse(cr, uid, ids, context=context):
305+ for attendee in event.attendee_ids:
306+ if attendee.email:
307+ mail_id = emailtemplate_pool.send_mail(cr, uid, template_id, attendee.id, context=context)
308+ vals['model'] = None # We don't want to have the mail in the chatter while in queue!
309+ mailmessage = mail_pool.browse(cr, uid, mail_id, context=context).mail_message_id
310+ mailmessage_pool.write(cr, uid, [mailmessage.id], vals, context=context)
311+ mail_ids.append(mail_id)
312+ if mail_ids:
313+ res = mail_pool.send(cr, uid, mail_ids, context=context)
314+ return res
315
316 class event_registration(osv.osv):
317 """Event Registration"""
318- _name= 'event.registration'
319+ _name= 'event.registration_attendee'
320 _description = __doc__
321 _inherit = ['mail.thread', 'ir.needaction_mixin']
322 _columns = {
323@@ -320,10 +414,12 @@
324 'email': fields.char('Email', size=64),
325 'phone': fields.char('Phone', size=64),
326 'name': fields.char('Name', size=128, select=True),
327+ 'reminder_sended' : fields.boolean('Reminder sended', help="For the reminder linked to a subscription"),
328 }
329 _defaults = {
330 'nb_register': 1,
331 'state': 'draft',
332+ 'reminder_sended': False,
333 }
334 _order = 'name, create_date desc'
335
336@@ -417,4 +513,60 @@
337 data.update(d['value'])
338 return {'value': data}
339
340+class event_reminder(osv.osv):
341+ """ Event Reminder """
342+
343+ _name='event.reminder'
344+
345+ _columns = {
346+ 'number_unit': fields.integer('Number of units', help="number of unit."),
347+ 'unit': fields.selection([('days', 'Days'),
348+ ('weeks', 'Weeks'),
349+ ('months', 'Months')], string="Units", required=True, help="unit of the reminder (days, weeks, month)."),
350+ 'element' : fields.selection([('after_subscription', 'After Subscription'),
351+ ('before_event', 'Before Event'),
352+ ('after_event', 'After Event')], string="Element", required=True, help="(subscription or event)"),
353+ 'email_template': fields.many2one('email.template', 'Email Template', required=True, help="Email template to be send."),
354+ 'sended' : fields.boolean("Sended", help="Works for reminder linked to an event and not for a registration (see event.registration_attendee)"),
355+ 'event_id' : fields.many2one('event.event', 'Event ID'),
356+ }
357+
358+ _defaults = {
359+ 'number_unit' : 1,
360+ 'sended' : False,
361+ }
362+
363+ def _get_number_days(self, reminder):
364+ if reminder.unit == "days":
365+ return reminder.number_unit
366+ if reminder.unit == "weeks":
367+ return reminder.number_unit * 7
368+ if reminder.unit == "months":
369+ return reminder.number_unit * 30
370+
371+ def action_cron_reminder_event(self, cr, uid, context=None):
372+ event_obj = self.pool.get('event.event')
373+ for event in event_obj.browse(cr, uid, event_obj.search(cr, uid, [], context=context), context):
374+ for reminder in event.event_reminder_ids:
375+ if reminder.element == "after_subscription":
376+ for subs in event.attendee_ids:
377+ time_to_send = datetime.max
378+ if not subs.reminder_sended:
379+ time_to_send = datetime.strptime(subs.create_date, "%Y-%m-%d %H:%M:%S") + timedelta(days=self._get_number_days(reminder))
380+ if time_to_send < datetime.now():
381+ self.pool.get('event.event').send_reminder_mail(cr, uid, event.id, reminder.email_template.id, context=context)
382+ self.pool.get('event.registration_attendee').write(cr, uid, [subs.id], {'reminder_sended': True}, context=context)
383+ else:
384+ for subs in event.attendee_ids:
385+ time_to_send = datetime.max
386+ if not reminder.sended:
387+ time_to_send = datetime.max
388+ if reminder.element == "before_event":
389+ time_to_send = datetime.strptime(reminder.event_id.date_begin, '%Y-%m-%d %H:%M:%S') - timedelta(days=self._get_number_days(reminder))
390+ elif reminder.element == "after_event":
391+ time_to_send = datetime.strptime(reminder.event_id.date_end, '%Y-%m-%d %H:%M:%S') + timedelta(days=self._get_number_days(reminder))
392+ if time_to_send < datetime.now():
393+ self.pool.get('event.event').send_reminder_mail(cr, uid, event.id, reminder.email_template.id, context=context)
394+ self.write(cr, uid, [reminder.id], {'sended': True}, context=context)
395+
396 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
397
398=== modified file 'event/event_data.xml'
399--- event/event_data.xml 2012-12-05 05:37:32 +0000
400+++ event/event_data.xml 2014-06-09 06:19:49 +0000
401@@ -14,7 +14,7 @@
402
403 <!-- Event-related subtypes for messaging / Chatter -->
404 <record id="event.mt_event_registration" model="mail.message.subtype">
405- <field name="name">New Registration</field>
406+ <field name="name">New Attendee</field>
407 <field name="res_model">event.event</field>
408 <field name="default" eval="False"/>
409 </record>
410@@ -26,5 +26,19 @@
411 <value>From the top menu Events, you can organize events, manage registrations, automate communication around your event and sell events through your quotations.</value>
412 <value>Module Events has been installed</value>
413 </function>
414+
415+ <!-- Scheduler for Event Reminder -->
416+ <record forcecreate="True" id="ir_cron_event_reminder" model="ir.cron">
417+ <field name="name">Event Reminder Cron Task</field>
418+ <field name="active">True</field>
419+ <field name="user_id" ref="base.user_root" />
420+ <field name="interval_number">30</field>
421+ <field name="interval_type">minutes</field>
422+ <field name="numbercall">-1</field>
423+ <field name="doall" eval="False" />
424+ <field name="model">event.reminder</field>
425+ <field name="function">action_cron_reminder_event</field>
426+ </record>
427+
428 </data>
429 </openerp>
430
431=== modified file 'event/event_demo.xml'
432--- event/event_demo.xml 2014-01-27 13:58:28 +0000
433+++ event/event_demo.xml 2014-06-09 06:19:49 +0000
434@@ -32,7 +32,7 @@
435 <field name="name">Open Days in Los Angeles</field>
436 <field eval="(DateTime.now() + timedelta(days=1)).strftime('%Y-%m-%d 8:00:00')" name="date_begin"/>
437 <field eval="(DateTime.now() + timedelta(days=5)).strftime('%Y-%m-%d 18:00:00')" name="date_end"/>
438- <field name="seats_max">500</field>
439+ <field name="seats_max">60</field>
440 <field name="address_id" ref="base.res_partner_6"/>
441 <field name="type" ref="event_type_1"/>
442 <field name="description"><![CDATA[
443@@ -78,7 +78,7 @@
444 <field eval="(DateTime.now() + timedelta(days=3)).strftime('%Y-%m-%d 11:00:00')" name="date_end"/>
445 <field name="type" ref="event_type_0"/>
446 <field name="address_id" ref="base.res_partner_5"/>
447- <field name="seats_max">350</field>
448+ <field name="seats_max">60</field>
449 <field name="description"><![CDATA[
450 <div class="oe_structure">
451 <center><strong>Functional Webinar</strong></center>
452@@ -113,7 +113,7 @@
453 <field eval="(DateTime.today()+ timedelta(days=5)).strftime('%Y-%m-%d 16:30:00')" name="date_end"/>
454 <field name="type" ref="event_type_2"/>
455 <field name="address_id" ref="base.res_partner_14"/>
456- <field name="seats_max">200</field>
457+ <field name="seats_max">55</field>
458 <field name="description"><![CDATA[
459 <div class="oe_structure">
460 <center><strong>Conference on Business Applications</strong></center>
461@@ -208,7 +208,7 @@
462 <function model="event.event" name="button_confirm" eval="[ref('event_2')]"/>
463
464 <!-- Demo data for Event Registration-->
465- <record id="reg_1_1" model="event.registration">
466+ <record id="reg_1_1" model="event.registration_attendee">
467 <field name="name">Agrolait</field>
468 <field name="email">s.l@agrolait.be</field>
469 <field name="phone">003281588558</field>
470@@ -217,7 +217,7 @@
471 <field name="nb_register">5</field>
472 </record>
473
474- <record id="reg_1_2" model="event.registration">
475+ <record id="reg_1_2" model="event.registration_attendee">
476 <field name="name">ASUStek</field>
477 <field name="email">info@asustek.com</field>
478 <field name="phone">+ 1 64 61 04 01</field>
479@@ -226,7 +226,7 @@
480 <field name="nb_register">10</field>
481 </record>
482
483- <record id="reg_0_2" model="event.registration">
484+ <record id="reg_0_2" model="event.registration_attendee">
485 <field name="name">Camptocamp</field>
486 <field name="email">openerp@camptocamp.com</field>
487 <field name="phone">+41 21 619 10 04 </field>
488@@ -235,5 +235,33 @@
489 <field name="nb_register">5</field>
490 </record>
491
492+ <record id="event_reminder_rec0" model="event.reminder">
493+ <field name="email_template" ref="event.confirmation_event"/>
494+ <field name="unit">days</field>
495+ <field name="element">after_subscription</field>
496+ <field name="event_id" ref="event_0"/>
497+ </record>
498+
499+ <record id="event_reminder_rec1" model="event.reminder">
500+ <field name="email_template" ref="event.confirmation_event"/>
501+ <field name="unit">days</field>
502+ <field name="element">after_subscription</field>
503+ <field name="event_id" ref="event_1"/>
504+ </record>
505+
506+ <record id="event_reminder_rec2" model="event.reminder">
507+ <field name="email_template" ref="event.confirmation_event"/>
508+ <field name="unit">days</field>
509+ <field name="element">after_subscription</field>
510+ <field name="event_id" ref="event_2"/>
511+ </record>
512+
513+ <record id="event_reminder_rec3" model="event.reminder">
514+ <field name="email_template" ref="event.confirmation_event"/>
515+ <field name="unit">days</field>
516+ <field name="element">after_subscription</field>
517+ <field name="event_id" ref="event_3"/>
518+ </record>
519+
520 </data>
521 </openerp>
522
523=== modified file 'event/event_view.xml'
524--- event/event_view.xml 2014-05-12 07:23:31 +0000
525+++ event/event_view.xml 2014-06-09 06:19:49 +0000
526@@ -3,7 +3,7 @@
527 <data>
528
529 <record id="act_event_list_register_event" model="ir.actions.act_window">
530- <field name="res_model">event.registration</field>
531+ <field name="res_model">event.registration_attendee</field>
532 <field name="view_type">form</field>
533 <field name="name">Registrations</field>
534 <field name="view_mode">tree,form,calendar,graph</field>
535@@ -23,9 +23,9 @@
536 <field name="name"/>
537 <field name="default_reply_to"/>
538 <field name="default_registration_min"/>
539- <field name="default_email_event" domain="[('model_id.model','=','event.registration')]"/>
540+ <field name="default_email_event" domain="[('model_id.model','=','event.registration_attendee')]"/>
541 <field name="default_registration_max"/>
542- <field name="default_email_registration" domain="[('model_id.model','=','event.registration')]"/>
543+ <field name="default_email_registration" domain="[('model_id.model','=','event.registration_attendee')]"/>
544 </group>
545 </form>
546 </field>
547@@ -80,74 +80,45 @@
548 </div>
549 <group name="main_field_group">
550 <group>
551- <field name="address_id" context="{'show_address': 1}" options='{"always_reload": True}'/>
552+ <field name="location" widget="radio"/>
553+ <field name="address_id" context="{'show_address': 1}" options='{"always_reload": True}' attrs="{'invisible':[('location', '!=', 'physical')]}" string=" "/>
554+ <field name="date_begin" string="Event Date" on_change="onchange_start_date(date_begin,date_end)"/>
555+ <field name="date_end" string=" "/>
556+ <field name="date_tz" />
557+ </group>
558+ <group>
559 <field name="organizer_id"/>
560+ <field name="user_id" string="Event manager"/>
561 <field name="company_id" groups="base.group_multi_company"/>
562 </group>
563- <group>
564- <field name="user_id"/>
565- <field name="type" on_change="onchange_event_type(type,context)" />
566- <field name="date_begin" on_change="onchange_start_date(date_begin,date_end)"/>
567- <field name="date_end"/>
568- <field name="date_tz" />
569- </group>
570 </group>
571 <notebook>
572- <page string="Registrations">
573+ <page string="Advanced">
574 <group>
575 <group>
576- <field name="seats_min"/>
577- <field name="seats_max"/>
578- <label for="seats_reserved" string="Current Registrations" groups="base.group_user"/>
579- <div groups="base.group_user">
580- <field name="seats_unconfirmed" class="oe_inline"/> (confirmed: <field name="seats_reserved" class="oe_inline"/>)
581- </div>
582- <field name="seats_used"/>
583+ <field name="type" string="Type of Event" on_change="onchange_event_type(type)"/>
584 </group>
585- </group>
586- <field name="registration_ids" colspan="4" nolabel="1" groups="event.group_event_manager,event.group_event_user" context="{'event_id': active_id}">
587- <tree string="Registration" editable="top">
588- <field name="name" />
589- <field name="email" />
590- <field name="phone"/>
591- <field name="nb_register" />
592- <field name="state"/>
593- <button name="registration_open" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
594- <button name="button_reg_close" string="Attended the Event" states="open" type="object" icon="gtk-jump-to"/>
595- <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
596- </tree>
597- <form string="Registration">
598- <field name="partner_id" attrs="{'readonly':[('state','!=', 'draft')]}" on_change="onchange_partner_id(partner_id, context)" />
599- <field name="name"/>
600- <group colspan="4" col="4">
601- <field name="email"/>
602- <field name="phone"/>
603- </group>
604- <group colspan="4" col="4">
605- <field name="nb_register"/>
606- </group>
607- <group colspan="4" col="4">
608- </group>
609- <group col="8" colspan="4">
610- <separator string="" colspan="4"/>
611- <newline/>
612- <field name="state" colspan="2"/>
613- <button name="registration_open" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
614- <button name="button_reg_close" string="Attended the Event" states="open" type="object" icon="gtk-jump-to"/>
615- <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
616- </group>
617- </form>
618- </field>
619- </page>
620- <page string="Description">
621- <field name="description" nolabel="1" placeholder="Event Description..."/>
622- </page>
623- <page string='Event Details' groups="base.group_no_one">
624- <group colspan="4">
625- <field name="reply_to"/>
626- <field name="email_registration_id"/>
627- <field name="email_confirmation_id"/>
628- </group>
629+ <group/>
630+ </group>
631+ <!-- Automate reminders -->
632+ <group>
633+ <field name="event_reminder_ids" string="Automate Reminders" context="{'default_event_id': active_id}">
634+ <tree editable="top">
635+ <field name="email_template" string="Email To Send" />
636+ <field name="number_unit" string="Timing" />
637+ <field name="unit" string="" />
638+ <field name="element" string="When" />
639+ </tree>
640+ </field>
641+ </group>
642+ <!-- Manage sales in event_sale_view.xml -->
643+ <div class="manageSales" />
644+ </page>
645+ <page string="Event Management" invisible="1">
646+ <!-- Ticket and seat management -->
647+ <div name="ticket_management"/>
648+ <!-- Event Promotion and Visibility -->
649+ <div name="promotion"/>
650 </page>
651 </notebook>
652 </sheet>
653@@ -187,61 +158,83 @@
654 <field name="name">event.event.kanban</field>
655 <field name="model">event.event</field>
656 <field name="arch" type="xml">
657- <kanban>
658+ <kanban version="7.0" class="oe_background_grey">
659 <field name="type"/>
660 <field name="user_id"/>
661 <field name="is_subscribed"/>
662 <field name="country_id"/>
663 <field name="date_begin"/>
664 <field name="state"/>
665+ <field name="color"/>
666 <field name="seats_max"/>
667 <field name="seats_reserved"/>
668 <field name="seats_available"/>
669+ <field name="seats_unconfirmed"/>
670+ <field name="count_registrations"/>
671 <templates>
672 <t t-name="kanban-box">
673- <div class="oe_module_vignette">
674- <a type="open" class="oe_module_icon">
675- <div class="oe_event_date "><t t-esc="record.date_begin.raw_value.getDate()"/></div>
676- <div class="oe_event_month_year">
677- <t t-esc="record.date_begin.raw_value.toString('MMM')"/>
678- <t t-esc="record.date_begin.raw_value.getFullYear()"/>
679- </div>
680- <div class="oe_event_time"><t t-esc="record.date_begin.raw_value.toString('hh:mm tt')"/></div>
681- </a>
682- <div class="oe_module_desc">
683- <h4><a type="open"><field name="name"/></a></h4>
684- <p>
685- <t t-if="record.country_id.raw_value">@<field name="country_id"/><br/></t>
686- <t t-if="record.user_id.raw_value">Organized by <field name="user_id"/><br/></t>
687- <t t-if="record.seats_available.raw_value lte 10 and record.seats_available.raw_value gt 0"><i>Only</i></t>
688- <t t-if="!record.seats_max.raw_value"><i>No ticket available.</i></t>
689- <t t-if="record.seats_max.raw_value">
690- <i t-if="record.seats_available.raw_value">
691- <b><field name="seats_available"/></b>
692- <t t-if="record.seats_available.raw_value > 1">tickets </t>
693- <t t-if="record.seats_available.raw_value lte 1">ticket </t>
694- available.
695- </i>
696- </t>
697- </p>
698- <div groups="base.group_user,base.group_portal">
699- <t t-if="record.seats_available.raw_value gt 0 and record.seats_max.raw_value">
700- <t t-if="!record.is_subscribed.raw_value">
701- <input t-att-id="record.id.raw_value" type="text" name="subscribe" class="no_of_seats" value="1" onchange="document.getElementById('btn_sub' +this.id).setAttribute('data-context',JSON.stringify({'ticket':this.value}))"/>
702- <button t-att-id="'btn_sub'+record.id.raw_value" type="object" name="subscribe_to_event" class="oe_subscribe_button">
703- <span >Subscribe</span>
704- </button>
705- </t>
706- </t>
707- <t t-if="record.is_subscribed.raw_value">
708- <button type="object" name="unsubscribe_to_event" class="oe_unsubscribe_button ">
709- <span>Subscribed</span>
710- <span class="oe_unsubscribe">Unsubscribe</span>
711- </button>
712- </t>
713+ <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_event oe_kanban_card oe_kanban_global_click">
714+ <div class="oe_dropdown_toggle oe_dropdown_kanban oe_custom">
715+ <span class="oe_e">í</span>
716+ <ul class="oe_dropdown_menu">
717+ <t t-if="widget.view.is_action_enabled('edit')">
718+ <li><a type="edit">Edit...</a></li>
719+ </t>
720+ <t t-if="widget.view.is_action_enabled('delete')">
721+ <li><a type="delete">Delete</a></li>
722+ </t>
723+ <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
724+ </ul>
725+ </div>
726+ <div class = "oe_kanban_content">
727+ <!-- Module Icon -->
728+ <a type="open" class="oe_module_icon">
729+ <div class="oe_event_date "><t t-esc="record.date_begin.raw_value.getDate()"/></div>
730+ <div class="oe_event_month_year">
731+ <t t-esc="record.date_begin.raw_value.toString('MMM')"/>
732+ <t t-esc="record.date_begin.raw_value.getFullYear()"/>
733+ </div>
734+ <div class="oe_event_time"><t t-esc="record.date_begin.raw_value.toString('hh:mm tt')"/></div>
735+ </a>
736+ <div class="oe_module_desc">
737+ <h4><a type="open"><field name="name"/></a></h4>
738+ <p>
739+ <t t-if="record.country_id.raw_value">@<field name="country_id"/><br/></t>
740+ </p>
741+ <p>
742+ <t t-if="record.seats_reserved.raw_value">
743+ <a name="%(act_event_list_register_event)d" type="action">
744+ <b><field name="seats_reserved"/></b>
745+ <t t-if="record.seats_reserved.raw_value > 1">Attendees</t>
746+ <t t-if="record.seats_reserved.raw_value lte 1">Attendee</t>
747+ </a>
748+ </t>
749+ <a name="%(event.action_report_event_attendees)d" type="action" class="oe_right oe_sparkline_bar_link">
750+ <field name="registration_per_day" widget="sparkline_bar"
751+ options="{'barWidth': 6, 'barSpacing': 2, 'tooltip_suffix': 'Attendees'}"></field>
752+ </a>
753+ </p>
754+ </div>
755+ </div>
756+ <div class="row">
757+ <div t-if="record.seats_available.raw_value and record.seats_reserved.raw_value" class="row col-md-7" groups="event_sale.group_event_manage_tickets">
758+ <div>
759+ <field name="seats_registered" widget="event_graph"/>
760+ </div>
761+ <div class="row text-center oe_event_graph_description">
762+ <strong><span>Real Attendees on Maximum Available</span></strong>
763+ </div>
764+ </div>
765+ <div t-if="record.seats_reserved.raw_value or record.seats_unconfirmed.raw_value" class="row col-md-7" groups="event_sale.group_event_manage_tickets">
766+ <div>
767+ <field name="sold_ticket" widget="event_graph"/>
768+ </div>
769+ <div class="row text-center oe_event_graph_description">
770+ <strong><span>Unconfirmed from sold tickets</span></strong>
771+ </div>
772+ </div>
773 </div>
774 </div>
775- </div>
776 </t>
777 </templates>
778 </kanban>
779@@ -314,7 +307,7 @@
780 <act_window
781 id="act_register_event_partner"
782 name="Subscribe"
783- res_model="event.registration"
784+ res_model="event.registration_attendee"
785 src_model="res.partner"
786 view_mode="tree,form,calendar,graph"
787 context="{'search_default_partner_id': [active_id], 'default_partner_id': active_id}"
788@@ -326,16 +319,15 @@
789
790
791 <record model="ir.ui.view" id="view_event_registration_tree">
792- <field name="name">event.registration.tree</field>
793- <field name="model">event.registration</field>
794+ <field name="name">event.registration_attendee.tree</field>
795+ <field name="model">event.registration_attendee</field>
796 <field name="arch" type="xml">
797 <tree string="Registration" fonts="bold:message_unread==True">
798 <field name="create_date"/>
799- <field name="partner_id"/>
800+ <field name="partner_id" string="Customer"/>
801 <field name="name"/>
802 <field name="email"/>
803 <field name="event_id" />
804- <field name="nb_register"/>
805 <field name="user_id" invisible="1"/>
806 <field name="origin"/>
807 <field name="state"/>
808@@ -348,8 +340,8 @@
809 </record>
810
811 <record model="ir.ui.view" id="view_event_registration_form">
812- <field name="name">event.registration.form</field>
813- <field name="model">event.registration</field>
814+ <field name="name">event.registration_attendee.form</field>
815+ <field name="model">event.registration_attendee</field>
816 <field name="arch" type="xml">
817 <form string="Event Registration" version="7.0">
818 <header>
819@@ -397,8 +389,8 @@
820
821 <!-- Calendar view of event registration -->
822 <record id="view_event_registration_calendar" model="ir.ui.view">
823- <field name="name">event.registration.calendar</field>
824- <field name="model">event.registration</field>
825+ <field name="name">event.registration_attendee.calendar</field>
826+ <field name="model">event.registration_attendee</field>
827 <field eval="2" name="priority"/>
828 <field name="arch" type="xml">
829 <calendar color="event_id" date_start="event_begin_date" date_stop="event_end_date" string="Event Registration">
830@@ -410,7 +402,7 @@
831
832 <record model="ir.ui.view" id="view_event_registration_graph">
833 <field name="name">Registration Graph</field>
834- <field name="model">event.registration</field>
835+ <field name="model">event.registration_attendee</field>
836 <field name="arch" type="xml">
837 <graph string="Registration" type="bar">
838 <field name="event_id" type="row"/>
839@@ -423,7 +415,7 @@
840 <!-- Search view of event registration -->
841 <record model="ir.ui.view" id="view_registration_search">
842 <field name="name">Registrations</field>
843- <field name="model">event.registration</field>
844+ <field name="model">event.registration_attendee</field>
845 <field name="arch" type="xml">
846 <search string="Event Registration">
847 <field name="name" string="Participant" filter_domain="['|','|',('name','ilike',self),('email','ilike',self),('origin','ilike',self)]"/>
848@@ -449,8 +441,8 @@
849 </record>
850
851 <record model="ir.actions.act_window" id="action_registration">
852- <field name="name">Registrations</field>
853- <field name="res_model">event.registration</field>
854+ <field name="name">Attendees</field>
855+ <field name="res_model">event.registration_attendee</field>
856 <field name="view_type">form</field>
857 <field name="domain"></field>
858 <field name="view_mode">tree,form,calendar,graph</field>
859@@ -458,7 +450,7 @@
860 <field name="search_view_id" ref="view_registration_search"/>
861 </record>
862
863- <menuitem name="Registrations"
864+ <menuitem name="Attendees"
865 id="menu_action_registration" parent="event.event_main_menu"
866 action="action_registration" groups="event.group_event_manager,event.group_event_user"/>
867
868
869=== modified file 'event/report/report_event_registration.py'
870--- event/report/report_event_registration.py 2014-03-10 14:36:00 +0000
871+++ event/report/report_event_registration.py 2014-06-09 06:19:49 +0000
872@@ -22,8 +22,8 @@
873 from openerp.osv import fields, osv
874 from openerp import tools
875
876-class report_event_registration(osv.osv):
877- _name = "report.event.registration"
878+class report_event_registration_attendee(osv.osv):
879+ _name = "report.event.registration_attendee"
880 _description = "Events Analysis"
881 _auto = False
882 _columns = {
883@@ -47,10 +47,10 @@
884 """
885 Initialize the sql view for the event registration
886 """
887- tools.drop_view_if_exists(cr, 'report_event_registration')
888+ tools.drop_view_if_exists(cr, 'report_event_registration_attendee')
889
890 # TOFIX this request won't select events that have no registration
891- cr.execute(""" CREATE VIEW report_event_registration AS (
892+ cr.execute(""" CREATE VIEW report_event_registration_attendee AS (
893 SELECT
894 e.id::varchar || '/' || coalesce(r.id::varchar,'') AS id,
895 e.id AS event_id,
896@@ -68,7 +68,7 @@
897 r.state AS registration_state
898 FROM
899 event_event e
900- LEFT JOIN event_registration r ON (e.id=r.event_id)
901+ LEFT JOIN event_registration_attendee r ON (e.id=r.event_id)
902
903 GROUP BY
904 event_id,
905
906=== modified file 'event/report/report_event_registration_view.xml'
907--- event/report/report_event_registration_view.xml 2014-03-05 10:17:37 +0000
908+++ event/report/report_event_registration_view.xml 2014-06-09 06:19:49 +0000
909@@ -3,8 +3,8 @@
910 <data>
911
912 <record model ="ir.ui.view" id="report_event_registration_graph">
913- <field name="name">report.event.registration.graph</field>
914- <field name="model">report.event.registration</field>
915+ <field name="name">report.event.registration_attendee.graph</field>
916+ <field name="model">report.event.registration_attendee</field>
917 <field name="arch" type="xml">
918 <graph string="Event on Registration" type="pivot" >
919 <field name="event_type" type="row"/>
920@@ -17,8 +17,8 @@
921
922 <!-- Event on Registration search view -->
923 <record model="ir.ui.view" id="view_report_event_registration_search">
924- <field name="name">report.event.registration.search</field>
925- <field name="model">report.event.registration</field>
926+ <field name="name">report.event.registration_attendee.search</field>
927+ <field name="model">report.event.registration_attendee</field>
928 <field name="arch" type="xml">
929 <search string="Event on Registration">
930 <filter icon="terp-document-new" string="New" domain="[('event_state','=','draft')]" help="Events which are in New state"/>
931@@ -55,7 +55,7 @@
932
933 <record model="ir.actions.act_window" id="action_report_event_registration">
934 <field name="name">Events Analysis</field>
935- <field name="res_model">report.event.registration</field>
936+ <field name="res_model">report.event.registration_attendee</field>
937 <field name="view_type">form</field>
938 <field name="view_mode">graph</field>
939 <field name="search_view_id" ref="view_report_event_registration_search"/>
940@@ -69,6 +69,16 @@
941 <field name="act_window_id" ref="action_report_event_registration"/>
942 </record>
943
944+ <record id="action_report_event_attendees" model="ir.actions.act_window">
945+ <field name="name">Events Analysis</field>
946+ <field name="res_model">report.event.registration_attendee</field>
947+ <field name="context">{"search_default_event_id":active_id}</field>
948+ <field name="view_mode">graph</field>
949+ <field name="view_id" ref="event.view_report_event_registration_search"/>
950+ <field name="domain">[]</field>
951+ <field name="help"></field>
952+ </record>
953+
954 <menuitem parent="base.menu_reporting" id="menu_reporting_events" sequence="30" groups="event.group_event_manager" name="Events"/>
955 <menuitem parent="menu_reporting_events" action="action_report_event_registration" id="menu_report_event_registration" sequence="3" groups="event.group_event_manager"/>
956
957
958=== added file 'event/res_config_view.xml'
959--- event/res_config_view.xml 1970-01-01 00:00:00 +0000
960+++ event/res_config_view.xml 2014-06-09 06:19:49 +0000
961@@ -0,0 +1,24 @@
962+<?xml version="1.0" encoding="utf-8"?>
963+<openerp>
964+ <data>
965+ <record id="view_event_config" model="ir.ui.view">
966+ <field name="name">Configure Events</field>
967+ <field name="model">marketing.config.settings</field>
968+ <field name="inherit_id" ref="marketing.view_marketing_configuration"/>
969+ <field name="arch" type="xml">
970+ <div name="lead automation" position="before">
971+ <div name="event_management" invisible="1">
972+ <separator string="Event Management"/>
973+ <group>
974+ <label for="id" string="Event Management"/>
975+ <div>
976+ <div name="event_sale_manage_tickets"/>
977+ <div name="website_event_promotion"/>
978+ </div>
979+ </group>
980+ </div>
981+ </div>
982+ </field>
983+ </record>
984+ </data>
985+</openerp>
986
987=== modified file 'event/security/event_security.xml'
988--- event/security/event_security.xml 2013-10-27 12:31:04 +0000
989+++ event/security/event_security.xml 2014-06-09 06:19:49 +0000
990@@ -38,7 +38,7 @@
991 </record>
992 <record model="ir.rule" id="event_registration_company_rule">
993 <field name="name">Event/Registration: multi-company</field>
994- <field name="model_id" ref="model_event_registration"/>
995+ <field name="model_id" ref="model_event_registration_attendee"/>
996 <field name="global" eval="True"/>
997 <field name="domain_force">['|',
998 ('company_id', '=', False),
999@@ -48,7 +48,7 @@
1000 </record>
1001 <record model="ir.rule" id="report_event_registration_company_rule">
1002 <field name="name">Event/Report Registration: multi-company</field>
1003- <field name="model_id" ref="model_report_event_registration"/>
1004+ <field name="model_id" ref="model_report_event_registration_attendee"/>
1005 <field name="global" eval="True"/>
1006 <field name="domain_force">['|',
1007 ('company_id', '=', False),
1008
1009=== modified file 'event/security/ir.model.access.csv'
1010--- event/security/ir.model.access.csv 2013-10-27 12:31:04 +0000
1011+++ event/security/ir.model.access.csv 2014-06-09 06:19:49 +0000
1012@@ -2,7 +2,8 @@
1013 access_event_type,event.type,model_event_type,event.group_event_user,1,0,0,0
1014 access_event_type_manager,event.type manager,model_event_type,event.group_event_manager,1,1,1,1
1015 access_event_event,event.event,model_event_event,event.group_event_user,1,1,1,1
1016-access_event_registration,event.registration,model_event_registration,event.group_event_user,1,1,1,1
1017-access_report_event_registration,report.event.registration,model_report_event_registration,event.group_event_user,1,1,1,1
1018+access_event_registration_attendee,event.registration_attendee,model_event_registration_attendee,event.group_event_user,1,1,1,1
1019+access_report_event_registration_attendee,report.event.registration_attendee,model_report_event_registration_attendee,event.group_event_user,1,1,1,1
1020 access_event_event_portal,event.event,model_event_event,,1,0,0,0
1021-access_event_registration_portal,event.registration,model_event_registration,,1,0,0,0
1022+access_event_registration_attendee_portal,event.registration_attendee,model_event_registration_attendee,,1,0,0,0
1023+access_event_reminder,event.reminder,model_event_reminder,,1,1,1,1
1024
1025=== modified file 'event/static/src/css/event.css'
1026--- event/static/src/css/event.css 2012-11-29 22:26:45 +0000
1027+++ event/static/src/css/event.css 2014-06-09 06:19:49 +0000
1028@@ -1,3 +1,7 @@
1029+.openerp .oe_kanban_event {
1030+ width: 325px;
1031+ min-height: 290px !important;
1032+}
1033 .oe_event_date{
1034 border-top-left-radius:3px;
1035 border-top-right-radius:3px;
1036@@ -9,6 +13,7 @@
1037 color: #FFFFFF;
1038 -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
1039 background-color: #8A89BA;
1040+ margin-right: 0px !important;
1041 }
1042 .oe_event_time{
1043 border-bottom-left-radius:3px;
1044@@ -31,23 +36,7 @@
1045 color: #FFFFFF;
1046 background-color: #8A89BA;
1047 }
1048-
1049-.no_of_seats{
1050- width:35px;
1051-}
1052-
1053-.oe_mapbox
1054-{
1055- position: relative;
1056- float: right;
1057- height:200px;
1058- width:256px;
1059- border: 1px solid #eeeeee;
1060-}
1061-.oe_unsubscribe, .oe_unsubscribe_button:hover span {
1062- display: none;
1063- }
1064-.oe_unsubscribe_button:hover .oe_unsubscribe {
1065- display: inline;
1066- }
1067-
1068+.oe_event_graph_description {
1069+ width:175px;
1070+ margin-left: -5px;
1071+}
1072
1073=== added directory 'event/static/src/js'
1074=== added file 'event/static/src/js/event.js'
1075--- event/static/src/js/event.js 1970-01-01 00:00:00 +0000
1076+++ event/static/src/js/event.js 2014-06-09 06:19:49 +0000
1077@@ -0,0 +1,29 @@
1078+openerp.event = function (instance) {
1079+ var _t = instance.web._t;
1080+ var _lt = instance.web._lt;
1081+
1082+ instance.web_kanban.EventGraph = instance.web_kanban.AbstractField.extend({
1083+ start: function() {
1084+ this.display_graph(this.field.raw_value);
1085+ },
1086+ display_graph : function(data) {
1087+ var self = this;
1088+ nv.addGraph(function () {
1089+ self.$el.append('<svg>');
1090+ var chart = nv.models.pieChart()
1091+ .x(function(d) { return d.label; })
1092+ .y(function(d) { return d.value; })
1093+ .showLabels(false)
1094+ .showLegend(false)
1095+ .width(170)
1096+ .height(170);
1097+ self.svg = self.$el.find('svg')[0];
1098+ d3.select(self.svg)
1099+ .datum(data)
1100+ .transition().duration(350)
1101+ .call(chart);
1102+ });
1103+ },
1104+ });
1105+ instance.web_kanban.fields_registry.add("event_graph", "instance.web_kanban.EventGraph");
1106+};
1107\ No newline at end of file
1108
1109=== modified file 'event/test/process/event_draft2done.yml'
1110--- event/test/process/event_draft2done.yml 2014-01-27 13:58:28 +0000
1111+++ event/test/process/event_draft2done.yml 2014-06-09 06:19:49 +0000
1112@@ -18,14 +18,14 @@
1113 -
1114 I create a registration for the event
1115 -
1116- !record {model: event.registration, id: event_registration1}:
1117+ !record {model: event.registration_attendee, id: event_registration1}:
1118 event_id: event_event
1119 name: test_confirm
1120 nb_register: 10
1121 -
1122 I create a second registration for the same event
1123 -
1124- !record {model: event.registration, id: event_registration2}:
1125+ !record {model: event.registration_attendee, id: event_registration2}:
1126 event_id: event_event
1127 name: test_cancel
1128 nb_register: 5
1129@@ -37,13 +37,13 @@
1130 -
1131 I confirm the registration1
1132 -
1133- !python {model: event.registration}: |
1134+ !python {model: event.registration_attendee}: |
1135 event_pool = self.pool.get("event.event")
1136 self.registration_open(cr, uid, [ref("event_registration1")],context=context)
1137 -
1138 I check that registration is "confirmed"
1139 -
1140- !assert {model: event.registration, id: event_registration1}:
1141+ !assert {model: event.registration_attendee, id: event_registration1}:
1142 - state == 'open', "registration should be confirmed."
1143 -
1144 I check if the number of confirmed registration is correct
1145@@ -53,12 +53,12 @@
1146 -
1147 I close the registration
1148 -
1149- !python {model: event.registration}: |
1150+ !python {model: event.registration_attendee}: |
1151 self.button_reg_close(cr, uid, [ref("event_registration1")],context=context)
1152 -
1153 I check if registration is correctly finnished
1154 -
1155- !assert {model: event.registration, id: event_registration1}:
1156+ !assert {model: event.registration_attendee, id: event_registration1}:
1157 - state == 'done'
1158 -
1159 I check if attended registration is correct
1160@@ -68,12 +68,12 @@
1161 -
1162 I cancel the second registration
1163 -
1164- !python {model: event.registration}: |
1165+ !python {model: event.registration_attendee}: |
1166 self.button_reg_cancel(cr, uid, [ref("event_registration2")],context=context)
1167 -
1168 I Check that registration is cancelled
1169 -
1170- !assert {model: event.registration, id: event_registration2}:
1171+ !assert {model: event.registration_attendee, id: event_registration2}:
1172 - state == 'cancel', "Registration should be cancelled."
1173 -
1174 I confirm the event
1175@@ -110,7 +110,7 @@
1176 -
1177 I create a registration for the event
1178 -
1179- !record {model: event.registration, id: event_registration_cancel}:
1180+ !record {model: event.registration_attendee, id: event_registration_cancel}:
1181 event_id: event_event1
1182 name: test_confirm_again
1183 nb_register: 5
1184@@ -127,5 +127,5 @@
1185 -
1186 I check if its registrations are cancelled too
1187 -
1188- !assert {model: event.registration, id: event_registration_cancel}:
1189+ !assert {model: event.registration_attendee, id: event_registration_cancel}:
1190 - state == 'cancel', "Registration should be cancelled."
1191
1192=== modified file 'event/test/ui/demo_data.yml'
1193--- event/test/ui/demo_data.yml 2012-11-29 22:26:45 +0000
1194+++ event/test/ui/demo_data.yml 2014-06-09 06:19:49 +0000
1195@@ -1,7 +1,7 @@
1196 -
1197 I create event registation record to call event onchange and partner onchange.
1198 -
1199- !record {model: event.registration, id: reg_0_1}:
1200+ !record {model: event.registration_attendee, id: reg_0_1}:
1201 event_id: event_0
1202 partner_id: base.res_partner_1
1203 name: 'Ticket for Concert'
1204@@ -14,7 +14,7 @@
1205 -
1206 I call onchange event from event registration wizard.
1207 -
1208- !python {model: partner.event.registration}: |
1209+ !python {model: partner.event.registration_attendee}: |
1210 context.update({'active_id': ref("base.res_partner_5")})
1211 self.onchange_event_id(cr, uid, 1, ref("event_1"), context=context)
1212 -
1213@@ -27,5 +27,5 @@
1214 -
1215 I call close registration process.
1216 -
1217- !python {model: event.registration}: |
1218+ !python {model: event.registration_attendee}: |
1219 self.button_reg_close(cr, uid, [ref("reg_0_2")])
1220
1221=== modified file 'event/test/ui/duplicate_event.yml'
1222--- event/test/ui/duplicate_event.yml 2011-11-28 09:11:58 +0000
1223+++ event/test/ui/duplicate_event.yml 2014-06-09 06:19:49 +0000
1224@@ -9,7 +9,7 @@
1225 -
1226 Copy of event registarion.
1227 -
1228- !python {model: event.registration}: |
1229+ !python {model: event.registration_attendee}: |
1230 try:
1231 self.copy(cr, uid, ref("reg_1_1"))
1232 except:
1233
1234=== modified file 'event/views/event.xml'
1235--- event/views/event.xml 2014-04-24 17:21:29 +0000
1236+++ event/views/event.xml 2014-06-09 06:19:49 +0000
1237@@ -6,6 +6,7 @@
1238 <template id="assets_backend" name="event assets" inherit_id="web.assets_backend">
1239 <xpath expr="." position="inside">
1240 <link rel="stylesheet" href="/event/static/src/css/event.css"/>
1241+ <script type="text/javascript" src="/event/static/src/js/event.js"></script>
1242 </xpath>
1243 </template>
1244 </data>
1245
1246=== modified file 'event_sale/__init__.py'
1247--- event_sale/__init__.py 2012-02-28 10:59:06 +0000
1248+++ event_sale/__init__.py 2014-06-09 06:19:49 +0000
1249@@ -20,3 +20,4 @@
1250 ##############################################################################
1251
1252 import event_sale
1253+import res_config
1254
1255=== modified file 'event_sale/__openerp__.py'
1256--- event_sale/__openerp__.py 2013-11-26 16:14:24 +0000
1257+++ event_sale/__openerp__.py 2014-06-09 06:19:49 +0000
1258@@ -42,6 +42,8 @@
1259 'data': [
1260 'event_sale_view.xml',
1261 'event_sale_data.xml',
1262+ 'security/event_sale_security.xml',
1263+ 'res_config_view.xml',
1264 ],
1265 'demo': ['event_demo.xml'],
1266 'test': ['test/confirm.yml'],
1267
1268=== modified file 'event_sale/event_sale.py'
1269--- event_sale/event_sale.py 2014-05-02 14:01:52 +0000
1270+++ event_sale/event_sale.py 2014-06-09 06:19:49 +0000
1271@@ -19,6 +19,7 @@
1272 #
1273 ##############################################################################
1274
1275+from openerp.addons.web.http import request
1276 from openerp.addons.event.event import event_event as Event
1277 from openerp.osv import fields, osv
1278 from openerp.tools.translate import _
1279@@ -91,7 +92,7 @@
1280 '''
1281 if context is None:
1282 context = {}
1283- registration_obj = self.pool.get('event.registration')
1284+ registration_obj = self.pool.get('event.registration_attendee')
1285 for order_line in self.browse(cr, uid, ids, context=context):
1286 if order_line.event_id:
1287 dic = {
1288@@ -113,6 +114,7 @@
1289 context.update({'mail_create_nolog': True})
1290 registration_id = registration_obj.create(cr, uid, dic, context=context)
1291 registration_obj.message_post(cr, uid, [registration_id], body=message, context=context)
1292+
1293 return super(sale_order_line, self).button_confirm(cr, uid, ids, context=context)
1294
1295 def onchange_event_ticket_id(self, cr, uid, ids, event_ticket_id=False, context=None):
1296@@ -141,15 +143,27 @@
1297 pass
1298 return []
1299
1300+ def action_get_sale_order_for_event(self, cr, uid, ids, context=None):
1301+ sale_order_line_ids = self.pool.get('sale.order.line').search(cr, uid, [('event_id', 'in', ids)])
1302+ return {
1303+ 'name': 'History of order',
1304+ 'view_type': 'form',
1305+ 'view_mode': 'tree, form',
1306+ 'res_model': 'sale.order',
1307+ 'target': 'new',
1308+ 'type': 'ir.actions.act_window',
1309+ 'domain': [('order_line', 'in', sale_order_line_ids)],
1310+ }
1311+
1312 def _get_ticket_events(self, cr, uid, ids, context=None):
1313 # `self` is the event.event.ticket model when called by ORM!
1314 return list(set(ticket.event_id.id
1315 for ticket in self.browse(cr, uid, ids, context)))
1316
1317 # proxy method, can't import parent method directly as unbound_method: it would receive
1318- # an invalid `self` <event_registration> when called by ORM
1319+ # an invalid `self` <event_registration_attendee> when called by ORM
1320 def _events_from_registrations(self, cr, uid, ids, context=None):
1321- # `self` is the event.registration model when called by ORM
1322+ # `self` is the event.registration_attendee model when called by ORM
1323 return self.pool['event.event']._get_events_from_registrations(cr, uid, ids, context=context)
1324
1325 _columns = {
1326@@ -159,11 +173,12 @@
1327 help="The maximum registration level is equal to the sum of the maximum registration of event ticket." +
1328 "If you have too much registrations you are not able to confirm your event. (0 to ignore this rule )",
1329 type='integer',
1330+ store={'event.event': (lambda self, cr, uid, ids, context={}: ids, ['event_ticket_ids'], 20)},
1331 readonly=True),
1332 'seats_available': fields.function(Event._get_seats, oldname='register_avail', string='Available Seats',
1333 type='integer', multi='seats_reserved',
1334 store={
1335- 'event.registration': (_events_from_registrations, ['state'], 10),
1336+ 'event.registration_attendee': (_events_from_registrations, ['state'], 10),
1337 'event.event': (lambda self, cr, uid, ids, c = {}: ids,
1338 ['seats_max', 'registration_ids'], 20),
1339 'event.event.ticket': (_get_ticket_events, ['seats_max'], 10),
1340@@ -175,6 +190,7 @@
1341
1342 class event_ticket(osv.osv):
1343 _name = 'event.event.ticket'
1344+ _order = 'price'
1345
1346 def _get_seats(self, cr, uid, ids, fields, args, context=None):
1347 """Get reserved, available, reserved but unconfirmed and used seats for each event tickets.
1348@@ -204,8 +220,8 @@
1349 'name': fields.char('Name', size=64, required=True, translate=True),
1350 'event_id': fields.many2one('event.event', "Event", required=True, ondelete='cascade'),
1351 'product_id': fields.many2one('product.product', 'Product', required=True, domain=[("event_type_id", "!=", False)]),
1352- 'registration_ids': fields.one2many('event.registration', 'event_ticket_id', 'Registrations'),
1353- 'deadline': fields.date("Sales End"),
1354+ 'registration_ids': fields.one2many('event.registration_attendee', 'event_ticket_id', 'Registrations'),
1355+ 'deadline': fields.date("End of Sales"),
1356 'is_expired': fields.function(_is_expired, type='boolean', string='Is Expired'),
1357 'price': fields.float('Price'),
1358 'seats_max': fields.integer('Maximum Avalaible Seats', oldname='register_max', help="You can for each event define a maximum registration level. If you have too much registrations you are not able to confirm your event. (put 0 to ignore this rule )"),
1359@@ -243,7 +259,7 @@
1360
1361 class event_registration(osv.osv):
1362 """Event Registration"""
1363- _inherit= 'event.registration'
1364+ _inherit= 'event.registration_attendee'
1365 _columns = {
1366 'event_ticket_id': fields.many2one('event.event.ticket', 'Event Ticket'),
1367 }
1368
1369=== modified file 'event_sale/event_sale_data.xml'
1370--- event_sale/event_sale_data.xml 2013-11-26 16:14:24 +0000
1371+++ event_sale/event_sale_data.xml 2014-06-09 06:19:49 +0000
1372@@ -18,8 +18,18 @@
1373 <field name="event_type_id" ref="event_sale.event_type"/>
1374 </record>
1375
1376+ <record id="product_product_event_free" model="product.product">
1377+ <field name="list_price">0.0</field>
1378+ <field name="event_ok" eval="True"/>
1379+ <field name="standard_price">0.0</field>
1380+ <field name="uom_id" ref="product.product_uom_unit"/>
1381+ <field name="uom_po_id" ref="product.product_uom_unit"/>
1382+ <field name="name">Free</field>
1383+ <field name="categ_id" ref="product.product_category_all"/>
1384+ <field name="type">service</field>
1385+ <field name="event_type_id" ref="event_sale.event_type"/>
1386+ </record>
1387+
1388 </data>
1389 </openerp>
1390
1391-
1392-
1393
1394=== modified file 'event_sale/event_sale_view.xml'
1395--- event_sale/event_sale_view.xml 2014-05-12 05:01:53 +0000
1396+++ event_sale/event_sale_view.xml 2014-06-09 06:19:49 +0000
1397@@ -18,8 +18,8 @@
1398 </record>
1399
1400 <record model="ir.ui.view" id="view_event_registration_ticket_search">
1401- <field name="name">event.registration.ticket.search</field>
1402- <field name="model">event.registration</field>
1403+ <field name="name">event.registration_attendee.ticket.search</field>
1404+ <field name="model">event.registration_attendee</field>
1405 <field name="inherit_id" ref="event.view_registration_search" />
1406 <field name="arch" type="xml">
1407 <filter name="group_event" position="after">
1408@@ -29,19 +29,19 @@
1409 </record>
1410
1411 <record model="ir.ui.view" id="view_event_registration_ticket_tree">
1412- <field name="name">event.registration.ticket.tree</field>
1413- <field name="model">event.registration</field>
1414+ <field name="name">event.registration_attendee.ticket.tree</field>
1415+ <field name="model">event.registration_attendee</field>
1416 <field name="inherit_id" ref="event.view_event_registration_tree" />
1417 <field name="arch" type="xml">
1418 <field name="event_id" position="after">
1419- <field name="event_ticket_id"/>
1420+ <field name="event_ticket_id" string="Ticket"/>
1421 </field>
1422 </field>
1423 </record>
1424
1425 <record model="ir.ui.view" id="view_event_registration_ticket_form">
1426- <field name="name">event.registration.ticket.form</field>
1427- <field name="model">event.registration</field>
1428+ <field name="name">event.registration_attendee.ticket.form</field>
1429+ <field name="model">event.registration_attendee</field>
1430 <field name="inherit_id" ref="event.view_event_registration_form" />
1431 <field name="arch" type="xml">
1432 <field name="user_id" position="after">
1433@@ -90,27 +90,39 @@
1434 <field name="inherit_id" ref="event.view_event_form"/>
1435 <field name="arch" type="xml">
1436 <data>
1437- <xpath expr="//notebook" position="inside">
1438- <page string="Ticket Types">
1439- <field name="event_ticket_ids" context="{'default_name': name}">
1440- <tree string="Payments" editable="bottom">
1441- <field name="name"/>
1442- <field name="product_id" on_change='onchange_product_id(product_id)'/>
1443- <field name="deadline"/>
1444- <field name="price"/>
1445- <field name="seats_max"/>
1446- <field name="seats_reserved"/>
1447- <field name="seats_unconfirmed"/>
1448- </tree>
1449- </field>
1450- </page>
1451- </xpath>
1452- <field name="nb_register" position="after">
1453- <field name="event_ticket_id" domain="[('event_id', '=', context.get('event_id'))]"/>
1454- </field>
1455+ <xpath expr="//notebook/page[@string='Event Management']" position="attributes">
1456+ <attribute name="invisible">0</attribute>
1457+ </xpath>
1458+ <xpath expr="//notebook/page[@string='Event Management']/div[@name='ticket_management']" position="replace">
1459+ <group string="Ticket and Seats Management" groups="event_sale.group_event_manage_tickets">
1460+ <field name="seats_max" string="Maximum Registration" class="oe_inline"
1461+ attrs="{'invisible':[('event_ticket_ids', '==', [])]}"/>
1462+ <label for="seats_max" string="Maximum Registration" class="oe_inline" attrs="{'invisible':[('event_ticket_ids', '!=', [])]}"/>
1463+ <span class="oe_inline oe_grey" attrs="{'invisible':[('event_ticket_ids', '!=', [])]}"> Unlimited</span>
1464+ </group>
1465+ <group name="Event Tickets" groups="event_sale.group_event_manage_tickets">
1466+ <field name="event_ticket_ids" string="Manage tickets">
1467+ <tree editable="top">
1468+ <field name="name" />
1469+ <field name="product_id" string="Ticket" on_change='onchange_product_id(product_id)' context="{'default_event_ok': True}"/>
1470+ <field name="price"/>
1471+ <field name="seats_max" string="Quantity Available" />
1472+ <field name="deadline"/>
1473+ </tree>
1474+ </field>
1475+ </group>
1476+ </xpath>
1477+ <xpath expr="//notebook/page[@string='Advanced']/div[@class='manageSales']" position="replace">
1478+ <group attrs="{'invisible':[('event_ticket_ids', '=', [])]}">
1479+ <label for="action_get_sale_order_for_event" string="Manage Sales" states="confirm,done"/>
1480+ <button string="History of Orders" type="object" name="action_get_sale_order_for_event" states="confirm,done" />
1481+ </group>
1482+ </xpath>
1483 </data>
1484+
1485 </field>
1486 </record>
1487
1488 </data>
1489 </openerp>
1490+
1491
1492=== added file 'event_sale/res_config.py'
1493--- event_sale/res_config.py 1970-01-01 00:00:00 +0000
1494+++ event_sale/res_config.py 2014-06-09 06:19:49 +0000
1495@@ -0,0 +1,11 @@
1496+
1497+from openerp.osv import fields, osv
1498+
1499+class event_config_settings(osv.osv_memory):
1500+ _inherit = 'marketing.config.settings'
1501+
1502+ _columns = {
1503+ 'group_event_manage_tickets': fields.boolean('Manage Event Tickets',
1504+ implied_group='event_sale.group_event_manage_tickets',
1505+ help='Manage different kind of tickets: vip, free, ... '),
1506+ }
1507
1508=== added file 'event_sale/res_config_view.xml'
1509--- event_sale/res_config_view.xml 1970-01-01 00:00:00 +0000
1510+++ event_sale/res_config_view.xml 2014-06-09 06:19:49 +0000
1511@@ -0,0 +1,23 @@
1512+<?xml version="1.0" encoding="utf-8"?>
1513+<openerp>
1514+ <data>
1515+ <record id="view_event_sale_config" model="ir.ui.view">
1516+ <field name="name">Configure Events</field>
1517+ <field name="model">marketing.config.settings</field>
1518+ <field name="inherit_id" ref="event.view_event_config"/>
1519+ <field name="arch" type="xml">
1520+ <div name="event_management" position="attributes">
1521+ <attribute name="invisible">0</attribute>
1522+ </div>
1523+ <div name="event_sale_manage_tickets" position="replace">
1524+ <div>
1525+ <div name="manage_tickets">
1526+ <field name="group_event_manage_tickets" class="oe_inline"/>
1527+ <label for="group_event_manage_tickets"/>
1528+ </div>
1529+ </div>
1530+ </div>
1531+ </field>
1532+ </record>
1533+ </data>
1534+</openerp>
1535
1536=== added directory 'event_sale/security'
1537=== added file 'event_sale/security/event_sale_security.xml'
1538--- event_sale/security/event_sale_security.xml 1970-01-01 00:00:00 +0000
1539+++ event_sale/security/event_sale_security.xml 2014-06-09 06:19:49 +0000
1540@@ -0,0 +1,11 @@
1541+<?xml version="1.0" encoding="utf-8"?>
1542+<openerp>
1543+<data noupdate="0">
1544+
1545+ <record id="group_event_manage_tickets" model="res.groups">
1546+ <field name="name">Manage Event Tickets</field>
1547+ <field name="category_id" ref="base.module_category_hidden"/>
1548+ </record>
1549+
1550+</data>
1551+</openerp>
1552\ No newline at end of file
1553
1554=== modified file 'event_sale/test/confirm.yml'
1555--- event_sale/test/confirm.yml 2012-11-29 22:26:45 +0000
1556+++ event_sale/test/confirm.yml 2014-06-09 06:19:49 +0000
1557@@ -45,7 +45,9 @@
1558 -
1559 I check if a registration is created
1560 -
1561- !python {model: event.registration}: |
1562+ !python {model: event.registration_attendee}: |
1563+ from openerp.osv import osv
1564+ from openerp.tools.translate import _
1565 order_id = ref('order1')
1566 order = self.pool.get('sale.order').browse(cr, uid,order_id)
1567 registration_ids = self.search(cr,uid,[('origin','=',order.name)])
1568
1569=== modified file 'marketing/res_config_view.xml'
1570--- marketing/res_config_view.xml 2014-03-13 12:05:03 +0000
1571+++ marketing/res_config_view.xml 2014-06-09 06:19:49 +0000
1572@@ -12,26 +12,30 @@
1573 or
1574 <button string="Cancel" type="object" name="cancel" class="oe_link"/>
1575 </header>
1576- <separator string="Mass Mailing"/>
1577- <group>
1578- <label for="id" string="Settings"/>
1579- <div>
1580- <div name="module_mass_mailing">
1581- <field name="module_mass_mailing" class="oe_inline"/>
1582- <label for="module_mass_mailing"/>
1583- </div>
1584- </div>
1585- </group>
1586- <separator string="Marketing Campaigns"/>
1587- <group>
1588- <label for="id" string="Settings"/>
1589- <div>
1590- <div name="module_marketing_campaign">
1591- <field name="module_marketing_campaign" class="oe_inline"/>
1592- <label for="module_marketing_campaign"/>
1593- </div>
1594- </div>
1595- </group>
1596+ <div name="mass mailing">
1597+ <separator string="Mass Mailing"/>
1598+ <group>
1599+ <label for="id" string="Settings"/>
1600+ <div>
1601+ <div name="module_mass_mailing">
1602+ <field name="module_mass_mailing" class="oe_inline"/>
1603+ <label for="module_mass_mailing"/>
1604+ </div>
1605+ </div>
1606+ </group>
1607+ </div>
1608+ <div name="lead automation">
1609+ <separator string="Lead Automation"/>
1610+ <group>
1611+ <label for="id" string="Feature"/>
1612+ <div>
1613+ <div name="module_marketing_campaign">
1614+ <field name="module_marketing_campaign" class="oe_inline"/>
1615+ <label for="module_marketing_campaign" string="Automate leads acquisition"/>
1616+ </div>
1617+ </div>
1618+ </group>
1619+ </div>
1620 </form>
1621 </field>
1622 </record>
1623
1624=== modified file 'website_event/__openerp__.py'
1625--- website_event/__openerp__.py 2014-01-31 09:27:21 +0000
1626+++ website_event/__openerp__.py 2014-06-09 06:19:49 +0000
1627@@ -9,13 +9,14 @@
1628 Online Events
1629 """,
1630 'author': 'OpenERP SA',
1631- 'depends': ['website', 'website_partner', 'website_mail', 'event'],
1632+ 'depends': ['website', 'website_partner', 'website_mail', 'event', 'mass_mailing'],
1633 'data': [
1634 'data/event_data.xml',
1635 'views/website_event.xml',
1636 'views/website_event_sale_backend.xml',
1637 'security/ir.model.access.csv',
1638 'security/website_event.xml',
1639+ 'views/res_config_view.xml',
1640 ],
1641 'qweb': ['static/src/xml/*.xml'],
1642 'demo': [
1643
1644=== modified file 'website_event/models/__init__.py'
1645--- website_event/models/__init__.py 2014-01-28 11:31:01 +0000
1646+++ website_event/models/__init__.py 2014-06-09 06:19:49 +0000
1647@@ -1,1 +1,2 @@
1648 import event
1649+import res_config
1650
1651=== added file 'website_event/models/res_config.py'
1652--- website_event/models/res_config.py 1970-01-01 00:00:00 +0000
1653+++ website_event/models/res_config.py 2014-06-09 06:19:49 +0000
1654@@ -0,0 +1,14 @@
1655+
1656+from openerp.osv import fields, osv
1657+
1658+class event_config_settings(osv.osv_memory):
1659+ _inherit = 'marketing.config.settings'
1660+
1661+ _columns = {
1662+ 'group_publish_events': fields.boolean('Publish your event',
1663+ implied_group='website_event.group_publish_events',
1664+ help='Publish your event in the web.'),
1665+ 'group_advanced_event_features': fields.boolean('Manage advanced event features',
1666+ implied_group='website_event.group_advanced_event_features',
1667+ help='Manage advanced event features like etracking, agenda, sponsors.'),
1668+ }
1669
1670=== modified file 'website_event/security/website_event.xml'
1671--- website_event/security/website_event.xml 2014-01-28 11:31:01 +0000
1672+++ website_event/security/website_event.xml 2014-06-09 06:19:49 +0000
1673@@ -11,5 +11,18 @@
1674 <field name="perm_create" eval="False"/>
1675 <field name="perm_unlink" eval="False"/>
1676 </record>
1677+
1678+ <record id="group_publish_events" model="res.groups">
1679+ <field name="name">Publish your event</field>
1680+ <field name="implied_ids" eval="[(4, ref('base.group_website_publisher'))]"/>
1681+ <field name="category_id" ref="base.module_category_hidden"/>
1682+ </record>
1683+
1684+ <record id="group_advanced_event_features" model="res.groups">
1685+ <field name="name">Manage advanced event features</field>
1686+ <field name="category_id" ref="base.module_category_hidden"/>
1687+ </record>
1688+
1689 </data>
1690 </openerp>
1691+
1692
1693=== modified file 'website_event/static/src/js/website.tour.event.js'
1694--- website_event/static/src/js/website.tour.event.js 2014-03-20 08:30:55 +0000
1695+++ website_event/static/src/js/website.tour.event.js 2014-06-09 06:19:49 +0000
1696@@ -17,7 +17,7 @@
1697 element: '#content-menu-button',
1698 placement: 'left',
1699 title: _t("Add Content"),
1700- content: _t("The <em>Content</em> menu allows you to create new pages, events, menus, etc."),
1701+ content: _t("Use this <em>Content</em> menu to create a new event like any other document (page, menu, products, blog post, ...)"),
1702 popover: { fixed: true },
1703 },
1704 {
1705@@ -32,7 +32,7 @@
1706 sampleText: 'Advanced Technical Training',
1707 placement: 'right',
1708 title: _t("Create an Event Name"),
1709- content: _t("Create a name for your new event and click <em>'Continue'</em>. e.g: Technical Training"),
1710+ content: _t("Add a name for your new event e.g: New product demo"),
1711 },
1712 {
1713 waitNot: '.modal input[type=text]:not([value!=""])',
1714
1715=== added file 'website_event/views/res_config_view.xml'
1716--- website_event/views/res_config_view.xml 1970-01-01 00:00:00 +0000
1717+++ website_event/views/res_config_view.xml 2014-06-09 06:19:49 +0000
1718@@ -0,0 +1,25 @@
1719+<?xml version="1.0" encoding="utf-8"?>
1720+<openerp>
1721+ <data>
1722+ <record id="view_website_event_config" model="ir.ui.view">
1723+ <field name="name">Configure Events</field>
1724+ <field name="model">marketing.config.settings</field>
1725+ <field name="inherit_id" ref="event.view_event_config"/>
1726+ <field name="arch" type="xml">
1727+ <div name="event_management" position="attributes">
1728+ <attribute name="invisible">0</attribute>
1729+ </div>
1730+ <div name="website_event_promotion" position="replace">
1731+ <div>
1732+ <field name="group_publish_events" class="oe_inline"/>
1733+ <label for="group_publish_events"/>
1734+ </div>
1735+ <div>
1736+ <field name="group_advanced_event_features" class="oe_inline"/>
1737+ <label for="group_advanced_event_features"/>
1738+ </div>
1739+ </div>
1740+ </field>
1741+ </record>
1742+ </data>
1743+</openerp>
1744
1745=== modified file 'website_event/views/website_event.xml'
1746--- website_event/views/website_event.xml 2014-05-09 20:27:53 +0000
1747+++ website_event/views/website_event.xml 2014-06-09 06:19:49 +0000
1748@@ -207,11 +207,16 @@
1749 </ol>
1750 <ol class="breadcrumb mb0" id="event_menu" t-if="event.menu_id">
1751 <t t-foreach="event.menu_id.child_id" t-as="submenu">
1752- <t t-call="website.submenu"/>
1753+ <t t-if="submenu.name not in ['Agenda', 'Location']">
1754+ <t t-call="website.submenu"/>
1755+ </t>
1756+ <t t-if="submenu.name in ['Agenda', 'Location']" groups="website_event.group_advanced_event_features">
1757+ <t t-call="website.submenu"/>
1758+ </t>
1759 </t>
1760 </ol>
1761 </div>
1762- <div class="col-sm-5" groups="event.group_event_manager">
1763+ <div class="col-sm-5" groups="event.group_event_manager,website_event.group_publish_events">
1764 <t t-call="website.publish_management">
1765 <t t-set="object" t-value="event"/>
1766 <t t-set="publish_edit" t-value="True"/>
1767@@ -299,6 +304,11 @@
1768 </li>
1769 </ul>
1770 </div>
1771+ <div class="col-md-4 mb16">
1772+ <t t-call="website_mail.follow">
1773+ <t t-set="object" t-value="event"/>
1774+ </t>
1775+ </div>
1776 <div class="col-md-4 css_noprint">
1777 <div class="clearfix"/>
1778
1779@@ -342,7 +352,6 @@
1780 <h4>Social Stream</h4>
1781 </div>
1782 <div class="panel-body">
1783- <t t-call="website_mail.follow"><t t-set="object" t-value="event"/></t>
1784 <div t-if="event.twitter_hashtag" class="mt16">
1785 <p><strong>Participate on Twitter</strong></p>
1786 <p class="text-muted">
1787
1788=== modified file 'website_event/views/website_event_sale_backend.xml'
1789--- website_event/views/website_event_sale_backend.xml 2014-01-30 17:51:53 +0000
1790+++ website_event/views/website_event_sale_backend.xml 2014-06-09 06:19:49 +0000
1791@@ -2,18 +2,30 @@
1792 <openerp>
1793 <data>
1794
1795- <record model="ir.ui.view" id="view_event_sale_form">
1796+ <record id="action_view_mass_mailings1" model="ir.actions.act_window">
1797+ <field name="name">Mass Mailings</field>
1798+ <field name="res_model">mail.mass_mailing</field>
1799+ <field name="view_id" ref="mass_mailing.action_view_mass_mailings"/>
1800+ <field name="view_type">form</field>
1801+ <field name="view_mode">form</field>
1802+ <field name="target">new</field>
1803+ </record>
1804+
1805+ <record model="ir.ui.view" id="view_event_form">
1806 <field name="name">event.event.website.form</field>
1807 <field name="model">event.event</field>
1808 <field name="inherit_id" ref="event.view_event_form"/>
1809 <field name="arch" type="xml">
1810- <!-- add state field in header -->
1811- <xpath expr="//div[@class='oe_right oe_button_box']" position="before">
1812- <field name="website_url" invisible="1"/>
1813- <field name="website_published" class="pull-right" widget="website_button"/>
1814+ <xpath expr="//notebook/page[@string='Event Management']" position="attributes">
1815+ <attribute name="invisible">0</attribute>
1816 </xpath>
1817- <xpath expr="//field[@name='organizer_id']" position="after">
1818- <field name="twitter_hashtag"/>
1819+ <xpath expr="//notebook/page[@string='Event Management']/div[@name='promotion']" position="replace">
1820+ <group string="Event Promotion and Visibility">
1821+ <field name="website_published" class="pull-left" widget="website_button" string=" " groups="website_event.group_publish_events"/>
1822+ <field name="website_url" string="Publish" widget="url"/>
1823+ <label for="%(action_view_mass_mailings1)d" />
1824+ <button name="%(action_view_mass_mailings1)d" string="Send Invitation by Email" type="action" />
1825+ </group>
1826 </xpath>
1827 </field>
1828 </record>
1829
1830=== modified file 'website_event_sale/__openerp__.py'
1831--- website_event_sale/__openerp__.py 2014-01-28 11:31:01 +0000
1832+++ website_event_sale/__openerp__.py 2014-06-09 06:19:49 +0000
1833@@ -17,7 +17,6 @@
1834 'security/ir.model.access.csv',
1835 'security/website_event_sale.xml',
1836 ],
1837- 'qweb': ['static/src/xml/*.xml'],
1838 'installable': True,
1839 'auto_install': True
1840 }
1841
1842=== modified file 'website_event_sale/controllers/main.py'
1843--- website_event_sale/controllers/main.py 2014-05-13 09:35:45 +0000
1844+++ website_event_sale/controllers/main.py 2014-06-09 06:19:49 +0000
1845@@ -24,33 +24,68 @@
1846 from openerp.addons.web.http import request
1847 from openerp.addons.website_event.controllers.main import website_event
1848 from openerp.tools.translate import _
1849+from collections import OrderedDict, defaultdict
1850
1851
1852 class website_event(website_event):
1853
1854+ @http.route(['/event/register/attendee'], type='http', auth="public", methods=['POST'], website=True)
1855+ def register_attendee(self, event_id, **post):
1856+ cr, uid, context = request.cr, request.uid, request.context
1857+ event_obj = request.registry.get('event.event').browse(cr, uid, int(event_id), context=context)
1858+ values = {
1859+ 'post': OrderedDict(sorted(post.items())),
1860+ 'event_id': event_id,
1861+ 'event': event_obj
1862+ }
1863+ return request.website.render("website_event_sale.event_attendee_registration", values)
1864+
1865 @http.route(['/event/cart/update'], type='http', auth="public", methods=['POST'], website=True)
1866 def cart_update(self, event_id, **post):
1867 cr, uid, context = request.cr, request.uid, request.context
1868 ticket_obj = request.registry.get('event.event.ticket')
1869+ attendees_list = []
1870+ dict_attendee = {}
1871+
1872+ attendee_obj = request.registry.get('event.registration_attendee')
1873+ for key, value in post.items():
1874+ if key.partition('-')[0] == "attendee":
1875+ dict_attendee[key] = value
1876
1877 sale = False
1878- for key, value in post.items():
1879- quantity = int(value or "0")
1880+ attendees = defaultdict(lambda: defaultdict(lambda: defaultdict(dict)))
1881+ for key, value in dict_attendee.items():
1882+ splitted_key = key.rsplit('-')
1883+ quantity = int(splitted_key[4] or "0")
1884 if not quantity:
1885 continue
1886 sale = True
1887- ticket_id = key.split("-")[0] == 'ticket' and int(key.split("-")[1]) or None
1888- ticket = ticket_obj.browse(cr, SUPERUSER_ID, ticket_id, context=context)
1889- request.website.sale_get_order(force_create=1)._cart_update(
1890- product_id=ticket.product_id.id, add_qty=quantity, context=dict(context, event_ticket_id=ticket.id))
1891+ ticket_id = int(splitted_key[2])
1892+ context.update({'event': True})
1893+ if ticket_id != 0:
1894+ ticket = ticket_obj.browse(cr, SUPERUSER_ID, ticket_id, context=context)
1895+ request.website.sale_get_order(force_create=1)._cart_update(
1896+ product_id=ticket.product_id.id, add_qty=quantity, context=dict(context, event_ticket_id=ticket.id))
1897+ else:
1898+ product_id = request.registry['ir.model.data'].xmlid_to_res_id(request.cr, SUPERUSER_ID, 'event_sale.product_product_event_free')
1899+ request.website.sale_get_order(force_create=1)._cart_update(
1900+ product_id=product_id, add_qty=quantity, context=dict(context))
1901+ attendees[splitted_key[2]][splitted_key[3]][splitted_key[1]] = value
1902
1903 if not sale:
1904 return request.redirect("/event/%s" % event_id)
1905+
1906+ for key1, value1 in attendees.items():
1907+ for key2, value2 in value1.items():
1908+ value2['event_id'] = event_id
1909+ attendees_list.append(dict(value2))
1910+
1911+ request.session['attendees_list'] = attendees_list
1912+
1913 return request.redirect("/shop/checkout")
1914
1915 def _add_event(self, event_name="New Event", context={}, **kwargs):
1916 try:
1917- print kwargs
1918 dummy, res_id = request.registry.get('ir.model.data').get_object_reference(request.cr, request.uid, 'event_sale', 'product_product_event')
1919 context['default_event_ticket_ids'] = [[0,0,{
1920 'name': _('Subscription'),
1921@@ -63,5 +98,3 @@
1922 pass
1923 return super(website_event, self)._add_event(event_name, context, **kwargs)
1924
1925-
1926-
1927
1928=== modified file 'website_event_sale/models/sale_order.py'
1929--- website_event_sale/models/sale_order.py 2014-05-02 14:01:52 +0000
1930+++ website_event_sale/models/sale_order.py 2014-06-09 06:19:49 +0000
1931@@ -1,4 +1,5 @@
1932 # -*- coding: utf-8 -*-
1933+from openerp.addons.web.http import request
1934 from openerp import SUPERUSER_ID
1935 from openerp.osv import osv, fields
1936 from openerp.tools.translate import _
1937@@ -47,3 +48,31 @@
1938 values['name'] = "%s: %s" % (ticket.event_id.name, ticket.name)
1939
1940 return values
1941+
1942+class sale_order_line(osv.Model):
1943+ _inherit = 'sale.order.line'
1944+
1945+ def button_confirm(self, cr, uid, ids, context=None):
1946+ '''
1947+ Updated attendees details in attendee form and sales order lines.
1948+ '''
1949+ if context is None:
1950+ context = {}
1951+ result = super(sale_order_line, self).button_confirm(cr, uid, ids, context=context)
1952+ attendee_obj = request.registry.get('event.registration_attendee')
1953+ if request.session.get('attendees_list', False) and request.session.get('attendees_list') != []:
1954+ sale_order_obj = request.registry.get('sale.order').browse(cr, uid, request.session.get('sale_order_id', False), context=context)
1955+ attendee_ids = request.registry.get('event.registration_attendee').search(cr, uid, [('origin', '=', sale_order_obj.name)])
1956+ attendee_ids.reverse()
1957+ for attendee, attendees_list in zip(attendee_obj.browse(cr, uid, attendee_ids, context=context), request.session.get('attendees_list', False)):
1958+ attendee_obj.write(cr, uid, [attendee.id], {
1959+ 'name': attendees_list['name'],
1960+ 'email': attendees_list['email'],
1961+ 'phone': attendees_list['phone']}, context=context)
1962+
1963+ ids.reverse()
1964+ for attendee, saleorder_line in zip(attendee_obj.browse(cr, uid, attendee_ids, context= context), self.browse(cr, uid, ids, context= context)):
1965+ values = saleorder_line.name + ' ( ' + attendee.name + ' )'
1966+ self.write(cr, uid, saleorder_line.id, {'name': values}, context=context)
1967+ request.session['attendees_list'] = []
1968+ return result
1969
1970=== modified file 'website_event_sale/static/src/js/website.tour.event_sale.js'
1971--- website_event_sale/static/src/js/website.tour.event_sale.js 2014-04-14 08:48:33 +0000
1972+++ website_event_sale/static/src/js/website.tour.event_sale.js 2014-06-09 06:19:49 +0000
1973@@ -15,24 +15,38 @@
1974 },
1975 {
1976 waitNot: 'a[href*="/event"]:contains("Conference on Business Applications")',
1977- title: "select 2 Standard tickets",
1978+ title: "select 1 Standard ticket",
1979 element: 'select:eq(0)',
1980- sampleText: '2',
1981+ sampleText: '1',
1982 },
1983 {
1984- title: "select 3 VIP tickets",
1985- waitFor: 'select:eq(0) option:contains(2):selected',
1986+ title: "select 1 VIP ticket",
1987+ waitFor: 'select:eq(0) option:contains(1):selected',
1988 element: 'select:eq(1)',
1989- sampleText: '3',
1990- },
1991- {
1992- title: "Order Now",
1993- waitFor: 'select:eq(1) option:contains(3):selected',
1994- element: '.btn-primary:contains("Order Now")',
1995+ sampleText: '1',
1996+ },
1997+ {
1998+ title: "Select Attendees and Order",
1999+ waitFor: 'select:eq(1) option:contains(1):selected',
2000+ element: '.btn-primary:contains("Select Attendees and Order")',
2001+ },
2002+ {
2003+ title: "Fill attendees details",
2004+ element: 'form[action="/event/cart/update?event_id=3"] .btn:contains("Order Now")',
2005+ autoComplete: function (tour) {
2006+ if ($("input[name='attendee-name-4-1-1']").val() === "")
2007+ $("input[name='attendee-name-4-1-1']").val("StandardAttendee1");
2008+ if ($("input[name='attendee-email-4-1-1']").val() === "")
2009+ $("input[name='attendee-email-4-1-1']").val("standardattende1@eventoptenerp.com");
2010+ if ($("input[name='attendee-name-5-1-1']").val() === "")
2011+ $("input[name='attendee-name-5-1-1']").val("VIPAttendee1");
2012+ if ($("input[name='attendee-email-5-1-1']").val() === "")
2013+ $("input[name='attendee-email-5-1-1']").val("vipattende1@eventoptenerp.com");
2014+ },
2015 },
2016 {
2017 title: "Complete checkout",
2018- waitFor: '#top_menu .my_cart_quantity:contains(5)',
2019+ waitFor: '#top_menu .my_cart_quantity:contains(2)',
2020 element: 'form[action="/shop/confirm_order"] .btn:contains("Confirm")',
2021 autoComplete: function (tour) {
2022 if ($("input[name='name']").val() === "")
2023@@ -63,3 +77,4 @@
2024 });
2025
2026 }());
2027+
2028
2029=== modified file 'website_event_sale/views/website_event_sale.xml'
2030--- website_event_sale/views/website_event_sale.xml 2014-05-02 14:01:52 +0000
2031+++ website_event_sale/views/website_event_sale.xml 2014-06-09 06:19:49 +0000
2032@@ -28,7 +28,7 @@
2033
2034 <template id="event_description_full" inherit_id="website_event.event_description_full" inherit_option_id="website_event.event_description_full" name="Event's Ticket form">
2035 <xpath expr="//div[@t-field='event.description']" position="before">
2036- <form t-attf-action="/event/cart/update?event_id=#{ event.id }" method="post" t-if="event.event_ticket_ids">
2037+ <form t-attf-action="/event/register/attendee?event_id=#{ event.id }" method="post" t-if="event.event_ticket_ids">
2038 <table itemprop="offers" class="table table-striped">
2039 <thead>
2040 <tr>
2041@@ -65,21 +65,103 @@
2042 </span>
2043 </td>
2044 <td>
2045- <select t-if="ticket.seats_available" t-attf-name="ticket-#{ ticket.id }" class="form-control">
2046- <t t-foreach="range(0, ticket.seats_available > 9 and 10 or ticket.seats_available+1 )" t-as="nb"><option t-esc="nb"/></t>
2047+ <select t-if="event.seats_available" t-attf-name="ticket-#{ ticket.id }-#{ ticket.name}" class="form-control" >
2048+ <t t-foreach="range(0, event.seats_available > 9 and 10 or event.seats_available+1 )" t-as="nb">
2049+ <option t-esc="nb"/>
2050+ </t>
2051 </select>
2052- <span t-if="not ticket.seats_available">Sold Out</span>
2053+ <span t-if="not event.seats_available">Sold Out</span>
2054 </td>
2055 </tr>
2056 </t>
2057 </tbody>
2058 </table>
2059- <button type="submit" class="btn btn-primary btn-lg pull-right" t-if="event.seats_available">Order Now</button>
2060+ <button type="submit" t-if="event.seats_available" class="btn btn-primary btn-lg pull-right" >Select Attendees and Order</button>
2061 <div class="clearfix"/>
2062 <hr/>
2063 </form>
2064+ <form t-attf-id="form_noticket" t-attf-action="/event/register/attendee?event_id=#{ event.id }" method="post" t-if="not event.event_ticket_ids">
2065+ <table itemprop="offers" class="table table-striped">
2066+ <thead>
2067+ <tr>
2068+ <th>Ticket Type</th>
2069+ <th>Quantity</th>
2070+ </tr>
2071+ </thead>
2072+ <tbody>
2073+ <tr itemscope="itemscope" itemtype="http://data-vocabulary.org/Offer">
2074+ <td itemscope="itemscope" itemtype="http://data-vocabulary.org/Product">
2075+ <span>Free</span>
2076+ </td>
2077+ <td>
2078+ <select class="form-control" name='ticket-0-FREE'>
2079+ <t t-foreach="range(0, 11)" t-as="nb"><option t-esc="nb"/></t>
2080+ </select>
2081+ </td>
2082+ </tr>
2083+ </tbody>
2084+ </table>
2085+ <button href="#" t-attf-class="btn btn-primary btn-lg pull-right">Subscribe to this Event</button>
2086+ <div class="clearfix"/>
2087+ </form>
2088 </xpath>
2089 </template>
2090
2091+<template id="event_attendee_registration" name="Event Attendees">
2092+ <t t-call="website.layout">
2093+ <div class="col-md-offset-1 col-md-9 well" style="margin-bottom: 0px;">
2094+ <form t-attf-action="/event/cart/update?event_id=#{ event_id }" method="post">
2095+ <div itemscope="itemscope" itemtype="http://schema.org/Event">
2096+ <h1 itemprop="name" class="text-center" t-field="event.name"></h1>
2097+ <h4 class="text-center text-muted">
2098+ <i class="fa fa-clock-o"></i> <span itemprop="startDate" t-field="event.date_begin" t-field-options='{"hide_seconds":"True"}'/> to
2099+ <span itemprop="endDate" t-field="event.date_end" t-field-options='{"hide_seconds":"True"}'/>
2100+ </h4>
2101+ <h4 class="text-center text-muted"
2102+ t-field="event.address_id" t-field-options='{
2103+ "widget": "contact",
2104+ "fields": ["city"]
2105+ }'/>
2106+ </div>
2107+ <table class="table">
2108+ <t t-foreach="post" t-as="ticket">
2109+ <t t-set="split_ticket" t-value="ticket.split('-')"></t>
2110+ <t t-set="quantity" t-value="post[ticket]"/>
2111+ <t t-if="int(post[ticket]) > 0">
2112+ <thead>
2113+ <tr>
2114+ <th colspan="4" class="text-center"><t t-esc="split_ticket[2]"/></th>
2115+ </tr>
2116+ <tr>
2117+ <th/>
2118+ <th>Name</th>
2119+ <th>Phone</th>
2120+ <th>Email</th>
2121+ </tr>
2122+ </thead>
2123+ <tbody>
2124+ <t t-foreach="range(1, int(post[ticket])+1)" t-as="attendee">
2125+ <tr class='form-group'>
2126+ <td>Attendee<t t-raw="attendee"/></td>
2127+ <td><input class='form-control input-sm' type='text' t-attf-name="attendee-name-#{split_ticket[1]}-#{attendee}-#{quantity}" required="required"/></td>
2128+ <td><input class='form-control input-sm' type='tel' t-attf-name="attendee-phone-#{split_ticket[1]}-#{attendee}-#{quantity}"/></td>
2129+ <td><input class='form-control input-sm' type='email' t-attf-name="attendee-email-#{split_ticket[1]}-#{attendee}-#{quantity}" required="required"/></td>
2130+ <td><input t-if="split_ticket[2] != 'FREE'" class='hidden' type='text' t-attf-name="attendee-event_ticket_id-#{split_ticket[1]}-#{attendee}-#{quantity}" t-attf-value="#{ split_ticket[1] }"/></td>
2131+ </tr>
2132+ </t>
2133+ </tbody>
2134+ </t>
2135+ </t>
2136+ </table>
2137+ <hr/>
2138+ <a t-attf-href="/event/#{ slug(event) }/#{(not event.menu_id) and 'register' or ''}" class="btn btn-default btn-lg"><span class="fa fa-long-arrow-left"/> Select Ticket</a>
2139+ <button type="submit" class="btn btn-primary btn-lg pull-right" >Order Now</button>
2140+ <div class="clearfix"/>
2141+ </form>
2142+ </div>
2143+ </t>
2144+</template>
2145+
2146 </data>
2147 </openerp>
2148+
2149
2150=== modified file 'website_event_track/views/event_backend.xml'
2151--- website_event_track/views/event_backend.xml 2014-04-10 14:51:31 +0000
2152+++ website_event_track/views/event_backend.xml 2014-06-09 06:19:49 +0000
2153@@ -167,45 +167,6 @@
2154 <field name="count_tracks" widget="statinfo"/>
2155 </button>
2156 </xpath>
2157- <xpath expr="//field[@name='organizer_id']" position="after">
2158- <field name="timezone_of_event" />
2159- </xpath>
2160- <xpath expr="//div[@class='oe_title']" position="inside">
2161- <label for="tag_ids" class="oe_edit_only"/>
2162- <field name="tag_ids" widget="many2many_tags"/>
2163- <div name="event_checkboxes">
2164- <field name="show_menu"/>
2165- <label for="show_menu"/>
2166- <field name="show_tracks"/>
2167- <label for="show_tracks"/>
2168- <field name="show_track_proposal"/>
2169- <label for="show_track_proposal"/>
2170- </div>
2171- </xpath>
2172- <xpath expr="//notebook" position="inside">
2173- <page string="Tracks">
2174- <group col="2" class="oe_title">
2175- <field name="allowed_track_tag_ids" widget="many2many_tags"/>
2176- </group>
2177- <field name="track_ids" context="{'default_event_id': active_id}"/>
2178- </page>
2179- <page string="Sponsorships">
2180- <field name="sponsor_ids" context="{'default_event_id': active_id}">
2181- <tree editable="bottom">
2182- <field name="partner_id"/>
2183- <field name="url"/>
2184- <field name="sponsor_type_id"/>
2185- </tree>
2186- <form string="Sponsoring">
2187- <field name="partner_id"/>
2188- <field name="url"/>
2189- <field name="sponsor_type_id"/>
2190- </form>
2191- </field>
2192- </page>
2193- </xpath>
2194- <xpath expr="//div[@class='oe_right oe_button_box']" position="inside">
2195- </xpath>
2196 </field>
2197 </record>
2198
2199@@ -327,7 +288,6 @@
2200 <field name="duration" class="oe_inline" widget="float_time"/> hours
2201 </div>
2202 <field name="tag_ids" widget="many2many_tags"/>
2203- <field name="color"/>
2204 </group>
2205 </group>
2206 <label for="description" class="oe_edit_only"/>
2207
2208=== modified file 'website_event_track/views/website_event.xml'
2209--- website_event_track/views/website_event.xml 2014-04-09 18:43:34 +0000
2210+++ website_event_track/views/website_event.xml 2014-06-09 06:19:49 +0000
2211@@ -2,7 +2,7 @@
2212 <openerp>
2213 <data>
2214
2215-<template name="Sponsors" id="event_sponsor" inherit_option_id="website_event.layout" inherit_id="website_event.layout">
2216+<template name="Sponsors" id="event_sponsor" inherit_option_id="website_event.layout" inherit_id="website_event.layout" groups="website_event.group_advanced_event_features">
2217 <xpath expr="//t[@t-call='website.layout']" position="inside">
2218 <t t-set="head">
2219 <link rel='stylesheet' href='/website_event_track/static/src/css/website_event_track.css'/>
2220
2221=== modified file 'website_sale/models/sale_order.py'
2222--- website_sale/models/sale_order.py 2014-05-15 08:02:02 +0000
2223+++ website_sale/models/sale_order.py 2014-06-09 06:19:49 +0000
2224@@ -88,15 +88,21 @@
2225 # Create line if no line with product_id can be located
2226 if not line_id:
2227 values = self._website_product_id_change(cr, uid, ids, so.id, product_id, context=context)
2228- line_id = sol.create(cr, SUPERUSER_ID, values, context=context)
2229+ if context.get('event', False):
2230+ for i in range(add_qty):
2231+ line_id = sol.create(cr, SUPERUSER_ID, values, context=context)
2232+ else:
2233+ line_id = sol.create(cr, SUPERUSER_ID, values, context=context)
2234 if add_qty:
2235 add_qty -= 1
2236
2237 # compute new quantity
2238 if set_qty:
2239 quantity = set_qty
2240- elif add_qty != None:
2241+ elif add_qty != None and not context.get('event', False):
2242 quantity = sol.browse(cr, SUPERUSER_ID, line_id, context=context).product_uom_qty + (add_qty or 0)
2243+ elif context.get('event', False):
2244+ quantity = 1
2245
2246 # Remove zero of negative lines
2247 if quantity <= 0:

Subscribers

People subscribed via source and target branches

to all changes: