[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.
This commit is contained in:
Mitali Patel
2017-03-03 13:08:09 +01:00
committed by Thibault Delavallée
parent ddd4479d10
commit 531d641375
10 changed files with 436 additions and 231 deletions
+30 -34
View File
@@ -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):
+4 -10
View File
@@ -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})
+62 -60
View File
@@ -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>
@@ -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>
+41 -32
View File
@@ -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
@api.multi
def _set_show_menu(self):
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:
# 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.track_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_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:
event.count_tracks = result.get(event.id, 0)
event.sponsor_count = result.get(event.id, 0)
@api.multi
def _compute_website_track(self):
for event in self:
existing_pages = event.menu_id.child_id.mapped('name')
event.website_track = _('Talks') in existing_pages
@api.multi
def _compute_website_track_proposal(self):
for event in self:
existing_pages = event.menu_id.child_id.mapped('name')
event.website_track_proposal = _('Talk Proposals') in existing_pages
@api.multi
@api.depends('track_ids.tag_ids')
def _get_tracks_tag_ids(self):
def _compute_tracks_tag_ids(self):
for event in self:
event.tracks_tag_ids = event.track_ids.mapped('tag_ids').ids
@api.multi
def _count_sponsor(self):
for event in self:
event.count_sponsor = len(event.sponsor_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
@@ -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 _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):
self.ensure_one()
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)
@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
10 access_event_track_sponsor_type_public event.track.sponsor.type.public model_event_sponsor_type 1 0 0 0
11 access_event_track_sponsor_manager event.track.sponsor.type.public model_event_sponsor event.group_event_manager 1 1 1 1
12 access_event_track_sponsor_public event.track.sponsor.public model_event_sponsor 1 0 0 0
13 access_event_track_stage_all event.track.stage.all model_event_track_stage 1 0 0 0
14 access_event_track_stage_event_manager event.track.stage.event.manager model_event_track_stage event.group_event_manager 1 1 1 1
@@ -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>
@@ -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>
@@ -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>