[CLEAN] website_event_track: cleanind / migration to new api of the module
[odoo/odoo.git] / addons / website_event_track / models / event.py
1 # -*- coding: utf-8 -*-
2
3 from openerp import models, fields, api
4 from openerp.tools.translate import _
5 from openerp.addons.website.models.website import slug
6
7
8 class event_track_tag(models.Model):
9     _name = "event.track.tag"
10     _description = 'Track Tag'
11     _order = 'name'
12
13     name = fields.Char('Tag', translate=True)
14     track_ids = fields.Many2many('event.track', string='Tracks')
15
16
17 class event_track_location(models.Model):
18     _name = "event.track.location"
19     _description = 'Track Location'
20
21     name = fields.Char('Room')
22
23
24 class event_track(models.Model):
25     _name = "event.track"
26     _description = 'Event Tracks'
27     _order = 'priority, date'
28     _inherit = ['mail.thread', 'ir.needaction_mixin', 'website.seo.metadata']
29
30     @api.one
31     def _compute_website_url(self):
32         self.website_url = "/event/%s/track/%s" % (slug(self.event_id), slug(self))
33
34     name = fields.Char('Title', required=True, translate=True)
35
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)
55
56     @api.one
57     @api.depends('speaker_ids.image')
58     def _compute_image(self):
59         if self.speaker_ids:
60             self.image = self.speaker_ids[0].image
61         else:
62             self.image = False
63
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)],
73                 'state': state_value,
74                 'state_count': 0,
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
79             result = []
80             for state_value, state_name in states:
81                 res = filter(lambda x: x['state'] == state_value, read_group_res)
82                 if not res:
83                     res = filter(lambda x: x['state'] == state_value, read_group_all_states)
84                 res[0]['state'] = [state_value, state_name]
85                 result.append(res[0])
86             return result
87         else:
88             return super(event_track, self).read_group(cr, uid, domain, fields, groupby, offset=offset, limit=limit, context=context, orderby=orderby)
89
90     def open_track_speakers_list(self, cr, uid, track_id, context=None):
91         track_id = self.browse(cr, uid, track_id, context=context)
92         return {
93             'name': _('Speakers'),
94             'domain': [('id', 'in', [partner.id for partner in track_id.speaker_ids])],
95             'view_type': 'form',
96             'view_mode': 'kanban,form',
97             'res_model': 'res.partner',
98             'view_id': False,
99             'type': 'ir.actions.act_window',
100         }
101
102
103 class event_event(models.Model):
104     _inherit = "event.event"
105
106     @api.one
107     def _count_tracks(self):
108         self.count_tracks = len(self.track_ids)
109
110     @api.one
111     def _count_sponsor(self):
112         self.count_sponsor = len(self.sponsor_ids)
113
114     @api.one
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
119
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')
130
131     @api.one
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 ?
134         if self.show_tracks:
135             result.append((_('Talks'), '/event/%s/track' % slug(self)))
136             result.append((_('Agenda'), '/event/%s/agenda' % slug(self)))
137         if self.blog_id:
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)))
141         return result
142
143
144 class event_sponsors_type(models.Model):
145     _name = "event.sponsor.type"
146     _order = "sequence"
147
148     name = fields.Char('Sponsor Type', required=True, translate=True)
149     sequence = fields.Integer('Sequence')
150
151
152 class event_sponsors(models.Model):
153     _name = "event.sponsor"
154     _order = "sequence"
155
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)