_description = 'Event Type'
name = fields.Char(string='Event Type', required=True)
- default_reply_to = fields.Char(string='Default Reply-To',
+ default_reply_to = fields.Char(
+ string='Default Reply-To',
help="The email address of the organizer which is put in the 'Reply-To' of all emails sent automatically at event or registrations confirmation. You can also put your email address of your mail gateway if you use one.")
- default_email_event = fields.Many2one('email.template', string='Event Confirmation Email',
+ default_email_event = fields.Many2one(
+ 'email.template', string='Event Confirmation Email',
help="It will select this default confirmation event mail value when you choose this event")
- default_email_registration = fields.Many2one('email.template', string='Registration Confirmation Email',
+ default_email_registration = fields.Many2one(
+ 'email.template', string='Registration Confirmation Email',
help="It will select this default confirmation registration mail value when you choose this event")
- default_registration_min = fields.Integer(string='Default Minimum Registration', default=0,
+ default_registration_min = fields.Integer(
+ string='Default Minimum Registration', default=0,
help="It will select this default minimum value when you choose this event")
- default_registration_max = fields.Integer(string='Default Maximum Registration', default=0,
+ default_registration_max = fields.Integer(
+ string='Default Maximum Registration', default=0,
help="It will select this default maximum value when you choose this event")
_inherit = ['mail.thread', 'ir.needaction_mixin']
_order = 'date_begin'
- name = fields.Char(string='Event Name', translate=True, required=True,
+ name = fields.Char(
+ string='Name', translate=True, required=True,
readonly=False, states={'done': [('readonly', True)]})
- user_id = fields.Many2one('res.users', string='Responsible User',
+ user_id = fields.Many2one(
+ 'res.users', string='Responsible',
default=lambda self: self.env.user,
readonly=False, states={'done': [('readonly', True)]})
- type = fields.Many2one('event.type', string='Type of Event',
+ company_id = fields.Many2one(
+ 'res.company', string='Company', change_default=True,
+ default=lambda self: self.env['res.company']._company_default_get('event.event'),
+ required=False, readonly=False, states={'done': [('readonly', True)]})
+ organizer_id = fields.Many2one(
+ 'res.partner', string='Organizer',
+ default=lambda self: self.env.user.company_id.partner_id)
+ type = fields.Many2one(
+ 'event.type', string='Category',
readonly=False, states={'done': [('readonly', True)]})
color = fields.Integer('Kanban Color Index')
- seats_max = fields.Integer(string='Maximum Available Seats', oldname='register_max',
+
+ # Seats and computation
+ seats_max = fields.Integer(
+ string='Maximum Available Seats', oldname='register_max',
readonly=True, states={'draft': [('readonly', False)]},
help="You can for each event define a maximum registration level. If you have too much registrations you are not able to confirm your event. (put 0 to ignore this rule )")
seats_availability = fields.Selection(
[('limited', 'Limited'), ('unlimited', 'Unlimited')],
'Available Seat', required=True, default='unlimited')
- seats_min = fields.Integer(string='Minimum Reserved Seats', oldname='register_min',
+ seats_min = fields.Integer(
+ string='Minimum Reserved Seats', oldname='register_min',
readonly=True, states={'draft': [('readonly', False)]},
help="You can for each event define a minimum registration level. If you do not enough registrations you are not able to confirm your event. (put 0 to ignore this rule )")
-
- seats_reserved = fields.Integer(oldname='register_current', string='Reserved Seats',
+ seats_reserved = fields.Integer(
+ oldname='register_current', string='Reserved Seats',
store=True, readonly=True, compute='_compute_seats')
- seats_available = fields.Integer(oldname='register_avail', string='Available Seats',
+ seats_available = fields.Integer(
+ oldname='register_avail', string='Available Seats',
store=True, readonly=True, compute='_compute_seats')
- seats_unconfirmed = fields.Integer(oldname='register_prospect', string='Unconfirmed Seat Reservations',
+ seats_unconfirmed = fields.Integer(
+ oldname='register_prospect', string='Unconfirmed Seat Reservations',
store=True, readonly=True, compute='_compute_seats')
- seats_used = fields.Integer(oldname='register_attended', string='Number of Participations',
+ seats_used = fields.Integer(
+ oldname='register_attended', string='Number of Participations',
store=True, readonly=True, compute='_compute_seats')
@api.multi
""" Determine reserved, available, reserved but unconfirmed and used seats. """
# initialize fields to 0
for event in self:
- event.seats_unconfirmed = event.seats_reserved = event.seats_used = 0
+ event.seats_unconfirmed = event.seats_reserved = event.seats_used = event.seats_available = 0
# aggregate registrations by event and by state
if self.ids:
state_field = {
event[state_field[state]] += num
# compute seats_available
for event in self:
- event.seats_available = \
- event.seats_max - (event.seats_reserved + event.seats_used) \
- if event.seats_max > 0 else 0
+ if event.seats_max > 0:
+ event.seats_available = event.seats_max - (event.seats_reserved + event.seats_used)
- registration_ids = fields.One2many('event.registration', 'event_id', string='Registrations',
+ # Registration fields
+ registration_ids = fields.One2many(
+ 'event.registration', 'event_id', string='Registrations',
readonly=False, states={'done': [('readonly', True)]})
- count_registrations = fields.Integer(string='Registrations',
- compute='_count_registrations')
+ count_registrations = fields.Integer(string='Registrations', compute='_count_registrations')
- date_begin = fields.Datetime(string='Start Date', required=True,
+ @api.one
+ @api.depends('registration_ids')
+ def _count_registrations(self):
+ self.count_registrations = len(self.registration_ids)
+
+ # Date fields
+ date_tz = fields.Selection('_tz_get', string='Timezone', default=lambda self: self.env.user.tz)
+ date_begin = fields.Datetime(
+ string='Start Date', required=True,
readonly=True, states={'draft': [('readonly', False)]})
- date_end = fields.Datetime(string='End Date', required=True,
+ date_end = fields.Datetime(
+ string='End Date', required=True,
readonly=True, states={'draft': [('readonly', False)]})
+ date_begin_located = fields.Datetime(string='Start Date Located', compute='_compute_date_begin_tz')
+ date_end_located = fields.Datetime(string='End Date Located', compute='_compute_date_end_tz')
@api.model
def _tz_get(self):
return [(x, x) for x in pytz.all_timezones]
- date_tz = fields.Selection('_tz_get', string='Timezone', default=lambda self: self.env.user.tz)
-
@api.one
@api.depends('date_tz', 'date_begin')
def _compute_date_begin_tz(self):
else:
self.date_end_located = False
- date_begin_located = fields.Datetime(string='Start Date Located', compute='_compute_date_begin_tz')
- date_end_located = fields.Datetime(string='End Date Located', compute='_compute_date_end_tz')
-
state = fields.Selection([
- ('draft', 'Unconfirmed'),
- ('cancel', 'Cancelled'),
- ('confirm', 'Confirmed'),
- ('done', 'Done')
- ], string='Status', default='draft', readonly=True, required=True, copy=False,
+ ('draft', 'Unconfirmed'), ('cancel', 'Cancelled'),
+ ('confirm', 'Confirmed'), ('done', 'Done')],
+ string='Status', default='draft', readonly=True, required=True, copy=False,
help="If event is created, the status is 'Draft'. If event is confirmed for the particular dates the status is set to 'Confirmed'. If the event is over, the status is set to 'Done'. If event is cancelled the status is set to 'Cancelled'.")
auto_confirm = fields.Boolean(string='Auto Confirmation Activated', compute='_compute_auto_confirm')
+
+ @api.one
+ def _compute_auto_confirm(self):
+ self.auto_confirm = self.env['ir.values'].get_default('marketing.config.settings', 'auto_confirmation')
+
+ # Mailing
email_registration_id = fields.Many2one(
'email.template', string='Registration Confirmation Email',
domain=[('model', '=', 'event.registration')],
'email.template', string='Event Confirmation Email',
domain=[('model', '=', 'event.registration')],
help="If you set an email template, each participant will receive this email announcing the confirmation of the event.")
- reply_to = fields.Char(string='Reply-To Email',
- readonly=False, states={'done': [('readonly', True)]},
+ reply_to = fields.Char(
+ string='Reply-To Email', readonly=False, states={'done': [('readonly', True)]},
help="The email address of the organizer is likely to be put here, with the effect to be in the 'Reply-To' of the mails sent automatically at event or registrations confirmation. You can also put the email address of your mail gateway if you use one.")
- address_id = fields.Many2one('res.partner', string='Location',
- default=lambda self: self.env.user.company_id.partner_id,
+ address_id = fields.Many2one(
+ 'res.partner', string='Location', default=lambda self: self.env.user.company_id.partner_id,
readonly=False, states={'done': [('readonly', True)]})
- country_id = fields.Many2one('res.country', string='Country', related='address_id.country_id',
+ country_id = fields.Many2one(
+ 'res.country', string='Country', related='address_id.country_id',
store=True, readonly=False, states={'done': [('readonly', True)]})
- description = fields.Html(string='Description', oldname='note', translate=True,
+ description = fields.Html(
+ string='Description', oldname='note', translate=True,
readonly=False, states={'done': [('readonly', True)]})
- company_id = fields.Many2one('res.company', string='Company', change_default=True,
- default=lambda self: self.env['res.company']._company_default_get('event.event'),
- required=False, readonly=False, states={'done': [('readonly', True)]})
- organizer_id = fields.Many2one('res.partner', string='Organizer',
- default=lambda self: self.env.user.company_id.partner_id)
-
- is_subscribed = fields.Boolean(string='Subscribed',
- compute='_compute_subscribe')
-
- @api.one
- def _compute_auto_confirm(self):
- self.auto_confirm = self.env['ir.values'].get_default('marketing.config.settings', 'auto_confirmation')
-
- @api.one
- @api.depends('registration_ids')
- def _count_registrations(self):
- self.count_registrations = len(self.registration_ids)
-
- @api.one
- @api.depends('registration_ids.user_id', 'registration_ids.state')
- def _compute_subscribe(self):
- """ Determine whether the current user is already subscribed to any event in `self` """
- user = self.env.user
- self.is_subscribed = any(
- reg.user_id == user and reg.state in ('open', 'done')
- for reg in self.registration_ids
- )
@api.multi
@api.depends('name', 'date_begin', 'date_end')
_inherit = ['mail.thread', 'ir.needaction_mixin']
_order = 'name, create_date desc'
- origin = fields.Char(string='Source Document', readonly=True,
- help="Reference of the sales order which created the registration")
- nb_register = fields.Integer(string='Number of Participants', required=True, default=1,
+ origin = fields.Char(
+ string='Source Document', readonly=True,
+ help="Reference of the sales order which created the registration") # funny we refer sale orders... event is not sale related
+ nb_register = fields.Integer(
+ string='Number of Participants', required=True, default=1,
readonly=True, states={'draft': [('readonly', False)]})
- event_id = fields.Many2one('event.event', string='Event', required=True,
+ event_id = fields.Many2one(
+ 'event.event', string='Event', required=True,
readonly=True, states={'draft': [('readonly', False)]})
- partner_id = fields.Many2one('res.partner', string='Partner',
+ partner_id = fields.Many2one(
+ 'res.partner', string='Partner',
states={'done': [('readonly', True)]})
date_open = fields.Datetime(string='Registration Date', readonly=True)
date_closed = fields.Datetime(string='Attended Date', readonly=True)
- reply_to = fields.Char(string='Reply-to Email', related='event_id.reply_to',
- readonly=True)
- log_ids = fields.One2many('mail.message', 'res_id', string='Logs',
- domain=[('model', '=', _name)])
- event_begin_date = fields.Datetime(string="Event Start Date", related='event_id.date_begin',
- readonly=True)
- event_end_date = fields.Datetime(string="Event End Date", related='event_id.date_end',
- readonly=True)
+ reply_to = fields.Char(string='Reply-to Email', related='event_id.reply_to', readonly=True)
+ event_begin_date = fields.Datetime(string="Event Start Date", related='event_id.date_begin', readonly=True)
+ event_end_date = fields.Datetime(string="Event End Date", related='event_id.date_end', readonly=True)
user_id = fields.Many2one('res.users', string='User', states={'done': [('readonly', True)]})
- company_id = fields.Many2one('res.company', string='Company', related='event_id.company_id',
- store=True, readonly=True, states={'draft':[('readonly', False)]})
+ company_id = fields.Many2one(
+ 'res.company', string='Company', related='event_id.company_id',
+ store=True, readonly=True, states={'draft': [('readonly', False)]})
state = fields.Selection([
- ('draft', 'Unconfirmed'),
- ('cancel', 'Cancelled'),
- ('open', 'Confirmed'),
- ('done', 'Attended'),
- ], string='Status', default='draft', readonly=True, copy=False)
+ ('draft', 'Unconfirmed'), ('cancel', 'Cancelled'),
+ ('open', 'Confirmed'), ('done', 'Attended')],
+ string='Status', default='draft', readonly=True, copy=False, track_visibility='onchange')
email = fields.Char(string='Email')
phone = fields.Char(string='Phone')
name = fields.Char(string='Name', select=True)
self.event_id.message_post(
body=_('New registration confirmed: %s.') % (self.name or ''),
subtype="event.mt_event_registration")
- self.message_post(body=_('Event Registration confirmed.'))
self.state = 'open'
@api.one
else:
template = self.event_id.email_registration_id
if template:
- mail_message = template.send_mail(self.id)
+ template.send_mail(self.id)
@api.one
def mail_user_confirm(self):
"""Send email to user when the event is confirmed """
template = self.event_id.email_confirmation_id
if template:
- mail_message = template.send_mail(self.id)
+ template.send_mail(self.id)
@api.onchange('partner_id')
def _onchange_partner(self):
<openerp>
<data>
- <record id="act_event_list_register_event" model="ir.actions.act_window">
- <field name="res_model">event.registration</field>
- <field name="view_type">form</field>
- <field name="name">Registrations</field>
- <field name="view_mode">tree,form,calendar,graph</field>
- <field name="context">{'search_default_event_id': active_id, 'default_event_id': active_id}</field>
- </record>
- <menuitem name="Events" parent="base.marketing_menu" id="event_main_menu" sequence="2"/>
-
- <!-- EVENTS -->
+ <!-- Main menu items -->
+ <menuitem name="Events" id="event_main_menu" parent="base.marketing_menu" sequence="2"/>
+ <menuitem name="Events" id="event_configuration" parent="base.menu_marketing_config_root" sequence="1"/>
- <!-- EVENTS/CONFIGURATION/TYPE OF EVENTS -->
+ <!-- EVENT.TYPE VIEWS -->
<record model="ir.ui.view" id="view_event_type_form">
- <field name="name">Event type</field>
+ <field name="name">event.type.form</field>
<field name="model">event.type</field>
<field name="arch" type="xml">
<form string="Event Type">
- <group col="4">
+ <group>
<field name="name"/>
<field name="default_reply_to"/>
<field name="default_registration_min"/>
</record>
<record model="ir.ui.view" id="view_event_type_tree">
- <field name="name">Event type</field>
+ <field name="name">event.type.tree</field>
<field name="model">event.type</field>
<field name="arch" type="xml">
<tree string="Event Type">
<field name="res_model">event.type</field>
<field name="view_type">form</field>
</record>
- <menuitem name="Events" id="event_configuration" parent="base.menu_marketing_config_root" sequence="1"/>
+
<menuitem name="Events Types" id="menu_event_type" action="action_event_type" parent="event.event_configuration" groups="base.group_no_one"/>
- <!-- Events Organisation/CONFIGURATION/EVENTS -->
+ <!-- EVENT.REGISTRATION ACTIONS -->
+ <record id="act_event_registration_from_event" model="ir.actions.act_window">
+ <field name="res_model">event.registration</field>
+ <field name="view_type">form</field>
+ <field name="name">Registrations</field>
+ <field name="view_mode">tree,form,calendar,graph</field>
+ <field name="context">{'search_default_event_id': active_id, 'default_event_id': active_id}</field>
+ </record>
+
+ <!-- EVENT.EVENT VIEWS -->
<record model="ir.ui.view" id="view_event_form">
- <field name="name">Events</field>
+ <field name="name">event.event.form</field>
<field name="model">event.event</field>
<field name="arch" type="xml">
<form string="Events">
<h1><field name="name"/></h1>
</div>
<div class="oe_right oe_button_box" groups="base.group_user">
- <button name="%(event.act_event_list_register_event)d"
+ <button name="%(event.act_event_registration_from_event)d"
type="action"
class="oe_stat_button oe_inline"
icon="fa-github"
</field>
</record>
- <!-- Event tree view -->
<record model="ir.ui.view" id="view_event_tree">
<field name="name">event.event.tree</field>
<field name="model">event.event</field>
<field name="arch" type="xml">
<tree string="Events" fonts="bold:message_unread==True" colors="red:(seats_min and seats_min>seats_reserved) or (seats_max and seats_max<seats_reserved);grey:state=='cancel'">
- <field name="name" string="Name"/>
- <field name="type" string="Event Category"/>
+ <field name="name"/>
+ <field name="type"/>
<field name="date_begin"/>
<field name="date_end"/>
<field name="seats_reserved"/>
</field>
</record>
- <!-- Event Kanban View -->
<record model="ir.ui.view" id="view_event_kanban">
<field name="name">event.event.kanban</field>
<field name="model">event.event</field>
</small>
</div>
<h4>
- <a name="%(act_event_list_register_event)d" type="action">
+ <a name="%(act_event_registration_from_event)d" type="action">
<t t-esc="record.seats_reserved.raw_value" > Attendees</t>
<t t-if="(record.seats_reserved.raw_value + record.seats_unconfirmed.raw_value) > 0 ">/
<t t-esc="record.seats_reserved.raw_value + record.seats_unconfirmed.raw_value"/> Expected
</field>
</record>
- <!-- Events Calendar View -->
- <record id="view_event_calendar" model="ir.ui.view">
+ <record model="ir.ui.view" id="view_event_calendar">
<field name="name">event.event.calendar</field>
<field name="model">event.event</field>
<field eval="2" name="priority"/>
</field>
</record>
- <!-- Event Search View -->
<record model="ir.ui.view" id="view_event_search">
- <field name="name">Events</field>
+ <field name="name">event.event.search</field>
<field name="model">event.event</field>
<field name="arch" type="xml">
<search string="Events">
</field>
</record>
-
- <!-- Events Organisation/CONFIGURATION/EVENTS -->
<record model="ir.actions.act_window" id="action_event_view">
<field name="name">Events</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">kanban,calendar,tree,form</field>
<field name="context">{"search_default_upcoming":1}</field>
<field name="search_view_id" ref="view_event_search"/>
- <field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to add a new event.
- </p><p>
- Odoo helps you schedule and efficiently organize your events:
- track subscriptions and participations, automate the confirmation emails,
- sell tickets, etc.
- </p>
- </field>
+ <field name="help" type="html"><p class="oe_view_nocontent_create">
+ Click to add a new event.
+</p><p>
+ Odoo helps you schedule and efficiently organize your events:
+ track subscriptions and participations, automate the confirmation emails,
+ sell tickets, etc.
+</p></field>
</record>
<act_window
<menuitem name="Events" id="menu_event_event" action="action_event_view" parent="event.event_main_menu" />
<!-- EVENTS/REGISTRATIONS/EVENTS -->
-
-
<record model="ir.ui.view" id="view_event_registration_tree">
<field name="name">event.registration.tree</field>
<field name="model">event.registration</field>
<field name="partner_id" attrs="{'readonly':[('state','!=', 'draft')]}"/>
<field name="name"/>
<field name="phone"/>
- <label for="email"/>
- <div>
- <field name="email" class="oe_inline"/>
- <button class="oe_inline oe_right" string="Send Email"
- name="%(mail.action_email_compose_message_wizard)d"
- icon="terp-mail-message-new" context= '{"default_email_to":email}' type="action"/>
- </div>
+ <field name="email"/>
</group>
<group>
+ <field name="create_date" groups="base.group_no_one"/>
+ <field name="date_closed" groups="base.group_no_one"/>
<field name="nb_register"/>
<field name="user_id" attrs="{'readonly':[('state','!=', 'draft')]}" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'event.group_event_user']}"/>
</group>
- <group groups="base.group_no_one">
- <field name="create_date"/>
- <field name="date_closed"/>
- </group>
</group>
</sheet>
<div class="oe_chatter">
</field>
</record>
- <!-- Calendar view of event registration -->
<record id="view_event_registration_calendar" model="ir.ui.view">
<field name="name">event.registration.calendar</field>
<field name="model">event.registration</field>
</record>
<record model="ir.ui.view" id="view_event_registration_graph">
- <field name="name">Registration Graph</field>
+ <field name="name">event.registration.graph</field>
<field name="model">event.registration</field>
<field name="arch" type="xml">
<graph string="Registration" type="bar">
</field>
</record>
-
- <!-- Search view of event registration -->
<record model="ir.ui.view" id="view_registration_search">
- <field name="name">Registrations</field>
+ <field name="name">event.registration.search</field>
<field name="model">event.registration</field>
<field name="arch" type="xml">
<search string="Event Registration">
id="menu_action_registration" parent="event.event_main_menu"
action="action_registration" groups="event.group_event_manager,event.group_event_user"/>
- <menuitem name="Reporting" id="base.menu_report_association" parent="event_main_menu" sequence="20"/>
-
</data>
</openerp>