Merge lp:~openerp-dev/openobject-addons/trunk-imp-event-psa into lp:openobject-addons
- trunk-imp-event-psa
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
OpenERP Core Team | Pending | ||
Review via email: mp+215602@code.launchpad.net |
Commit message
Description of the change
- 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 :
AttributeErr or: Got KeyError('' Field 'reminder_sended' does not exist in object 'browse_ record( event.registrat ion_attendee, 1)' '',) while trying to get attribute reminder_sended on a event.registrat ion_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
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: |