[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:
@@ -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')
|
||||
|
||||
@@ -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)])
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
@@ -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',
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
|
||||
|
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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">⋮</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
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user