From 93f02c0c351c80857eca141b24126743458ec419 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 2 Oct 2014 16:40:50 +0200 Subject: [PATCH] [CLEAN] website_event_track: cleanind / migration to new api of the module - removed event.tag and event.track.stage models - cleaning / linting - fixed kanban view of tracks --- addons/event/event_demo.xml | 3 +- addons/event/security/ir.model.access.csv | 2 +- addons/website_event_track/data/event_data.xml | 18 - addons/website_event_track/data/event_demo.xml | 10 - .../data/website_event_track_demo.xml | 60 +-- addons/website_event_track/models/event.py | 276 ++++++------- .../security/ir.model.access.csv | 4 - addons/website_event_track/views/event_backend.xml | 404 ++++++++------------ addons/website_event_track/views/website_event.xml | 2 + 9 files changed, 316 insertions(+), 463 deletions(-) diff --git a/addons/event/event_demo.xml b/addons/event/event_demo.xml index 1a7ada4..41aeaf2 100644 --- a/addons/event/event_demo.xml +++ b/addons/event/event_demo.xml @@ -5,8 +5,7 @@ - - + Seminar diff --git a/addons/event/security/ir.model.access.csv b/addons/event/security/ir.model.access.csv index b6cdc4c..1d80379 100644 --- a/addons/event/security/ir.model.access.csv +++ b/addons/event/security/ir.model.access.csv @@ -5,4 +5,4 @@ access_event_event,event.event,model_event_event,event.group_event_user,1,1,1,1 access_event_registration,event.registration,model_event_registration,event.group_event_user,1,1,1,1 access_report_event_registration,report.event.registration,model_report_event_registration,event.group_event_user,1,1,1,1 access_event_event_portal,event.event,model_event_event,,1,0,0,0 -access_event_registration_portal,event.registration,model_event_registration,,1,0,0,0 +access_event_registration_portal,event.registration,model_event_registration,,1,0,0,0 \ No newline at end of file diff --git a/addons/website_event_track/data/event_data.xml b/addons/website_event_track/data/event_data.xml index c5df74b..37a370a 100644 --- a/addons/website_event_track/data/event_data.xml +++ b/addons/website_event_track/data/event_data.xml @@ -14,23 +14,5 @@ Gold 1 - - - - Proposals - - - Confirmed - - - Published - - - Announced - - - Completed - - diff --git a/addons/website_event_track/data/event_demo.xml b/addons/website_event_track/data/event_demo.xml index 4df9881..c83d850 100644 --- a/addons/website_event_track/data/event_demo.xml +++ b/addons/website_event_track/data/event_demo.xml @@ -2,16 +2,6 @@ - - Webinar - - - Exhibition - - - Conference - - Technical diff --git a/addons/website_event_track/data/website_event_track_demo.xml b/addons/website_event_track/data/website_event_track_demo.xml index 3279cf8..eddc845 100644 --- a/addons/website_event_track/data/website_event_track_demo.xml +++ b/addons/website_event_track/data/website_event_track_demo.xml @@ -28,7 +28,7 @@ 3 - + draft @@ -39,7 +39,7 @@ - + confirmed How to develop real time apps, the live chat module explained. @@ -49,7 +49,7 @@ - + confirmed How to develop automated tests in the Odoo web client. @@ -59,7 +59,7 @@ - + published The new way to promote your modules in the Apps platform and Odoo website. @@ -69,7 +69,7 @@ - + announced Detailed roadmap of accounting new modules and improvements for version 8. @@ -79,7 +79,7 @@ - + announced A technical explanation of Odoo as a CMS and a eCommerce platform for version 8. @@ -89,7 +89,7 @@ - + published Discover Odoo CRM: How to optimize your sales, from leads to sales orders. @@ -100,7 +100,7 @@ 2 - + published How to use Odoo for your HR process: recruitment, leaves management, appraisals, expenses, etc. @@ -112,7 +112,7 @@ 2 - + published Raising qualitive insights with the survey app @@ -122,7 +122,7 @@ 5 - + draft Discover Odoo Point-of-Sale: Your shop ready to use in 30 minutes. @@ -132,7 +132,7 @@ - + confirmed Manage your events with Odoo, the new training modules. @@ -142,7 +142,7 @@ - + announced Advanced reporting with Google Spreadsheets integration. @@ -152,7 +152,7 @@ - + published New Paypal modules (portal, handling, installments). @@ -162,7 +162,7 @@ - + published Odoo Mobile for Notes, Meetings and Messages. @@ -172,7 +172,7 @@ - + announced Odoo as your Enterprise Social Network. @@ -182,7 +182,7 @@ - + draft The Art of Making an Odoo Demo. @@ -192,7 +192,7 @@ - + draft How to build your marketing strategy for the purpose of generating leads with Odoo. @@ -203,7 +203,7 @@ 5 - + confirmed Advanced lead management with Odoo: tips and tricks from the fields @@ -214,7 +214,7 @@ 5 - + confirmed New Certification Program (valid from Oct. 2013). @@ -224,7 +224,7 @@ - + confirmed Recruiting high skilled talents with Odoo HR apps @@ -234,7 +234,7 @@ 7 - + confirmed Manage your KPIs (recomended to openERP partners). @@ -244,7 +244,7 @@ - + draft Key Success factors selling Odoo. @@ -254,7 +254,7 @@ - + announced Merge proposals review, code sprint (entire day). @@ -264,7 +264,7 @@ - + announced Merge proposals review, code sprint (entire afternoon) @@ -274,7 +274,7 @@ - + announced Odoo in 2014 @@ -283,7 +283,7 @@ - + published 3 @@ -293,7 +293,7 @@ - + published The new marketing strategy. @@ -302,7 +302,7 @@ - + published 6 @@ -311,7 +311,7 @@ - + confirmed Lunch @@ -319,7 +319,7 @@ - + confirmed diff --git a/addons/website_event_track/models/event.py b/addons/website_event_track/models/event.py index 0d67353..ee257eb 100644 --- a/addons/website_event_track/models/event.py +++ b/addons/website_event_track/models/event.py @@ -1,178 +1,132 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from openerp import api -from openerp.osv import fields, osv + +from openerp import models, fields, api from openerp.tools.translate import _ from openerp.addons.website.models.website import slug -import pytz -class event_track_tag(osv.osv): +class event_track_tag(models.Model): _name = "event.track.tag" + _description = 'Track Tag' _order = 'name' - _columns = { - 'name': fields.char('Event Track Tag', translate=True) - } -class event_tag(osv.osv): - _name = "event.tag" - _order = 'name' - _columns = { - 'name': fields.char('Event Tag', translate=True) - } - -# -# Tracks: conferences -# - -class event_track_stage(osv.osv): - _name = "event.track.stage" - _order = 'sequence' - _columns = { - 'name': fields.char('Track Stage', translate=True), - 'sequence': fields.integer('Sequence') - } - _defaults = { - 'sequence': 0 - } - - -class event_track_location(osv.osv): + name = fields.Char('Tag', translate=True) + track_ids = fields.Many2many('event.track', string='Tracks') + + +class event_track_location(models.Model): _name = "event.track.location" - _columns = { - 'name': fields.char('Track Rooms') - } + _description = 'Track Location' + + name = fields.Char('Room') -class event_track(osv.osv): + +class event_track(models.Model): _name = "event.track" _description = 'Event Tracks' _order = 'priority, date' _inherit = ['mail.thread', 'ir.needaction_mixin', 'website.seo.metadata'] - def _website_url(self, cr, uid, ids, field_name, arg, context=None): - res = dict.fromkeys(ids, '') - for track in self.browse(cr, uid, ids, context=context): - res[track.id] = "/event/%s/track/%s" % (slug(track.event_id), slug(track)) - return res - - _columns = { - 'name': fields.char('Track Title', required=True, translate=True), - 'user_id': fields.many2one('res.users', 'Responsible'), - 'speaker_ids': fields.many2many('res.partner', string='Speakers'), - 'tag_ids': fields.many2many('event.track.tag', string='Tags'), - 'stage_id': fields.many2one('event.track.stage', 'Stage'), - 'description': fields.html('Track Description', translate=True), - 'date': fields.datetime('Track Date'), - 'duration': fields.float('Duration', digits=(16,2)), - 'location_id': fields.many2one('event.track.location', 'Location'), - 'event_id': fields.many2one('event.event', 'Event', required=True), - 'color': fields.integer('Color Index'), - 'priority': fields.selection([('3','Low'),('2','Medium (*)'),('1','High (**)'),('0','Highest (***)')], 'Priority', required=True), - 'website_published': fields.boolean('Available in the website', copy=False), - 'website_url': fields.function(_website_url, string="Website url", type="char"), - 'image': fields.related('speaker_ids', 'image', type='binary', readonly=True) - } - def set_priority(self, cr, uid, ids, priority, context={}): - return self.write(cr, uid, ids, {'priority' : priority}) - - def _default_stage_id(self, cr, uid, context={}): - stage_obj = self.pool.get('event.track.stage') - ids = stage_obj.search(cr, uid, [], context=context) - return ids and ids[0] or False - - _defaults = { - 'user_id': lambda self, cr, uid, ctx: uid, - 'website_published': lambda self, cr, uid, ctx: False, - 'duration': lambda *args: 1.5, - 'stage_id': _default_stage_id, - 'priority': '2' - } - - def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, access_rights_uid=None, context=None): - stage_obj = self.pool.get('event.track.stage') - result = stage_obj.name_search(cr, uid, '', context=context) - return result, {} - - _group_by_full = { - 'stage_id': _read_group_stage_ids, - } + @api.one + def _compute_website_url(self): + self.website_url = "/event/%s/track/%s" % (slug(self.event_id), slug(self)) + + name = fields.Char('Title', required=True, translate=True) + + user_id = fields.Many2one('res.users', 'Responsible', default=lambda self: self.env.user) + speaker_ids = fields.Many2many('res.partner', string='Speakers') + tag_ids = fields.Many2many('event.track.tag', string='Tags') + state = fields.Selection([ + ('draft', 'Proposal'), ('confirmed', 'Confirmed'), ('announced', 'Announced'), ('published', 'Published')], + 'Status', default='draft', required=True, copy=False, track_visibility='onchange') + description = fields.Html('Track Description', translate=True) + date = fields.Datetime('Track Date') + duration = fields.Float('Duration', digits=(16, 2), default=1.5) + location_id = fields.Many2one('event.track.location', 'Location') + event_id = fields.Many2one('event.event', 'Event', required=True) + color = fields.Integer('Color Index') + priority = fields.Selection([ + ('0', 'Low'), ('1', 'Medium'), + ('2', 'High'), ('3', 'Highest')], + 'Priority', required=True, default='1') + website_published = fields.Boolean('Available in the website', copy=False) + website_url = fields.Char("Website url", compute='_compute_website_url') + image = fields.Binary('Image', compute='_compute_image', readonly=True, store=True) + + @api.one + @api.depends('speaker_ids.image') + def _compute_image(self): + if self.speaker_ids: + self.image = self.speaker_ids[0].image + else: + self.image = False + + def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False, lazy=True): + """ Override read_group to always display all states. """ + if groupby and groupby[0] == "state": + # Default result structure + # states = self._get_state_list(cr, uid, context=context) + states = [('draft', 'Proposal'), ('confirmed', 'Confirmed'), ('announced', 'Announced'), ('published', 'Published')] + 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(event_track, self).read_group(cr, uid, domain, fields, groupby, offset=offset, limit=limit, context=context, 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) + res[0]['state'] = [state_value, state_name] + result.append(res[0]) + return result + else: + return super(event_track, self).read_group(cr, uid, domain, fields, groupby, offset=offset, limit=limit, context=context, orderby=orderby) def open_track_speakers_list(self, cr, uid, track_id, context=None): track_id = self.browse(cr, uid, track_id, context=context) return { - 'name':_('Speakers'), - 'domain': [('id', 'in',[partner.id for partner in track_id.speaker_ids])], + 'name': _('Speakers'), + 'domain': [('id', 'in', [partner.id for partner in track_id.speaker_ids])], 'view_type': 'form', 'view_mode': 'kanban,form', 'res_model': 'res.partner', - 'view_id':False, + 'view_id': False, 'type': 'ir.actions.act_window', } -# -# Events -# -class event_event(osv.osv): + +class event_event(models.Model): _inherit = "event.event" - def _count_tracks(self, cr, uid, ids, field_name, arg, context=None): - return { - event.id: len(event.track_ids) - for event in self.browse(cr, uid, ids, context=context) - } + @api.one + def _count_tracks(self): + self.count_tracks = len(self.track_ids) - def _count_sponsor(self, cr, uid, ids, field_name, arg, context=None): - return { - event.id: len(event.sponsor_ids) - for event in self.browse(cr, uid, ids, context=context) - } + @api.one + def _count_sponsor(self): + self.count_sponsor = len(self.sponsor_ids) - def _get_tracks_tag_ids(self, cr, uid, ids, field_names, arg=None, context=None): - res = dict((res_id, []) for res_id in ids) - for event in self.browse(cr, uid, ids, context=context): - for track in event.track_ids: - res[event.id] += [tag.id for tag in track.tag_ids] - res[event.id] = list(set(res[event.id])) - return res - - _columns = { - 'tag_ids': fields.many2many('event.tag', string='Tags'), - 'track_ids': fields.one2many('event.track', 'event_id', 'Tracks', copy=True), - 'sponsor_ids': fields.one2many('event.sponsor', 'event_id', 'Sponsorships', copy=True), - 'blog_id': fields.many2one('blog.blog', 'Event Blog'), - 'show_track_proposal': fields.boolean('Talks Proposals'), - 'show_tracks': fields.boolean('Multiple Tracks'), - 'show_blog': fields.boolean('News'), - 'count_tracks': fields.function(_count_tracks, type='integer', string='Tracks'), - 'tracks_tag_ids': fields.function(_get_tracks_tag_ids, type='one2many', relation='event.track.tag', string='Tags of Tracks'), - 'allowed_track_tag_ids': fields.many2many('event.track.tag', string='Accepted Tags', help="List of available tags for track proposals."), - 'count_sponsor': fields.function(_count_sponsor, type='integer', string='Sponsors'), - } - - _defaults = { - 'show_track_proposal': False, - 'show_tracks': False, - 'show_blog': False, - } + @api.one + @api.depends('track_ids.tag_ids') + def _get_tracks_tag_ids(self): + track_tags = set(tag for track in self.track_ids for tag in track.tag_ids) + self.tracks_tag_ids = track_tags and list(track_tags) or False + + track_ids = fields.One2many('event.track', 'event_id', 'Tracks', copy=True) + sponsor_ids = fields.One2many('event.sponsor', 'event_id', 'Sponsorships', copy=True) + blog_id = fields.Many2one('blog.blog', 'Event Blog') + show_track_proposal = fields.Boolean('Talks Proposals') + show_tracks = fields.Boolean('Multiple Tracks') + show_blog = fields.Boolean('News') + count_tracks = fields.Integer('# Tracks', compute='_count_tracks') + 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') @api.one def _get_new_menu_pages(self): @@ -186,26 +140,22 @@ class event_event(osv.osv): result.append((_('Talk Proposals'), '/event/%s/track_proposal' % slug(self))) return result -# -# Sponsors -# -class event_sponsors_type(osv.osv): +class event_sponsors_type(models.Model): _name = "event.sponsor.type" _order = "sequence" - _columns = { - "name": fields.char('Sponsor Type', required=True, translate=True), - "sequence": fields.integer('Sequence') - } -class event_sponsors(osv.osv): + name = fields.Char('Sponsor Type', required=True, translate=True) + sequence = fields.Integer('Sequence') + + +class event_sponsors(models.Model): _name = "event.sponsor" _order = "sequence" - _columns = { - 'event_id': fields.many2one('event.event', 'Event', required=True), - 'sponsor_type_id': fields.many2one('event.sponsor.type', 'Sponsoring Type', required=True), - 'partner_id': fields.many2one('res.partner', 'Sponsor/Customer', required=True), - 'url': fields.text('Sponsor Website'), - 'sequence': fields.related('sponsor_type_id', 'sequence', string='Sequence', store=True), - 'image_medium': fields.related('partner_id', 'image_medium', string='Logo', type='binary') - } + + event_id = fields.Many2one('event.event', 'Event', required=True) + sponsor_type_id = fields.Many2one('event.sponsor.type', 'Sponsoring Type', required=True) + partner_id = fields.Many2one('res.partner', 'Sponsor/Customer', required=True) + url = fields.Char('Sponsor Website') + sequence = fields.Integer('Sequence', store=True, related='sponsor_type_id.sequence') + image_medium = fields.Binary(string='Logo', type='binary', related='partner_id.image_medium', store=True) diff --git a/addons/website_event_track/security/ir.model.access.csv b/addons/website_event_track/security/ir.model.access.csv index 0f5a530..88b9061 100644 --- a/addons/website_event_track/security/ir.model.access.csv +++ b/addons/website_event_track/security/ir.model.access.csv @@ -1,10 +1,6 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_event_location_manager,event.track.location manager,model_event_track_location,event.group_event_manager,1,1,1,1 access_event_track_manager,event.track manager,model_event_track,event.group_event_manager,1,1,1,1 -access_event_tag_public,event.tag public,model_event_tag,,1,0,0,0 -access_event_tag_manager,event.tag manager,model_event_tag,event.group_event_manager,1,1,1,1 -access_event_track_stage_public,event.track.stage public,model_event_track_stage,,1,0,0,0 -access_event_track_stage_manager,event.track.stage manager,model_event_track_stage,event.group_event_manager,1,1,1,1 access_event_track_tag_public,event.track.tag public,model_event_track_tag,,1,0,0,0 access_event_track_tag_manager,event.track.tag manager,model_event_track_tag,event.group_event_manager,1,1,1,1 access_event_track_location_public,event.track.location public,model_event_track_location,,1,0,0,0 diff --git a/addons/website_event_track/views/event_backend.xml b/addons/website_event_track/views/event_backend.xml index 5009198..34f1e2b 100644 --- a/addons/website_event_track/views/event_backend.xml +++ b/addons/website_event_track/views/event_backend.xml @@ -2,22 +2,181 @@ - + + + event.track.kanban + event.track + + + + + + +
+
+ í +
+
+

