[MERGE] event_*, website_event_*: clean ACLs and add a new group "Registration Desk"

[IMP] event_*: clean ACL and add a new group "Registration Desk" …

Purpose
=======

Clean the ACLs related to the Event application.

Add a new group to manage the registration in the entrance of an event. This
group should not be able to modify or remove records in Event but should be
able to create and manage the registrations.

Specifications
==============

Now, there are 3 event groups

  * ``Registration Desk User``, who can manage the registrations and
    read all event-related information;
  * ``Event User`` who can create event, sponsor, ticket... His role is
    to globally handle events on a day-to-day basis;
  * ``Event Administrator`` who can create event type, sponsor type,
    ticket type... His role is to manage the way events are managed withint
    its company:

Each group implies all previous groups.

Improve front-end so that event users can now perform some daily
operations directly in website, like publishing events or tracks.

Compared to previous event users gain a lot of rules, allowing to update
records like tickets, registrations, ... Low-end event users should now
use the registration desk group.

Links
=====

Task ID-2204364
COM #57022
ENT odoo/enterprise#13984
UPG odoo/upgrade#1897

Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
Odoo's Mergebot
2021-04-02 16:54:51 +02:00
committed by GitHub
41 changed files with 283 additions and 115 deletions
+13
View File
@@ -523,6 +523,19 @@ class EventEvent(models.Model):
default = dict(default or {}, name=_("%s (copy)") % (self.name))
return super(EventEvent, self).copy(default)
@api.model
def _get_mail_message_access(self, res_ids, operation, model_name=None):
if (
operation == 'create'
and self.env.user.has_group('event.group_event_registration_desk')
and (not model_name or model_name == 'event.event')
):
# allow the registration desk users to post messages on Event
# can not be done with "_mail_post_access" otherwise public user will be
# able to post on published Event (see website_event)
return 'read'
return super(EventEvent, self)._get_mail_message_access(res_ids, operation, model_name)
def _sync_required_computed(self, values):
# TODO: See if the change to seats_limited affects this ?
""" Call compute fields in cache to find missing values for required fields
@@ -21,6 +21,7 @@ class EventRegistration(models.Model):
event_ticket_id = fields.Many2one(
'event.event.ticket', string='Event Ticket', readonly=True, ondelete='restrict',
states={'draft': [('readonly', False)]})
active = fields.Boolean(default=True)
# utm informations
utm_campaign_id = fields.Many2one('utm.campaign', 'Campaign', index=True, ondelete='set null')
utm_source_id = fields.Many2one('utm.source', 'Source', index=True, ondelete='set null')
+2 -4
View File
@@ -1,20 +1,18 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
event_count = fields.Integer(
'# Events', compute='_compute_event_count', groups='event.group_event_user',
'# Events', compute='_compute_event_count', groups='event.group_event_registration_desk',
help='Number of events the partner has participated.')
def _compute_event_count(self):
self.event_count = 0
if not self.user_has_groups('event.group_event_user'):
return
for partner in self:
partner.event_count = self.env['event.event'].search_count([('registration_ids.partner_id', 'child_of', partner.ids)])
+7 -1
View File
@@ -6,9 +6,15 @@
<field name="sequence">18</field>
</record>
<record id="group_event_registration_desk" model="res.groups">
<field name="name">Registration Desk</field>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="category_id" ref="base.module_category_marketing_events"/>
</record>
<record id="group_event_user" model="res.groups">
<field name="name">User</field>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="implied_ids" eval="[(4, ref('group_event_registration_desk'))]"/>
<field name="category_id" ref="base.module_category_marketing_events"/>
</record>
+18 -15
View File
@@ -1,24 +1,27 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_event_type_user,event.type.user,model_event_type,event.group_event_user,1,0,0,0
access_event_type_registration,event.type.registration,model_event_type,event.group_event_registration_desk,1,0,0,0
access_event_type_manager,event.type.manager,model_event_type,event.group_event_manager,1,1,1,1
access_event_type_ticket_user,event.type.ticket.user,model_event_type_ticket,event.group_event_user,1,0,0,0
access_event_type_ticket_registration,event.type.ticket.registration,model_event_type_ticket,event.group_event_registration_desk,1,0,0,0
access_event_type_ticket_manager,event.type.ticket.manager,model_event_type_ticket,event.group_event_manager,1,1,1,1
access_event_event,event.event,model_event_event,,1,0,0,0
access_event_event_user,event.event.user,model_event_event,event.group_event_user,1,0,0,0
access_event_event_registration,event.event.registration,model_event_event,event.group_event_registration_desk,1,0,0,0
access_event_event_user,event.event.user,model_event_event,event.group_event_user,1,1,1,0
access_event_event_manager,event.event.manager,model_event_event,event.group_event_manager,1,1,1,1
access_event_event_ticket_user,event.event.ticket.user,model_event_event_ticket,event.group_event_user,1,0,0,0
access_event_event_ticket_manager,event.event.ticket.manager,model_event_event_ticket,event.group_event_manager,1,1,1,1
access_event_registration_user,event.registration.user,model_event_registration,event.group_event_user,1,1,1,1
access_event_event_ticket,event.event.ticket,model_event_event_ticket,,0,0,0,0
access_event_event_ticket_user,event.event.ticket.user,model_event_event_ticket,event.group_event_user,1,1,1,1
access_event_registration,event.registration,model_event_registration,,0,0,0,0
access_event_mail_user,event.mail.user,model_event_mail,event.group_event_user,1,0,0,0
access_event_mail_manager,event.mail.manager,model_event_mail,event.group_event_manager,1,1,1,1
access_event_mail_registration_user,event.mail.registration.user,model_event_mail_registration,event.group_event_user,1,0,0,0
access_event_registration_registration,event.registration.registration,model_event_registration,event.group_event_registration_desk,1,1,1,0
access_event_registration_manager,event.registration.manager,model_event_registration,event.group_event_manager,1,1,1,1
access_event_mail_registration,event.mail.registration,model_event_mail,event.group_event_registration_desk,1,0,0,0
access_event_mail_user,event.mail.user,model_event_mail,event.group_event_user,1,1,1,1
access_event_mail_registration_registration,event.mail.registration.registration,model_event_mail_registration,event.group_event_registration_desk,1,0,0,0
access_event_mail_registration_manager,event.mail.registration.manager,model_event_mail_registration,event.group_event_manager,1,1,1,1
access_event_type_mail_user,event.type.mail.user,model_event_type_mail,event.group_event_user,1,0,0,0
access_event_type_mail_registration,event.type.mail.registration,model_event_type_mail,event.group_event_registration_desk,1,0,0,0
access_event_type_mail_manager,event.type.mail.manager,model_event_type_mail,event.group_event_manager,1,1,1,1
access_event_stage_user,event.stage.user,model_event_stage,event.group_event_user,1,1,1,1
access_event_stage_registration,event.stage.registration,model_event_stage,event.group_event_registration_desk,1,0,0,0
access_event_stage_manager,event.stage.manager,model_event_stage,event.group_event_manager,1,1,1,1
access_event_tag_category_user,event.tag.category.user,model_event_tag_category,event.group_event_user,1,0,0,0
access_event_tag_category_manager,event.tag.category.manager,model_event_tag_category,event.group_event_manager,1,1,1,1
access_event_tag_user,event.tag.user,model_event_tag,event.group_event_user,1,1,0,0
access_event_tag_category_registration,event.tag.category.registration,model_event_tag_category,event.group_event_registration_desk,1,0,0,0
access_event_tag_category_user,event.tag.category.user,model_event_tag_category,event.group_event_user,1,1,1,1
access_event_tag,event.tag,model_event_tag,,0,0,0,0
access_event_tag_registration,event.tag.user,model_event_tag,event.group_event_registration_desk,1,0,0,0
access_event_tag_user,event.tag.user,model_event_tag,event.group_event_user,1,1,1,0
access_event_tag_manager,event.tag.manager,model_event_tag,event.group_event_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_event_type_user access_event_type_registration event.type.user event.type.registration model_event_type event.group_event_user event.group_event_registration_desk 1 0 0 0
3 access_event_type_manager event.type.manager model_event_type event.group_event_manager 1 1 1 1
4 access_event_type_ticket_user access_event_type_ticket_registration event.type.ticket.user event.type.ticket.registration model_event_type_ticket event.group_event_user event.group_event_registration_desk 1 0 0 0
5 access_event_type_ticket_manager event.type.ticket.manager model_event_type_ticket event.group_event_manager 1 1 1 1
6 access_event_event access_event_event_registration event.event event.event.registration model_event_event event.group_event_registration_desk 1 0 0 0
7 access_event_event_user event.event.user model_event_event event.group_event_user 1 0 1 0 1 0
8 access_event_event_manager event.event.manager model_event_event event.group_event_manager 1 1 1 1
9 access_event_event_ticket_user access_event_event_ticket event.event.ticket.user event.event.ticket model_event_event_ticket event.group_event_user 1 0 0 0 0
10 access_event_event_ticket_manager access_event_event_ticket_user event.event.ticket.manager event.event.ticket.user model_event_event_ticket event.group_event_manager event.group_event_user 1 1 1 1
access_event_registration_user event.registration.user model_event_registration event.group_event_user 1 1 1 1
11 access_event_registration event.registration model_event_registration 0 0 0 0
12 access_event_mail_user access_event_registration_registration event.mail.user event.registration.registration model_event_mail model_event_registration event.group_event_user event.group_event_registration_desk 1 0 1 0 1 0
13 access_event_mail_manager access_event_registration_manager event.mail.manager event.registration.manager model_event_mail model_event_registration event.group_event_manager 1 1 1 1
14 access_event_mail_registration_user access_event_mail_registration event.mail.registration.user event.mail.registration model_event_mail_registration model_event_mail event.group_event_user event.group_event_registration_desk 1 0 0 0
15 access_event_mail_user event.mail.user model_event_mail event.group_event_user 1 1 1 1
16 access_event_mail_registration_registration event.mail.registration.registration model_event_mail_registration event.group_event_registration_desk 1 0 0 0
17 access_event_mail_registration_manager event.mail.registration.manager model_event_mail_registration event.group_event_manager 1 1 1 1
18 access_event_type_mail_user access_event_type_mail_registration event.type.mail.user event.type.mail.registration model_event_type_mail event.group_event_user event.group_event_registration_desk 1 0 0 0
19 access_event_type_mail_manager event.type.mail.manager model_event_type_mail event.group_event_manager 1 1 1 1
20 access_event_stage_user access_event_stage_registration event.stage.user event.stage.registration model_event_stage event.group_event_user event.group_event_registration_desk 1 1 0 1 0 1 0
21 access_event_stage_manager event.stage.manager model_event_stage event.group_event_manager 1 1 1 1
22 access_event_tag_category_user access_event_tag_category_registration event.tag.category.user event.tag.category.registration model_event_tag_category event.group_event_user event.group_event_registration_desk 1 0 0 0
23 access_event_tag_category_manager access_event_tag_category_user event.tag.category.manager event.tag.category.user model_event_tag_category event.group_event_manager event.group_event_user 1 1 1 1
24 access_event_tag_user access_event_tag event.tag.user event.tag model_event_tag event.group_event_user 1 0 1 0 0 0
25 access_event_tag_registration event.tag.user model_event_tag event.group_event_registration_desk 1 0 0 0
26 access_event_tag_user event.tag.user model_event_tag event.group_event_user 1 1 1 0
27 access_event_tag_manager event.tag.manager model_event_tag event.group_event_manager 1 1 1 1
+7
View File
@@ -27,6 +27,13 @@ class TestEventCommon(common.TransactionCase):
company_id=cls.env.ref("base.main_company").id,
groups='base.group_user',
)
cls.user_eventregistrationdesk = mail_new_test_user(
cls.env, login='user_eventregistrationdesk',
name='Ursule EventRegistration', email='ursule.eventregistration@test.example.com',
tz='Europe/Brussels', notification_type='inbox',
company_id=cls.env.ref("base.main_company").id,
groups='base.group_user,event.group_event_registration_desk',
)
cls.user_eventuser = mail_new_test_user(
cls.env, login='user_eventuser',
name='Ursule EventUser', email='ursule.eventuser@test.example.com',
+3 -3
View File
@@ -5,7 +5,7 @@
<menuitem name="Events"
id="event_main_menu"
sequence="65"
groups="event.group_event_user"
groups="event.group_event_registration_desk"
web_icon="event,static/description/icon.png"/>
<!-- HEADER: EVENTS -->
@@ -13,14 +13,14 @@
id="menu_event_event"
sequence="1"
parent="event.event_main_menu"
groups="event.group_event_user"/>
groups="event.group_event_registration_desk"/>
<!-- HEADER: REPORTING -->
<menuitem name="Reporting"
id="menu_reporting_events"
sequence="50"
parent="event_main_menu"
groups="event.group_event_manager"/>
groups="event.group_event_user"/>
<!-- HEADER: CONFIGURATION -->
<menuitem name="Configuration"
+2 -2
View File
@@ -501,7 +501,7 @@
action="event_event_action_pivot"
sequence="3"
parent="event.menu_reporting_events"
groups="event.group_event_manager"/>
groups="event.group_event_user"/>
<!-- EVENT.REGISTRATION VIEWS -->
<record model="ir.ui.view" id="view_event_registration_tree">
@@ -739,7 +739,7 @@
parent="event.menu_reporting_events"
sequence="4"
action="action_registration"
groups="event.group_event_manager"/>
groups="event.group_event_user"/>
<!-- EVENT.MAIL VIEWS -->
<record model="ir.ui.view" id="view_event_mail_form">
+2 -2
View File
@@ -11,11 +11,11 @@ class Lead(models.Model):
event_id = fields.Many2one('event.event', string="Source Event", help="Event triggering the rule that created this lead")
registration_ids = fields.Many2many(
'event.registration', string="Source Registrations",
groups='event.group_event_user',
groups='event.group_event_registration_desk',
help="Registrations triggering the rule that created this lead")
registration_count = fields.Integer(
string="# Registrations", compute='_compute_registration_count',
groups='event.group_event_user',
groups='event.group_event_registration_desk',
help="Counter for the registrations linked to this lead")
@api.depends('registration_ids')
@@ -14,7 +14,7 @@ class EventRegistration(models.Model):
groups='sales_team.group_sale_salesman',
help="Leads generated from the registration.")
lead_count = fields.Integer(
'# Leads', compute='_compute_lead_count', groups='sales_team.group_sale_salesman',
'# Leads', compute='_compute_lead_count', compute_sudo=True,
help="Counter for the leads linked to this registration")
@api.depends('lead_ids')
@@ -57,7 +57,7 @@ class EventRegistration(models.Model):
"""
to_update, event_lead_rule_skip = False, self.env.context.get('event_lead_rule_skip')
if not event_lead_rule_skip:
to_update = self.filtered(lambda reg: reg.lead_ids)
to_update = self.filtered(lambda reg: reg.lead_count)
if to_update:
lead_tracked_vals = to_update._get_lead_tracked_values()
@@ -1,4 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_event_crm_manager,event.lead.rule.manager,model_event_lead_rule,event.group_event_manager,1,1,1,1
access_event_crm_registration,event.lead.rule.user,model_event_lead_rule,event.group_event_registration_desk,1,0,0,0
access_event_crm_user,event.lead.rule.user,model_event_lead_rule,event.group_event_user,1,0,0,0
access_event_crm_manager,event.lead.rule.manager,model_event_lead_rule,event.group_event_manager,1,1,1,1
access_event_crm_salesman,event.lead.rule.salesman,model_event_lead_rule,sales_team.group_sale_salesman,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_event_crm_manager access_event_crm_registration event.lead.rule.manager event.lead.rule.user model_event_lead_rule event.group_event_manager event.group_event_registration_desk 1 1 0 1 0 1 0
3 access_event_crm_user event.lead.rule.user model_event_lead_rule event.group_event_user 1 0 0 0
4 access_event_crm_manager event.lead.rule.manager model_event_lead_rule event.group_event_manager 1 1 1 1
5 access_event_crm_salesman event.lead.rule.salesman model_event_lead_rule sales_team.group_sale_salesman 1 0 0 0
+24 -3
View File
@@ -24,7 +24,7 @@ class TestEventCrmFlow(TestEventCrmCommon):
self.assertEqual(self.event_customer.phone, '0485112233')
self.assertFalse(self.event_customer.mobile)
@users('user_eventmanager')
@users('user_eventregistrationdesk')
def test_event_crm_flow_batch_create(self):
""" Test attendee- and order-based registrations creation. Event-based
creation mimics a simplified website_event flow where grouping is done
@@ -58,7 +58,7 @@ class TestEventCrmFlow(TestEventCrmCommon):
# ensuring filtering out worked also at description level
self.assertNotIn('invalid@not.example.com', lead.description)
@users('user_eventmanager')
@users('user_eventregistrationdesk')
def test_event_crm_flow_batch_update(self):
""" Test update of contact or description fields that leads to lead
update. """
@@ -96,7 +96,7 @@ class TestEventCrmFlow(TestEventCrmCommon):
# ensuring filtering out worked also at description level
self.assertNotIn('invalid@not.example.com', lead.description)
@users('user_eventmanager')
@users('user_eventregistrationdesk')
def test_event_crm_flow_per_attendee_single(self):
self.assert_initial_data()
@@ -145,3 +145,24 @@ class TestEventCrmFlow(TestEventCrmCommon):
})
self.assertEqual(len(self.event_0.registration_ids), 4)
self.assertLeadConvertion(self.test_rule_attendee, registration, partner=None)
@users('user_eventregistrationdesk')
def test_event_crm_trigger_done(self):
"""Test the case when the "crm.lead.rule" is executed when we write on the
registration state. """
registration = self.env['event.registration'].create({
'partner_id': self.event_customer.id,
'email': 'trigger.test@not.test.example.com',
'phone': False,
'mobile': '0456112233',
'event_id': self.event_0.id,
})
leads = self.env['crm.lead'].sudo().search([
('registration_ids', 'in', registration.ids),
])
self.assertFalse(leads, 'The lead must not be created yet')
registration.action_set_done()
self.assertLeadConvertion(self.test_rule_order_done, registration)
@@ -2,7 +2,7 @@
<odoo>
<data noupdate="0">
<record id="sales_team.group_sale_salesman" model="res.groups">
<field name="implied_ids" eval="[(4, ref('event.group_event_user'))]"/>
<field name="implied_ids" eval="[(4, ref('event.group_event_registration_desk'))]"/>
</record>
</data>
</odoo>
@@ -37,7 +37,8 @@
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button name="action_view_sale_order" type="object"
class="oe_stat_button" icon="fa-usd" string="Sale Order">
class="oe_stat_button" icon="fa-usd" string="Sale Order"
groups="sales_team.group_sale_salesman">
</button>
</xpath>
<xpath expr="//group" position="before">
@@ -15,12 +15,11 @@ class TestEventSecurity(TestEventCommon):
@users('user_employee')
@mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model')
def test_event_access_employee(self):
# employee can read events (sure ?)
# Event: read ok
event = self.event_0.with_user(self.env.user)
event.read(['name'])
# event.stage_id.read(['name', 'description'])
# event.event_type_id.read(['name', 'has_seats_limitation'])
# Event: read only
with self.assertRaises(AccessError):
self.env['event.event'].create({
'name': 'TestEvent',
@@ -29,39 +28,80 @@ class TestEventSecurity(TestEventCommon):
'seats_limited': True,
'seats_max': 10,
})
with self.assertRaises(AccessError):
event.write({
'name': 'TestEvent Modified',
})
# Event Type
with self.assertRaises(AccessError):
self.event_type_complex.with_user(self.env.user).read(['name'])
with self.assertRaises(AccessError):
self.event_type_complex.with_user(self.env.user).write({'name': 'Test Write'})
# Event Stage
with self.assertRaises(AccessError):
self.env['event.stage'].create({
'name': 'TestStage',
})
@users('user_eventuser')
# Event Registration
with self.assertRaises(AccessError):
self.env['event.registration'].search([])
@users('user_eventregistrationdesk')
@mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model')
def test_event_access_event_user(self):
def test_event_access_event_registration(self):
# Event: read ok
event = self.event_0.with_user(self.env.user)
event.read(['name', 'user_id', 'kanban_state_label'])
# Event: read only
with self.assertRaises(AccessError):
self.env['event.event'].create({
'name': 'TestEvent',
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
})
event.name = 'Test'
with self.assertRaises(AccessError):
event.unlink()
# Event Registration
registration = self.env['event.registration'].create({
'event_id': self.event_0.id,
})
self.assertEqual(registration.event_id.name, self.event_0.name, 'Registration users should be able to read')
registration.name = 'Test write'
with self.assertRaises(AccessError):
event.write({
'name': 'TestEvent Modified',
registration.unlink()
@users('user_eventuser')
@mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model')
def test_event_access_event_user(self):
# Event
event = self.event_0.with_user(self.env.user)
event.read(['name', 'user_id', 'kanban_state_label'])
event.write({'name': 'New name'})
self.env['event.event'].create({
'name': 'Event',
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
})
# Event: cannot unlink
with self.assertRaises(AccessError):
event.unlink()
# Event Type
with self.assertRaises(AccessError):
self.env['event.type'].create({
'name': 'ManagerEventType',
'use_mail_schedule': True,
'event_type_mail_ids': [(5, 0), (0, 0, {
'interval_nbr': 1, 'interval_unit': 'days', 'interval_type': 'before_event',
'template_id': self.env['ir.model.data'].xmlid_to_res_id('event.event_reminder')})]
})
@users('user_eventmanager')
@mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model')
def test_event_access_event_manager(self):
# EventManager can do about everything
# Event Type
event_type = self.env['event.type'].create({
'name': 'ManagerEventType',
'use_mail_schedule': True,
@@ -69,21 +109,26 @@ class TestEventSecurity(TestEventCommon):
'interval_nbr': 1, 'interval_unit': 'days', 'interval_type': 'before_event',
'template_id': self.env['ir.model.data'].xmlid_to_res_id('event.event_reminder')})]
})
event_type.write({'name': 'New Name'})
# Event
event = self.env['event.event'].create({
'name': 'ManagerEvent',
'event_type_id': event_type.id,
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
})
event.write({'name': 'New Event Name'})
registration = self.env['event.registration'].create({'event_id': event.id, 'name': 'Myself'})
registration.write({'name': 'Myself2'})
# Event Stage
stage = self.env['event.stage'].create({'name': 'test'})
stage.write({'name': 'ManagerTest'})
event.write({'stage_id': stage.id})
# Event Registration
registration = self.env['event.registration'].create({'event_id': event.id, 'name': 'Myself'})
registration.write({'name': 'Myself2'})
registration.unlink()
event.unlink()
stage.unlink()
event_type.unlink()
@@ -97,3 +142,73 @@ class TestEventSecurity(TestEventCommon):
event_config = self.env['res.config.settings'].with_user(self.user_eventmanager).create({
})
event_config.execute()
def test_implied_groups(self):
"""Test that the implied groups are correctly set.
- Event Manager imply Event User
- Event User imply Registration user
"""
# Event Manager
self.assertTrue(
self.user_eventmanager.has_group('event.group_event_user'),
'The event manager group must imply the event user group')
self.assertTrue(
self.user_eventmanager.has_group('event.group_event_registration_desk'),
'The event manager group must imply the registration user group')
# Event User
self.assertTrue(
self.user_eventuser.has_group('event.group_event_registration_desk'),
'The event user group must imply the event user group')
self.assertFalse(
self.user_eventuser.has_group('event.group_event_manager'),
'The event user group must not imply the event user group')
# Registration User
self.assertFalse(
self.user_eventregistrationdesk.has_group('event.group_event_manager'),
'The event registration group must not imply the event user manager')
self.assertFalse(
self.user_eventregistrationdesk.has_group('event.group_event_user'),
'The event registration group must not imply the event user group')
def test_multi_companies(self):
"""Test ACLs with multi company. """
company_1 = self.env.ref("base.main_company")
company_2 = self.env['res.company'].create({'name': 'Company 2'})
user_company_1 = self.user_eventuser
event_company_1, event_company_2 = self.env['event.event'].create([
{
'name': 'Event Company 1',
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
'company_id': company_1.id,
}, {
'name': 'Event Company 2',
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
'company_id': company_2.id,
}
])
registration_company_1, registration_company_2 = self.env['event.registration'].create([
{
'name': 'Registration Company 1',
'event_id': event_company_1.id,
'company_id': company_1.id,
}, {
'name': 'Registration Company 2',
'event_id': event_company_2.id,
'company_id': company_2.id,
}
])
result = self.env['event.event'].with_user(user_company_1).search([])
self.assertIn(event_company_1, result, 'You must be able to read the events in your company')
self.assertNotIn(event_company_2, result, 'You must not be able to read events outside of your company')
result = self.env['event.registration'].with_user(user_company_1).search([])
self.assertIn(registration_company_1, result, 'You must be able to read the registrations in your company')
self.assertNotIn(registration_company_2, result, 'You must not be able to read registrations outside of your company')
+2 -1
View File
@@ -315,8 +315,9 @@ class Event(models.Model):
:param menu_type: type of menu. Mainly used for inheritance purpose
allowing more fine-grain tuning of menus. """
self.check_access_rights('write')
if not url:
self.env['ir.ui.view'].with_context(_force_unlink=True).search([('name', '=', name + ' ' + self.name)]).unlink()
self.env['ir.ui.view'].with_context(_force_unlink=True).sudo().search([('name', '=', name + ' ' + self.name)]).unlink()
page_result = self.env['website'].sudo().new_page(name + ' ' + self.name, template=xml_id, ispage=False)
url = "/event/" + slug(self) + "/page" + page_result['url'] # url contains starting "/"
website_menu = self.env['website.menu'].sudo().create({
@@ -13,15 +13,15 @@ class WebsiteVisitor(models.Model):
help="Main identity")
event_registration_ids = fields.One2many(
'event.registration', 'visitor_id', string='Event Registrations',
groups="event.group_event_user")
groups="event.group_event_registration_desk")
event_registration_count = fields.Integer(
'# Registrations', compute='_compute_event_registration_count',
groups="event.group_event_user")
groups="event.group_event_registration_desk")
event_registered_ids = fields.Many2many(
'event.event', string="Registered Events",
compute="_compute_event_registered_ids", compute_sudo=True,
search="_search_event_registered_ids",
groups="event.group_event_user")
groups="event.group_event_registration_desk")
@api.depends('event_registration_ids')
def _compute_event_registration_count(self):
@@ -1,11 +1,8 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_event_event_public,event.event.public,event.model_event_event,base.group_public,1,0,0,0
access_event_event_portal,event.event.portal,event.model_event_event,base.group_portal,1,0,0,0
access_event_event,event.event,model_event_event,,1,0,0,0
access_event_type,event.type,event.model_event_type,,0,0,0,0
access_event_event_ticket_public,event.event.ticket.public,event.model_event_event_ticket,base.group_public,1,0,0,0
access_event_event_ticket_portal,event.event.ticket.portal,event.model_event_event_ticket,base.group_portal,1,0,0,0
access_event_tag_category,event.tag.category,event.model_event_tag_category,,1,0,0,0
access_event_tag,event.tag,event.model_event_tag,,1,0,0,0
access_website_event_menu,website.event.menu,model_website_event_menu,,1,0,0,0
access_website_event_menu_manager,website.event.menu.manager,model_website_event_menu,event.group_event_manager,1,1,1,1
access_website_event_menu_user,website.event.menu.user,model_website_event_menu,event.group_event_user,1,1,1,1
access_website_visitor_user,website.visitor.user,model_website_visitor,event.group_event_user,1,1,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_event_event_public access_event_event event.event.public event.event event.model_event_event model_event_event base.group_public 1 0 0 0
access_event_event_portal event.event.portal event.model_event_event base.group_portal 1 0 0 0
3 access_event_type event.type event.model_event_type 0 0 0 0
access_event_event_ticket_public event.event.ticket.public event.model_event_event_ticket base.group_public 1 0 0 0
access_event_event_ticket_portal event.event.ticket.portal event.model_event_event_ticket base.group_portal 1 0 0 0
4 access_event_tag_category event.tag.category event.model_event_tag_category 1 0 0 0
5 access_event_tag event.tag event.model_event_tag 1 0 0 0
6 access_website_event_menu website.event.menu model_website_event_menu 1 0 0 0
7 access_website_event_menu_manager access_website_event_menu_user website.event.menu.manager website.event.menu.user model_website_event_menu event.group_event_manager event.group_event_user 1 1 1 1
8 access_website_visitor_user website.visitor.user model_website_visitor event.group_event_user 1 1 0 0
@@ -155,7 +155,7 @@
<t t-if="not event_ids">
<div class="col-12">
<div class="h2 mb-3">No events found.</div>
<div class="alert alert-info text-center" groups="event.group_event_manager">
<div class="alert alert-info text-center" groups="event.group_event_user">
<p class="m-0">Use the top button '<b>+ New</b>' to create an event.</p>
</div>
</div>
@@ -104,7 +104,7 @@ class ExhibitorController(WebsiteEventController):
'sponsor_countries': sponsor_countries,
# environment
'hostname': request.httprequest.host.split(':')[0],
'user_event_manager': request.env.user.has_group('event.group_event_manager'),
'is_event_user': request.env.user.has_group('event.group_event_user'),
}
# ------------------------------------------------------------
@@ -158,10 +158,10 @@ class ExhibitorController(WebsiteEventController):
'sponsors_other': sponsors_other[:30],
# options
'option_widescreen': option_widescreen,
'option_can_edit': request.env.user.has_group('event.group_event_manager'),
'option_can_edit': request.env.user.has_group('event.group_event_user'),
# environment
'hostname': request.httprequest.host.split(':')[0],
'user_event_manager': request.env.user.has_group('event.group_event_manager'),
'is_event_user': request.env.user.has_group('event.group_event_user'),
}
# ------------------------------------------------------------
@@ -123,7 +123,7 @@
<div t-if="search_key" class="alert alert-info text-center">
<p class="m-0">We did not find any exhibitor matching your <strong t-esc="search_key"/> search.</p>
</div>
<div t-else="" class="alert alert-info text-center" groups="event.group_event_manager">
<div t-else="" class="alert alert-info text-center" groups="event.group_event_user">
<p class="m-0">Add some exhibitors to get started !</p>
</div>
</div>
@@ -162,7 +162,7 @@
t-att-data-sponsor-id="sponsor.id"
t-att-data-event-is-ongoing="sponsor.event_id.is_ongoing"
t-att-data-sponsor-is-ongoing="sponsor.is_in_opening_hours"
t-att-data-user-event-manager="user_event_manager">
t-att-data-user-event-manager="is_event_user">
<div t-if="sponsor_image_url" class="card-img-top position-static o_wesponsor_bg_image"
t-attf-style="padding-top: 50%; background-image: url(#{sponsor_image_url});">
<small t-if="not sponsor.is_published" class="o_wesponsor_card_header_badge bg-danger">
@@ -170,7 +170,7 @@
</small>
<div class="o_wesponsor_connect_button">
<a href="#" class="btn btn-primary h3">
<t t-if="not user_event_manager and not sponsor.event_id.is_ongoing and not event.is_participating">
<t t-if="not is_event_user and not sponsor.event_id.is_ongoing and not event.is_participating">
Register
</t>
<t t-elif="sponsor.exhibitor_type == 'online'">Connect</t>
@@ -190,7 +190,7 @@
</small>
<div class="o_wesponsor_connect_button">
<a href="#" class="btn btn-primary h3">
<t t-if="not user_event_manager and not sponsor.event_id.is_ongoing and not event.is_participating">
<t t-if="not is_event_user and not sponsor.event_id.is_ongoing and not event.is_participating">
Register
</t>
<t t-else="">Connect</t>
@@ -49,7 +49,8 @@
t-options="{'format': 'medium'}"/> (<t t-esc="sponsor.event_id.date_tz"/>).
</span>
<br/>
<span>Join us there to meet <b t-esc="sponsor.partner_name"/> !</span>
<span t-if="is_event_user">Attendees will be able to join to meet <b t-esc="sponsor.partner_name"/> .</span>
<span t-else="">Join us there to meet <b t-esc="sponsor.partner_name"/> !</span>
</div>
</t>
<!-- SPONSOR JITSI + CLOSED/FULL ALERTS -->
@@ -51,8 +51,8 @@ class WebsiteEventMeetController(EventCommunityController):
meeting_rooms = request.env['event.meeting.room'].sudo().search(search_domain)
meeting_rooms = meeting_rooms.sorted(self._sort_event_rooms, reverse=True)
is_event_manager = request.env.user.has_group("event.group_event_manager")
if not is_event_manager:
is_event_user = request.env.user.has_group("event.group_event_user")
if not is_event_user:
meeting_rooms = meeting_rooms.filtered(lambda m: not m.room_is_full)
visitor = request.env['website.visitor']._get_visitor_from_request()
@@ -68,7 +68,7 @@ class WebsiteEventMeetController(EventCommunityController):
"default_lang_code": request.context.get('lang', request.env.user.lang),
"default_username": visitor.display_name if visitor else None,
# environment
"is_event_manager": is_event_manager,
"is_event_user": is_event_user,
}
@http.route("/event/<model('event.event'):event>/meeting_room_create",
@@ -155,5 +155,5 @@ class WebsiteEventMeetController(EventCommunityController):
'meeting_rooms_other': meeting_rooms_other,
# options
'option_widescreen': True,
'is_event_manager': request.env.user.has_group('event.group_event_manager'),
'is_event_user': request.env.user.has_group('event.group_event_manager'),
}
@@ -1,6 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_event_meeting_room,event.meeting.room,model_event_meeting_room,,1,0,0,0
access_event_meeting_room_user,event.meeting.room.user,model_event_meeting_room,event.group_event_user,1,0,0,0
access_event_meeting_room_manager,event.meeting.room.manager,model_event_meeting_room,event.group_event_manager,1,1,1,1
access_chat_room_user,chat.room.user,website_jitsi.model_chat_room,event.group_event_user,1,0,0,0
access_chat_room_manager,chat.room.manager,website_jitsi.model_chat_room,event.group_event_manager,1,1,1,1
access_event_meeting_room_user,event.meeting.room.user,model_event_meeting_room,event.group_event_user,1,1,1,1
access_chat_room_registration,chat.room.registration,website_jitsi.model_chat_room,event.group_event_registration_desk,1,0,0,0
access_chat_room_user,chat.room.user,website_jitsi.model_chat_room,event.group_event_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_event_meeting_room event.meeting.room model_event_meeting_room 1 0 0 0
3 access_event_meeting_room_user event.meeting.room.user model_event_meeting_room event.group_event_user 1 0 1 0 1 0 1
4 access_event_meeting_room_manager access_chat_room_registration event.meeting.room.manager chat.room.registration model_event_meeting_room website_jitsi.model_chat_room event.group_event_manager event.group_event_registration_desk 1 1 0 1 0 1 0
5 access_chat_room_user chat.room.user website_jitsi.model_chat_room event.group_event_user 1 0 1 0 1 0 1
access_chat_room_manager chat.room.manager website_jitsi.model_chat_room event.group_event_manager 1 1 1 1
@@ -55,7 +55,7 @@
</template>
<template id="meeting_room_card" name="Meeting Room Card">
<div class="modal o_join_later_modal" t-attf-id="o_join_later_modal_#{meeting_room.id}" tabindex="-1" role="dialog" style="height: 400px; top:calc(50% - 200px);">
<div class="modal o_join_later_modal fixed-top" t-attf-id="o_join_later_modal_#{meeting_room.id}" tabindex="-1" role="dialog" style="top: 0">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="mt-4 col-12 alert alert-warning text-center" role="alert">
@@ -95,7 +95,7 @@
</div>
<!-- Action to do when clicking on the card -->
<t t-if="event.is_ongoing or is_event_manager">
<t t-if="event.is_ongoing or is_event_user">
<!--During the event or if event manager-->
<t t-set="meeting_room_href" t-value="'/event/' + slug(event) + '/meeting_room/' + slug(meeting_room)"/>
</t>
@@ -110,10 +110,10 @@
<t t-set="meeting_room_data_target" t-value="'#o_join_later_modal_%i' % meeting_room.id"/>
</t>
<a t-if="is_event_manager or not meeting_room.room_is_full"
<a t-if="is_event_user or not meeting_room.room_is_full"
t-att-data-meeting-room-id="meeting_room.id"
t-att-data-open-room="opened"
t-att-data-is-event-manager="int(is_event_manager)"
t-att-data-is-event-manager="int(is_event_user)"
t-attf-class="card o_wevent_meeting_room_card w-100 my-2 bg-light d-block text-decoration-none"
t-att-href="meeting_room_href"
t-att-data-toggle="meeting_room_data_toggle"
@@ -123,7 +123,7 @@
<div class="d-flex flex-column">
<div class="d-flex flex-row justify-content-between">
<h4 class="text-break mw-75 text-uppercase" t-esc="meeting_room.name"/>
<div t-if="is_event_manager" class="w-25">
<div t-if="is_event_user" class="w-25">
<div class="dropdown float-right dropleft">
<button class="btn py-0" data-toggle="dropdown"><h3 class="m-0">&#8942;</h3></button>
<div class="dropdown-menu">
@@ -163,7 +163,7 @@
<p>Want to create your own discussion room ?</p>
<a href="#" role="button"
class="btn btn-primary o_wevent_create_room_button"
t-if="event.is_ongoing or event.start_today or is_event_manager"
t-if="event.is_ongoing or event.start_today or is_event_user"
t-att-data-event-id="event.id"
t-att-data-default-lang-code="default_lang_code">
<span>Create a Room</span>
@@ -54,7 +54,7 @@
</t>
<!-- ROOM CONTENT -->
<div class="d-flex flex-column">
<div t-if="meeting_room.room_is_full and not is_event_manager" class="alert alert-warning text-center">
<div t-if="meeting_room.room_is_full and not is_event_user" class="alert alert-warning text-center">
<span>Oops! This room is full !</span><br />Come back later to have a chat with us!
</div>
<div t-else="" class="d-flex flex-column">
@@ -72,7 +72,7 @@
<t t-set="auto_open" t-value="1"/>
<t t-set="attach_to" t-value="'#o_wemeet_jitsi_iframe'"/>
<t t-set="max_capacity" t-value="meeting_room.room_max_capacity"/>
<t t-set="check_full" t-value="int(not is_event_manager)"/>
<t t-set="check_full" t-value="int(not is_event_user)"/>
<t t-set="default_username" t-value="default_username"/>
<t t-set="jitsi_server_domain" t-value="meeting_room.chat_room_id.jitsi_server_domain"/>
</t>
@@ -2,5 +2,6 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_event_question,event.question,model_event_question,,1,0,0,0
access_event_question_user,event.question.user,model_event_question,event.group_event_user,1,1,1,1
access_event_question_answer,event.question.answer,model_event_question_answer,,1,0,0,0
access_event_question_answer_registration,event.question.answer.registration,model_event_question_answer,event.group_event_registration_desk,1,1,0,0
access_event_question_answer_user,event.question.answer.user,model_event_question_answer,event.group_event_user,1,1,1,1
access_event_registration_answer_user,event.registration.answer.user,model_event_registration_answer,event.group_event_user,1,1,1,1
access_event_registration_answer_registration,event.registration.answer.registration,model_event_registration_answer,event.group_event_registration_desk,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_event_question event.question model_event_question 1 0 0 0
3 access_event_question_user event.question.user model_event_question event.group_event_user 1 1 1 1
4 access_event_question_answer event.question.answer model_event_question_answer 1 0 0 0
5 access_event_question_answer_registration event.question.answer.registration model_event_question_answer event.group_event_registration_desk 1 1 0 0
6 access_event_question_answer_user event.question.answer.user model_event_question_answer event.group_event_user 1 1 1 1
7 access_event_registration_answer_user access_event_registration_answer_registration event.registration.answer.user event.registration.answer.registration model_event_registration_answer event.group_event_user event.group_event_registration_desk 1 1 1 1
@@ -15,7 +15,7 @@
<field name="name">Event Question: event user: read all</field>
<field name="model_id" ref="website_event_questions.model_event_question"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('event.group_event_user'))]"/>
<field name="groups" eval="[(4, ref('event.group_event_registration_desk'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
@@ -36,7 +36,7 @@
<field name="name">Event Question Answer: event user: read all</field>
<field name="model_id" ref="website_event_questions.model_event_question_answer"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('event.group_event_user'))]"/>
<field name="groups" eval="[(4, ref('event.group_event_registration_desk'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
@@ -14,6 +14,7 @@ Sell event tickets through eCommerce app.
'views/event_event_views.xml',
'views/website_event_templates.xml',
'views/website_sale_templates.xml',
'security/ir.model.access.csv',
'security/website_event_sale_security.xml',
],
'auto_install': True,
@@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_event_event_ticket,event.event.ticket,event.model_event_event_ticket,,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_event_event_ticket event.event.ticket event.model_event_event_ticket 1 0 0 0
@@ -141,7 +141,7 @@ class EventTrackController(http.Controller):
# environment
'is_html_empty': is_html_empty,
'hostname': request.httprequest.host.split(':')[0],
'user_event_manager': request.env.user.has_group('event.group_event_manager'),
'is_event_user': request.env.user.has_group('event.group_event_user'),
}
# ------------------------------------------------------------
@@ -155,7 +155,7 @@ class EventTrackController(http.Controller):
'event': event,
'main_object': event,
'tag': tag,
'user_event_manager': request.env.user.has_group('event.group_event_manager'),
'is_event_user': request.env.user.has_group('event.group_event_user'),
}
vals.update(self._prepare_calendar_values(event))
@@ -347,7 +347,7 @@ class EventTrackController(http.Controller):
# environment
'is_html_empty': is_html_empty,
'hostname': request.httprequest.host.split(':')[0],
'user_event_manager': request.env.user.has_group('event.group_event_manager'),
'is_event_user': request.env.user.has_group('event.group_event_user'),
}
@http.route("/event/track/toggle_reminder", type="json", auth="public", website=True)
@@ -1,14 +1,16 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_event_track_manager,event.track.manager,model_event_track,event.group_event_manager,1,1,1,1
access_event_track,event.track,model_event_track,,1,0,0,0
access_event_track_user,event.track.user,model_event_track,event.group_event_user,1,1,1,0
access_event_track_manager,event.track.manager,model_event_track,event.group_event_manager,1,1,1,1
access_event_track_tag,event.track.tag,model_event_track_tag,,1,0,0,0
access_event_track_tag_user,event.track.tag.user,model_event_track_tag,event.group_event_user,1,1,0,0
access_event_track_tag_user,event.track.tag.user,model_event_track_tag,event.group_event_user,1,1,1,0
access_event_track_tag_manager,event.track.tag.manager,model_event_track_tag,event.group_event_manager,1,1,1,1
access_event_track_location,event.track.location,model_event_track_location,,1,0,0,0
access_event_track_location_user,event.track.location.user,model_event_track_location,event.group_event_user,1,1,1,0
access_event_track_location_manager,event.track.location.manager,model_event_track_location,event.group_event_manager,1,1,1,1
access_event_track_stage,event.track.stage,model_event_track_stage,,1,0,0,0
access_event_track_stage_manager,event.track.stage.manager,model_event_track_stage,event.group_event_manager,1,1,1,1
access_event_track_visitor,event.track.visitor,model_event_track_visitor,,0,0,0,0
access_event_track_visitor_manager,event.track.visitor.manager,model_event_track_visitor,event.group_event_manager,1,1,1,1
access_event_track_tag_category,event.track.tag.category,model_event_track_tag_category,,1,0,0,0
access_event_track_tag_category_manager,event.track.tag.category.manager,model_event_track_tag_category,event.group_event_manager,1,1,1,1
access_event_track_tag_category_user,event.track.tag.category.user,model_event_track_tag_category,event.group_event_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
access_event_track_manager event.track.manager model_event_track event.group_event_manager 1 1 1 1
2 access_event_track event.track model_event_track 1 0 0 0
3 access_event_track_user event.track.user model_event_track event.group_event_user 1 1 1 0
4 access_event_track_manager event.track.manager model_event_track event.group_event_manager 1 1 1 1
5 access_event_track_tag event.track.tag model_event_track_tag 1 0 0 0
6 access_event_track_tag_user event.track.tag.user model_event_track_tag event.group_event_user 1 1 0 1 0
7 access_event_track_tag_manager event.track.tag.manager model_event_track_tag event.group_event_manager 1 1 1 1
8 access_event_track_location event.track.location model_event_track_location 1 0 0 0
9 access_event_track_location_user event.track.location.user model_event_track_location event.group_event_user 1 1 1 0
10 access_event_track_location_manager event.track.location.manager model_event_track_location event.group_event_manager 1 1 1 1
11 access_event_track_stage event.track.stage model_event_track_stage 1 0 0 0
12 access_event_track_stage_manager event.track.stage.manager model_event_track_stage event.group_event_manager 1 1 1 1
13 access_event_track_visitor event.track.visitor model_event_track_visitor 0 0 0 0
14 access_event_track_visitor_manager event.track.visitor.manager model_event_track_visitor event.group_event_manager 1 1 1 1
15 access_event_track_tag_category event.track.tag.category model_event_track_tag_category 1 0 0 0
16 access_event_track_tag_category_manager access_event_track_tag_category_user event.track.tag.category.manager event.track.tag.category.user model_event_track_tag_category event.group_event_manager event.group_event_user 1 1 1 1
@@ -65,7 +65,7 @@
<div t-if="search_key" class="alert alert-info text-center">
<p class="m-0">We did not find any track matching your <strong t-esc="search_key"/> search.</p>
</div>
<div t-else="" class="alert alert-info text-center" groups="event.group_event_manager">
<div t-else="" class="alert alert-info text-center" groups="event.group_event_user">
<p class="m-0">Schedule some tracks to get started !</p>
</div>
</div>
@@ -159,7 +159,7 @@
<small t-if="track.is_track_live and not track.is_track_done and track.website_published"
class="mx-1 badge badge-danger">Live
</small>
<small t-if="not track.website_published and user_event_manager and track.stage_id.is_accepted"
<small t-if="not track.website_published and is_event_user and track.stage_id.is_accepted"
title="Unpublished"
class="ml-1 badge badge-danger o_wevent_online_badge_unpublished">Unpublished</small>
<small t-if="not track.stage_id.is_accepted" title="Not Accepted"
@@ -174,9 +174,9 @@
</div>
<div class="o_we_agenda_card_content d-flex flex-column justify-content-center my-1">
<div t-att-class="'text-black' if track.website_published or user_event_manager else 'text-muted'"
<div t-att-class="'text-black' if track.website_published or is_event_user else 'text-muted'"
t-att-onclick="'window.location=\'/event/%s/track/%s\'' % (slug(event), slug(track))
if track.website_published or user_event_manager else ''">
if track.website_published or is_event_user else ''">
<span class="o_we_agenda_card_title text-bold" t-esc="track.name"/>
</div>
<div class="text-muted text-center">
@@ -123,7 +123,7 @@
<div t-if="search_key" class="alert alert-info text-center">
<p class="m-0">We did not find any track matching your <strong t-esc="search_key"/> search.</p>
</div>
<div t-else="" class="alert alert-info text-center" groups="event.group_event_manager">
<div t-else="" class="alert alert-info text-center" groups="event.group_event_user">
<p class="m-0">Schedule some tracks to get started !</p>
</div>
</div>
@@ -210,7 +210,7 @@
</t>
</div>
<span class="h5 mb0">
<a t-if="track.is_published or user_event_manager"
<a t-if="track.is_published or is_event_user"
class="mr-2"
t-att-href="track.website_url">
<span t-field="track.name"/>
@@ -218,7 +218,7 @@
<t t-else="">
<span class="mr-2" t-field="track.name"/>
</t>
<span t-if="not track.is_published and user_event_manager"
<span t-if="not track.is_published and is_event_user"
class="badge badge-danger o_wevent_online_badge_unpublished">
Unpublished
</span>
@@ -175,7 +175,7 @@
<div class="tab-pane fade show active" id="track_list" role="tabpanel">
<ul class="list-unstyled mb-0">
<li t-foreach="tracks_other" t-as="track_other" class="w-100">
<a t-if="user_event_manager or track_other.is_published"
<a t-if="is_event_user or track_other.is_published"
class="d-block w-100 h-100 px-2 pt-2 pb-1 text-decoration-none"
t-att-href="track_other.website_url">
<t t-call="website_event_track.event_track_aside_other_track"/>
@@ -133,7 +133,8 @@
<button name="%(website_event_track.website_visitor_action_from_track)d"
type="action"
class="oe_stat_button"
icon="fa-bell">
icon="fa-bell"
groups="event.group_event_user">
<field name="wishlist_visitor_count" string="Wishlisted By" widget="statinfo"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
@@ -4,7 +4,7 @@
<template id="tracks_display_list" inherit_id="website_event_track.tracks_display_list">
<!-- TRACK LIST: ADD REPLAY TAG FOR FINISHED TRACKS -->
<xpath expr="//div[@t-foreach='tracks']//div[hasclass('col-md-7')]//span[@t-elif='not track.is_track_done and not track.is_track_soon']" position="after">
<a t-elif="track.youtube_video_url and (track.is_published or user_event_manager)"
<a t-elif="track.youtube_video_url and (track.is_published or is_event_user)"
t-att-href="track.website_url" class="badge badge-danger ml-2">Replay
</a>
</xpath>
@@ -1,7 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
event_quiz_access_event_user,event.quiz.access.event.user,model_event_quiz,event.group_event_user,1,0,0,0
event_quiz_access_event_manager,event.quiz.access.event.manager,model_event_quiz,event.group_event_manager,1,1,1,1
event_quiz_question_access_event_user,event.quiz.question.access.event.user,model_event_quiz_question,event.group_event_user,1,0,0,0
event_quiz_question_access_event_manager,event.quiz.question.access.event.manager,model_event_quiz_question,event.group_event_manager,1,1,1,1
event_quiz_answer_access_event_user,event.quiz.answer.event.user,model_event_quiz_answer,event.group_event_user,1,0,0,0
event_quiz_answer_access_event_manager,event.quiz.answer.event.manager,model_event_quiz_answer,event.group_event_manager,1,1,1,1
event_quiz_access_event_user,event.quiz.access.event.user,model_event_quiz,event.group_event_user,1,1,1,1
event_quiz_question_access_event_user,event.quiz.question.access.event.user,model_event_quiz_question,event.group_event_user,1,1,1,1
event_quiz_answer_access_event_user,event.quiz.answer.event.user,model_event_quiz_answer,event.group_event_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 event_quiz_access_event_user event.quiz.access.event.user model_event_quiz event.group_event_user 1 0 1 0 1 0 1
3 event_quiz_access_event_manager event_quiz_question_access_event_user event.quiz.access.event.manager event.quiz.question.access.event.user model_event_quiz model_event_quiz_question event.group_event_manager event.group_event_user 1 1 1 1
4 event_quiz_question_access_event_user event_quiz_answer_access_event_user event.quiz.question.access.event.user event.quiz.answer.event.user model_event_quiz_question model_event_quiz_answer event.group_event_user 1 0 1 0 1 0 1
event_quiz_question_access_event_manager event.quiz.question.access.event.manager model_event_quiz_question event.group_event_manager 1 1 1 1
event_quiz_answer_access_event_user event.quiz.answer.event.user model_event_quiz_answer event.group_event_user 1 0 0 0
event_quiz_answer_access_event_manager event.quiz.answer.event.manager model_event_quiz_answer event.group_event_manager 1 1 1 1
@@ -41,7 +41,7 @@ var Quiz = publicWidget.Widget.extend({
completed: false,
isMember: false,
progressBar: false,
isManager: false
isEventUser: false
});
this.quiz = quizData || false;
if (this.quiz) {
@@ -55,7 +55,7 @@
</span>
</div>
<div class="flex-grow-1 text-right">
<button t-if="widget.track.isManager"
<button t-if="widget.track.isEventUser"
class="d-none d-md-inline-block btn btn-light border o_quiz_js_quiz_reset">
Reset
</button>
@@ -9,7 +9,7 @@
t-att-data-completed="1 if quiz_completed else 0"
t-att-data-quiz-attempts-count="quiz_attempts_count or 0"
t-att-data-quiz-points-gained="quiz_points"
t-att-data-is-manager="user_event_manager or 0">
t-att-data-is-event-user="is_event_user or 0">
<t t-foreach="track.quiz_id.question_ids" t-as="question">
<t t-call="website_event_track_quiz.quiz_question"/>
</t>