summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitali Patel <mpa@odoo.com>2017-02-08 16:41:18 +0100
committerThibault Delavallée <tde@odoo.com>2017-03-03 13:08:09 +0100
commit531d641375f5cee7d3a5e629f6b1eaceee8b2739 (patch)
tree4163f959a7cbda0edc008fe52003d90ab84daa61
parentddd4479d10c1071222fec38f89d803c4509013de (diff)
[IMP] event_track: make tracks easier to use
Purpose of this commit is to clean and ease the use of tracks in event management. * status is change to stages. Those are global for all event as we consider track acceptation process as similar across events; * change speakers many2many to a one2many. Most event have only one speaker or at least a main speaker; * add various chatter features: tracking of template, subtypes, suggested recipients, ... Also add activities on tracks and their various filters; * add automatic mailing on stages like already done in tasks or issues; * tweak display of tracks on agenda. Event manager see unpublished tracks with the right label in order to know the status of the various event tracks.
-rw-r--r--addons/website_event/models/event.py64
-rw-r--r--addons/website_event_track/controllers/main.py14
-rw-r--r--addons/website_event_track/data/event_demo.xml122
-rw-r--r--addons/website_event_track/data/event_track_data.xml71
-rw-r--r--addons/website_event_track/models/event.py69
-rw-r--r--addons/website_event_track/models/event_track.py145
-rw-r--r--addons/website_event_track/security/ir.model.access.csv2
-rw-r--r--addons/website_event_track/views/event_track_templates.xml38
-rw-r--r--addons/website_event_track/views/event_track_views.xml119
-rw-r--r--addons/website_event_track/views/event_views.xml19
10 files changed, 434 insertions, 229 deletions
diff --git a/addons/website_event/models/event.py b/addons/website_event/models/event.py
index 6c1e1ddf809..b6596223e3b 100644
--- a/addons/website_event/models/event.py
+++ b/addons/website_event/models/event.py
@@ -25,9 +25,10 @@ class Event(models.Model):
)
is_participating = fields.Boolean("Is Participating", compute="_compute_is_participating")
- show_menu = fields.Boolean('Dedicated Menu', compute='_get_show_menu', inverse='_set_show_menu',
- help="Creates menus Introduction, Location and Register on the page "
- " of the event on the website.", store=True)
+ website_menu = fields.Boolean(
+ 'Dedicated Menu', compute='_compute_website_menu', inverse='_set_website_menu',
+ help="Creates menus Introduction, Location and Register on the page "
+ " of the event on the website.", store=True)
menu_id = fields.Many2one('website.menu', 'Event Menu')
def _compute_is_participating(self):
@@ -46,46 +47,41 @@ class Event(models.Model):
if event.id: # avoid to perform a slug on a not yet saved record in case of an onchange.
event.website_url = '/event/%s' % slug(event)
- @api.multi
- def _get_new_menu_pages(self):
- """ Retuns a list of tuple ('Page name', 'relative page url') for the event """
+ def _get_menu_entries(self):
self.ensure_one()
- todo = [
- (_('Introduction'), 'website_event.template_intro'),
- (_('Location'), 'website_event.template_location')
+ return [
+ (_('Introduction'), False, 'website_event.template_intro'),
+ (_('Location'), False, 'website_event.template_location'),
+ (_('Register'), '/event/%s/register' % slug(self), False),
]
- result = []
- for name, path in todo:
- complete_name = name + ' ' + self.name
- newpath = self.env['website'].new_page(complete_name, path, ispage=False)
- url = "/event/" + slug(self) + "/page/" + newpath
- result.append((name, url))
- result.append((_('Register'), '/event/%s/register' % slug(self)))
- return result
@api.multi
- def _set_show_menu(self):
+ def _set_website_menu(self):
for event in self:
- if event.menu_id and not event.show_menu:
+ if event.menu_id and not event.website_menu:
event.menu_id.unlink()
- elif event.show_menu and not event.menu_id:
- root_menu = self.env['website.menu'].create({'name': event.name})
- to_create_menus = event._get_new_menu_pages()
- seq = 0
- for name, url in to_create_menus:
- self.env['website.menu'].create({
- 'name': name,
- 'url': url,
- 'parent_id': root_menu.id,
- 'sequence': seq,
- })
- seq += 1
- event.menu_id = root_menu
+ elif event.website_menu:
+ if not event.menu_id:
+ root_menu = self.env['website.menu'].create({'name': event.name})
+ event.menu_id = root_menu
+
+ for sequence, (name, url, xml_id) in enumerate(self._get_menu_entries()):
+ existing_pages = event.menu_id.child_id.mapped('name')
+ if name not in existing_pages:
+ if not url:
+ newpath = self.env['website'].new_page(name + ' ' + self.name, xml_id, ispage=False)
+ url = "/event/" + slug(self) + "/page/" + newpath
+ self.env['website.menu'].create({
+ 'name': name,
+ 'url': url,
+ 'parent_id': event.menu_id.id,
+ 'sequence': sequence,
+ })
@api.multi
- def _get_show_menu(self):
+ def _compute_website_menu(self):
for event in self:
- event.show_menu = bool(event.menu_id)
+ event.website_menu = bool(event.menu_id)
@api.multi
def google_map_img(self, zoom=8, width=298, height=298):
diff --git a/addons/website_event_track/controllers/main.py b/addons/website_event_track/controllers/main.py
index 544c749c635..5a5a096127c 100644
--- a/addons/website_event_track/controllers/main.py
+++ b/addons/website_event_track/controllers/main.py
@@ -65,7 +65,7 @@ class WebsiteEventTrackController(http.Controller):
'dates': dates
}
- @http.route(['''/event/<model("event.event", "[('show_tracks','=',1)]"):event>/agenda'''], type='http', auth="public", website=True)
+ @http.route(['''/event/<model("event.event", "[('website_track','=',1)]"):event>/agenda'''], type='http', auth="public", website=True)
def event_agenda(self, event, tag=None, **post):
days_tracks = collections.defaultdict(lambda: [])
for track in event.track_ids.sorted(lambda track: (track.date, bool(track.location_id))):
@@ -79,22 +79,16 @@ class WebsiteEventTrackController(http.Controller):
tracks_by_days[day] = tracks
days[day] = self._prepare_calendar(event, tracks)
- speakers = {}
- for track in event.sudo().track_ids:
- speakers_name = u" – ".join(track.speaker_ids.mapped('name'))
- speakers[track.id] = speakers_name
-
return request.render("website_event_track.agenda", {
'event': event,
'days': days,
'tracks_by_days': tracks_by_days,
- 'speakers': speakers,
'tag': tag
})
@http.route([
- '''/event/<model("event.event", "[('show_tracks','=',1)]"):event>/track''',
- '''/event/<model("event.event", "[('show_tracks','=',1)]"):event>/track/tag/<model("event.track.tag"):tag>'''
+ '''/event/<model("event.event", "[('website_track','=',1)]"):event>/track''',
+ '''/event/<model("event.event", "[('website_track','=',1)]"):event>/track/tag/<model("event.track.tag"):tag>'''
], type='http', auth="public", website=True)
def event_tracks(self, event, tag=None, **post):
searches = {}
@@ -114,7 +108,7 @@ class WebsiteEventTrackController(http.Controller):
}
return request.render("website_event_track.tracks", values)
- @http.route(['''/event/<model("event.event", "[('show_track_proposal','=',1)]"):event>/track_proposal'''], type='http', auth="public", website=True)
+ @http.route(['''/event/<model("event.event", "[('website_track_proposal','=',1)]"):event>/track_proposal'''], type='http', auth="public", website=True)
def event_track_proposal(self, event, **post):
return request.render("website_event_track.event_track_proposal", {'event': event})
diff --git a/addons/website_event_track/data/event_demo.xml b/addons/website_event_track/data/event_demo.xml
index 02fa5a6cd64..35573323586 100644
--- a/addons/website_event_track/data/event_demo.xml
+++ b/addons/website_event_track/data/event_demo.xml
@@ -17,14 +17,14 @@
This should be done at the end so that the menu is complete
-->
<record id="event.event_0" model="event.event">
- <field name="show_tracks">True</field>
- <field name="show_track_proposal">True</field>
+ <field name="website_track">True</field>
+ <field name="website_track_proposal">True</field>
</record>
<!-- Show menu after so that the menu is created with tracks -->
<record id="event.event_0" model="event.event">
- <field name="show_menu">True</field>
+ <field name="website_menu">True</field>
</record>
<!-- Sponsorships -->
@@ -98,11 +98,11 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 06:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location5"/>
<field name="duration" eval="1"/>
- <field eval="[(4, ref('base.res_partner_2')),(4, ref('base.res_partner_3'))]" name="speaker_ids"/>
+ <field name="partner_id" ref="base.res_partner_2"/>
<field name="color">3</field>
- <field name="state">draft</field>
+ <field name="stage_id" ref="event_track_stage0"/>
+ <field name="kanban_state">blocked</field>
</record>
-
<record id="event_track2" model="event.track">
<field name="name">How to integrate hardware materials with the Odoo point of sale.</field>
<field name="website_published" eval="True"/>
@@ -110,8 +110,9 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 8:30:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location5"/>
<field name="duration" eval="0.25"/>
- <field eval="[(4, ref('base.res_partner_3'))]" name="speaker_ids"/>
- <field name="state">confirmed</field>
+ <field name="partner_id" ref="base.res_partner_3"/>
+ <field name="stage_id" ref="event_track_stage1"/>
+ <field name="kanban_state">done</field>
</record>
<record id="event_track3" model="event.track">
<field name="name">How to develop real time apps, the website live chat module explained.</field>
@@ -120,8 +121,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 10:30:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location5"/>
<field name="duration" eval="0.3"/>
- <field eval="[(4, ref('base.res_partner_4'))]" name="speaker_ids"/>
- <field name="state">confirmed</field>
+ <field name="partner_id" ref="base.res_partner_4"/>
+ <field name="stage_id" ref="event_track_stage1"/>
</record>
<record id="event_track4" model="event.track">
<field name="name">How to develop automated tests in the Odoo web client.</field>
@@ -130,8 +131,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 9:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location5"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_2'))]" name="speaker_ids"/>
- <field name="state">published</field>
+ <field name="partner_id" ref="base.res_partner_2"/>
+ <field name="stage_id" ref="event_track_stage3"/>
</record>
<record id="event_track5" model="event.track">
<field name="name">The new way to promote your modules in the Apps platform and Odoo website.</field>
@@ -140,8 +141,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 6:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location6"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_4'))]" name="speaker_ids"/>
- <field name="state">announced</field>
+ <field name="partner_id" ref="base.res_partner_4"/>
+ <field name="stage_id" ref="event_track_stage2"/>
</record>
<record id="event_track6" model="event.track">
<field name="name">Detailed roadmap of accounting new modules and improvements for version 8.</field>
@@ -150,8 +151,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 6:30:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location6"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_3'))]" name="speaker_ids"/>
- <field name="state">announced</field>
+ <field name="partner_id" ref="base.res_partner_3"/>
+ <field name="stage_id" ref="event_track_stage2"/>
</record>
<record id="event_track7" model="event.track">
<field name="name">A technical explanation of Odoo as a CMS and a eCommerce platform for version 8.</field>
@@ -160,8 +161,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 8:30:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location6"/>
<field name="duration" eval="1"/>
- <field eval="[(4, ref('base.res_partner_1'))]" name="speaker_ids"/>
- <field name="state">published</field>
+ <field name="partner_id" ref="base.res_partner_1"/>
+ <field name="stage_id" ref="event_track_stage3"/>
</record>
<record id="event_track8" model="event.track">
<field name="name">Discover Odoo CRM: How to optimize your sales, from leads to sales orders.</field>
@@ -171,8 +172,9 @@
<field name="location_id" ref="website_event_track.event_track_location7"/>
<field name="duration" eval="0.5"/>
<field name="color">2</field>
- <field eval="[(4, ref('base.res_partner_4'))]" name="speaker_ids"/>
- <field name="state">published</field>
+ <field name="partner_id" ref="base.res_partner_4"/>
+ <field name="stage_id" ref="event_track_stage3"/>
+ <field name="kanban_state">blocked</field>
</record>
<record id="event_track9" model="event.track">
<field name="name">How to use Odoo for your HR process: recruitment, leaves management, appraisals, expenses, etc.</field>
@@ -183,8 +185,8 @@
<field name="location_id" ref="website_event_track.event_track_location7"/>
<field name="duration" eval="1"/>
<field name="color">2</field>
- <field eval="[(4, ref('base.res_partner_12'))]" name="speaker_ids"/>
- <field name="state">published</field>
+ <field name="partner_id" ref="base.res_partner_12"/>
+ <field name="stage_id" ref="event_track_stage3"/>
</record>
<record id="event_track10" model="event.track">
<field name="name">Raising qualitive insights with the survey app</field>
@@ -194,7 +196,7 @@
<field name="location_id" ref="website_event_track.event_track_location7"/>
<field name="duration" eval="0.5"/>
<field name="color">5</field>
- <field name="state">draft</field>
+ <field name="stage_id" ref="event_track_stage0"/>
</record>
<record id="event_track11" model="event.track">
<field name="name">Discover Odoo Point-of-Sale: Your shop ready to use in 30 minutes.</field>
@@ -203,8 +205,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 10:30:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location7"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_4'))]" name="speaker_ids"/>
- <field name="state">confirmed</field>
+ <field name="partner_id" ref="base.res_partner_4"/>
+ <field name="stage_id" ref="event_track_stage1"/>
</record>
<record id="event_track12" model="event.track">
<field name="name">Manage your events with Odoo, the new training modules.</field>
@@ -213,8 +215,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 11:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location7"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_2')),(4, ref('base.res_partner_12'))]" name="speaker_ids"/>
- <field name="state">announced</field>
+ <field name="partner_id" ref="base.res_partner_2"/>
+ <field name="stage_id" ref="event_track_stage2"/>
</record>
<record id="event_track13" model="event.track">
<field name="name">Advanced reporting with Google Spreadsheets integration.</field>
@@ -223,8 +225,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 6:30:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location8"/>
<field name="duration" eval="0.25"/>
- <field eval="[(4, ref('base.res_partner_12'))]" name="speaker_ids"/>
- <field name="state">published</field>
+ <field name="partner_id" ref="base.res_partner_12"/>
+ <field name="stage_id" ref="event_track_stage3"/>
</record>
<record id="event_track14" model="event.track">
<field name="name">New Paypal modules (portal, handling, installments).</field>
@@ -233,8 +235,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 7:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location8"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_10'))]" name="speaker_ids"/>
- <field name="state">published</field>
+ <field name="partner_id" ref="base.res_partner_10"/>
+ <field name="stage_id" ref="event_track_stage3"/>
</record>
<record id="event_track15" model="event.track">
<field name="name">Odoo Mobile for Notes, Meetings and Messages.</field>
@@ -243,8 +245,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 10:30:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location8"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_3'))]" name="speaker_ids"/>
- <field name="state">announced</field>
+ <field name="partner_id" ref="base.res_partner_3"/>
+ <field name="stage_id" ref="event_track_stage3"/>
</record>
<record id="event_track16" model="event.track">
<field name="name">Odoo as your Enterprise Social Network.</field>
@@ -253,8 +255,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 11:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location8"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_12'))]" name="speaker_ids"/>
- <field name="state">draft</field>
+ <field name="partner_id" ref="base.res_partner_12"/>
+ <field name="stage_id" ref="event_track_stage0"/>
</record>
<record id="event_track17" model="event.track">
<field name="name">The Art of Making an Odoo Demo.</field>
@@ -263,8 +265,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 6:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location9"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_10'))]" name="speaker_ids"/>
- <field name="state">draft</field>
+ <field name="partner_id" ref="base.res_partner_10"/>
+ <field name="stage_id" ref="event_track_stage0"/>
</record>
<record id="event_track18" model="event.track">
<field name="name">How to build your marketing strategy for the purpose of generating leads with Odoo.</field>
@@ -274,8 +276,8 @@
<field name="location_id" ref="website_event_track.event_track_location9"/>
<field name="duration" eval="0.5"/>
<field name="color">5</field>
- <field eval="[(4, ref('base.res_partner_2'))]" name="speaker_ids"/>
- <field name="state">confirmed</field>
+ <field name="partner_id" ref="base.res_partner_2"/>
+ <field name="stage_id" ref="event_track_stage1"/>
</record>
<record id="event_track19" model="event.track">
<field name="name">Advanced lead management with Odoo: tips and tricks from the fields</field>
@@ -285,8 +287,8 @@
<field name="location_id" ref="website_event_track.event_track_location9"/>
<field name="duration" eval="0.5"/>
<field name="color">5</field>
- <field eval="[(4, ref('base.res_partner_4'))]" name="speaker_ids"/>
- <field name="state">confirmed</field>
+ <field name="partner_id" ref="base.res_partner_4"/>
+ <field name="stage_id" ref="event_track_stage1"/>
</record>
<record id="event_track20" model="event.track">
<field name="name">New Certification Program (valid from Oct. 2013).</field>
@@ -295,8 +297,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 10:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location9"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_3'))]" name="speaker_ids"/>
- <field name="state">confirmed</field>
+ <field name="partner_id" ref="base.res_partner_3"/>
+ <field name="stage_id" ref="event_track_stage1"/>
</record>
<record id="event_track21" model="event.track">
<field name="name">Recruiting high skilled talents with Odoo HR apps</field>
@@ -306,7 +308,7 @@
<field name="location_id" ref="website_event_track.event_track_location9"/>
<field name="duration" eval="0.5"/>
<field name="color">7</field>
- <field name="state">confirmed</field>
+ <field name="stage_id" ref="event_track_stage1"/>
</record>
<record id="event_track22" model="event.track">
<field name="name">Manage your KPIs (recomended to openERP partners).</field>
@@ -315,8 +317,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 11:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location9"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_3'))]" name="speaker_ids"/>
- <field name="state">draft</field>
+ <field name="partner_id" ref="base.res_partner_3"/>
+ <field name="stage_id" ref="event_track_stage0"/>
</record>
<record id="event_track23" model="event.track">
<field name="name">Key Success factors selling Odoo.</field>
@@ -325,8 +327,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 7:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location9"/>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_1'))]" name="speaker_ids"/>
- <field name="state">announced</field>
+ <field name="partner_id" ref="base.res_partner_1"/>
+ <field name="stage_id" ref="event_track_stage3"/>
</record>
<record id="event_track24" model="event.track">
<field name="name">Merge proposals review, code sprint (entire day).</field>
@@ -335,8 +337,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 6:00:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location10"/>
<field name="duration" eval="1.5"/>
- <field eval="[(4, ref('base.res_partner_12')),(4, ref('base.res_partner_18'))]" name="speaker_ids"/>
- <field name="state">announced</field>
+ <field name="partner_id" ref="base.res_partner_18"/>
+ <field name="stage_id" ref="event_track_stage3"/>
</record>
<record id="event_track25" model="event.track">
<field name="name">Merge proposals review, code sprint (entire afternoon)</field>
@@ -345,8 +347,8 @@
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 8:30:00')"></field>
<field name="location_id" ref="website_event_track.event_track_location10"/>
<field name="duration" eval="2.5"/>
- <field eval="[(4, ref('base.res_partner_12')),(4, ref('base.res_partner_18'))]" name="speaker_ids"/>
- <field name="state">announced</field>
+ <field name="partner_id" ref="base.res_partner_18"/>
+ <field name="stage_id" ref="event_track_stage3"/>
</record>
<record id="event_track27" model="event.track">
<field name="name">Odoo in 2014</field>
@@ -354,8 +356,8 @@
<field name="event_id" ref="event.event_0"/>
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 04:00:00')"></field>
<field name="duration" eval="1"/>
- <field eval="[(4, ref('base.res_partner_1'))]" name="speaker_ids"/>
- <field name="state">published</field>
+ <field name="partner_id" ref="base.res_partner_1"/>
+ <field name="stage_id" ref="event_track_stage3"/>
<field name="color">3</field>
</record>
<record id="event_track28" model="event.track">
@@ -364,8 +366,8 @@
<field name="event_id" ref="event.event_0"/>
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 5:00:00')"></field>
<field name="duration" eval="0.5"/>
- <field eval="[(4, ref('base.res_partner_2'))]" name="speaker_ids"/>
- <field name="state">published</field>
+ <field name="partner_id" ref="base.res_partner_2"/>
+ <field name="stage_id" ref="event_track_stage2"/>
</record>
<record id="event_track29" model="event.track">
<field name="name">The new marketing strategy.</field>
@@ -373,8 +375,8 @@
<field name="event_id" ref="event.event_0"/>
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 5:30:00')"></field>
<field name="duration" eval="0.25"/>
- <field eval="[(4, ref('base.res_partner_2'))]" name="speaker_ids"/>
- <field name="state">published</field>
+ <field name="partner_id" ref="base.res_partner_2"/>
+ <field name="stage_id" ref="event_track_stage2"/>
<field name="color">6</field>
</record>
<record id="event_track30" model="event.track">
@@ -383,7 +385,7 @@
<field name="event_id" ref="event.event_0"/>
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 5:45:00')"></field>
<field name="duration" eval="0.25"/>
- <field name="state">confirmed</field>
+ <field name="stage_id" ref="event_track_stage1"/>
</record>
<record id="event_track31" model="event.track">
<field name="name">Lunch</field>
@@ -391,7 +393,7 @@
<field name="event_id" ref="event.event_0"/>
<field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 7:30:00')"></field>
<field name="duration" eval="1"/>
- <field name="state">confirmed</field>
+ <field name="stage_id" ref="event_track_stage1"/>
</record>
</odoo>
diff --git a/addons/website_event_track/data/event_track_data.xml b/addons/website_event_track/data/event_track_data.xml
index 7979921cbb5..88af18033e2 100644
--- a/addons/website_event_track/data/event_track_data.xml
+++ b/addons/website_event_track/data/event_track_data.xml
@@ -1,6 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
+ <!-- Email templates -->
+ <record id="mail_template_data_track_confirmation" model="mail.template">
+ <field name="name">Track: Confirmation</field>
+ <field name="subject">Confirmation of ${object.name}</field>
+ <field name="model_id" ref="website_event_track.model_event_track"/>
+ <field name="use_default_to" eval="True"/>
+ <field name="body_html" type="xml">
+<div>
+ <p>
+ Dear <t t-esc="object.partner_name"/>
+ </p><p>
+ We are pleased to inform you that your proposal ${object.name} has been accepted and confirmed for the event ${object.event_id.name}.
+ </p><p>
+ You will find more details here:
+ <div style="margin-top: 16px;">
+ <a href="/event/${object.event_id.id}/"
+ style="padding: 8px 12px; font-size: 12px; color: #FFFFFF; text-decoration: none !important; font-weight: 400; background-color: #875A7B; border: 0px solid #875A7B; border-radius:3px">
+ View Event
+ </a>
+ </div>
+ </p>
+ <p>Sincerely,</p>
+</div>
+ </field>
+ <field name="auto_delete" eval="True"/>
+ </record>
<record id="event_sponsor_type1" model="event.sponsor.type">
<field name="name">Bronze</field>
@@ -15,6 +41,36 @@
<field name="sequence">1</field>
</record>
+ <record id="event_track_stage0" model="event.track.stage">
+ <field name="name">Proposal</field>
+ <field name="sequence">1</field>
+ </record>
+ <record id="event_track_stage1" model="event.track.stage">
+ <field name="name">Confirmed</field>
+ <field name="sequence">2</field>
+ <field name="mail_template_id" ref="mail_template_data_track_confirmation"/>
+ </record>
+ <record id="event_track_stage2" model="event.track.stage">
+ <field name="name">Announced</field>
+ <field name="sequence">3</field>
+ </record>
+ <record id="event_track_stage3" model="event.track.stage">
+ <field name="name">Published</field>
+ <field name="sequence">4</field>
+ <field name="is_done" eval="True"/>
+ </record>
+ <record id="event_track_stage4" model="event.track.stage">
+ <field name="name">Refused</field>
+ <field name="sequence">5</field>
+ <field name="fold" eval="True"/>
+ </record>
+ <record id="event_track_stage5" model="event.track.stage">
+ <field name="name">Cancelled</field>
+ <field name="sequence">6</field>
+ <field name="fold" eval="True"/>
+ <field name="is_cancel" eval="True"/>
+ </record>
+
<!-- Event-related subtypes for new track / Chatter -->
<record id="mt_event_track" model="mail.message.subtype">
<field name="name">New Track</field>
@@ -23,5 +79,20 @@
<field name="default" eval="False"/>
</record>
+ <!-- Track subtypes -->
+ <record id="mt_track_blocked" model="mail.message.subtype">
+ <field name="name">Track Blocked</field>
+ <field name="res_model">event.track</field>
+ <field name="default" eval="False"/>
+ <field name="internal" eval="True"/>
+ <field name="description">Track blocked</field>
+ </record>
+ <record id="mt_track_ready" model="mail.message.subtype">
+ <field name="name">Track Ready</field>
+ <field name="res_model">event.track</field>
+ <field name="default" eval="True"/>
+ <field name="internal" eval="True"/>
+ <field name="description">Track Ready for Next Stage</field>
+ </record>
</data>
</odoo>
diff --git a/addons/website_event_track/models/event.py b/addons/website_event_track/models/event.py
index 08d8cd35b6c..6bcf0f1a757 100644
--- a/addons/website_event_track/models/event.py
+++ b/addons/website_event_track/models/event.py
@@ -9,49 +9,58 @@ class Event(models.Model):
_inherit = "event.event"
track_ids = fields.One2many('event.track', 'event_id', 'Tracks')
+ track_count = fields.Integer('Tracks', compute='_compute_track_count')
+
sponsor_ids = fields.One2many('event.sponsor', 'event_id', 'Sponsors')
- show_track_proposal = fields.Boolean('Tracks Proposals', compute='_get_show_menu', inverse='_set_show_menu', store=True)
- show_tracks = fields.Boolean('Show Tracks on Website', compute='_get_show_menu', inverse='_set_show_menu', store=True)
- count_tracks = fields.Integer('Tracks', compute='_count_tracks')
+ sponsor_count = fields.Integer('Sponsors', compute='_compute_sponsor_count')
+
+ website_track = fields.Boolean('Tracks on Website', compute='_compute_website_track', inverse='_set_website_menu')
+ website_track_proposal = fields.Boolean('Proposals on Website', compute='_compute_website_track_proposal', inverse='_set_website_menu')
+
allowed_track_tag_ids = fields.Many2many('event.track.tag', relation='event_allowed_track_tags_rel', string='Available Track Tags')
- tracks_tag_ids = fields.Many2many('event.track.tag', relation='event_track_tags_rel', string='Track Tags', compute='_get_tracks_tag_ids', store=True)
- count_sponsor = fields.Integer('# Sponsors', compute='_count_sponsor')
+ tracks_tag_ids = fields.Many2many(
+ 'event.track.tag', relation='event_track_tags_rel', string='Track Tags',
+ compute='_compute_tracks_tag_ids', store=True)
@api.multi
- def _get_new_menu_pages(self):
- self.ensure_one()
- result = super(Event, self)._get_new_menu_pages()
- if self.show_tracks:
- result.append((_('Talks'), '/event/%s/track' % slug(self)))
- result.append((_('Agenda'), '/event/%s/agenda' % slug(self)))
- if self.show_track_proposal:
- result.append((_('Talk Proposals'), '/event/%s/track_proposal' % slug(self)))
- return result
+ def _compute_track_count(self):
+ data = self.env['event.track'].read_group([('stage_id.is_cancel', '!=', True)], ['event_id'], ['event_id'])
+ result = dict((data['event_id'][0], data['event_id_count']) for data in data)
+ for event in self:
+ event.track_count = result.get(event.id, 0)
@api.multi
- def _set_show_menu(self):
+ def _compute_sponsor_count(self):
+ data = self.env['event.sponsor'].read_group([], ['event_id'], ['event_id'])
+ result = dict((data['event_id'][0], data['event_id_count']) for data in data)
for event in self:
- # if the number of menu items have changed, then menu items must be regenerated
- if event.menu_id:
- nbr_menu_items = len(event._get_new_menu_pages())
- if nbr_menu_items != len(event.menu_id.child_id):
- event.menu_id.unlink()
- return super(Event, self)._set_show_menu()
+ event.sponsor_count = result.get(event.id, 0)
@api.multi
- def _count_tracks(self):
- track_data = self.env['event.track'].read_group([('state', '!=', 'cancel')], ['event_id', 'state'], ['event_id'])
- result = dict((data['event_id'][0], data['event_id_count']) for data in track_data)
+ def _compute_website_track(self):
for event in self:
- event.count_tracks = result.get(event.id, 0)
+ existing_pages = event.menu_id.child_id.mapped('name')
+ event.website_track = _('Talks') in existing_pages
@api.multi
- @api.depends('track_ids.tag_ids')
- def _get_tracks_tag_ids(self):
+ def _compute_website_track_proposal(self):
for event in self:
- event.tracks_tag_ids = event.track_ids.mapped('tag_ids').ids
+ existing_pages = event.menu_id.child_id.mapped('name')
+ event.website_track_proposal = _('Talk Proposals') in existing_pages
@api.multi
- def _count_sponsor(self):
+ @api.depends('track_ids.tag_ids')
+ def _compute_tracks_tag_ids(self):
for event in self:
- event.count_sponsor = len(event.sponsor_ids)
+ event.tracks_tag_ids = event.track_ids.mapped('tag_ids').ids
+
+ def _get_menu_entries(self):
+ self.ensure_one()
+ res = super(Event, self)._get_menu_entries()
+ if self.website_track:
+ res += [
+ (_('Talks'), '/event/%s/track' % slug(self), False),
+ (_('Agenda'), '/event/%s/agenda' % slug(self), False)]
+ if self.website_track_proposal:
+ res += [(_('Talk Proposals'), '/event/%s/track_proposal' % slug(self), False)]
+ return res
diff --git a/addons/website_event_track/models/event_track.py b/addons/website_event_track/models/event_track.py
index 7560077da61..9b46b618d6e 100644
--- a/addons/website_event_track/models/event_track.py
+++ b/addons/website_event_track/models/event_track.py
@@ -27,26 +27,58 @@ class TrackLocation(models.Model):
name = fields.Char('Room')
+class TrackStage(models.Model):
+ _name = 'event.track.stage'
+ _description = 'Track Stage'
+ _order = 'sequence, id'
+
+ name = fields.Char(string='Stage Name', required=True, translate=True)
+ sequence = fields.Integer(string='Sequence', default=1)
+ mail_template_id = fields.Many2one(
+ 'mail.template', string='Email Template',
+ domain=[('model', '=', 'event.track')],
+ help="If set an email will be sent to the customer when the track reaches this step.")
+ fold = fields.Boolean(
+ string='Folded in Kanban',
+ help='This stage is folded in the kanban view when there are no records in that stage to display.')
+ is_done = fields.Boolean(string='Accepted Stage')
+ is_cancel = fields.Boolean(string='Canceled Stage')
+
+
class Track(models.Model):
_name = "event.track"
_description = 'Event Track'
_order = 'priority, date'
- _inherit = ['mail.thread', 'website.seo.metadata', 'website.published.mixin']
+ _inherit = ['mail.thread', 'mail.activity.mixin', 'website.seo.metadata', 'website.published.mixin']
_mail_mass_mailing = _('Track Speakers')
+ @api.model
+ def _get_default_stage_id(self):
+ return self.env['event.track.stage'].search([], limit=1).id
+
name = fields.Char('Title', required=True, translate=True)
active = fields.Boolean(default=True)
user_id = fields.Many2one('res.users', 'Responsible', track_visibility='onchange', default=lambda self: self.env.user)
- partner_id = fields.Many2one('res.partner', 'Proposed by')
- partner_name = fields.Char('Partner Name')
- partner_email = fields.Char('Partner Email')
- partner_phone = fields.Char('Partner Phone')
- partner_biography = fields.Html('Partner Biography')
- speaker_ids = fields.Many2many('res.partner', string='Speakers')
+ partner_id = fields.Many2one('res.partner', 'Speaker')
+ partner_name = fields.Char('Speaker Name')
+ partner_email = fields.Char('Speaker Email')
+ partner_phone = fields.Char('Speaker Phone')
+ partner_biography = fields.Html('Speaker Biography')
tag_ids = fields.Many2many('event.track.tag', string='Tags')
- state = fields.Selection([
- ('draft', 'Proposal'), ('confirmed', 'Confirmed'), ('announced', 'Announced'), ('published', 'Published'), ('refused', 'Refused'), ('cancel', 'Cancelled')],
- 'Status', default='draft', required=True, copy=False, track_visibility='onchange')
+ stage_id = fields.Many2one(
+ 'event.track.stage', string='Stage',
+ index=True, copy=False, default=_get_default_stage_id,
+ group_expand='_read_group_stage_ids',
+ required=True, track_visibility='onchange')
+ kanban_state = fields.Selection([
+ ('normal', 'Grey'),
+ ('done', 'Green'),
+ ('blocked', 'Red')], string='Kanban State',
+ copy=False, default='normal', required=True, track_visibility='onchange',
+ help="A track's kanban state indicates special situations affecting it:\n"
+ " * Grey is the default situation\n"
+ " * Red indicates something is preventing the progress of this track\n"
+ " * Green indicates the track is ready to be pulled to the next stage")
description = fields.Html('Track Description', translate=html_translate, sanitize_attributes=False)
date = fields.Datetime('Track Date')
duration = fields.Float('Duration', default=1.5)
@@ -57,7 +89,7 @@ class Track(models.Model):
('0', 'Low'), ('1', 'Medium'),
('2', 'High'), ('3', 'Highest')],
'Priority', required=True, default='1')
- image = fields.Binary('Image', related='speaker_ids.image_medium', store=True, attachment=True)
+ image = fields.Binary('Image', related='partner_id.image_medium', store=True, attachment=True)
@api.multi
@api.depends('name')
@@ -67,59 +99,72 @@ class Track(models.Model):
if not isinstance(track.id, models.NewId):
track.website_url = '/event/%s/track/%s' % (slug(track.event_id), slug(track))
+ @api.onchange('partner_id')
+ def _onchange_partner_id(self):
+ if self.partner_id:
+ self.partner_name = self.partner_id.name
+ self.partner_email = self.partner_id.email
+ self.partner_phone = self.partner_id.phone
+ self.partner_biography = self.partner_id.website_description
+
@api.model
def create(self, vals):
- res = super(Track, self).create(vals)
- res.message_subscribe(res.speaker_ids.ids)
- res.message_post_with_view(
+ track = super(Track, self).create(vals)
+
+ track.event_id.message_post_with_view(
'website_event_track.event_track_template_new',
- subject=res.name,
- subtype_id=self.env['ir.model.data'].xmlid_to_res_id('website_event_track.mt_event_track'))
- return res
+ values={'track': track},
+ subject=track.name,
+ subtype_id=self.env.ref('website_event_track.mt_event_track').id,
+ )
+
+ return track
@api.multi
def write(self, vals):
- if vals.get('state') == 'published':
- vals.update({'website_published': True})
+ if 'stage_id' in vals and 'kanban_state' not in vals:
+ vals['kanban_state'] = 'normal'
res = super(Track, self).write(vals)
- if vals.get('speaker_ids'):
- self.message_subscribe([speaker['id'] for speaker in self.resolve_2many_commands('speaker_ids', vals['speaker_ids'], ['id'])])
+ if vals.get('partner_id'):
+ self.message_subscribe(vals['partner_id'])
return res
@api.model
- def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
- """ Override read_group to always display all states. """
- if groupby and groupby[0] == "state":
- # Default result structure
- states = [('draft', 'Proposal'), ('confirmed', 'Confirmed'), ('announced', 'Announced'), ('published', 'Published'), ('cancel', 'Cancelled')]
- read_group_all_states = [{
- '__context': {'group_by': groupby[1:]},
- '__domain': domain + [('state', '=', state_value)],
- 'state': state_value,
- 'state_count': 0,
- } for state_value, state_name in states]
- # Get standard results
- read_group_res = super(Track, self).read_group(domain, fields, groupby, offset=offset, limit=limit, orderby=orderby)
- # Update standard results with default results
- result = []
- for state_value, state_name in states:
- res = filter(lambda x: x['state'] == state_value, read_group_res)
- if not res:
- res = filter(lambda x: x['state'] == state_value, read_group_all_states)
- if state_value == 'cancel':
- res[0]['__fold'] = True
- res[0]['state'] = [state_value, state_name]
- result.append(res[0])
- return result
- else:
- return super(Track, self).read_group(domain, fields, groupby, offset=offset, limit=limit, orderby=orderby)
+ def _read_group_stage_ids(self, stages, domain, order):
+ """ Always display all stages """
+ return stages.search([], order=order)
@api.multi
- def open_track_speakers_list(self):
+ def _track_template(self, tracking):
+ res = super(Track, self)._track_template(tracking)
+ track = self[0]
+ changes, tracking_value_ids = tracking[track.id]
+ if 'stage_id' in changes and track.stage_id.mail_template_id:
+ res['stage_id'] = (track.stage_id.mail_template_id, {'composition_mode': 'mass_mail'})
+ return res
+
+ @api.multi
+ def _track_subtype(self, init_values):
self.ensure_one()
+ if 'kanban_state' in init_values and self.kanban_state == 'blocked':
+ return 'website_event_track.mt_track_blocked'
+ elif 'kanban_state' in init_values and self.kanban_state == 'done':
+ return 'website_event_track.mt_track_ready'
+ return super(Track, self)._track_subtype(init_values)
+
+ @api.multi
+ def message_get_suggested_recipients(self):
+ recipients = super(Track, self).message_get_suggested_recipients()
+ for track in self:
+ if track.partner_email != track.partner_id.email:
+ track._message_add_suggested_recipient(recipients, email=track.partner_email, reason=_('Speaker Email'))
+ return recipients
+
+ @api.multi
+ def open_track_speakers_list(self):
return {
'name': _('Speakers'),
- 'domain': [('id', 'in', [partner.id for partner in self.speaker_ids])],
+ 'domain': [('id', 'in', self.mapped('partner_id').ids)],
'view_type': 'form',
'view_mode': 'kanban,form',
'res_model': 'res.partner',
@@ -130,6 +175,7 @@ class Track(models.Model):
class SponsorType(models.Model):
_name = "event.sponsor.type"
+ _description = 'Event Sponsor Type'
_order = "sequence"
name = fields.Char('Sponsor Type', required=True, translate=True)
@@ -138,6 +184,7 @@ class SponsorType(models.Model):
class Sponsor(models.Model):
_name = "event.sponsor"
+ _description = 'Event Sponsor'
_order = "sequence"
event_id = fields.Many2one('event.event', 'Event', required=True)
diff --git a/addons/website_event_track/security/ir.model.access.csv b/addons/website_event_track/security/ir.model.access.csv
index 88b9061d615..729a0bc42df 100644
--- a/addons/website_event_track/security/ir.model.access.csv
+++ b/addons/website_event_track/security/ir.model.access.csv
@@ -10,3 +10,5 @@ access_event_track_sponsor_type_manager,event.track.sponsor.type.public,model_ev
access_event_track_sponsor_type_public,event.track.sponsor.type.public,model_event_sponsor_type,,1,0,0,0
access_event_track_sponsor_manager,event.track.sponsor.type.public,model_event_sponsor,event.group_event_manager,1,1,1,1
access_event_track_sponsor_public,event.track.sponsor.public,model_event_sponsor,,1,0,0,0
+access_event_track_stage_all,event.track.stage.all,model_event_track_stage,,1,0,0,0
+access_event_track_stage_event_manager,event.track.stage.event.manager,model_event_track_stage,event.group_event_manager,1,1,1,1 \ No newline at end of file
diff --git a/addons/website_event_track/views/event_track_templates.xml b/addons/website_event_track/views/event_track_templates.xml
index 585527f3b27..9e6e86b0c63 100644
--- a/addons/website_event_track/views/event_track_templates.xml
+++ b/addons/website_event_track/views/event_track_templates.xml
@@ -80,9 +80,10 @@
<t t-if="track">
<a t-attf-href="/event/#{ slug(event) }/track/#{ slug(track) }">
<span t-esc="track and track.name"/>
+ <span t-if="not track.website_published" class="label label-warning">unpublished</span>
</a>
<div class="text-muted">
- <small t-esc="speakers[track.id]"/>
+ <small t-esc="track.partner_id.sudo().name"/>
</div>
</t>
</td>
@@ -97,7 +98,7 @@
<span t-esc="track.name"/>
</a>
<div class="text-muted">
- <small t-esc="speakers[track.id]"/>
+ <small t-esc="track.partner_id.sudo()"/>
</div>
</td>
</t>
@@ -129,8 +130,8 @@
<small t-if="not track.website_published" class="label label-danger">unpublished</small>
</h3>
<ul class="list-inline mb0">
- <li t-if="track.speaker_ids" class="text-muted fa fa-user">
- <t t-esc="', '.join([speaker.name for speaker in track.speaker_ids])"></t>
+ <li t-if="track.partner_id" class="text-muted fa fa-user">
+ <t t-esc="track.partner_id.sudo().name"/>
</li>
<li t-if="track.date" class="text-muted fa fa-calendar"> <span t-field="track.date" t-options='{"hide_seconds":"True"}'/></li>
<li class="text-muted fa fa-map-marker" t-if="track.location_id">
@@ -224,17 +225,17 @@
</div>
</div>
</section>
- <div t-foreach="track.speaker_ids" t-as="speaker" class="well mt32">
+ <div t-if="track.partner_id" class="well mt32">
<div class="row">
<div class="col-sm-2">
- <span t-field="speaker.sudo().image_medium"
+ <span t-field="track.partner_id.sudo().image_medium"
t-options='{"widget": "image", "class": "img-circle"}'/>
</div><div class="col-sm-10">
- <h4 t-field="speaker.name" class="mb4"/>
- <div class="fa fa-home mb16" t-if="speaker.website">
- <a t-att-href="speaker.website"><span t-field="speaker.website"/></a>
+ <h4 t-field="track.partner_id.name" class="mb4"/>
+ <div class="fa fa-home mb16" t-if="track.partner_id.website">
+ <a t-att-href="track.partner_id.website"><span t-field="track.partner_id.website"/></a>
</div>
- <div t-field="speaker.website_description"/>
+ <div t-field="track.partner_id.website_description"/>
</div>
</div>
</div>
@@ -301,7 +302,7 @@
<h1 class="text-center mb0">Call for Proposals</h1>
<h2 class="text-center text-muted mb32" t-esc="event.name"></h2>
</section>
- <section id="forms" t-if="not event.show_track_proposal">
+ <section id="forms" t-if="not event.website_track_proposal">
<h1>Proposals are closed!</h1>
<p>
This event does not accept proposals.
@@ -332,7 +333,7 @@
</p>
</section>
</div>
- <section id="forms" t-if="event.show_track_proposal">
+ <section id="forms" t-if="event.website_track_proposal">
<form class="form-horizontal mt32 js_website_submit_form" t-attf-action="/event/#{event.id}/track_proposal/post" method="post" enctype="multipart/form-data">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<div class="form-group">
@@ -448,14 +449,13 @@
<!-- Chatter templates -->
<template id="event_track_template_new">
- <h3>New track proposal</h3>
+ <p>New track proposal <a href="#" t-att-data-oe-model="track._name" t-att-data-oe-id="track.id"> <t t-esc="track.name"/></a></p>
<ul>
- <li><b>Proposed By</b>: <t t-esc="object.partner_id.name or object.partner_name or object.partner_email"/></li>
- <li><b>Mail</b>: <a t-attf-href="mailto:#{object.partner_email}"><t t-esc="object.partner_email"/></a></li>
- <li><b>Phone</b>: <t t-esc="object.partner_phone"/></li>
- <li><b>Title</b>: <t t-esc="object.name"/></li>
- <li><b>Speakers Biography</b>: <t t-esc="object.partner_biography"/></li>
- <li><b>Talk Introduction</b>: <t t-esc="object.description"/></li>
+ <li><b>Proposed By</b>: <t t-esc="track.partner_name or track.partner_email"/></li>
+ <li><b>Mail</b>: <a t-attf-href="mailto:#{track.partner_email}"><t t-esc="track.partner_email"/></a></li>
+ <li><b>Phone</b>: <t t-esc="track.partner_phone"/></li>
+ <li><b>Speakers Biography</b>: <t t-esc="track.partner_biography"/></li>
+ <li><b>Talk Introduction</b>: <t t-esc="track.description"/></li>
</ul>
</template>
diff --git a/addons/website_event_track/views/event_track_views.xml b/addons/website_event_track/views/event_track_views.xml
index f10c2c12ce5..7a9e740a673 100644
--- a/addons/website_event_track/views/event_track_views.xml
+++ b/addons/website_event_track/views/event_track_views.xml
@@ -6,11 +6,14 @@
<field name="name">event.track.kanban</field>
<field name="model">event.track</field>
<field name="arch" type="xml">
- <kanban default_group_by="state">
+ <kanban default_group_by="stage_id">
<templates>
<field name="color"/>
- <field name="speaker_ids"/>
+ <field name="partner_id"/>
+ <field name="stage_id"/>
<field name="website_url"/>
+ <field name="activity_ids"/>
+ <field name="activity_state"/>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
<div class="o_dropdown_kanban dropdown" groups="base.group_user">
@@ -31,16 +34,17 @@
<div>
<t t-if="duration"><field name="duration" widget="float_time"/> hours</t>
</div>
- <div class="oe_kanban_bottom_right">
+ <div class="oe_kanban_bottom_left">
<field name="priority" widget="priority"/>
</div>
- <div class="oe_kanban_footer_left">
- <t t-foreach="record.speaker_ids.raw_value.slice(0,11)" t-as="speaker">
- <img t-att-src="kanban_image('res.partner', 'image_small', speaker)" t-att-data-member_id="speaker" width="30px" height="30px"/>
- </t>
- <t t-if="record.speaker_ids.raw_value.length > 11 ">
- <a name="open_track_speakers_list" type="object"><t t-esc="record.speaker_ids.raw_value.length - 11"> More</t></a>
- </t>
+ <div class="oe_kanban_bottom_right">
+ <img t-att-src="kanban_image('res.partner', 'image_small', record.partner_id.raw_value)"
+ t-att-title="record.partner_id.value" width="24" height="24"
+ class="oe_kanban_avatar pull-right"/>
+ <div class="pull-left mr4">
+ <field name="activity_ids" widget="kanban_activity"/>
+ <field name="kanban_state" widget="kanban_state_selection" groups="base.group_user"/>
+ </div>
</div>
<div class="oe_clear"/>
</div>
@@ -71,14 +75,26 @@
<field name="name"/>
<field name="event_id"/>
<field name="location_id"/>
- <field name="state"/>
- <field name="speaker_ids"/>
+ <field name="stage_id"/>
+ <field name="partner_id"/>
<filter string="Unread Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
+ <separator/>
+ <filter string="My Activities" name="activities_my"
+ domain="[('activity_ids.user_id', '=', uid)]"/>
+ <filter string="Today Activities" name="activities_today"
+ domain="[('activity_ids.date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
+ <filter string="Upcoming Activities (7 days)" name="activities_week"
+ domain="['&amp;', ('activity_ids.date_deadline', '&gt;=', context_today().strftime('%Y-%m-%d')),
+ ('activity_ids.date_deadline', '&lt;=', (context_today()+datetime.timedelta(days=7)).strftime('%Y-%m-%d'))
+ ]"/>
+ <filter string="Overdue Activities" name="activities_overdue"
+ domain="[('activity_ids.date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"
+ help="Show all records which has next action date is before today"/>
<group expand="0" string="Group By">
<filter string="Responsible" context="{'group_by': 'user_id'}"/>
- <filter string="Status" context="{'group_by':'state'}"/>
+ <filter string="Stage" context="{'group_by':'stage_id'}"/>
<filter string="Date" context="{'group_by':'date'}"/>
<filter string="Event" context="{'group_by':'event_id'}"/>
</group>
@@ -92,7 +108,7 @@
<field name="arch" type="xml">
<form string="Event Track">
<header>
- <field name="state" widget="statusbar" clickable="True"/>
+ <field name="stage_id" widget="statusbar" clickable="True"/>
</header>
<sheet string="Track">
<div class="oe_button_box" name="button_box">
@@ -124,7 +140,6 @@
<field name="partner_phone"/>
</group>
<group>
- <field name="speaker_ids" widget="many2many_tags"/>
<field name="date"/>
<label for="duration"/>
<div>
@@ -137,6 +152,7 @@
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
+ <field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
@@ -184,7 +200,7 @@
<field name="name">Event Tracks</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form,calendar,graph</field>
- <field name="context">{'search_default_event_id': active_id, 'default_event_id': active_id, 'group_by': 'state'}</field>
+ <field name="context">{'search_default_event_id': active_id, 'default_event_id': active_id, 'group_by': 'stage_id'}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a track.
@@ -272,7 +288,8 @@
<menuitem
id="menu_event_sponsor_type"
action="action_event_sponsor_type"
- parent="event.menu_event_configuration"/>
+ parent="event.menu_event_configuration"
+ groups="base.group_no_one"/>
<!-- EVENT.SPONSOR VIEWS -->
<record model="ir.ui.view" id="view_event_sponsor_tree">
@@ -338,6 +355,74 @@
<menuitem
id="menu_event_track_tag"
action="action_event_track_tag"
+ parent="event.menu_event_configuration"
+ groups="base.group_no_one"/>
+
+ <!-- EVENTS TRACK STAGES-->
+ <record id="event_track_stage_view_search" model="ir.ui.view">
+ <field name="name">event.track.stage.view.search</field>
+ <field name="model">event.track.stage</field>
+ <field name="arch" type="xml">
+ <search string="Track Stage">
+ <field name="name" string="Track Stages"/>
+ </search>
+ </field>
+ </record>
+
+ <record id="event_track_stage_view_form" model="ir.ui.view">
+ <field name="name">event.track.stage.view.form</field>
+ <field name="model">event.track.stage</field>
+ <field name="arch" type="xml">
+ <form string="Track Stage">
+ <sheet>
+ <group>
+ <group>
+ <field name="name"/>
+ <field name="mail_template_id"/>
+ <field name="sequence" groups="base.group_no_one"/>
+ </group>
+ <group>
+ <field name="fold"/>
+ <field name="is_done"/>
+ <field name="is_cancel"/>
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="event_track_stage_view_tree" model="ir.ui.view">
+ <field name="name">event.track.stage.view.tree</field>
+ <field name="model">event.track.stage</field>
+ <field name="arch" type="xml">
+ <tree string="Track Stage">
+ <field name="sequence" widget="handle"/>
+ <field name="name"/>
+ <field name="fold"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="event_track_stage_action" model="ir.actions.act_window">
+ <field name="name">Track Stages</field>
+ <field name="res_model">event.track.stage</field>
+ <field name="view_type">form</field>
+ <field name="view_id" ref="event_track_stage_view_tree"/>
+ <field name="help" type="html">
+<p class="oe_view_nocontent_create">
+ Click to add a stage in the task pipeline.
+</p><p>
+ Define the steps that will be used in the event from the
+ creation of the track, up to the closing of the track.
+ You will use these stages in order to track the progress in
+ solving an event track.
+</p></field>
+ </record>
+
+ <menuitem name="Track Stages"
+ id="event_track_stage_menu"
+ action="event_track_stage_action"
parent="event.menu_event_configuration"/>
</odoo>
diff --git a/addons/website_event_track/views/event_views.xml b/addons/website_event_track/views/event_views.xml
index e28d5d13a5b..a46d73b7ba4 100644
--- a/addons/website_event_track/views/event_views.xml
+++ b/addons/website_event_track/views/event_views.xml
@@ -10,25 +10,24 @@
<button name="%(action_event_track_from_event)d"
type="action"
class="oe_stat_button"
- icon="fa-inbox"
- attrs="{'invisible': [('show_tracks', '=', False), ('show_track_proposal', '=', False)]}">
- <field name="count_tracks" widget="statinfo"/>
+ icon="fa-inbox">
+ <field name="track_count" widget="statinfo"/>
</button>
<button name="%(action_event_sponsor_from_event)d"
type="action"
class="oe_stat_button"
icon="fa-users">
- <field name="count_sponsor" widget="statinfo" string="Sponsors"/>
+ <field name="sponsor_count" widget="statinfo"/>
</button>
</button>
<xpath expr="//div[@class='oe_title']" position="inside">
<div name="event_checkboxes">
- <field name="show_menu"/>
- <label for="show_menu"/>
- <field name="show_tracks" attrs="{'invisible': [('show_menu', '=', False)]}"/>
- <label for="show_tracks" attrs="{'invisible': [('show_menu', '=', False)]}"/>
- <field name="show_track_proposal" attrs="{'invisible': [('show_menu', '=', False)]}"/>
- <label for="show_track_proposal" attrs="{'invisible': [('show_menu', '=', False)]}"/>
+ <field name="website_menu"/>
+ <label for="website_menu"/>
+ <field name="website_track" attrs="{'invisible': [('website_menu', '=', False)]}"/>
+ <label for="website_track" attrs="{'invisible': [('website_menu', '=', False)]}"/>
+ <field name="website_track_proposal" attrs="{'invisible': [('website_menu', '=', False)]}"/>
+ <label for="website_track_proposal" attrs="{'invisible': [('website_menu', '=', False)]}"/>
</div>
</xpath>
</field>