[CLEAN] website_event_track: cleanind / migration to new api of the module
authorThibault Delavallée <tde@openerp.com>
Thu, 2 Oct 2014 14:40:50 +0000 (16:40 +0200)
committerThibault Delavallée <tde@openerp.com>
Mon, 6 Oct 2014 13:28:17 +0000 (15:28 +0200)
- removed event.tag and event.track.stage models
- cleaning / linting
- fixed kanban view of tracks

addons/event/event_demo.xml
addons/event/security/ir.model.access.csv
addons/website_event_track/data/event_data.xml
addons/website_event_track/data/event_demo.xml
addons/website_event_track/data/website_event_track_demo.xml
addons/website_event_track/models/event.py
addons/website_event_track/security/ir.model.access.csv
addons/website_event_track/views/event_backend.xml
addons/website_event_track/views/website_event.xml

index 1a7ada4..41aeaf2 100644 (file)
@@ -5,8 +5,7 @@
              <field name="groups_id" eval="[(4, ref('event.group_event_user'))]"/>
      </record>
 
-
-<!-- Demo Data for Event Type -->
+    <!-- Demo Data for Event Type -->
     <record id="event_type_0" model="event.type">
         <field name="name">Seminar</field>
     </record>
index b6cdc4c..1d80379 100644 (file)
@@ -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\r
 access_report_event_registration,report.event.registration,model_report_event_registration,event.group_event_user,1,1,1,1\r
 access_event_event_portal,event.event,model_event_event,,1,0,0,0\r
-access_event_registration_portal,event.registration,model_event_registration,,1,0,0,0\r
+access_event_registration_portal,event.registration,model_event_registration,,1,0,0,0
\ No newline at end of file
index c5df74b..37a370a 100644 (file)
             <field name="name">Gold</field>
             <field name="sequence">1</field>
         </record>
-
-
-        <record id="event_track_stage1" model="event.track.stage">
-            <field name="name">Proposals</field>
-        </record>
-        <record id="event_track_stage2" model="event.track.stage">
-            <field name="name">Confirmed</field>
-        </record>
-        <record id="event_track_stage3" model="event.track.stage">
-            <field name="name">Published</field>
-        </record>
-        <record id="event_track_stage4" model="event.track.stage">
-            <field name="name">Announced</field>
-        </record>
-        <record id="event_track_stage5" model="event.track.stage">
-            <field name="name">Completed</field>
-        </record>
-
     </data>
 </openerp>
index 4df9881..c83d850 100644 (file)
@@ -2,16 +2,6 @@
 <openerp>
     <data>
 
-        <record id="event_tag1" model="event.track.tag">
-            <field name="name">Webinar</field>
-        </record>
-        <record id="event_tag2" model="event.track.tag">
-            <field name="name">Exhibition</field>
-        </record>
-        <record id="event_tag3" model="event.track.tag">
-            <field name="name">Conference</field>
-        </record>
-
         <record id="event_track_tag1" model="event.track.tag">
             <field name="name">Technical</field>
         </record>
index 3279cf8..eddc845 100644 (file)
@@ -28,7 +28,7 @@
         <field name="duration" eval="1"/>
         <field eval="[(4, ref('base.res_partner_2')),(4, ref('base.res_partner_3'))]" name="speaker_ids"/>
         <field name="color">3</field>
-        <field name="stage_id" ref="event_track_stage1"/>
+        <field name="state">draft</field>
         
     </record>
     <record id="event_track2" model="event.track">
@@ -39,7 +39,7 @@
         <field name="location_id" ref="website_event_track.event_track_location5"/>
         <field name="duration" eval="0.25"/>
         <field eval="[(4, ref('base.res_partner_3'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">confirmed</field>
     </record>
     <record id="event_track3" model="event.track">
         <field name="name">How to develop real time apps, the live chat module explained.</field>
@@ -49,7 +49,7 @@
         <field name="location_id" ref="website_event_track.event_track_location5"/>
         <field name="duration" eval="0.3"/>
         <field eval="[(4, ref('base.res_partner_4'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage3"/>
