Skip to content
Snippets Groups Projects
Commit 968ef022 authored by Thibault Delavallée's avatar Thibault Delavallée
Browse files

[REF] website_event(_track/_question) : move from onchange / default to stored...

[REF] website_event(_track/_question) : move from onchange / default to stored editable computed fields

PURPOSE

Try to move from onchange / default_get to stored editable computed fields.
Behavior should be the same (computed or set by user), with support of
create / write / onchange field update without additional code.

SPECIFICATIONS: GLOBAL RULES

Update classic fields updated in some cases by onchange and/or default methods
by fields with store=True, readonly=False. It means their value comes either
from manual user input, either from trigger based computation.

Remove onchange and default_get when possible, leading to an unique computation
method and clearing fields definition.

Also clean some fields definition inconsistencies, notably required fields
that should instead be correctly computed or default that have no real meaning.

SPECIFICATIONS: WEBSITE_TRACK(_PROPOSAL)

Keep an explicit onchange for tick / untick of website_track_proposal. Indeed
otherwise you have a loop of dependencies between website_track and
website_track_proposal

  * untick website_track: website_track_proposal = False (done in _compute_website_track_proposal)
  * tick website_track: no effect
  * untick website_track_proposal: no effect
  * tick website_track_proposa: website_track = True

It would be complicated to write in computed fields, as they depend on each
other, on cache and current values, ... It is therefore simpler to keep an
onchange: when ticking website_track_proposal set website_track as True in
interface.

LINKS

