1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime
from pytz import timezone, utc
from odoo import api, fields, models
from odoo.addons.http_routing.models.ir_http import slug
from odoo.addons.resource.models.resource import float_to_time
from odoo.tools import is_html_empty
from odoo.tools.translate import html_translate
class EventSponsor(models.Model):
_name = 'event.sponsor'
_inherit = [
'event.sponsor',
'website.published.mixin',
'chat.room.mixin',
]
_rec_name = 'name'
_order = 'sponsor_type_id, sequence'
# description
subtitle = fields.Char('Slogan', help='Catchy marketing sentence for promote')
is_exhibitor = fields.Boolean("Exhibitor's Chat")
website_description = fields.Html(
'Description', compute='_compute_website_description',
sanitize_attributes=False, sanitize_form=True, translate=html_translate,
readonly=False, store=True)
# live mode
hour_from = fields.Float('Opening hour', default=8.0)
hour_to = fields.Float('End hour', default=18.0)
event_date_tz = fields.Selection(string='Timezone', related='event_id.date_tz', readonly=True)
is_in_opening_hours = fields.Boolean(
'Within opening hours', compute='_compute_is_in_opening_hours')
# chat room
chat_room_id = fields.Many2one(readonly=False)
room_name = fields.Char(readonly=False)
# country information (related to ease frontend templates)
country_id = fields.Many2one(
'res.country', string='Country',
related='partner_id.country_id', readonly=True)
country_flag_url = fields.Char(
string='Country Flag',
compute='_compute_country_flag_url', compute_sudo=True)
@api.onchange('is_exhibitor')
def _onchange_is_exhibitor(self):
""" Keep an explicit onchange to allow configuration of room names, even
if this field is normally a related on chat_room_id.name. It is not a real
computed field, an onchange used in form view is sufficient. """
for sponsor in self:
if sponsor.is_exhibitor and not sponsor.room_name:
if sponsor.name:
room_name = "odoo-exhibitor-%s" % sponsor.name
else:
room_name = self.env['chat.room']._default_name(objname='exhibitor')
sponsor.room_name = self._jitsi_sanitize_name(room_name)
if sponsor.is_exhibitor and not sponsor.room_max_capacity:
sponsor.room_max_capacity = '8'
@api.depends('partner_id')
def _compute_website_description(self):
for sponsor in self:
if is_html_empty(sponsor.website_description):
sponsor.website_description = sponsor.partner_id.website_description
@api.depends('event_id.is_ongoing', 'hour_from', 'hour_to', 'event_id.date_begin', 'event_id.date_end')
def _compute_is_in_opening_hours(self):
""" Opening hours: hour_from and hour_to are given within event TZ or UTC.
Now() must therefore be computed based on that TZ. """
for sponsor in self:
if not sponsor.event_id.is_ongoing:
sponsor.is_in_opening_hours = False
elif not sponsor.hour_from or not sponsor.hour_to:
sponsor.is_in_opening_hours = True
else:
event_tz = timezone(sponsor.event_id.date_tz)
# localize now, begin and end datetimes in event tz
dt_begin = sponsor.event_id.date_begin.astimezone(event_tz)
dt_end = sponsor.event_id.date_end.astimezone(event_tz)
now_utc = utc.localize(fields.Datetime.now().replace(microsecond=0))
now_tz = now_utc.astimezone(event_tz)
# compute opening hours
opening_from_tz = event_tz.localize(datetime.combine(now_tz.date(), float_to_time(sponsor.hour_from)))
opening_to_tz = event_tz.localize(datetime.combine(now_tz.date(), float_to_time(sponsor.hour_to)))
opening_from = max([dt_begin, opening_from_tz])
opening_to = min([dt_end, opening_to_tz])
sponsor.is_in_opening_hours = opening_from <= now_tz < opening_to
@api.depends('partner_id.country_id.image_url')
def _compute_country_flag_url(self):
for sponsor in self:
if sponsor.partner_id.country_id:
sponsor.country_flag_url = sponsor.partner_id.country_id.image_url
else:
sponsor.country_flag_url = False
# ------------------------------------------------------------
# MIXINS
# ---------------------------------------------------------
@api.depends('name', 'event_id.name')
def _compute_website_url(self):
super(EventSponsor, self)._compute_website_url()
for sponsor in self:
if sponsor.id: # avoid to perform a slug on a not yet saved record in case of an onchange.
base_url = sponsor.event_id.get_base_url()
sponsor.website_url = '%s/event/%s/exhibitor/%s' % (base_url, slug(sponsor.event_id), slug(sponsor))
# ------------------------------------------------------------
# CRUD
# ------------------------------------------------------------
@api.model_create_multi
def create(self, values_list):
for values in values_list:
if values.get('is_exhibitor') and not values.get('room_name'):
exhibitor_name = values['name'] if values.get('name') else self.env['res.partner'].browse(values['partner_id']).name
name = 'odoo-exhibitor-%s' % exhibitor_name or 'sponsor'
values['room_name'] = name
return super(EventSponsor, self).create(values_list)
def write(self, values):
toupdate = self.env['event.sponsor']
if values.get('is_exhibitor') and not values.get('chat_room_id') and not values.get('room_name'):
toupdate = self.filtered(lambda exhibitor: not exhibitor.chat_room_id)
# go into sequential update in order to create a custom room name for each sponsor
for exhibitor in toupdate:
values['room_name'] = 'odoo-exhibitor-%s' % exhibitor.name
super(EventSponsor, exhibitor).write(values)
return super(EventSponsor, self - toupdate).write(values)
# ------------------------------------------------------------
# ACTIONS
# ---------------------------------------------------------
def get_backend_menu_id(self):
return self.env.ref('event.event_main_menu').id
|