+        <field name="state">confirmed</field>
     </record>
     <record id="event_track4" model="event.track">
         <field name="name">How to develop automated tests in the Odoo web client.</field>
@@ -59,7 +59,7 @@
         <field name="location_id" ref="website_event_track.event_track_location5"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_2'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage4"/>
+        <field name="state">published</field>
     </record>
     <record id="event_track5" model="event.track">
         <field name="name">The new way to promote your modules in the Apps platform and Odoo website.</field>
@@ -69,7 +69,7 @@
         <field name="location_id" ref="website_event_track.event_track_location6"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_4'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage5"/>
+        <field name="state">announced</field>
     </record>
     <record id="event_track6" model="event.track">
         <field name="name">Detailed roadmap of accounting new modules and improvements for version 8.</field>
@@ -79,7 +79,7 @@
         <field name="location_id" ref="website_event_track.event_track_location6"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_5'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">announced</field>
     </record>
     <record id="event_track7" model="event.track">
         <field name="name">A technical explanation of Odoo as a CMS and a eCommerce platform for version 8.</field>
@@ -89,7 +89,7 @@
         <field name="location_id" ref="website_event_track.event_track_location6"/>
         <field name="duration" eval="1"/>
         <field eval="[(4, ref('base.res_partner_6'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage4"/>
+        <field name="state">published</field>
     </record>
     <record id="event_track8" model="event.track">
         <field name="name">Discover Odoo CRM: How to optimize your sales, from leads to sales orders.</field>
         <field name="duration" eval="0.5"/>
         <field name="color">2</field>
         <field eval="[(4, ref('base.res_partner_7'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage3"/>
+        <field name="state">published</field>
     </record>
     <record id="event_track9" model="event.track">
         <field name="name">How to use Odoo for your HR process: recruitment, leaves management, appraisals, expenses, etc.</field>
         <field name="duration" eval="1"/>
         <field name="color">2</field>
         <field eval="[(4, ref('base.res_partner_8'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">published</field>
     </record>
     <record id="event_track10" model="event.track">
         <field name="name">Raising qualitive insights with the survey app</field>
         <field name="location_id" ref="website_event_track.event_track_location7"/>
         <field name="duration" eval="0.5"/>
         <field name="color">5</field>
-        <field name="stage_id" ref="event_track_stage1"/>
+        <field name="state">draft</field>
     </record>
     <record id="event_track11" model="event.track">
         <field name="name">Discover Odoo Point-of-Sale: Your shop ready to use in 30 minutes.</field>
         <field name="location_id" ref="website_event_track.event_track_location7"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_4'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">confirmed</field>
     </record>
     <record id="event_track12" model="event.track">
         <field name="name">Manage your events with Odoo, the new training modules.</field>
         <field name="location_id" ref="website_event_track.event_track_location7"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_2')),(4, ref('base.res_partner_8'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage3"/>
+        <field name="state">announced</field>
     </record>
     <record id="event_track13" model="event.track">
         <field name="name">Advanced reporting with Google Spreadsheets integration.</field>
         <field name="location_id" ref="website_event_track.event_track_location8"/>
         <field name="duration" eval="0.25"/>
         <field eval="[(4, ref('base.res_partner_9'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage5"/>
+        <field name="state">published</field>
     </record>
     <record id="event_track14" model="event.track">
         <field name="name">New Paypal modules (portal, handling, installments).</field>
         <field name="location_id" ref="website_event_track.event_track_location8"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_10'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage5"/>
+        <field name="state">published</field>
     </record>
     <record id="event_track15" model="event.track">
         <field name="name">Odoo Mobile for Notes, Meetings and Messages.</field>
         <field name="location_id" ref="website_event_track.event_track_location8"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_11'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage4"/>
+        <field name="state">announced</field>
     </record>
     <record id="event_track16" model="event.track">
         <field name="name">Odoo as your Enterprise Social Network.</field>
         <field name="location_id" ref="website_event_track.event_track_location8"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_12'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage3"/>
