[CLEAN] website_event: migrate models to the new API + some code cleaning.
[odoo/odoo.git] / addons / website_event_track / models / event.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
6 #
7 #    This program is free software: you can redistribute it and/or modify
8 #    it under the terms of the GNU Affero General Public License as
9 #    published by the Free Software Foundation, either version 3 of the
10 #    License, or (at your option) any later version.
11 #
12 #    This program is distributed in the hope that it will be useful,
13 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #    GNU Affero General Public License for more details.
16 #
17 #    You should have received a copy of the GNU Affero General Public License
18 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##############################################################################
21
22 from openerp import api
23 from openerp.osv import fields, osv
24 from openerp.tools.translate import _
25 from openerp.addons.website.models.website import slug
26
27 import pytz
28
29 class event_track_tag(osv.osv):
30     _name = "event.track.tag"
31     _order = 'name'
32     _columns = {
33         'name': fields.char('Event Track Tag', translate=True)
34     }
35
36 class event_tag(osv.osv):
37     _name = "event.tag"
38     _order = 'name'
39     _columns = {
40         'name': fields.char('Event Tag', translate=True)
41     }
42
43 #
44 # Tracks: conferences
45 #
46
47 class event_track_stage(osv.osv):
48     _name = "event.track.stage"
49     _order = 'sequence'
50     _columns = {
51         'name': fields.char('Track Stage', translate=True),
52         'sequence': fields.integer('Sequence')
53     }
54     _defaults = {
55         'sequence': 0
56     }
57
58
59 class event_track_location(osv.osv):
60     _name = "event.track.location"
61     _columns = {
62         'name': fields.char('Track Rooms')
63     }
64
65 class event_track(osv.osv):
66     _name = "event.track"
67     _description = 'Event Tracks'
68     _order = 'priority, date'
69     _inherit = ['mail.thread', 'ir.needaction_mixin', 'website.seo.metadata']
70
71     def _website_url(self, cr, uid, ids, field_name, arg, context=None):
72         res = dict.fromkeys(ids, '')
73         for track in self.browse(cr, uid, ids, context=context):
74             res[track.id] = "/event/%s/track/%s" % (slug(track.event_id), slug(track))
75         return res
76
77     _columns = {
78         'name': fields.char('Track Title', required=True, translate=True),
79         'user_id': fields.many2one('res.users', 'Responsible'),
80         'speaker_ids': fields.many2many('res.partner', string='Speakers'),
81         'tag_ids': fields.many2many('event.track.tag', string='Tags'),
82         'stage_id': fields.many2one('event.track.stage', 'Stage'),
83         'description': fields.html('Track Description', translate=True),
84         'date': fields.datetime('Track Date'),
85         'duration': fields.float('Duration', digits=(16,2)),
86         'location_id': fields.many2one('event.track.location', 'Location'),
87         'event_id': fields.many2one('event.event', 'Event', required=True),
88         'color': fields.integer('Color Index'),
89         'priority': fields.selection([('3','Low'),('2','Medium (*)'),('1','High (**)'),('0','Highest (***)')], 'Priority', required=True),
90         'website_published': fields.boolean('Available in the website', copy=False),
91         'website_url': fields.function(_website_url, string="Website url", type="char"),
92         'image': fields.related('speaker_ids', 'image', type='binary', readonly=True)
93     }
94     def set_priority(self, cr, uid, ids, priority, context={}):
95         return self.write(cr, uid, ids, {'priority' : priority})
96
97     def _default_stage_id(self, cr, uid, context={}):
98         stage_obj = self.pool.get('event.track.stage')
99         ids = stage_obj.search(cr, uid, [], context=context)
100         return ids and ids[0] or False
101
102     _defaults = {
103         'user_id': lambda self, cr, uid, ctx: uid,
104         'website_published': lambda self, cr, uid, ctx: False,
105         'duration': lambda *args: 1.5,
106         'stage_id': _default_stage_id,
107         'priority': '2'
108     }
109
110     def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, access_rights_uid=None, context=None):
111         stage_obj = self.pool.get('event.track.stage')
112         result = stage_obj.name_search(cr, uid, '', context=context)
113         return result, {}
114
115     _group_by_full = {
116         'stage_id': _read_group_stage_ids,
117     }
118
119     def open_track_speakers_list(self, cr, uid, track_id, context=None):
120         track_id = self.browse(cr, uid, track_id, context=context)
121         return {
122             'name':_('Speakers'),
123             'domain': [('id', 'in',[partner.id for partner in track_id.speaker_ids])],
124             'view_type': 'form',
125             'view_mode': 'kanban,form',
126             'res_model': 'res.partner',
127             'view_id':False,
128             'type': 'ir.actions.act_window',
129         }
130
131 #
132 # Events
133 #
134 class event_event(osv.osv):
135     _inherit = "event.event"
136
137     def _count_tracks(self, cr, uid, ids, field_name, arg, context=None):
138         return {
139             event.id: len(event.track_ids)
140             for event in self.browse(cr, uid, ids, context=context)
141         }
142
143     def _count_sponsor(self, cr, uid, ids, field_name, arg, context=None):
144         return {
145             event.id: len(event.sponsor_ids)
146             for event in self.browse(cr, uid, ids, context=context)
147         }
148
149     def _get_tracks_tag_ids(self, cr, uid, ids, field_names, arg=None, context=None):
150         res = dict((res_id, []) for res_id in ids)
151         for event in self.browse(cr, uid, ids, context=context):
152             for track in event.track_ids:
153                 res[event.id] += [tag.id for tag in track.tag_ids]
154             res[event.id] = list(set(res[event.id]))
155         return res
156
157     _columns = {
158         'tag_ids': fields.many2many('event.tag', string='Tags'),
159         'track_ids': fields.one2many('event.track', 'event_id', 'Tracks', copy=True),
160         'sponsor_ids': fields.one2many('event.sponsor', 'event_id', 'Sponsorships', copy=True),
161         'blog_id': fields.many2one('blog.blog', 'Event Blog'),
162         'show_track_proposal': fields.boolean('Talks Proposals'),
163         'show_tracks': fields.boolean('Multiple Tracks'),
164         'show_blog': fields.boolean('News'),
165         'count_tracks': fields.function(_count_tracks, type='integer', string='Tracks'),
166         'tracks_tag_ids': fields.function(_get_tracks_tag_ids, type='one2many', relation='event.track.tag', string='Tags of Tracks'),
167         'allowed_track_tag_ids': fields.many2many('event.track.tag', string='Accepted Tags', help="List of available tags for track proposals."),
168         'count_sponsor': fields.function(_count_sponsor, type='integer', string='Sponsors'),
169     }
170
171     _defaults = {
172         'show_track_proposal': False,
173         'show_tracks': False,
174         'show_blog': False,
175     }
176
177     @api.one
178     def _get_new_menu_pages(self):
179         result = super(event_event, self)._get_new_menu_pages()[0]  # TDE CHECK api.one -> returns a list with one item ?
180         if self.show_tracks:
181             result.append((_('Talks'), '/event/%s/track' % slug(self)))
182             result.append((_('Agenda'), '/event/%s/agenda' % slug(self)))
183         if self.blog_id:
184             result.append((_('News'), '/blogpost'+slug(self.blog_ig)))
185         if self.show_track_proposal:
186             result.append((_('Talk Proposals'), '/event/%s/track_proposal' % slug(self)))
187         return result
188
189 #
190 # Sponsors
191 #
192
193 class event_sponsors_type(osv.osv):
194     _name = "event.sponsor.type"
195     _order = "sequence"
196     _columns = {
197         "name": fields.char('Sponsor Type', required=True, translate=True),
198         "sequence": fields.integer('Sequence')
199     }
200
201 class event_sponsors(osv.osv):
202     _name = "event.sponsor"
203     _order = "sequence"
204     _columns = {
205         'event_id': fields.many2one('event.event', 'Event', required=True),
206         'sponsor_type_id': fields.many2one('event.sponsor.type', 'Sponsoring Type', required=True),
207         'partner_id': fields.many2one('res.partner', 'Sponsor/Customer', required=True),
208         'url': fields.text('Sponsor Website'),
209         'sequence': fields.related('sponsor_type_id', 'sequence', string='Sequence', store=True),
210         'image_medium': fields.related('partner_id', 'image_medium', string='Logo', type='binary')
211     }