Reproduce : - Login to the latest runbot 14.0 (BASE, not the main!) with the admin user - Install the apps "contacts" and "calendar". - Go to contacts and create a new contact with an email - Make a new company "Company B" and make sure that this is set as default company for the administrator user. - Set two different logo's on these companies so you can differentiate them. - Create a new meeting invitation and add the contact you created in step 2 to it. - Use the "Send mail" option on the meeting invite to make sure it gets sent. Then check in mailhog (it only comes in here after executing the queue cron for mails). - Now copy the link behind the "accept" button and copy it in an incognito. Result : The logo shown on the calendar invitation page is wrong as it uses the company logo from the company with ID 1 (first created company) while your logo in the email is the right one from your default company. Solution : The logo shown on the calendar invitation page is the one from the default company of the organizer if any, otherwise the one from the default company of the creator. opw-2579398 closes odoo/odoo#77907 X-original-commit: ffcaca15bd166d0dfe883a79e41a474b4a521d5a Signed-off-by: Arnaud Joset <arj-odoo@users.noreply.github.com>
104 lines
5.0 KiB
Python
104 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import odoo.http as http
|
|
|
|
from odoo.http import request
|
|
from odoo.tools.misc import get_lang
|
|
|
|
|
|
class CalendarController(http.Controller):
|
|
|
|
# YTI Note: Keep id and kwargs only for retrocompatibility purpose
|
|
@http.route('/calendar/meeting/accept', type='http', auth="calendar")
|
|
def accept_meeting(self, token, id, **kwargs):
|
|
attendee = request.env['calendar.attendee'].sudo().search([
|
|
('access_token', '=', token),
|
|
('state', '!=', 'accepted')])
|
|
attendee.do_accept()
|
|
return self.view_meeting(token, id)
|
|
|
|
@http.route('/calendar/recurrence/accept', type='http', auth="calendar")
|
|
def accept_recurrence(self, token, id, **kwargs):
|
|
attendee = request.env['calendar.attendee'].sudo().search([
|
|
('access_token', '=', token),
|
|
('state', '!=', 'accepted')])
|
|
if attendee:
|
|
attendees = request.env['calendar.attendee'].sudo().search([
|
|
('event_id', 'in', attendee.event_id.recurrence_id.calendar_event_ids.ids),
|
|
('partner_id', '=', attendee.partner_id.id),
|
|
('state', '!=', 'accepted'),
|
|
])
|
|
attendees.do_accept()
|
|
return self.view_meeting(token, id)
|
|
|
|
@http.route('/calendar/meeting/decline', type='http', auth="calendar")
|
|
def decline_meeting(self, token, id, **kwargs):
|
|
attendee = request.env['calendar.attendee'].sudo().search([
|
|
('access_token', '=', token),
|
|
('state', '!=', 'declined')])
|
|
attendee.do_decline()
|
|
return self.view_meeting(token, id)
|
|
|
|
@http.route('/calendar/recurrence/decline', type='http', auth="calendar")
|
|
def decline_recurrence(self, token, id, **kwargs):
|
|
attendee = request.env['calendar.attendee'].sudo().search([
|
|
('access_token', '=', token),
|
|
('state', '!=', 'declined')])
|
|
if attendee:
|
|
attendees = request.env['calendar.attendee'].sudo().search([
|
|
('event_id', 'in', attendee.event_id.recurrence_id.calendar_event_ids.ids),
|
|
('partner_id', '=', attendee.partner_id.id),
|
|
('state', '!=', 'declined'),
|
|
])
|
|
attendees.do_decline()
|
|
return self.view_meeting(token, id)
|
|
|
|
@http.route('/calendar/meeting/view', type='http', auth="calendar")
|
|
def view_meeting(self, token, id, **kwargs):
|
|
attendee = request.env['calendar.attendee'].sudo().search([
|
|
('access_token', '=', token),
|
|
('event_id', '=', int(id))])
|
|
if not attendee:
|
|
return request.not_found()
|
|
timezone = attendee.partner_id.tz
|
|
lang = attendee.partner_id.lang or get_lang(request.env).code
|
|
event = request.env['calendar.event'].with_context(tz=timezone, lang=lang).sudo().browse(int(id))
|
|
company = event.user_id and event.user_id.company_id or event.create_uid.company_id
|
|
|
|
# If user is internal and logged, redirect to form view of event
|
|
# otherwise, display the simplifyed web page with event informations
|
|
if request.session.uid and request.env['res.users'].browse(request.session.uid).user_has_groups('base.group_user'):
|
|
return request.redirect('/web?db=%s#id=%s&view_type=form&model=calendar.event' % (request.env.cr.dbname, id))
|
|
|
|
# NOTE : we don't use request.render() since:
|
|
# - we need a template rendering which is not lazy, to render before cursor closing
|
|
# - we need to display the template in the language of the user (not possible with
|
|
# request.render())
|
|
response_content = request.env['ir.ui.view'].with_context(lang=lang)._render_template(
|
|
'calendar.invitation_page_anonymous', {
|
|
'company': company,
|
|
'event': event,
|
|
'attendee': attendee,
|
|
})
|
|
return request.make_response(response_content, headers=[('Content-Type', 'text/html')])
|
|
|
|
@http.route('/calendar/meeting/join', type='http', auth="user", website=True)
|
|
def calendar_join_meeting(self, token, **kwargs):
|
|
event = request.env['calendar.event'].sudo().search([
|
|
('access_token', '=', token)])
|
|
if not event:
|
|
return request.not_found()
|
|
event.action_join_meeting(request.env.user.partner_id.id)
|
|
attendee = request.env['calendar.attendee'].sudo().search([('partner_id', '=', request.env.user.partner_id.id), ('event_id', '=', event.id)])
|
|
return request.redirect('/calendar/meeting/view?token=%s&id=%s' % (attendee.access_token, event.id))
|
|
|
|
# Function used, in RPC to check every 5 minutes, if notification to do for an event or not
|
|
@http.route('/calendar/notify', type='json', auth="user")
|
|
def notify(self):
|
|
return request.env['calendar.alarm_manager'].get_next_notif()
|
|
|
|
@http.route('/calendar/notify_ack', type='json', auth="user")
|
|
def notify_ack(self):
|
|
return request.env['res.partner'].sudo()._set_calendar_last_notif_ack()
|