+        <field name="state">draft</field>
     </record>
     <record id="event_track17" model="event.track">
         <field name="name">The Art of Making an Odoo Demo.</field>
         <field name="location_id" ref="website_event_track.event_track_location9"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_10'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">draft</field>
     </record>
     <record id="event_track18" model="event.track">
         <field name="name">How to build your marketing strategy for the purpose of generating leads with Odoo.</field>
         <field name="duration" eval="0.5"/>
         <field name="color">5</field>
         <field eval="[(4, ref('base.res_partner_13'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage4"/>
+        <field name="state">confirmed</field>
     </record>
     <record id="event_track19" model="event.track">
         <field name="name">Advanced lead management with Odoo: tips and tricks from the fields</field>
         <field name="duration" eval="0.5"/>
         <field name="color">5</field>
         <field eval="[(4, ref('base.res_partner_14'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage1"/>
+        <field name="state">confirmed</field>
     </record>
     <record id="event_track20" model="event.track">
         <field name="name">New Certification Program (valid from Oct. 2013).</field>
         <field name="location_id" ref="website_event_track.event_track_location9"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_15'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">confirmed</field>
     </record>
     <record id="event_track21" model="event.track">
         <field name="name">Recruiting high skilled talents with Odoo HR apps</field>
         <field name="location_id" ref="website_event_track.event_track_location9"/>
         <field name="duration" eval="0.5"/>
         <field name="color">7</field>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">confirmed</field>
     </record>
     <record id="event_track22" model="event.track">
         <field name="name">Manage your KPIs (recomended to openERP partners).</field>
         <field name="location_id" ref="website_event_track.event_track_location9"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_15'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage1"/>
+        <field name="state">draft</field>
     </record>
     <record id="event_track23" model="event.track">
         <field name="name">Key Success factors selling Odoo.</field>
         <field name="location_id" ref="website_event_track.event_track_location9"/>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_16'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage3"/>
+        <field name="state">announced</field>
     </record>
     <record id="event_track24" model="event.track">
         <field name="name">Merge proposals review, code sprint (entire day).</field>
         <field name="location_id" ref="website_event_track.event_track_location10"/>
         <field name="duration" eval="1.5"/>
         <field eval="[(4, ref('base.res_partner_17')),(4, ref('base.res_partner_18'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">announced</field>
     </record>
     <record id="event_track25" model="event.track">
         <field name="name">Merge proposals review, code sprint (entire afternoon)</field>
         <field name="location_id" ref="website_event_track.event_track_location10"/>
         <field name="duration" eval="2.5"/>
         <field eval="[(4, ref('base.res_partner_17')),(4, ref('base.res_partner_18'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage4"/>
+        <field name="state">announced</field>
     </record>
     <record id="event_track27" model="event.track">
         <field name="name">Odoo in 2014</field>
         <field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 04:00:00')"></field>
         <field name="duration" eval="1"/>
         <field eval="[(4, ref('base.res_partner_1'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">published</field>
         <field name="color">3</field>
     </record>
     <record id="event_track28" model="event.track">
         <field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 5:00:00')"></field>
         <field name="duration" eval="0.5"/>
         <field eval="[(4, ref('base.res_partner_2'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage4"/>
+        <field name="state">published</field>
     </record>
     <record id="event_track29" model="event.track">
         <field name="name">The new marketing strategy.</field>
         <field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 5:30:00')"></field>
         <field name="duration" eval="0.25"/>
         <field eval="[(4, ref('base.res_partner_19'))]" name="speaker_ids"/>
-        <field name="stage_id" ref="event_track_stage1"/>
+        <field name="state">published</field>
         <field name="color">6</field>
     </record>
     <record id="event_track30" model="event.track">
         <field name="event_id" ref="event.event_0"/>
         <field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 5:45:00')"></field>
         <field name="duration" eval="0.25"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">confirmed</field>
     </record>
     <record id="event_track31" model="event.track">
         <field name="name">Lunch</field>
         <field name="event_id" ref="event.event_0"/>
         <field name="date" eval="time.strftime(str(DateTime.today().year) + '-06-04 7:30:00')"></field>
         <field name="duration" eval="1"/>
