This commit adapts the business code to changes introduced by the parent commit in order to keep the same behaviour as before. All readonly=False fields will have to be checked afterwards to confirm that the business case requires write access to the source field.
214 lines
8.7 KiB
Python
214 lines
8.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models
|
|
from odoo.tools.translate import _, html_translate
|
|
from odoo.addons.http_routing.models.ir_http import slug
|
|
|
|
|
|
class TrackTag(models.Model):
|
|
_name = "event.track.tag"
|
|
_description = 'Event Track Tag'
|
|
_order = 'name'
|
|
|
|
name = fields.Char('Tag')
|
|
track_ids = fields.Many2many('event.track', string='Tracks')
|
|
color = fields.Integer(string='Color Index')
|
|
|
|
_sql_constraints = [
|
|
('name_uniq', 'unique (name)', "Tag name already exists !"),
|
|
]
|
|
|
|
|
|
class TrackLocation(models.Model):
|
|
_name = "event.track.location"
|
|
_description = 'Event Track Location'
|
|
|
|
name = fields.Char('Room')
|
|
|
|
|
|
class TrackStage(models.Model):
|
|
_name = 'event.track.stage'
|
|
_description = 'Event Track Stage'
|
|
_order = 'sequence, id'
|
|
|
|
name = fields.Char(string='Stage Name', required=True, translate=True)
|
|
sequence = fields.Integer(string='Sequence', default=1)
|
|
mail_template_id = fields.Many2one(
|
|
'mail.template', string='Email Template',
|
|
domain=[('model', '=', 'event.track')],
|
|
help="If set an email will be sent to the customer when the track reaches this step.")
|
|
fold = fields.Boolean(
|
|
string='Folded in Kanban',
|
|
help='This stage is folded in the kanban view when there are no records in that stage to display.')
|
|
is_done = fields.Boolean(string='Accepted Stage')
|
|
is_cancel = fields.Boolean(string='Canceled Stage')
|
|
|
|
|
|
class Track(models.Model):
|
|
_name = "event.track"
|
|
_description = 'Event Track'
|
|
_order = 'priority, date'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin', 'website.seo.metadata', 'website.published.mixin']
|
|
|
|
@api.model
|
|
def _get_default_stage_id(self):
|
|
return self.env['event.track.stage'].search([], limit=1).id
|
|
|
|
name = fields.Char('Title', required=True, translate=True)
|
|
active = fields.Boolean(default=True)
|
|
user_id = fields.Many2one('res.users', 'Responsible', track_visibility='onchange', default=lambda self: self.env.user)
|
|
partner_id = fields.Many2one('res.partner', 'Speaker')
|
|
partner_name = fields.Char('Speaker Name')
|
|
partner_email = fields.Char('Speaker Email')
|
|
partner_phone = fields.Char('Speaker Phone')
|
|
partner_biography = fields.Html('Speaker Biography')
|
|
tag_ids = fields.Many2many('event.track.tag', string='Tags')
|
|
stage_id = fields.Many2one(
|
|
'event.track.stage', string='Stage', ondelete='restrict',
|
|
index=True, copy=False, default=_get_default_stage_id,
|
|
group_expand='_read_group_stage_ids',
|
|
required=True, track_visibility='onchange')
|
|
kanban_state = fields.Selection([
|
|
('normal', 'Grey'),
|
|
('done', 'Green'),
|
|
('blocked', 'Red')], string='Kanban State',
|
|
copy=False, default='normal', required=True, track_visibility='onchange',
|
|
help="A track's kanban state indicates special situations affecting it:\n"
|
|
" * Grey is the default situation\n"
|
|
" * Red indicates something is preventing the progress of this track\n"
|
|
" * Green indicates the track is ready to be pulled to the next stage")
|
|
description = fields.Html('Track Description', translate=html_translate, sanitize_attributes=False)
|
|
date = fields.Datetime('Track Date')
|
|
duration = fields.Float('Duration', default=1.5)
|
|
location_id = fields.Many2one('event.track.location', 'Room')
|
|
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')
|
|
image = fields.Binary('Image', related='partner_id.image_medium', store=True, attachment=True, readonly=False)
|
|
|
|
@api.multi
|
|
@api.depends('name')
|
|
def _compute_website_url(self):
|
|
super(Track, self)._compute_website_url()
|
|
for track in self:
|
|
if not isinstance(track.id, models.NewId):
|
|
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
|
|
self.partner_biography = self.partner_id.website_description
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
track = super(Track, self).create(vals)
|
|
|
|
track.event_id.message_post_with_view(
|
|
'website_event_track.event_track_template_new',
|
|
values={'track': track},
|
|
subject=track.name,
|
|
subtype_id=self.env.ref('website_event_track.mt_event_track').id,
|
|
)
|
|
|
|
return track
|
|
|
|
@api.multi
|
|
def write(self, vals):
|
|
if 'stage_id' in vals and 'kanban_state' not in vals:
|
|
vals['kanban_state'] = 'normal'
|
|
res = super(Track, self).write(vals)
|
|
if vals.get('partner_id'):
|
|
self.message_subscribe([vals['partner_id']])
|
|
return res
|
|
|
|
@api.model
|
|
def _read_group_stage_ids(self, stages, domain, order):
|
|
""" Always display all stages """
|
|
return stages.search([], order=order)
|
|
|
|
@api.multi
|
|
def _track_template(self, tracking):
|
|
res = super(Track, self)._track_template(tracking)
|
|
track = self[0]
|
|
changes, tracking_value_ids = tracking[track.id]
|
|
if 'stage_id' in changes and track.stage_id.mail_template_id:
|
|
res['stage_id'] = (track.stage_id.mail_template_id, {
|
|
'composition_mode': 'comment',
|
|
'auto_delete_message': True,
|
|
'subtype_id': self.env['ir.model.data'].xmlid_to_res_id('mail.mt_note'),
|
|
'notif_layout': 'mail.mail_notification_light'
|
|
})
|
|
return res
|
|
|
|
@api.multi
|
|
def _track_subtype(self, init_values):
|
|
self.ensure_one()
|
|
if 'kanban_state' in init_values and self.kanban_state == 'blocked':
|
|
return 'website_event_track.mt_track_blocked'
|
|
elif 'kanban_state' in init_values and self.kanban_state == 'done':
|
|
return 'website_event_track.mt_track_ready'
|
|
return super(Track, self)._track_subtype(init_values)
|
|
|
|
@api.multi
|
|
def message_get_suggested_recipients(self):
|
|
recipients = super(Track, self).message_get_suggested_recipients()
|
|
for track in self:
|
|
if track.partner_email != track.partner_id.email:
|
|
track._message_add_suggested_recipient(recipients, email=track.partner_email, reason=_('Speaker Email'))
|
|
return recipients
|
|
|
|
def _message_post_after_hook(self, message, *args, **kwargs):
|
|
if self.partner_email and not self.partner_id:
|
|
# we consider that posting a message with a specified recipient (not a follower, a specific one)
|
|
# on a document without customer means that it was created through the chatter using
|
|
# suggested recipients. This heuristic allows to avoid ugly hacks in JS.
|
|
new_partner = message.partner_ids.filtered(lambda partner: partner.email == self.partner_email)
|
|
if new_partner:
|
|
self.search([
|
|
('partner_id', '=', False),
|
|
('partner_email', '=', new_partner.email),
|
|
('stage_id.is_cancel', '=', False),
|
|
]).write({'partner_id': new_partner.id})
|
|
return super(Track, self)._message_post_after_hook(message, *args, **kwargs)
|
|
|
|
@api.multi
|
|
def open_track_speakers_list(self):
|
|
return {
|
|
'name': _('Speakers'),
|
|
'domain': [('id', 'in', self.mapped('partner_id').ids)],
|
|
'view_type': 'form',
|
|
'view_mode': 'kanban,form',
|
|
'res_model': 'res.partner',
|
|
'view_id': False,
|
|
'type': 'ir.actions.act_window',
|
|
}
|
|
|
|
|
|
class SponsorType(models.Model):
|
|
_name = "event.sponsor.type"
|
|
_description = 'Event Sponsor Type'
|
|
_order = "sequence"
|
|
|
|
name = fields.Char('Sponsor Type', required=True, translate=True)
|
|
sequence = fields.Integer('Sequence')
|
|
|
|
|
|
class Sponsor(models.Model):
|
|
_name = "event.sponsor"
|
|
_description = 'Event Sponsor'
|
|
_order = "sequence"
|
|
|
|
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', readonly=False)
|
|
image_medium = fields.Binary(string='Logo', related='partner_id.image_medium', store=True, attachment=True, readonly=False)
|