[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:
committed by
Thibault Delavallée
parent
ddd4479d10
commit
531d641375
@@ -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):
|
||||
|
||||
@@ -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})
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
@@ -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="['&', ('activity_ids.date_deadline', '>=', context_today().strftime('%Y-%m-%d')),
|
||||
('activity_ids.date_deadline', '<=', (context_today()+datetime.timedelta(days=7)).strftime('%Y-%m-%d'))
|
||||
]"/>
|
||||
<filter string="Overdue Activities" name="activities_overdue"
|
||||
domain="[('activity_ids.date_deadline', '<', 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>
|
||||
|
||||
Reference in New Issue
Block a user