-        <field name="stage_id" ref="event_track_stage2"/>
+        <field name="state">confirmed</field>
     </record>
 </data>
 </openerp>
index 0d67353..ee257eb 100644 (file)
 # -*- coding: utf-8 -*-
-##############################################################################
-#
-#    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
-#
-#    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 <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-
-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)
index 0f5a530..88b9061 100644 (file)
@@ -1,10 +1,6 @@
 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink\r
 access_event_location_manager,event.track.location manager,model_event_track_location,event.group_event_manager,1,1,1,1\r
 access_event_track_manager,event.track manager,model_event_track,event.group_event_manager,1,1,1,1\r
-access_event_tag_public,event.tag public,model_event_tag,,1,0,0,0\r
-access_event_tag_manager,event.tag manager,model_event_tag,event.group_event_manager,1,1,1,1\r
-access_event_track_stage_public,event.track.stage public,model_event_track_stage,,1,0,0,0\r
-access_event_track_stage_manager,event.track.stage manager,model_event_track_stage,event.group_event_manager,1,1,1,1\r
 access_event_track_tag_public,event.track.tag public,model_event_track_tag,,1,0,0,0\r
 access_event_track_tag_manager,event.track.tag manager,model_event_track_tag,event.group_event_manager,1,1,1,1\r
 access_event_track_location_public,event.track.location public,model_event_track_location,,1,0,0,0\r
index 5009198..34f1e2b 100644 (file)
 <openerp>
     <data>
 