Task ID 2089156
Community PR odoo/odoo#42911
parent 7666f976
No related branches found
No related tags found
No related merge requests found
......@@ -62,9 +62,8 @@ class Event(models.Model):
track related menus. """
super(Event, self)._compute_from_event_type()
for event in self:
if not event.event_type_id:
if not event.website_menu:
event.website_menu = False
if not event.event_type_id and not event.website_menu:
event.website_menu = False
elif event.event_type_id:
event.website_menu = event.event_type_id.website_menu
......
......@@ -8,14 +8,19 @@ from odoo.addons.http_routing.models.ir_http import slug
class EventType(models.Model):
_inherit = 'event.type'
website_track = fields.Boolean('Tracks on Website')
website_track_proposal = fields.Boolean('Tracks Proposals on Website')
website_track = fields.Boolean(
string='Tracks on Website', compute='_compute_website_menu_data',
copy=True, readonly=False, store=True)
website_track_proposal = fields.Boolean(
string='Tracks Proposals on Website', compute='_compute_website_menu_data',
copy=True, readonly=False, store=True)
@api.onchange('website_menu')
def _onchange_website_menu(self):
if not self.website_menu:
self.website_track = False
self.website_track_proposal = False
@api.depends('website_menu')
def _compute_website_menu_data(self):
for event_type in self:
if not event_type.website_menu:
event_type.website_track = False
event_type.website_track_proposal = False
class Event(models.Model):
......@@ -23,16 +28,16 @@ class Event(models.Model):
track_ids = fields.One2many('event.track', 'event_id', 'Tracks')
track_count = fields.Integer('Track Count', compute='_compute_track_count')
sponsor_ids = fields.One2many('event.sponsor', 'event_id', 'Sponsors')
sponsor_count = fields.Integer('Sponsor Count', compute='_compute_sponsor_count')
website_track = fields.Boolean('Tracks on Website')
website_track_proposal = fields.Boolean('Proposals on Website')
website_track = fields.Boolean(
'Tracks on Website', compute='_compute_website_track',
copy=True, readonly=False, store=True)
website_track_proposal = fields.Boolean(
'Proposals on Website', compute='_compute_website_track_proposal',
copy=True, readonly=False, store=True)
track_menu_ids = fields.One2many('website.event.menu', 'event_id', string='Event Tracks Menus', domain=[('menu_type', '=', 'track')])
track_proposal_menu_ids = fields.One2many('website.event.menu', 'event_id', string='Event Proposals Menus', domain=[('menu_type', '=', 'track_proposal')])
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',
......@@ -50,6 +55,46 @@ class Event(models.Model):
for event in self:
event.sponsor_count = result.get(event.id, 0)
@api.depends('event_type_id', 'website_menu')
def _compute_website_track(self):
""" Explicitly checks that event_type has changed before copying its value
on the event itself. Changing website_menu trigger should not mess with the
behavior of event_type. """
for event in self:
if event.event_type_id and event.event_type_id != event._origin.event_type_id:
event.website_track = event.event_type_id.website_track
elif not event.website_menu or not event.website_track:
event.website_track = False
@api.depends('event_type_id', 'website_track')
def _compute_website_track_proposal(self):
for event in self:
if event.event_type_id and event.event_type_id != event._origin.event_type_id:
event.website_track_proposal = event.event_type_id.website_track_proposal
elif not event.website_track:
event.website_track_proposal = False
@api.onchange('website_track_proposal')
def _onchange_website_track_proposal(self):
""" Keep an explicit onchange for tick / untick of website_track_proposal.
Indeed otherwise you have a loop of dependencies between website_track and
website_track_proposal
* untick website_track: website_track_proposal = False (done in _compute_website_track_proposal)
* tick website_track: no effect
* untick website_track_proposal: no effect
* tick website_track_proposa: website_track = True
It would be complicated to write in computed fields, as they depend on
each other, on cache and current values, ...
It is therefore simpler to keep an onchange: when ticking website_track_proposal
set website_track as True in interface.
"""
for event in self:
if event.website_track_proposal and not event.website_track:
event.website_track = True
@api.depends('track_ids.tag_ids', 'track_ids.tag_ids.color')
def _compute_tracks_tag_ids(self):
for event in self:
......@@ -92,26 +137,3 @@ class Event(models.Model):
self.ensure_one()
res = [(_('Talk Proposals'), '/event/%s/track_proposal' % slug(self), False, 'track_proposal')]
return res
@api.onchange('event_type_id')
def _onchange_type(self):
super(Event, self)._onchange_type()
if self.event_type_id and self.website_menu:
self.website_track = self.event_type_id.website_track
self.website_track_proposal = self.event_type_id.website_track_proposal
@api.onchange('website_menu')
def _onchange_website_menu(self):
if not self.website_menu:
self.website_track = False
self.website_track_proposal = False
@api.onchange('website_track')
def _onchange_website_track(self):
if not self.website_track:
self.website_track_proposal = False
@api.onchange('website_track_proposal')
def _onchange_website_track_proposal(self):
if self.website_track_proposal:
self.website_track = True
......@@ -43,10 +43,16 @@ class Track(models.Model):
user_id = fields.Many2one('res.users', 'Responsible', tracking=True, default=lambda self: self.env.user)
company_id = fields.Many2one('res.company', related='event_id.company_id')
partner_id = fields.Many2one('res.partner', 'Speaker')
partner_name = fields.Char('Name', tracking=10)
partner_email = fields.Char('Email', tracking=20)
partner_phone = fields.Char('Phone', tracking=30)
partner_biography = fields.Html('Biography')
partner_name = fields.Char(
string='Name', compute='_compute_partner_info',
copy=True, readonly=False, store=True, tracking=10)
partner_email = fields.Char(
string='Email', compute='_compute_partner_info',
copy=True, readonly=False, store=True, tracking=20)
partner_phone = fields.Char(
string='Phone', compute='_compute_partner_info',
copy=True, readonly=False, store=True, tracking=30)
partner_biography = fields.Html(string='Biography')
tag_ids = fields.Many2many('event.track.tag', string='Tags')
stage_id = fields.Many2one(
'event.track.stage', string='Stage', ondelete='restrict',
......@@ -82,12 +88,13 @@ class Track(models.Model):
if track.id:
track.website_url = '/event/%s/track/%s' % (slug(track.event_id), slug(track))
@api.onchange('partner_id')
def _onchange_partner_id(self):
if self.partner_id:
self.partner_name = self.partner_id.name
self.partner_email = self.partner_id.email
self.partner_phone = self.partner_id.phone
@api.depends('partner_id')
def _compute_partner_info(self):
for track in self:
if track.partner_id:
track.partner_name = track.partner_id.name
track.partner_email = track.partner_id.email
track.partner_phone = track.partner_id.phone
@api.depends('date', 'duration')
def _compute_end_date(self):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment