1 # -*- coding: utf-8 -*-
3 from openerp import models, fields, api
4 from openerp.tools.translate import _
5 from openerp.addons.website.models.website import slug
8 class event_track_tag(models.Model):
9 _name = "event.track.tag"
10 _description = 'Track Tag'
13 name = fields.Char('Tag', translate=True)
14 track_ids = fields.Many2many('event.track', string='Tracks')
17 class event_track_location(models.Model):
18 _name = "event.track.location"
19 _description = 'Track Location'
21 name = fields.Char('Room')
24 class event_track(models.Model):
26 _description = 'Event Tracks'
27 _order = 'priority, date'
28 _inherit = ['mail.thread', 'ir.needaction_mixin', 'website.seo.metadata']
31 def _compute_website_url(self):
32 self.website_url = "/event/%s/track/%s" % (slug(self.event_id), slug(self))
34 name = fields.Char('Title', required=True, translate=True)
36 user_id = fields.Many2one('res.users', 'Responsible', default=lambda self: self.env.user)
37 speaker_ids = fields.Many2many('res.partner', string='Speakers')
38 tag_ids = fields.Many2many('event.track.tag', string='Tags')
39 state = fields.Selection([
40 ('draft', 'Proposal'), ('confirmed', 'Confirmed'), ('announced', 'Announced'), ('published', 'Published')],
41 'Status', default='draft', required=True, copy=False, track_visibility='onchange')
42 description = fields.Html('Track Description', translate=True)
43 date = fields.Datetime('Track Date')
44 duration = fields.Float('Duration', digits=(16, 2), default=1.5)
45 location_id = fields.Many2one('event.track.location', 'Location')
46 event_id = fields.Many2one('event.event', 'Event', required=True)
47 color = fields.Integer('Color Index')
48 priority = fields.Selection([
49 ('0', 'Low'), ('1', 'Medium'),
50 ('2', 'High'), ('3', 'Highest')],
51 'Priority', required=True, default='1')
52 website_published = fields.Boolean('Available in the website', copy=False)
53 website_url = fields.Char("Website url", compute='_compute_website_url')
54 image = fields.Binary('Image', compute='_compute_image', readonly=True, store=True)
57 @api.depends('speaker_ids.image')
58 def _compute_image(self):
60 self.image = self.speaker_ids[0].image
64 def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False, lazy=True):
65 """ Override read_group to always display all states. """
66 if groupby and groupby[0] == "state":
67 # Default result structure
68 # states = self._get_state_list(cr, uid, context=context)
69 states = [('draft', 'Proposal'), ('confirmed', 'Confirmed'), ('announced', 'Announced'), ('published', 'Published')]
70 read_group_all_states = [{
71 '__context': {'group_by': groupby[1:]},
72 '__domain': domain + [('state', '=', state_value)],
75 } for state_value, state_name in states]
76 # Get standard results
77 read_group_res = super(event_track, self).read_group(cr, uid, domain, fields, groupby, offset=offset, limit=limit, context=context, orderby=orderby)
78 # Update standard results with default results
80 for state_value, state_name in states:
81 res = filter(lambda x: x['state'] == state_value, read_group_res)
83 res = filter(lambda x: x['state'] == state_value, read_group_all_states)
84 res[0]['state'] = [state_value, state_name]
88 return super(event_track, self).read_group(cr, uid, domain, fields, groupby, offset=offset, limit=limit, context=context, orderby=orderby)
90 def open_track_speakers_list(self, cr, uid, track_id, context=None):
91 track_id = self.browse(cr, uid, track_id, context=context)
93 'name': _('Speakers'),
94 'domain': [('id', 'in', [partner.id for partner in track_id.speaker_ids])],
96 'view_mode': 'kanban,form',
97 'res_model': 'res.partner',
99 'type': 'ir.actions.act_window',
103 class event_event(models.Model):
104 _inherit = "event.event"
107 def _count_tracks(self):
108 self.count_tracks = len(self.track_ids)
111 def _count_sponsor(self):
112 self.count_sponsor = len(self.sponsor_ids)
115 @api.depends('track_ids.tag_ids')
116 def _get_tracks_tag_ids(self):
117 track_tags = set(tag for track in self.track_ids for tag in track.tag_ids)
118 self.tracks_tag_ids = track_tags and list(track_tags) or False
120 track_ids = fields.One2many('event.track', 'event_id', 'Tracks', copy=True)
121 sponsor_ids = fields.One2many('event.sponsor', 'event_id', 'Sponsorships', copy=True)
122 blog_id = fields.Many2one('blog.blog', 'Event Blog')
123 show_track_proposal = fields.Boolean('Talks Proposals')
124 show_tracks = fields.Boolean('Multiple Tracks')
125 show_blog = fields.Boolean('News')
126 count_tracks = fields.Integer('# Tracks', compute='_count_tracks')
127 allowed_track_tag_ids = fields.Many2many('event.track.tag', relation='event_allowed_track_tags_rel', string='Available Track Tags')
128 tracks_tag_ids = fields.Many2many('event.track.tag', relation='event_track_tags_rel', string='Track Tags', compute='_get_tracks_tag_ids', store=True)
129 count_sponsor = fields.Integer('# Sponsors', compute='_count_sponsor')
132 def _get_new_menu_pages(self):
133 result = super(event_event, self)._get_new_menu_pages()[0] # TDE CHECK api.one -> returns a list with one item ?
135 result.append((_('Talks'), '/event/%s/track' % slug(self)))
136 result.append((_('Agenda'), '/event/%s/agenda' % slug(self)))
138 result.append((_('News'), '/blogpost'+slug(self.blog_ig)))
139 if self.show_track_proposal:
140 result.append((_('Talk Proposals'), '/event/%s/track_proposal' % slug(self)))
144 class event_sponsors_type(models.Model):
145 _name = "event.sponsor.type"
148 name = fields.Char('Sponsor Type', required=True, translate=True)
149 sequence = fields.Integer('Sequence')
152 class event_sponsors(models.Model):
153 _name = "event.sponsor"
156 event_id = fields.Many2one('event.event', 'Event', required=True)
157 sponsor_type_id = fields.Many2one('event.sponsor.type', 'Sponsoring Type', required=True)
158 partner_id = fields.Many2one('res.partner', 'Sponsor/Customer', required=True)
159 url = fields.Char('Sponsor Website')
160 sequence = fields.Integer('Sequence', store=True, related='sponsor_type_id.sequence')
161 image_medium = fields.Binary(string='Logo', type='binary', related='partner_id.image_medium', store=True)