-        <record id="act_event_list_tracks" model="ir.actions.act_window">
+        <!-- Event Tracks -->
+        <record model="ir.ui.view" id="view_event_track_kanban">
+            <field name="name">event.track.kanban</field>
+            <field name="model">event.track</field>
+            <field name="arch" type="xml">
+                <kanban default_group_by="state">
+                    <templates>
+                        <field name="color"/>
+                        <field name="speaker_ids"/>
+                        <t t-name="kanban-box">
+                            <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
+                                <div class="oe_dropdown_toggle oe_dropdown_kanban" groups="base.group_user">
+                                    <span class="oe_e">í</span>
+                                    <ul class="oe_dropdown_menu">
+                                        <li><a href="/event/1/track/2">View Track</a></li>
+                                        <t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Edit Track</a></li></t>
+                                        <t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t>
+                                        <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                    </ul>
+                                </div>
+                                <div class="oe_kanban_content">
+                                    <h4><field name="name"/></h4>
+                                    <field name="tag_ids"/>
+                                    <div>
+                                        <t t-if="duration"><field name="duration" widget="float_time"/> hours</t>
+                                    </div>
+                                    <div class="oe_kanban_bottom_right">
+                                        <field name="priority" widget="priority"/>
+                                    </div>
+                                    <div class="oe_kanban_footer_left">
+                                        <t t-foreach="record.speaker_ids.raw_value.slice(0,11)" t-as="speaker">
+                                            <img t-att-src="kanban_image('res.partner', 'image_small', speaker)" t-att-data-member_id="speaker" width="30px" height="30px"/>
+                                        </t>
+                                        <t t-if="record.speaker_ids.raw_value.length > 11 ">
+                                            <a name="open_track_speakers_list" type="object"><t t-esc="record.speaker_ids.raw_value.length - 11"> More</t></a>
+                                        </t>
+                                    </div>
+                                    <div class="oe_clear"/>
+                                </div>
+                            </div>
+                        </t>
+                    </templates>
+                </kanban>
+            </field>
+        </record>
+
+        <record id="view_event_track_calendar" model="ir.ui.view">
+            <field name="name">event.track.calendar</field>
+            <field name="model">event.track</field>
+            <field eval="2" name="priority"/>
+            <field name="arch" type="xml">
+                <calendar color="location_id" date_start="date" date_delay="duration" string="Event Tracks">
+                    <field name="name"/>
+                    <field name="event_id"/>
+                </calendar>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="view_event_track_search">
+            <field name="name">event.track.search</field>
+            <field name="model">event.track</field>
+            <field name="arch" type="xml">
+                <search string="Event Tracks">
+                    <field name="name"/>
+                    <field name="event_id"/>
+                    <field name="state"/>
+                    <field name="speaker_ids"/>
+                    <group expand="0" string="Group By">
+                        <filter string="Responsible"  context="{'group_by': 'user_id'}"/>
+                        <filter string="Status" context="{'group_by':'state'}"/>
+                        <filter string="Date" context="{'group_by':'date'}"/>
+                        <filter string="Event" context="{'group_by':'event_id'}"/>
+                    </group>
+                </search>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="view_event_track_form">
+            <field name="name">event.track.form</field>
+            <field name="model">event.track</field>
+            <field name="arch" type="xml">
+                <form string="Event Track">
+                    <header>
+                        <field name="state" widget="statusbar" clickable="True"/>
+                    </header>
+                    <sheet string="Track">
+                        <div class="oe_right oe_button_box">
+                            <field name="website_url" invisible="1"/>
+                            <field name="website_published" class="pull-right" widget="website_button"/>
+                        </div>
+                        <div class="oe_title">
+                            <label for="name" class="oe_edit_only"/>
+                            <h1>
+                                <field name="name"/>
+                            </h1>
+                            <label for="event_id" class="oe_edit_only"/>
+                            <h3>
+                                <field name="event_id"/>
+                            </h3>
+                        </div>
+                        <group>
+                            <group>
+                                <field name="user_id"/>
+                                <field name="speaker_ids" widget="many2many_tags"/>
+                                <field name="location_id"/>
+                            </group>
+                            <group>
+                                <field name="date"/>
+                                <label for="duration"/>
+                                <div>
+                                    <field name="duration" class="oe_inline" widget="float_time"/> hours
+                                </div>
+                                <field name="tag_ids" widget="many2many_tags"/>
+                                <field name="color"/>
+                            </group>
+                        </group>
+                    </sheet>
+                    <div class="oe_chatter">
+                        <field name="message_follower_ids" widget="mail_followers"/>
+                        <field name="message_ids" widget="mail_thread"/>
+                    </div>
+                </form>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="view_event_track_tree">
+            <field name="name">event.track.tree</field>
+            <field name="model">event.track</field>
+            <field name="arch" type="xml">
+                <tree string="Event Track">
+                    <field name="name"/>
+                    <field name="event_id"/>
+                </tree>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="view_event_track_graph">
+            <field name="name">event.track.graph</field>
+            <field name="model">event.track</field>
+            <field name="arch" type="xml">
+                <graph string="Tracks" type="bar" orientation="horizontal">
+                    <field name="location_id"/>
+                    <field name="duration" operator="+"/>
+                </graph>
+            </field>
+        </record>
+
+        <record model="ir.actions.act_window" id="action_event_track">
+            <field name="name">Event Tracks</field>
+            <field name="res_model">event.track</field>
+            <field name="view_mode">kanban,tree,form,calendar,graph</field>
+            <field name="help" type="html">
+<p class="oe_view_nocontent_create">
+Click to add a track.
+</p><p>
+    Tracks define the agenda of your event. These can bea talk, a round table, a meeting, etc.
+</p></field>
+        </record>
+
+        <record model="ir.actions.act_window" id="action_event_track_from_event">
             <field name="res_model">event.track</field>
             <field name="name">Event Tracks</field>
             <field name="view_type">form</field>
             <field name="view_mode">kanban,tree,form,calendar,graph</field>
-            <field name="context">{'search_default_event_id': active_id, 'default_event_id': active_id, 'group_by': 'stage_id'}</field>
+            <field name="context">{'search_default_event_id': active_id, 'default_event_id': active_id, 'group_by': 'state'}</field>
             <field name="help" type="html">