+ +
+ hours +
+
+ +
+ +
+
+
+ + + + + + + + event.track.calendar + event.track + + + + + + + + + + + event.track.search + event.track + + + + + + + + + + + + + + + + + + event.track.form + event.track + +
+
+ +
+ +
+ + +
+
+
+ + + + + + + + + + +
+
+ + +
+
+
+
+ + + event.track.tree + event.track + + + + + + + + + + event.track.graph + event.track + + + + + + + + + + Event Tracks + event.track + kanban,tree,form,calendar,graph + +

+Click to add a track. +

+ Tracks define the agenda of your event. These can bea talk, a round table, a meeting, etc. +

+
+ + event.track Event Tracks form kanban,tree,form,calendar,graph - {'search_default_event_id': active_id, 'default_event_id': active_id, 'group_by': 'stage_id'} + {'search_default_event_id': active_id, 'default_event_id': active_id, 'group_by': 'state'} -

- Click to add a track. -

- Tracks define the agenda of your event. These can be - a talk, a round table, a meeting, etc. -

-
+

+Click to add a track. +

+Tracks define the agenda of your event. These can be a talk, a round table, a meeting, etc. +

+ + Event Locations @@ -49,34 +208,6 @@ action="action_event_track_location" parent="event.event_configuration" groups="base.group_no_one"/> - - - Event Stages - event.track.stage - -
- - -
-
- - Event Stage - event.track.stage - - - - - - - - - Event Stages - event.track.stage - - - Sponsor Types @@ -160,41 +291,14 @@ - - - - Event Tags - event.tag - -
- - -
-
- - Event Tag - event.tag - - - - - - - - Event Tags - event.tag - - - - Event Tracks event.event - -