1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
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.
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.
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/>.
20 ##############################################################################
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
29 class event_track_tag(osv.osv):
30 _name = "event.track.tag"
33 'name': fields.char('Event Track Tag', translate=True)
36 class event_tag(osv.osv):
40 'name': fields.char('Event Tag', translate=True)
47 class event_track_stage(osv.osv):
48 _name = "event.track.stage"
51 'name': fields.char('Track Stage', translate=True),
52 'sequence': fields.integer('Sequence')
59 class event_track_location(osv.osv):
60 _name = "event.track.location"
62 'name': fields.char('Track Rooms')
65 class event_track(osv.osv):
67 _description = 'Event Tracks'
68 _order = 'priority, date'
69 _inherit = ['mail.thread', 'ir.needaction_mixin', 'website.seo.metadata']
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))
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)
94 def set_priority(self, cr, uid, ids, priority, context={}):
95 return self.write(cr, uid, ids, {'priority' : priority})
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
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,
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)
116 'stage_id': _read_group_stage_ids,
119 def open_track_speakers_list(self, cr, uid, track_id, context=None):
120 track_id = self.browse(cr, uid, track_id, context=context)
122 'name':_('Speakers'),
123 'domain': [('id', 'in',[partner.id for partner in track_id.speaker_ids])],
125 'view_mode': 'kanban,form',
126 'res_model': 'res.partner',
128 'type': 'ir.actions.act_window',
134 class event_event(osv.osv):
135 _inherit = "event.event"
137 def _count_tracks(self, cr, uid, ids, field_name, arg, context=None):
139 event.id: len(event.track_ids)
140 for event in self.browse(cr, uid, ids, context=context)
143 def _count_sponsor(self, cr, uid, ids, field_name, arg, context=None):
145 event.id: len(event.sponsor_ids)
146 for event in self.browse(cr, uid, ids, context=context)
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]))
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'),
172 'show_track_proposal': False,
173 'show_tracks': False,
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 ?
181 result.append((_('Talks'), '/event/%s/track' % slug(self)))
182 result.append((_('Agenda'), '/event/%s/agenda' % slug(self)))
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)))
193 class event_sponsors_type(osv.osv):
194 _name = "event.sponsor.type"
197 "name": fields.char('Sponsor Type', required=True, translate=True),
198 "sequence": fields.integer('Sequence')
201 class event_sponsors(osv.osv):
202 _name = "event.sponsor"
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')