-              <p class="oe_view_nocontent_create">
-                  Click to add a track.
-              </p><p>
-                  Tracks define the agenda of your event. These can be
-                  a talk, a round table, a meeting, etc.
-              </p>
-            </field>
+<p class="oe_view_nocontent_create">
+Click to add a track.
+</p><p>
+Tracks define the agenda of your event. These can be a talk, a round table, a meeting, etc.
+</p></field>
         </record>
 
+        <menuitem name="Event Tracks" id="menu_event_track" action="action_event_track" parent="event.event_configuration" groups="base.group_no_one"/>
+
         <!-- EVENTS/CONFIGURATION/EVENT locations -->
         <record model="ir.ui.view" id="view_event_location_form">
             <field name="name">Event Locations</field>
             action="action_event_track_location" parent="event.event_configuration"
             groups="base.group_no_one"/>
 
-        <!-- EVENTS/CONFIGURATION/EVENT Stages -->
-        <record model="ir.ui.view" id="view_event_track_stage_form">
-            <field name="name">Event Stages</field>
-            <field name="model">event.track.stage</field>
-            <field name="arch" type="xml">
-                <form string="Event Stage">
-                    <field name="name"/>
-                </form>
-            </field>
-        </record>
-        <record model="ir.ui.view" id="view_event_track_stage_tree">
-            <field name="name">Event Stage</field>
-            <field name="model">event.track.stage</field>
-            <field name="arch" type="xml">
-                <tree string="Event Stage">
-                    <field name="sequence" widget="handle"/>
-                    <field name="name"/>
-                </tree>
-            </field>
-        </record>
-        <record model="ir.actions.act_window" id="action_event_track_stage">
-            <field name="name">Event Stages</field>
-            <field name="res_model">event.track.stage</field>
-        </record>
-        <menuitem name="Event Stages" id="menu_event_track_stage"
-            action="action_event_track_stage" parent="event.event_configuration"
-            groups="base.group_no_one"/>
-
         <!-- EVENTS/CONFIGURATION/EVENT Sponsor Types -->
         <record model="ir.ui.view" id="view_event_sponsor_type_form">
             <field name="name">Sponsor Types</field>
         </record>
         <menuitem id="menu_event_track_tag" action="action_event_track_tag" parent="event.event_configuration" groups="base.group_no_one"/>
 
-
-        <!-- EVENTS/CONFIGURATION/EVENT Tags -->
-        <record model="ir.ui.view" id="view_event_tag_form">
-            <field name="name">Event Tags</field>
-            <field name="model">event.tag</field>
-            <field name="arch" type="xml">
-                <form string="Event Tag">
-                    <field name="name"/>
-                </form>
-            </field>
-        </record>
-        <record model="ir.ui.view" id="view_event_tag_tree">
-            <field name="name">Event Tag</field>
-            <field name="model">event.tag</field>
-            <field name="arch" type="xml">
-                <tree string="Event Tag">
-                    <field name="name"/>
-                </tree>
-            </field>
-        </record>
-        <record model="ir.actions.act_window" id="action_event_tag">
-            <field name="name">Event Tags</field>
-            <field name="res_model">event.tag</field>
-        </record>
-        <menuitem name="Event Tags" id="menu_event_tag" action="action_event_tag" parent="event.event_configuration" groups="base.group_no_one"/>
-
         <!-- Events Organisation/CONFIGURATION/EVENTS -->
-
         <record model="ir.ui.view" id="view_event_form">
             <field name="name">Event Tracks</field>
             <field name="inherit_id" ref="event.view_event_form"/>
             <field name="model">event.event</field>
             <field name="arch" type="xml">
                 <xpath expr="//div[@class='oe_right oe_button_box']" position="inside">
-                    <button name="%(act_event_list_tracks)d" 
+                    <button name="%(action_event_track_from_event)d" 
                             type="action" 
                             class="oe_stat_button oe_inline" 
                             icon="fa-inbox">
                     </button>
                 </xpath>
                 <xpath expr="//div[@class='oe_title']" position="inside">
-                    <label for="tag_ids" class="oe_edit_only"/>
-                    <field name="tag_ids" widget="many2many_tags"/>
                     <div name="event_checkboxes">
                         <field name="show_menu"/>
                         <label for="show_menu"/>
             </field>
         </record>
 
-        <!-- Event Tracks -->
-
-        <record model="ir.ui.view" id="view_event_track_kanban">
-            <field name="name">event.track.kanban</field>
-            <field name="model">event.track</field>
-            <field name="arch" type="xml">
-                <kanban>
-                    <templates>
-                        <field name="color"/>
-                        <field name="priority"/>
-                        <field name="speaker_ids"/>
-                        <t t-name="kanban-box">
-                            <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
-                                <div class="oe_dropdown_toggle oe_dropdown_kanban" groups="base.group_user">
-                                    <span class="oe_e">í</span>
-                                    <ul class="oe_dropdown_menu">
-                                        <li><a href="/event/1/track/2">View Track</a></li>
-                                        <t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Edit Track</a></li></t>
-                                        <t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t>
-                                        <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
-                                    </ul>
-                                </div>
-                                <div class="oe_kanban_content">
-                                    <h4><field name="name"/></h4>
-                                    <field name="tag_ids"/>
-                                    <div t-if="duration"><field name="duration" widget="float_time"/> hours</div>
-                                    <span class="oe_right">
-                                        <t t-set="priority" t-value="record.priority.raw_value || 0"/>
-                                        <a type="object" name="set_priority" args="['2']" t-if="priority == 3" title="Normal Priority">
-                                           <img src="/web/static/src/img/icons/star-off.png" width="16" height="16"/>
-                                        </a>
-                                        <a type="object" name="set_priority" args="['3']" t-if="priority lte 2" title="Normal Priority">
-                                           <img t-attf-src="/web/static/src/img/icons/star-#{priority lte 2 ? 'on' : 'off'}.png" width="16" height="16"/>
-                                        </a>
-                                        <a type="object" name="set_priority" args="['1']" title="High Priority">
-                                           <img t-attf-src="/web/static/src/img/icons/star-#{priority lte 1 ? 'on' : 'off'}.png" width="16" height="16"/>
-                                        </a>
-                                        <a type="object" name="set_priority" args="['0']" title="Highest Priority">
-                                           <img t-attf-src="/web/static/src/img/icons/star-#{priority == 0 ? 'on' : 'off'}.png" width="16" height="16"/>
-                                        </a>
-                                    </span>
-                                    <div class="row">
-                                        <div class="col-md-10">
-                                            <t t-foreach="record.speaker_ids.raw_value.slice(0,11)" t-as="speaker">
-                                                <img t-att-src="kanban_image('res.partner', 'image_small', speaker)" t-att-data-speaker_id="speaker" width="30px" height="30px"/>
-                                            </t>
-                                            <t t-if="record.speaker_ids.raw_value.length > 11 ">
-                                                <a name="open_track_speakers_list" type="object">
-                                                    <t t-esc="record.speaker_ids.raw_value.length - 11"> More</t>
-                                                </a>
-                                            </t>
-                                        </div>
-                                    </div>
-                                    <div class="oe_clear"/>
-                                </div>
-                            </div>
-                        </t>
-                    </templates>
-                </kanban>
-            </field>
-        </record>
-        <record id="view_event_track_calendar" model="ir.ui.view">
-            <field name="name">event.track.calendar</field>
-            <field name="model">event.track</field>
-            <field eval="2" name="priority"/>
-            <field name="arch" type="xml">
-                <calendar color="location_id" date_start="date" date_delay="duration" string="Event Tracks">
-                    <field name="name"/>
-                    <field name="event_id"/>
-                </calendar>
-            </field>
-        </record>
-        <record model="ir.ui.view" id="view_event_track_search">
-            <field name="name">Event Tracks</field>
-            <field name="model">event.track</field>
-            <field name="arch" type="xml">
-                <search string="Event Tracks">
-                    <field name="name"/>
-                    <field name="event_id"/>
-                    <field name="stage_id"/>
-                    <field name="speaker_ids"/>
-                    <group expand="0" string="Group By">
-                        <filter string="Responsible"  context="{'group_by': 'user_id'}"/>
-                        <filter string="Stage" context="{'group_by':'stage_id'}"/>
-                        <filter string="Date" context="{'group_by':'date'}"/>
-                        <filter string="Event" context="{'group_by':'event_id'}"/>
-                    </group>
-                </search>
-            </field>
-        </record>
-
-        <record model="ir.ui.view" id="view_event_track_form">
-            <field name="name">event.track.form</field>
-            <field name="model">event.track</field>
-            <field name="arch" type="xml">
-                <form string="Event Track">
-                    <header>
-                        <field name="stage_id" widget="statusbar"/>
-                    </header>
-                    <sheet string="Track">
-                        <div class="oe_right oe_button_box">
-                            <field name="website_url" invisible="1"/>
-                            <field name="website_published" class="pull-right" widget="website_button"/>
-                        </div>
-                        <div class="oe_title">
-                            <label for="name" class="oe_edit_only"/>
-                            <h1>
-                                <field name="name"/>
-                            </h1>
-                            <label for="event_id" class="oe_edit_only"/>
-                            <h3>
-                                <field name="event_id"/>
-                            </h3>
-                        </div>
-                        <group>
-                            <group>
-                                <field name="user_id"/>
-                                <field name="speaker_ids" widget="many2many_tags"/>
-                                <field name="location_id"/>
-                            </group>
-                            <group>
-                                <field name="date"/>
-                                <label for="duration"/>
-                                <div>
-                                    <field name="duration" class="oe_inline" widget="float_time"/> hours
-                                </div>
-                                <field name="tag_ids" widget="many2many_tags"/>
-                                <field name="color"/>
-                            </group>
-                        </group>
-                    </sheet>
-                    <div class="oe_chatter">
-                        <field name="message_follower_ids" widget="mail_followers"/>
-                        <field name="message_ids" widget="mail_thread"/>
-                    </div>
-                </form>
-            </field>
-        </record>
-
-        <record model="ir.ui.view" id="view_event_track_tree">
-            <field name="name">Event Tracks</field>
-            <field name="model">event.track</field>
-            <field name="arch" type="xml">
-                <tree string="Event Track">
-                    <field name="name"/>
-                    <field name="event_id"/>
-                </tree>
-            </field>
-        </record>
-
-        <record model="ir.ui.view" id="view_event_track_graph">
-            <field name="name">Tracks Graph</field>
-            <field name="model">event.track</field>
-            <field name="arch" type="xml">
-                <graph string="Tracks" type="bar" orientation="horizontal">
-                    <field name="location_id"/>
-                    <field name="duration" operator="+"/>
-                </graph>
-            </field>
-        </record>
-
-        <record model="ir.actions.act_window" id="action_event_track">
-            <field name="name">Event Tracks</field>
-            <field name="res_model">event.track</field>
-            <field name="view_mode">kanban,tree,form,calendar</field>
-        </record>
-        <menuitem name="Event Tracks" id="menu_event_track" action="action_event_track" parent="event.event_configuration" groups="base.group_no_one"/>
-
     </data>
 </openerp>
index e6ee8ac..3e86632 100644 (file)
                             <div class="col-sm-2">
                                 <span t-field="track.image"
                                     t-field-options='{"widget": "image", "class": "img-circle"}'/>
+                                    <!-- <span t-field="speaker.self" t-field-options='{"widget": "contact", "fields": ["name", "country_id"]}'
+                                        style="display: inline-block;"/> -->
                             </div><div class="col-sm-10">
                                <h4 t-field="speaker.name" class="mb4"/>
                                <div class="fa fa-home mb16" t-if="speaker.website">