Resource booking

resource_booking
REPOSITORY
REPOSITORYOCA/calendar
GIT
GIThttps://github.com/OCA/calendar.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/calendar/tree/18.0/resource_booking
VERSION
VERSION 1.0.14
CATEGORY
CATEGORYAppointments
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSGitHub, Carlos Lopez, Víctor Martínez, Weblate, OCA-git-bot, Don Kendall, oca-ci, FernandoRomera, christian-ramos-tecnativa, Pilar Vargas, Dan Kendall
WEBSITE
WEBSITEhttps://github.com/OCA/calendar
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_calendar_slot_duration
odoo/odoo:
    - calendar
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cssselect
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds a new app to allow you to book resource combinations in
given schedules.

Example use cases:

- Management of consultations in a clinic.
- Salesman appointments.
- Classroom and projector reservations.
- Hotel room booking.

Among the things you can do:

- Specify the type of booking, which includes a calendar of
  availability.
- Specify which resources can be booked together. All of them must be
  free to be booked.
- Place pending bookings, effectively giving permissions to someone to
  see the availability calendar and choose one slot.
- Partners can do that from their portals.
- If a partner has no user, he can still do the same via a tokenized
  URL.
- Backend users can also do that from the backend.
- Booking lifecycle with computed states.
- Automatic meeting creation and deletion.
- Automatic conflict detection.
- Deadline to block modifications.

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
alert_availability_lost Alert Resource Booking Availability was Lost ir.ui.view qweb New
mail_activity_schedule_view_form mail.activity.schedule.inherit.calendar mail.activity.schedule xpath Inherits mail.mail_activity_schedule_view_form
mail_activity_view_form_popup mail.activity.form.inherit.booking mail.activity xpath Inherits mail.mail_activity_view_form_popup
message_combination_assigned message_combination_assigned ir.ui.view qweb New
portal_breadcrumbs portal_breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_bookings My Bookings ir.ui.view qweb New
portal_my_home portal_my_home ir.ui.view qweb Inherits portal.portal_my_home
resource_booking_combination_view_form Resource booking combination form resource.booking.combination form New
resource_booking_combination_view_search resource.booking.combination.view.search resource.booking.combination search New
resource_booking_combination_view_tree Resource booking combination list resource.booking.combination list New
resource_booking_portal_form Booking portal form ir.ui.view qweb New
resource_booking_portal_header Resource Booking Header ir.ui.view qweb New
resource_booking_portal_schedule Resource Booking Scheduling ir.ui.view qweb New
resource_booking_type_view_form Resource booking type form resource.booking.type form New
resource_booking_type_view_search resource.booking.type.view.search resource.booking.type search New
resource_booking_type_view_tree Resource booking type list resource.booking.type list New
resource_booking_view_calendar Resource booking calendar resource.booking calendar New
resource_booking_view_form Resource booking form resource.booking form New
resource_booking_view_search resource.booking.view.search resource.booking search New
resource_booking_view_tree Resource booking list resource.booking list New
scheduling_calendar Resource Booking Calendar ir.ui.view qweb New
view_calendar_event_form calendar.event.view.form.inherit calendar.event form Inherits calendar.view_calendar_event_form
view_partner_form res.partner div Inherits base.view_partner_form
Models touched (11)

New fields (1)
  • resource_booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='meeting_id' string='Resource booking'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
    Transfer resource booking to _attendees_values by context. We need to serialize the creation in that case. mail_notify_author key from context is necessary to force the notification to be sent to author.
  • get_interval(self, interval, tz=None)
    Autofix tz from related resource booking. This function is called to render calendar.event notification mails. Any notification related to a resource.booking must be emitted in the same TZ as the resource.booking. Otherwise it's confusing to the user.
  • unlink(self)
    Check you're allowed to unschedule it.
  • write(self, vals)
    Check you're allowed to reschedule it.

New fields (1)
  • booking_id Many2one → resource.booking
    ondelete='cascade' string='Resource booking' args: 'resource.booking'
Public methods (1)
  • action_open_resource_booking(self)

New fields (0)

No new fields.

Public methods (1)
  • action_open_resource_booking(self)

New fields (1)
  • category Selection
    selection_add=[('resource_booking', 'Resource booking')]
Public methods (0)

No public methods.

New fields (2)
  • resource_booking_count Integer
    compute='_compute_resource_booking_count' string='Resource booking count'
  • resource_booking_ids Many2many → resource.booking
    column1='res_partner_id' column2='resource_booking_id' comodel_name='resource.booking' copy=False relation='res_partner_resource_booking_rel' string='Bookings'
Public methods (1)
  • action_view_resource_booking(self)

New fields (21)
  • active Boolean
    default=True
  • booking_activity_ids One2many → mail.activity
    string='Booking Activities' args: 'mail.activity', 'booking_id'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • combination_auto_assign Boolean
    default=True help='When checked, resource combinations will be (un)assigned automatically based on their availability during the booking dates.' string='Auto assigned'
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' compute='_compute_combination_id' copy=False domain="[('type_rel_ids.type_id', 'in', [type_id])]" index=True readonly=False store=True string='Resources combination' tracking=True
  • description Html
  • duration Float
    compute='_compute_duration' help='Amount of time that the resources will be booked and unavailable for others.' readonly=False store=True tracking=True
  • is_modifiable Boolean
    compute='_compute_is_modifiable'
  • is_overdue Boolean
    compute='_compute_is_overdue'
  • location Char
    compute='_compute_location' readonly=False store=True
  • meeting_id Many2one → calendar.event
    comodel_name='calendar.event' context={'default_res_id': False, 'default_res_model': False} copy=False help='Meeting confirmed for this booking.' index=True ondelete='set null' string='Meeting'
  • name Char
    help='Leave empty to autogenerate a booking name.' index=True
  • partner_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_id' inverse='_inverse_partner_id' readonly=False search='_search_partner_id' string='Requester'
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' help='Who will attend this booking?' relation='res_partner_resource_booking_rel' required=True string='Attendees' tracking=True
  • requester_advice Text
    readonly=True related='type_id.requester_advice'
  • start Datetime
    compute='_compute_start' copy=False index=True readonly=False store=True tracking=True
  • state Selection
    compute='_compute_state' default='pending' help='Pending: No meeting scheduled.\nScheduled: The requester has not confirmed attendance yet.\nConfirmed: Meeting scheduled, and requester attendance confirmed.\nCanceled: Meeting removed, booking archived.' index=True store=True tracking=True args: [('pending', 'Pending'), ('scheduled', 'Scheduled'), ('confirmed', 'Confirmed'), ('canceled', 'Canceled')]
  • stop Datetime
    compute='_compute_stop' copy=False index=True store=True tracking=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type' tracking=True
  • user_id Many2one → res.users
    comodel_name='res.users' compute='_compute_user_id' default=<expr> help='Who organized this booking? Usually whoever created the record. It will appear as the calendar event organizer, when scheduled, and calendar notifications will be sent in his/her name.' index=True readonly=False store=True string='Organizer' tracking=True
  • videocall_location Char
    compute='_compute_videocall_location' readonly=False store=True string='Meeting URL'
Public methods (8)
  • action_cancel(self)
    Cancel this booking.
  • action_confirm(self)
    Confirm own and requesting partner's attendance.
  • action_open_portal(self)
  • action_schedule(self)
    Redirect user to a simpler way to schedule this booking.
  • action_unschedule(self)
    Remove associated meetings.
  • create(self, vals_list)
    @api.model_create_multi
    Sync booking with meeting if needed.
  • unlink(self)
    Unlink meeting if needed.
  • write(self, vals)
    Sync booking with meeting if needed.

New fields (8)
  • active Boolean
    default=True
  • booking_count Integer
    compute='_compute_booking_count' string='Booking count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='combination_id' string='Bookings'
  • forced_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' help="Force a specific calendar, instead of combining the resources'." index=True string='Forced calendar'
  • name Char
    compute='_compute_name' store=True
  • resource_ids Many2many → resource.resource
    comodel_name='resource.resource' help='Resources that must be free to be booked together.' required=True string='Resources'
  • type_count Integer
    compute='_compute_type_count' string='Booking types'
  • type_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' help='Resource booking types where this combination is available.' inverse_name='combination_id' string='Resource booking types'
Public methods (2)
  • action_open_bookings(self)
  • action_open_resource_booking_types(self)

New fields (16)
  • active Boolean
    default=True
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Meetings will be created with these reminders by default.' string='Default reminders'
  • booking_count Integer
    compute='_compute_booking_count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' help='Bookings available for this type' inverse_name='type_id' string='Bookings'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' help='Meetings will be created with these tags by default.' string='Default tags'
  • combination_assignment Selection
    default='random' help='Choose how to auto-assign resource combinations. It has no effect if assigned manually.' required=True args: [('sorted', 'Sorted: pick the first one that is free'), ('random', 'Randomly: order is not important')]
  • combination_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' copy=True help='Resource combinations available for this type of bookings.' inverse_name='type_id' string='Available resource combinations'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='Company where this booking type is available.' index=True readonly=False store=True string='Company'
  • duration Float
    default=0.5 help='Booking default duration.' required=True
  • location Char
  • modifications_deadline Float
    default=24 help='When this deadline has been exceeded, if a booking was not yet confirmed, it will be canceled automatically. Also, only booking managers will be able to unschedule or reschedule them. The value is expressed in hours.' required=True
  • name Char
    index=True required=True translate=True
  • requester_advice Text
    help='Text that will appear by default in portal invitation emails and in calendar views for scheduling.' translate=True
  • resource_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' default=<expr> help='Restrict bookings to this schedule.' index=True ondelete='restrict' required=True string='Availability Calendar'
  • slot_duration Float
    default=0.5 help='Interval offered to start each resource booking.' required=True
  • videocall_location Char
    string='Meeting URL'
Public methods (1)
  • action_open_bookings(self)

New fields (4)
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' index=True ondelete='cascade' required=True string='Combination'
  • sequence Integer
    default=100 index=True required=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type'
  • type_name Char
    related='type_id.name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • is_available(self, start_dt, end_dt, domain=None, tz=None)
    Convenience method to check whether a resource is available within a time span.
REPOSITORY
REPOSITORYOCA/calendar
GIT
GIThttps://github.com/OCA/calendar.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/calendar/tree/17.0/resource_booking
VERSION
VERSION 1.1.4
CATEGORY
CATEGORYAppointments
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, Carlos Lopez, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, pilarvargas-tecnativa
WEBSITE
WEBSITEhttps://github.com/OCA/calendar
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_calendar_slot_duration
odoo/odoo:
    - calendar
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - onboarding
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cssselect
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds a new app to allow you to book resource combinations in
given schedules.

Example use cases:

- Management of consultations in a clinic.
- Salesman appointments.
- Classroom and projector reservations.
- Hotel room booking.

Among the things you can do:

- Specify the type of booking, which includes a calendar of
  availability.
- Specify which resources can be booked together. All of them must be
  free to be booked.
- Place pending bookings, effectively giving permissions to someone to
  see the availability calendar and choose one slot.
- Partners can do that from their portals.
- If a partner has no user, he can still do the same via a tokenized
  URL.
- Backend users can also do that from the backend.
- Booking lifecycle with computed states.
- Automatic meeting creation and deletion.
- Automatic conflict detection.
- Deadline to block modifications.

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
alert_availability_lost Alert Resource Booking Availability was Lost ir.ui.view qweb New
mail_activity_schedule_view_form mail.activity.schedule.inherit.calendar mail.activity.schedule xpath Inherits mail.mail_activity_schedule_view_form
mail_activity_view_form_popup mail.activity.form.inherit.booking mail.activity xpath Inherits mail.mail_activity_view_form_popup
message_combination_assigned message_combination_assigned ir.ui.view qweb New
portal_breadcrumbs portal_breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_bookings My Bookings ir.ui.view qweb New
portal_my_home portal_my_home ir.ui.view qweb Inherits portal.portal_my_home
resource_booking_combination_view_form Resource booking combination form resource.booking.combination form New
resource_booking_combination_view_search resource.booking.combination.view.search resource.booking.combination search New
resource_booking_combination_view_tree Resource booking combination tree resource.booking.combination tree New
resource_booking_portal_form Booking portal form ir.ui.view qweb New
resource_booking_portal_header Resource Booking Header ir.ui.view qweb New
resource_booking_portal_schedule Resource Booking Scheduling ir.ui.view qweb New
resource_booking_type_view_form Resource booking type form resource.booking.type form New
resource_booking_type_view_search resource.booking.type.view.search resource.booking.type search New
resource_booking_type_view_tree Resource booking type tree resource.booking.type tree New
resource_booking_view_calendar Resource booking calendar resource.booking calendar New
resource_booking_view_form Resource booking form resource.booking form New
resource_booking_view_search resource.booking.view.search resource.booking search New
resource_booking_view_tree Resource booking tree resource.booking tree New
scheduling_calendar Resource Booking Calendar ir.ui.view qweb New
view_calendar_event_form calendar.event.view.form.inherit calendar.event form Inherits calendar.view_calendar_event_form
view_partner_form res.partner div Inherits base.view_partner_form
Models touched (11)

New fields (1)
  • resource_booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='meeting_id' string='Resource booking'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
    Transfer resource booking to _attendees_values by context. We need to serialize the creation in that case. mail_notify_author key from context is necessary to force the notification to be sent to author.
  • get_interval(self, interval, tz=None)
    Autofix tz from related resource booking. This function is called to render calendar.event notification mails. Any notification related to a resource.booking must be emitted in the same TZ as the resource.booking. Otherwise it's confusing to the user.
  • unlink(self)
    Check you're allowed to unschedule it.
  • write(self, vals)
    Check you're allowed to reschedule it.

New fields (1)
  • booking_id Many2one → resource.booking
    ondelete='cascade' string='Resource booking' args: 'resource.booking'
Public methods (1)
  • action_open_resource_booking(self)

New fields (0)

No new fields.

Public methods (1)
  • action_open_resource_booking(self)

New fields (1)
  • category Selection
    selection_add=[('resource_booking', 'Resource booking')]
Public methods (0)

No public methods.

New fields (2)
  • resource_booking_count Integer
    compute='_compute_resource_booking_count' string='Resource booking count'
  • resource_booking_ids Many2many → resource.booking
    column1='res_partner_id' column2='resource_booking_id' comodel_name='resource.booking' copy=False relation='res_partner_resource_booking_rel' string='Bookings'
Public methods (1)
  • action_view_resource_booking(self)

New fields (21)
  • active Boolean
    default=True
  • booking_activity_ids One2many → mail.activity
    string='Booking Activities' args: 'mail.activity', 'booking_id'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • combination_auto_assign Boolean
    default=True help='When checked, resource combinations will be (un)assigned automatically based on their availability during the booking dates.' string='Auto assigned'
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' compute='_compute_combination_id' copy=False domain="[('type_rel_ids.type_id', 'in', [type_id])]" index=True readonly=False store=True string='Resources combination' tracking=True
  • description Html
  • duration Float
    compute='_compute_duration' help='Amount of time that the resources will be booked and unavailable for others.' readonly=False store=True tracking=True
  • is_modifiable Boolean
    compute='_compute_is_modifiable'
  • is_overdue Boolean
    compute='_compute_is_overdue'
  • location Char
    compute='_compute_location' readonly=False store=True
  • meeting_id Many2one → calendar.event
    comodel_name='calendar.event' context={'default_res_id': False, 'default_res_model': False} copy=False help='Meeting confirmed for this booking.' index=True ondelete='set null' string='Meeting'
  • name Char
    help='Leave empty to autogenerate a booking name.' index=True
  • partner_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_id' inverse='_inverse_partner_id' readonly=False search='_search_partner_id' string='Requester'
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' help='Who will attend this booking?' relation='res_partner_resource_booking_rel' required=True string='Attendees' tracking=True
  • requester_advice Text
    readonly=True related='type_id.requester_advice'
  • start Datetime
    compute='_compute_start' copy=False index=True readonly=False store=True tracking=True
  • state Selection
    compute='_compute_state' default='pending' help='Pending: No meeting scheduled.\nScheduled: The requester has not confirmed attendance yet.\nConfirmed: Meeting scheduled, and requester attendance confirmed.\nCanceled: Meeting removed, booking archived.' index=True store=True tracking=True args: [('pending', 'Pending'), ('scheduled', 'Scheduled'), ('confirmed', 'Confirmed'), ('canceled', 'Canceled')]
  • stop Datetime
    compute='_compute_stop' copy=False index=True store=True tracking=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type' tracking=True
  • user_id Many2one → res.users
    comodel_name='res.users' compute='_compute_user_id' default=<expr> help='Who organized this booking? Usually whoever created the record. It will appear as the calendar event organizer, when scheduled, and calendar notifications will be sent in his/her name.' index=True readonly=False store=True string='Organizer' tracking=True
  • videocall_location Char
    compute='_compute_videocall_location' readonly=False store=True string='Meeting URL'
Public methods (8)
  • action_cancel(self)
    Cancel this booking.
  • action_confirm(self)
    Confirm own and requesting partner's attendance.
  • action_open_portal(self)
  • action_schedule(self)
    Redirect user to a simpler way to schedule this booking.
  • action_unschedule(self)
    Remove associated meetings.
  • create(self, vals_list)
    @api.model_create_multi
    Sync booking with meeting if needed.
  • unlink(self)
    Unlink meeting if needed.
  • write(self, vals)
    Sync booking with meeting if needed.

New fields (8)
  • active Boolean
    default=True
  • booking_count Integer
    compute='_compute_booking_count' string='Booking count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='combination_id' string='Bookings'
  • forced_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' help="Force a specific calendar, instead of combining the resources'." index=True string='Forced calendar'
  • name Char
    compute='_compute_name' store=True
  • resource_ids Many2many → resource.resource
    comodel_name='resource.resource' help='Resources that must be free to be booked together.' required=True string='Resources'
  • type_count Integer
    compute='_compute_type_count' string='Booking types'
  • type_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' help='Resource booking types where this combination is available.' inverse_name='combination_id' string='Resource booking types'
Public methods (2)
  • action_open_bookings(self)
  • action_open_resource_booking_types(self)

New fields (16)
  • active Boolean
    default=True
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Meetings will be created with these reminders by default.' string='Default reminders'
  • booking_count Integer
    compute='_compute_booking_count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' help='Bookings available for this type' inverse_name='type_id' string='Bookings'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' help='Meetings will be created with these tags by default.' string='Default tags'
  • combination_assignment Selection
    default='random' help='Choose how to auto-assign resource combinations. It has no effect if assigned manually.' required=True args: [('sorted', 'Sorted: pick the first one that is free'), ('random', 'Randomly: order is not important')]
  • combination_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' copy=True help='Resource combinations available for this type of bookings.' inverse_name='type_id' string='Available resource combinations'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='Company where this booking type is available.' index=True readonly=False store=True string='Company'
  • duration Float
    default=0.5 help='Booking default duration.' required=True
  • location Char
  • modifications_deadline Float
    default=24 help='When this deadline has been exceeded, if a booking was not yet confirmed, it will be canceled automatically. Also, only booking managers will be able to unschedule or reschedule them. The value is expressed in hours.' required=True
  • name Char
    index=True required=True translate=True
  • requester_advice Text
    help='Text that will appear by default in portal invitation emails and in calendar views for scheduling.' translate=True
  • resource_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' default=<expr> help='Restrict bookings to this schedule.' index=True ondelete='restrict' required=True string='Availability Calendar'
  • slot_duration Float
    default=0.5 help='Interval offered to start each resource booking.' required=True
  • videocall_location Char
    string='Meeting URL'
Public methods (1)
  • action_open_bookings(self)

New fields (4)
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' index=True ondelete='cascade' required=True string='Combination'
  • sequence Integer
    default=100 index=True required=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type'
  • type_name Char
    related='type_id.name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • is_available(self, start_dt, end_dt, domain=None, tz=None)
    Convenience method to check whether a resource is available within a time span.
REPOSITORY
REPOSITORYOCA/calendar
GIT
GIThttps://github.com/OCA/calendar.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/calendar/tree/16.0/resource_booking
VERSION
VERSION 1.5.3
CATEGORY
CATEGORYAppointments
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSVíctor Martínez, Weblate, OCA-git-bot, oca-ci, Carolina Fernandez, Adasat Torres de León, r.perez
WEBSITE
WEBSITEhttps://github.com/OCA/calendar
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:56
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_calendar_slot_duration
odoo/odoo:
    - calendar
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cssselect
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (22)
XML IDNameModelTypeStatus
alert_availability_lost Alert Resource Booking Availability was Lost ir.ui.view qweb New
mail_activity_view_form_popup mail.activity.form.inherit.booking mail.activity xpath Inherits mail.mail_activity_view_form_popup
message_combination_assigned message_combination_assigned ir.ui.view qweb New
portal_breadcrumbs portal_breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_bookings My Bookings ir.ui.view qweb New
portal_my_home portal_my_home ir.ui.view qweb Inherits portal.portal_my_home
resource_booking_combination_view_form Resource booking combination form resource.booking.combination form New
resource_booking_combination_view_search resource.booking.combination.view.search resource.booking.combination search New
resource_booking_combination_view_tree Resource booking combination tree resource.booking.combination tree New
resource_booking_portal_form Booking portal form ir.ui.view qweb New
resource_booking_portal_header Resource Booking Header ir.ui.view qweb New
resource_booking_portal_schedule Resource Booking Scheduling ir.ui.view qweb New
resource_booking_type_view_form Resource booking type form resource.booking.type form New
resource_booking_type_view_search resource.booking.type.view.search resource.booking.type search New
resource_booking_type_view_tree Resource booking type tree resource.booking.type tree New
resource_booking_view_calendar Resource booking calendar resource.booking calendar New
resource_booking_view_form Resource booking form resource.booking form New
resource_booking_view_search resource.booking.view.search resource.booking search New
resource_booking_view_tree Resource booking tree resource.booking tree New
scheduling_calendar Resource Booking Calendar ir.ui.view qweb New
view_calendar_event_form calendar.event.view.form.inherit calendar.event form Inherits calendar.view_calendar_event_form
view_partner_form res.partner div Inherits base.view_partner_form
Models touched (10)

New fields (1)
  • resource_booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='meeting_id' string='Resource booking'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
    Transfer resource booking to _attendees_values by context. We need to serialize the creation in that case. mail_notify_author key from context is necessary to force the notification to be sent to author.
  • get_interval(self, interval, tz=None)
    Autofix tz from related resource booking. This function is called to render calendar.event notification mails. Any notification related to a resource.booking must be emitted in the same TZ as the resource.booking. Otherwise it's confusing to the user.
  • unlink(self)
    Check you're allowed to unschedule it.
  • write(self, vals)
    Check you're allowed to reschedule it.

New fields (1)
  • booking_id Many2one → resource.booking
    ondelete='cascade' string='Resource booking' args: 'resource.booking'
Public methods (1)
  • action_open_resource_booking(self)

New fields (1)
  • category Selection
    selection_add=[('resource_booking', 'Resource booking')]
Public methods (0)

No public methods.

New fields (2)
  • resource_booking_count Integer
    compute='_compute_resource_booking_count' string='Resource booking count'
  • resource_booking_ids Many2many → resource.booking
    column1='res_partner_id' column2='resource_booking_id' comodel_name='resource.booking' copy=False relation='res_partner_resource_booking_rel' string='Bookings'
Public methods (1)
  • action_view_resource_booking(self)

New fields (21)
  • active Boolean
    default=True
  • booking_activity_ids One2many → mail.activity
    string='Booking Activities' args: 'mail.activity', 'booking_id'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • combination_auto_assign Boolean
    default=True help='When checked, resource combinations will be (un)assigned automatically based on their availability during the booking dates.' string='Auto assigned'
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' compute='_compute_combination_id' copy=False domain="[('type_rel_ids.type_id', 'in', [type_id])]" index=True readonly=False states={'scheduled': [('required', True)], 'confirmed': [('required', True)]} store=True string='Resources combination' tracking=True
  • description Html
  • duration Float
    compute='_compute_duration' help='Amount of time that the resources will be booked and unavailable for others.' readonly=False store=True tracking=True
  • is_modifiable Boolean
    compute='_compute_is_modifiable'
  • is_overdue Boolean
    compute='_compute_is_overdue'
  • location Char
    compute='_compute_location' readonly=False store=True
  • meeting_id Many2one → calendar.event
    comodel_name='calendar.event' context={'default_res_id': False, 'default_res_model': False} copy=False help='Meeting confirmed for this booking.' index=True ondelete='set null' string='Meeting'
  • name Char
    help='Leave empty to autogenerate a booking name.' index=True
  • partner_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_id' inverse='_inverse_partner_id' readonly=False search='_search_partner_id' string='Requester'
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' help='Who will attend this booking?' relation='res_partner_resource_booking_rel' required=True string='Attendees' tracking=True
  • requester_advice Text
    readonly=True related='type_id.requester_advice'
  • start Datetime
    compute='_compute_start' copy=False index=True readonly=False store=True tracking=True
  • state Selection
    compute='_compute_state' default='pending' help='Pending: No meeting scheduled.\nScheduled: The requester has not confirmed attendance yet.\nConfirmed: Meeting scheduled, and requester attendance confirmed.\nCanceled: Meeting removed, booking archived.' index=True store=True tracking=True args: [('pending', 'Pending'), ('scheduled', 'Scheduled'), ('confirmed', 'Confirmed'), ('canceled', 'Canceled')]
  • stop Datetime
    compute='_compute_stop' copy=False index=True store=True tracking=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type' tracking=True
  • user_id Many2one → res.users
    comodel_name='res.users' compute='_compute_user_id' default=<expr> help='Who organized this booking? Usually whoever created the record. It will appear as the calendar event organizer, when scheduled, and calendar notifications will be sent in his/her name.' index=True readonly=False store=True string='Organizer' tracking=True
  • videocall_location Char
    compute='_compute_videocall_location' readonly=False store=True string='Meeting URL'
Public methods (9)
  • action_cancel(self)
    Cancel this booking.
  • action_confirm(self)
    Confirm own and requesting partner's attendance.
  • action_open_portal(self)
  • action_schedule(self)
    Redirect user to a simpler way to schedule this booking.
  • action_unschedule(self)
    Remove associated meetings.
  • create(self, vals_list)
    @api.model_create_multi
    Sync booking with meeting if needed.
  • name_get(self)
    Autogenerate booking name if none is provided.
  • unlink(self)
    Unlink meeting if needed.
  • write(self, vals)
    Sync booking with meeting if needed.

New fields (8)
  • active Boolean
    default=True
  • booking_count Integer
    compute='_compute_booking_count' string='Booking count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='combination_id' string='Bookings'
  • forced_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' help="Force a specific calendar, instead of combining the resources'." index=True string='Forced calendar'
  • name Char
    compute='_compute_name' store=True
  • resource_ids Many2many → resource.resource
    comodel_name='resource.resource' help='Resources that must be free to be booked together.' required=True string='Resources'
  • type_count Integer
    compute='_compute_type_count' string='Booking types'
  • type_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' help='Resource booking types where this combination is available.' inverse_name='combination_id' string='Resource booking types'
Public methods (2)
  • action_open_bookings(self)
  • action_open_resource_booking_types(self)

New fields (16)
  • active Boolean
    default=True
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Meetings will be created with these reminders by default.' string='Default reminders'
  • booking_count Integer
    compute='_compute_booking_count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' help='Bookings available for this type' inverse_name='type_id' string='Bookings'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' help='Meetings will be created with these tags by default.' string='Default tags'
  • combination_assignment Selection
    default='random' help='Choose how to auto-assign resource combinations. It has no effect if assigned manually.' required=True args: [('sorted', 'Sorted: pick the first one that is free'), ('random', 'Randomly: order is not important')]
  • combination_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' copy=True help='Resource combinations available for this type of bookings.' inverse_name='type_id' string='Available resource combinations'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='Company where this booking type is available.' index=True readonly=False store=True string='Company'
  • duration Float
    default=0.5 help='Booking default duration.' required=True
  • location Char
  • modifications_deadline Float
    default=24 help='When this deadline has been exceeded, if a booking was not yet confirmed, it will be canceled automatically. Also, only booking managers will be able to unschedule or reschedule them. The value is expressed in hours.' required=True
  • name Char
    index=True required=True translate=True
  • requester_advice Text
    help='Text that will appear by default in portal invitation emails and in calendar views for scheduling.' translate=True
  • resource_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' default=<expr> help='Restrict bookings to this schedule.' index=True ondelete='restrict' required=True string='Availability Calendar'
  • slot_duration Float
    default=0.5 help='Interval offered to start each resource booking.' required=True
  • videocall_location Char
    string='Meeting URL'
Public methods (1)
  • action_open_bookings(self)

New fields (4)
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' index=True ondelete='cascade' required=True string='Combination'
  • sequence Integer
    default=100 index=True required=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type'
  • type_name Char
    related='type_id.name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • is_available(self, start_dt, end_dt, domain=None, tz=None)
    Convenience method to check whether a resource is available within a time span.
REPOSITORY
REPOSITORYOCA/calendar
GIT
GIThttps://github.com/OCA/calendar.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/calendar/tree/15.0/resource_booking
VERSION
VERSION 2.1.1
CATEGORY
CATEGORYAppointments
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, Víctor Martínez, Weblate, OCA-git-bot, sergiocorato, David, Carmen Bianca BAKKER, oca-ci, Carolina Fernandez
WEBSITE
WEBSITEhttps://github.com/OCA/calendar
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_calendar_slot_duration
odoo/odoo:
    - calendar
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cssselect
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
alert_availability_lost Alert Resource Booking Availability was Lost ir.ui.view qweb New
mail_activity_view_form_popup mail.activity.form.inherit.booking mail.activity xpath Inherits mail.mail_activity_view_form_popup
message_combination_assigned message_combination_assigned ir.ui.view qweb New
portal_breadcrumbs portal_breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_bookings My Bookings ir.ui.view qweb New
portal_my_home portal_my_home ir.ui.view qweb Inherits portal.portal_my_home
resource_booking_combination_form Resource booking combination form resource.booking.combination form New
resource_booking_combination_view_search resource.booking.combination.view.search resource.booking.combination search New
resource_booking_combination_view_tree Resource booking combination tree resource.booking.combination tree New
resource_booking_form Resource booking form resource.booking form New
resource_booking_portal_form Booking portal form ir.ui.view qweb New
resource_booking_portal_header Resource Booking Header ir.ui.view qweb New
resource_booking_portal_schedule Resource Booking Scheduling ir.ui.view qweb New
resource_booking_type_form Resource booking type form resource.booking.type form New
resource_booking_type_view_search resource.booking.type.view.search resource.booking.type search New
resource_booking_type_view_tree Resource booking type tree resource.booking.type tree New
resource_booking_view_calendar Resource booking calendar resource.booking calendar New
resource_booking_view_search resource.booking.view.search resource.booking search New
resource_booking_view_tree Resource booking tree resource.booking tree New
scheduling_calendar Resource Booking Calendar ir.ui.view qweb New
view_calendar_event_form calendar.event.view.form.inherit calendar.event form Inherits calendar.view_calendar_event_form
Models touched (9)

New fields (1)
  • resource_booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='meeting_id' string='Resource booking'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
    Transfer resource booking to _attendees_values by context. We need to serialize the creation in that case. mail_notify_author key from context is necessary to force the notification to be sent to author.
  • get_interval(self, interval, tz=None)
    Autofix tz from related resource booking. This function is called to render calendar.event notification mails. Any notification related to a resource.booking must be emitted in the same TZ as the resource.booking. Otherwise it's confusing to the user.
  • unlink(self)
    Check you're allowed to unschedule it.
  • write(self, vals)
    Check you're allowed to reschedule it.

New fields (1)
  • booking_id Many2one → resource.booking
    ondelete='cascade' string='Resource booking' args: 'resource.booking'
Public methods (1)
  • action_open_resource_booking(self)

New fields (1)
  • category Selection
    selection_add=[('resource_booking', 'Resource booking')]
Public methods (0)

No public methods.

New fields (21)
  • active Boolean
    default=True
  • booking_activity_ids One2many → mail.activity
    string='Activities' args: 'mail.activity', 'booking_id'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • combination_auto_assign Boolean
    default=True help='When checked, resource combinations will be (un)assigned automatically based on their availability during the booking dates.' string='Auto assigned'
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' compute='_compute_combination_id' copy=False domain="[('type_rel_ids.type_id', 'in', [type_id])]" index=True readonly=False states={'scheduled': [('required', True)], 'confirmed': [('required', True)]} store=True string='Resources combination' tracking=True
  • description Html
  • duration Float
    compute='_compute_duration' help='Amount of time that the resources will be booked and unavailable for others.' readonly=False store=True tracking=True
  • is_modifiable Boolean
    compute='_compute_is_modifiable'
  • is_overdue Boolean
    compute='_compute_is_overdue'
  • location Char
    compute='_compute_location' readonly=False store=True
  • meeting_id Many2one → calendar.event
    comodel_name='calendar.event' context={'default_res_id': False, 'default_res_model': False} copy=False help='Meeting confirmed for this booking.' index=True ondelete='set null' string='Meeting'
  • name Char
    help='Leave empty to autogenerate a booking name.' index=True
  • partner_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_id' inverse='_inverse_partner_id' readonly=False search='_search_partner_id' string='Requester'
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' help='Who will attend this booking?' required=True string='Attendees' tracking=True
  • requester_advice Text
    readonly=True related='type_id.requester_advice'
  • start Datetime
    compute='_compute_start' copy=False index=True readonly=False store=True tracking=True
  • state Selection
    compute='_compute_state' default='pending' help='Pending: No meeting scheduled.\nScheduled: The requester has not confirmed attendance yet.\nConfirmed: Meeting scheduled, and requester attendance confirmed.\nCanceled: Meeting removed, booking archived.' index=True store=True tracking=True args: [('pending', 'Pending'), ('scheduled', 'Scheduled'), ('confirmed', 'Confirmed'), ('canceled', 'Canceled')]
  • stop Datetime
    compute='_compute_stop' copy=False index=True store=True tracking=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type' tracking=True
  • user_id Many2one → res.users
    comodel_name='res.users' compute='_compute_user_id' default=<expr> help='Who organized this booking? Usually whoever created the record. It will appear as the calendar event organizer, when scheduled, and calendar notifications will be sent in his/her name.' index=True readonly=False store=True string='Organizer' tracking=True
  • videocall_location Char
    compute='_compute_videocall_location' readonly=False store=True string='Meeting URL'
Public methods (9)
  • action_cancel(self)
    Cancel this booking.
  • action_confirm(self)
    Confirm own and requesting partner's attendance.
  • action_open_portal(self)
  • action_schedule(self)
    Redirect user to a simpler way to schedule this booking.
  • action_unschedule(self)
    Remove associated meetings.
  • create(self, vals_list)
    @api.model_create_multi
    Sync booking with meeting if needed.
  • name_get(self)
    Autogenerate booking name if none is provided.
  • unlink(self)
    Unlink meeting if needed.
  • write(self, vals)
    Sync booking with meeting if needed.

New fields (8)
  • active Boolean
    default=True
  • booking_count Integer
    compute='_compute_booking_count' string='Booking count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='combination_id' string='Bookings'
  • forced_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' help="Force a specific calendar, instead of combining the resources'." index=True string='Forced calendar'
  • name Char
    compute='_compute_name' store=True
  • resource_ids Many2many → resource.resource
    comodel_name='resource.resource' help='Resources that must be free to be booked together.' required=True string='Resources'
  • type_count Integer
    compute='_compute_type_count' string='Booking types'
  • type_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' help='Resource booking types where this combination is available.' inverse_name='combination_id' string='Resource booking types'
Public methods (2)
  • action_open_bookings(self)
  • action_open_resource_booking_types(self)

New fields (15)
  • active Boolean
    default=True
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Meetings will be created with these reminders by default.' string='Default reminders'
  • booking_count Integer
    compute='_compute_booking_count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' help='Bookings available for this type' inverse_name='type_id' string='Bookings'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' help='Meetings will be created with these tags by default.' string='Default tags'
  • combination_assignment Selection
    default='random' help='Choose how to auto-assign resource combinations. It has no effect if assiged manually.' required=True args: [('sorted', 'Sorted: pick the first one that is free'), ('random', 'Randomly: order is not important')]
  • combination_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' copy=True help='Resource combinations available for this type of bookings.' inverse_name='type_id' string='Available resource combinations'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='Company where this booking type is available.' index=True readonly=False store=True string='Company'
  • duration Float
    default=0.5 help='Interval offered to start each resource booking. Also used as booking default duration.' required=True
  • location Char
  • modifications_deadline Float
    default=24 help='When this deadline has been exceeded, if a booking was not yet confirmed, it will be canceled automatically. Also, only booking managers will be able to unschedule or reschedule them. The value is expressed in hours.' required=True
  • name Char
    index=True required=True translate=True
  • requester_advice Text
    help='Text that will appear by default in portal invitation emails and in calendar views for scheduling.' translate=True
  • resource_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' default=<expr> help='Restrict bookings to this schedule.' index=True ondelete='restrict' required=True string='Availability Calendar'
  • videocall_location Char
    string='Meeting URL'
Public methods (1)
  • action_open_bookings(self)

New fields (4)
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' index=True ondelete='cascade' required=True string='Combination'
  • sequence Integer
    default=100 index=True required=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type'
  • type_name Char
    related='type_id.name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • is_available(self, start_dt, end_dt, domain=None, tz=None)
    Convenience method to check whether a resource is available within a time span.
REPOSITORY
REPOSITORYOCA/calendar
GIT
GIThttps://github.com/OCA/calendar.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/calendar/tree/14.0/resource_booking
VERSION
VERSION 1.3.4
CATEGORY
CATEGORYAppointments
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, Víctor Martínez, Weblate, OCA-git-bot, Carmen Bianca BAKKER, oca-ci, hugues de keyzer
WEBSITE
WEBSITEhttps://github.com/OCA/calendar
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_calendar_slot_duration
odoo/odoo:
    - calendar
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cssselect
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
alert_availability_lost Alert Resource Booking Availability was Lost ir.ui.view qweb New
assets_frontend assets_frontend ir.ui.view qweb Inherits web.assets_frontend
message_combination_assigned message_combination_assigned ir.ui.view qweb New
portal_breadcrumbs portal_breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_bookings My Bookings ir.ui.view qweb New
portal_my_home portal_my_home ir.ui.view qweb Inherits portal.portal_my_home
resource_booking_combination_form Resource booking combination form resource.booking.combination form New
resource_booking_combination_view_search resource.booking.combination.view.search resource.booking.combination search New
resource_booking_combination_view_tree Resource booking combination tree resource.booking.combination tree New
resource_booking_form Resource booking form resource.booking form New
resource_booking_portal_form Booking portal form ir.ui.view qweb New
resource_booking_portal_header Resource Booking Header ir.ui.view qweb New
resource_booking_portal_schedule Resource Booking Scheduling ir.ui.view qweb New
resource_booking_type_form Resource booking type form resource.booking.type form New
resource_booking_type_view_search resource.booking.type.view.search resource.booking.type search New
resource_booking_type_view_tree Resource booking type tree resource.booking.type tree New
resource_booking_view_calendar Resource booking calendar resource.booking calendar New
resource_booking_view_search resource.booking.view.search resource.booking search New
resource_booking_view_tree Resource booking tree resource.booking tree New
scheduling_calendar Resource Booking Calendar ir.ui.view qweb New
view_calendar_event_form calendar.event.view.form.inherit calendar.event form Inherits calendar.view_calendar_event_form
Models touched (7)

New fields (1)
  • resource_booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='meeting_id' string='Resource booking'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
    Transfer resource booking to _attendees_values by context. We need to serialize the creation in that case. mail_notify_author key from context is necessary to force the notification to be sent to author.
  • get_interval(self, interval, tz=None)
    Autofix tz from related resource booking. This function is called to render calendar.event notification mails. Any notification related to a resource.booking must be emitted in the same TZ as the resource.booking. Otherwise it's confusing to the user.
  • unlink(self)
    Check you're allowed to unschedule it.
  • write(self, vals)
    Check you're allowed to reschedule it.

New fields (18)
  • active Boolean
    default=True
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • combination_auto_assign Boolean
    default=True help='When checked, resource combinations will be (un)assigned automatically based on their availability during the booking dates.' string='Auto assigned'
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' compute='_compute_combination_id' copy=False domain="[('type_rel_ids.type_id', 'in', [type_id])]" index=True readonly=False states={'scheduled': [('required', True)], 'confirmed': [('required', True)]} store=True string='Resources combination' tracking=True
  • description Html
    args: 'Description'
  • duration Float
    compute='_compute_duration' help='Amount of time that the resources will be booked and unavailable for others.' readonly=False store=True tracking=True
  • is_modifiable Boolean
    compute='_compute_is_modifiable'
  • is_overdue Boolean
    compute='_compute_is_overdue'
  • location Char
    compute='_compute_location' readonly=False store=True
  • meeting_id Many2one → calendar.event
    comodel_name='calendar.event' context={'default_res_id': False, 'default_res_model': False} copy=False help='Meeting confirmed for this booking.' index=True ondelete='set null' string='Meeting'
  • name Char
    help='Leave empty to autogenerate a booking name.' index=True
  • partner_id Many2one → res.partner
    help='Who requested this booking?' index=True ondelete='cascade' required=True string='Requester' tracking=True args: 'res.partner'
  • requester_advice Text
    readonly=True related='type_id.requester_advice'
  • start Datetime
    compute='_compute_start' copy=False index=True readonly=False store=True tracking=True
  • state Selection
    compute='_compute_state' default='pending' help='Pending: No meeting scheduled.\nScheduled: The requester has not confirmed attendance yet.\nConfirmed: Meeting scheduled, and requester attendance confirmed.\nCanceled: Meeting removed, booking archived.' index=True store=True tracking=True args: [('pending', 'Pending'), ('scheduled', 'Scheduled'), ('confirmed', 'Confirmed'), ('canceled', 'Canceled')]
  • stop Datetime
    compute='_compute_stop' copy=False index=True store=True tracking=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type' tracking=True
  • user_id Many2one → res.users
    compute='_compute_user_id' default=<expr> help='Who organized this booking? Usually whoever created the record. It will appear as the calendar event organizer, when scheduled, and calendar notifications will be sent in his/her name.' index=True readonly=False store=True string='Organizer' tracking=True args: 'res.users'
Public methods (9)
  • action_cancel(self)
    Cancel this booking.
  • action_confirm(self)
    Confirm own and requesting partner's attendance.
  • action_open_portal(self)
  • action_schedule(self)
    Redirect user to a simpler way to schedule this booking.
  • action_unschedule(self)
    Remove associated meetings.
  • create(self, vals_list)
    @api.model_create_multi
    Sync booking with meeting if needed.
  • name_get(self)
    Autogenerate booking name if none is provided.
  • unlink(self)
    Unlink meeting if needed.
  • write(self, vals)
    Sync booking with meeting if needed.

New fields (8)
  • active Boolean
    default=True
  • booking_count Integer
    compute='_compute_booking_count' string='Booking count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='combination_id' string='Bookings'
  • forced_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' help="Force a specific calendar, instead of combining the resources'." index=True string='Forced calendar'
  • name Char
    compute='_compute_name' store=True
  • resource_ids Many2many → resource.resource
    comodel_name='resource.resource' help='Resources that must be free to be booked together.' required=True string='Resources'
  • type_count Integer
    compute='_compute_type_count' string='Booking types'
  • type_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' help='Resource booking types where this combination is available.' inverse_name='combination_id' string='Resource booking types'
Public methods (2)
  • action_open_bookings(self)
  • action_open_resource_booking_types(self)

New fields (14)
  • active Boolean
    default=True index=True
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Meetings will be created with these reminders by default.' string='Default reminders'
  • booking_count Integer
    compute='_compute_booking_count'
  • booking_ids One2many → resource.booking
    help='Bookings available for this type' string='Bookings' args: 'resource.booking', 'type_id'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' help='Meetings will be created with these tags by default.' string='Default tags'
  • combination_assignment Selection
    default='random' help='Choose how to auto-assign resource combinations. It has no effect if assiged manually.' required=True args: [('sorted', 'Sorted: pick the first one that is free'), ('random', 'Randomly: order is not important')]
  • combination_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' copy=True help='Resource combinations available for this type of bookings.' inverse_name='type_id' string='Available resource combinations'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='Company where this booking type is available.' index=True readonly=False store=True string='Company'
  • duration Float
    default=0.5 help='Interval offered to start each resource booking. Also used as booking default duration.' required=True
  • location Char
  • modifications_deadline Float
    default=24 help='When this deadline has been exceeded, if a booking was not yet confirmed, it will be canceled automatically. Also, only booking managers will be able to unschedule or reschedule them. The value is expressed in hours.' required=True
  • name Char
    index=True required=True translate=True
  • requester_advice Text
    help='Text that will appear by default in portal invitation emails and in calendar views for scheduling.' translate=True
  • resource_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' default=<expr> help='Restrict bookings to this schedule.' index=True ondelete='restrict' required=True string='Availability Calendar'
Public methods (1)
  • action_open_bookings(self)

New fields (4)
  • combination_id Many2one → resource.booking.combination
    index=True ondelete='cascade' required=True string='Combination' args: 'resource.booking.combination'
  • sequence Integer
    default=100 index=True required=True
  • type_id Many2one → resource.booking.type
    index=True ondelete='cascade' required=True string='Type' args: 'resource.booking.type'
  • type_name Char
    related='type_id.name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • is_available(self, start_dt, end_dt, domain=None, tz=None)
    Convenience method to check whether a resource is available within a time span.
REPOSITORY
REPOSITORYOCA/calendar
GIT
GIThttps://github.com/OCA/calendar.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/calendar/tree/13.0/resource_booking
VERSION
VERSION 2.6.5
CATEGORY
CATEGORYAppointments
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, Jairo Llopis, david, OCA Transbot, oca-travis, OCA-git-bot, jguenat
WEBSITE
WEBSITEhttps://github.com/OCA/calendar
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:18
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_calendar_slot_duration
odoo/odoo:
    - calendar
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cssselect
freezegun
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
alert_availability_lost Alert Resource Booking Availability was Lost ir.ui.view qweb New
assets_frontend assets_frontend ir.ui.view qweb Inherits web.assets_frontend
message_combination_assigned message_combination_assigned ir.ui.view qweb New
portal_breadcrumbs portal_breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_bookings My Bookings ir.ui.view qweb New
portal_my_home portal_my_home ir.ui.view qweb Inherits portal.portal_my_home
resource_booking_combination_form Resource booking combination form resource.booking.combination form New
resource_booking_combination_view_search resource.booking.combination.view.search resource.booking.combination search New
resource_booking_combination_view_tree Resource booking combination tree resource.booking.combination tree New
resource_booking_form Resource booking form resource.booking form New
resource_booking_portal_form Booking portal form ir.ui.view qweb New
resource_booking_portal_header Resource Booking Header ir.ui.view qweb New
resource_booking_portal_schedule Resource Booking Scheduling ir.ui.view qweb New
resource_booking_type_form Resource booking type form resource.booking.type form New
resource_booking_type_view_search resource.booking.type.view.search resource.booking.type search New
resource_booking_type_view_tree Resource booking type tree resource.booking.type tree New
resource_booking_view_calendar Resource booking calendar resource.booking calendar New
resource_booking_view_search resource.booking.view.search resource.booking search New
resource_booking_view_tree Resource booking tree resource.booking tree New
scheduling_calendar Resource Booking Calendar ir.ui.view qweb New
view_calendar_event_form calendar.event.view.form.inherit calendar.event form Inherits calendar.view_calendar_event_form
Models touched (7)

New fields (1)
  • resource_booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='meeting_id' string='Resource booking'
Public methods (4)
  • create_attendees(self)
    Autoconfirm resource attendees if preselected.
  • get_interval(self, interval, tz=None)
    Autofix tz from related resource booking. This function is called to render calendar.event notification mails. Any notification related to a resource.booking must be emitted in the same TZ as the resource.booking. Otherwise it's confusing to the user.
  • unlink(self, can_be_deleted=True)
    Check you're allowed to unschedule it.
  • write(self, vals)
    Check you're allowed to reschedule it.

New fields (17)
  • active Boolean
    default=True
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • combination_auto_assign Boolean
    default=True help='When checked, resource combinations will be (un)assigned automatically based on their availability during the booking dates.' string='Auto assigned'
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' compute='_compute_combination_id' copy=False domain="[('type_rel_ids.type_id', 'in', [type_id])]" index=True readonly=False states={'scheduled': [('required', True)], 'confirmed': [('required', True)]} store=True string='Resources combination' tracking=True
  • duration Float
    compute='_compute_duration' help='Amount of time that the resources will be booked and unavailable for others.' readonly=False store=True track_sequence=220 tracking=True
  • is_modifiable Boolean
    compute='_compute_is_modifiable'
  • is_overdue Boolean
    compute='_compute_is_overdue'
  • location Char
    compute='_compute_location' readonly=False store=True
  • meeting_id Many2one → calendar.event
    comodel_name='calendar.event' context={'default_res_id': False, 'default_res_model': False} copy=False help='Meeting confirmed for this booking.' index=True ondelete='set null' string='Meeting'
  • name Char
    help='Leave empty to autogenerate a booking name.' index=True
  • partner_id Many2one → res.partner
    help='Who requested this booking?' index=True ondelete='cascade' required=True string='Requester' tracking=True args: 'res.partner'
  • requester_advice Text
    readonly=True related='type_id.requester_advice'
  • start Datetime
    compute='_compute_start' copy=False index=True readonly=False store=True track_sequence=200 tracking=True
  • state Selection
    compute='_compute_state' default='pending' help='Pending: No meeting scheduled.\nScheduled: The requester has not confirmed attendance yet.\nConfirmed: Meeting scheduled, and requester attendance confirmed.\nCanceled: Meeting removed, booking archived.' index=True store=True tracking=True args: [('pending', 'Pending'), ('scheduled', 'Scheduled'), ('confirmed', 'Confirmed'), ('canceled', 'Canceled')]
  • stop Datetime
    compute='_compute_stop' copy=False index=True store=True track_sequence=210 tracking=True
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type' tracking=True
  • user_id Many2one → res.users
    compute='_compute_user_id' default=<expr> help='Who organized this booking? Usually whoever created the record. It will appear as the calendar event organizer, when scheduled, and calendar notifications will be sent in his/her name.' index=True readonly=False store=True string='Organizer' tracking=True args: 'res.users'
Public methods (9)
  • action_cancel(self)
    Cancel this booking.
  • action_confirm(self)
    Confirm own and requesting partner's attendance.
  • action_open_portal(self)
  • action_schedule(self)
    Redirect user to a simpler way to schedule this booking.
  • action_unschedule(self)
    Remove associated meetings.
  • create(self, vals_list)
    @api.model_create_multi
    Sync booking with meeting if needed.
  • name_get(self)
    Autogenerate booking name if none is provided.
  • unlink(self)
    Unlink meeting if needed.
  • write(self, vals)
    Sync booking with meeting if needed.

New fields (8)
  • active Boolean
    default=True
  • booking_count Integer
    compute='_compute_booking_count' string='Booking count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='combination_id' string='Bookings'
  • forced_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' help="Force a specific calendar, instead of combining the resources'." index=True string='Forced calendar'
  • name Char
    compute='_compute_name' store=True
  • resource_ids Many2many → resource.resource
    comodel_name='resource.resource' help='Resources that must be free to be booked together.' required=True string='Resources'
  • type_count Integer
    compute='_compute_type_count' string='Booking types'
  • type_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' help='Resource booking types where this combination is available.' inverse_name='combination_id' string='Resource booking types'
Public methods (2)
  • action_open_bookings(self)
  • action_open_resource_booking_types(self)

New fields (14)
  • active Boolean
    default=True index=True
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Meetings will be created with these reminders by default.' string='Default reminders'
  • booking_count Integer
    compute='_compute_booking_count'
  • booking_ids One2many → resource.booking
    help='Bookings available for this type' string='Bookings' args: 'resource.booking', 'type_id'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' help='Meetings will be created with these tags by default.' string='Default tags'
  • combination_assignment Selection
    default='random' help='Choose how to auto-assign resource combinations. It has no effect if assiged manually.' required=True args: [('sorted', 'Sorted: pick the first one that is free'), ('random', 'Randomly: order is not important')]
  • combination_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' copy=True help='Resource combinations available for this type of bookings.' inverse_name='type_id' string='Available resource combinations'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='Company where this booking type is available.' index=True readonly=False store=True string='Company'
  • duration Float
    default=0.5 help='Interval offered to start each resource booking. Also used as booking default duration.' required=True
  • location Char
  • modifications_deadline Float
    default=24 help='When this deadline has been exceeded, if a booking was not yet confirmed, it will be canceled automatically. Also, only booking managers will be able to unschedule or reschedule them. The value is expressed in hours.' required=True
  • name Char
    index=True required=True translate=True
  • requester_advice Text
    help='Text that will appear by default in portal invitation emails and in calendar views for scheduling.' translate=True
  • resource_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' default=<expr> help='Restrict bookings to this schedule.' index=True ondelete='restrict' required=True string='Availability Calendar'
Public methods (1)
  • action_open_bookings(self)

New fields (4)
  • combination_id Many2one → resource.booking.combination
    index=True ondelete='cascade' required=True string='Combination' args: 'resource.booking.combination'
  • sequence Integer
    default=100 index=True required=True
  • type_id Many2one → resource.booking.type
    index=True ondelete='cascade' required=True string='Type' args: 'resource.booking.type'
  • type_name Char
    related='type_id.name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/calendar
GIT
GIThttps://github.com/OCA/calendar.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/calendar/tree/12.0/resource_booking
VERSION
VERSION 1.5.1
CATEGORY
CATEGORYAppointments
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSJairo Llopis, OCA Transbot, João Marques, oca-travis, Weblate, OCA-git-bot, Yajo, jguenat
WEBSITE
WEBSITEhttps://github.com/OCA/calendar
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:23
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/web:
    - web_calendar_slot_duration
odoo/odoo:
    - calendar
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - portal
    - http_routing
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cssselect
freezegun
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
alert_availability_lost Alert Resource Booking Availability was Lost ir.ui.view qweb New
assets_frontend assets_frontend ir.ui.view qweb Inherits web.assets_frontend
message_combination_assigned message_combination_assigned ir.ui.view qweb New
portal_breadcrumbs portal_breadcrumbs ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_bookings My Bookings ir.ui.view qweb New
portal_my_home portal_my_home ir.ui.view qweb Inherits portal.portal_my_home
resource_booking_combination_form Resource booking combination form resource.booking.combination form New
resource_booking_combination_view_search resource.booking.combination.view.search resource.booking.combination search New
resource_booking_combination_view_tree Resource booking combination tree resource.booking.combination tree New
resource_booking_form Resource booking form resource.booking form New
resource_booking_portal_form Booking portal form ir.ui.view qweb New
resource_booking_portal_header Resource Booking Header ir.ui.view qweb New
resource_booking_portal_schedule Resource Booking Scheduling ir.ui.view qweb New
resource_booking_type_form Resource booking type form resource.booking.type form New
resource_booking_type_view_search resource.booking.type.view.search resource.booking.type search New
resource_booking_type_view_tree Resource booking type tree resource.booking.type tree New
resource_booking_view_calendar Resource booking calendar resource.booking calendar New
resource_booking_view_search resource.booking.view.search resource.booking search New
resource_booking_view_tree Resource booking tree resource.booking tree New
scheduling_calendar Resource Booking Calendar ir.ui.view qweb New
view_calendar_event_form calendar.event.view.form.inherit calendar.event form Inherits calendar.view_calendar_event_form
Models touched (7)

New fields (1)
  • resource_booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='meeting_id' string='Resource booking'
Public methods (3)
  • get_interval(self, interval, tz=None)
    Autofix tz from related resource booking. This function is called to render calendar.event notification mails. Any notification related to a resource.booking must be emitted in the same TZ as the resource.booking. Otherwise it's confusing to the user.
  • unlink(self)
    Check you're allowed to unschedule it.
  • write(self, vals)
    Check you're allowed to reschedule it.

New fields (14)
  • active Boolean
    default=True index=True
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • combination_id Many2one → resource.booking.combination
    comodel_name='resource.booking.combination' copy=False domain="[('type_rel_ids.type_id', 'in', [type_id])]" index=True states={'scheduled': [('required', True)], 'confirmed': [('required', True)]} string='Resources combination' track_visibility='onchange'
  • involves_me Boolean
    compute='_compute_involves_me' search='_search_involves_me'
  • is_modifiable Boolean
    compute='_compute_overdue'
  • is_overdue Boolean
    compute='_compute_overdue'
  • meeting_id Many2one → calendar.event
    auto_join=True comodel_name='calendar.event' context={'default_res_id': False, 'default_res_model': False} copy=False help='Meeting confirmed for this booking.' index=True ondelete='set null' string='Meeting'
  • name Char
    compute='_compute_name'
  • partner_id Many2one → res.partner
    help='Who requested this booking?' index=True ondelete='cascade' required=True string='Requester' track_visibility='onchange' args: 'res.partner'
  • requester_advice Text
    readonly=True related='type_id.requester_advice'
  • start Datetime
    compute='_compute_dates' copy=False index=True inverse='_inverse_dates' store=True track_sequence=200 track_visibility='onchange'
  • state Selection
    compute='_compute_state' default='pending' help='Pending: No meeting scheduled.\nScheduled: The requester has not confirmed attendance yet.\nConfirmed: Meeting scheduled, and requester attendance confirmed.\nCanceled: Meeting removed, booking archived.' index=True store=True track_visibility='onchange' args: [('pending', 'Pending'), ('scheduled', 'Scheduled'), ('confirmed', 'Confirmed'), ('canceled', 'Canceled')]
  • stop Datetime
    compute='_compute_dates' copy=False index=True inverse='_inverse_dates' store=True track_sequence=210 track_visibility='onchange'
  • type_id Many2one → resource.booking.type
    comodel_name='resource.booking.type' index=True ondelete='cascade' required=True string='Type' track_visibility='onchange'
Public methods (6)
  • action_cancel(self)
    Cancel this booking.
  • action_confirm(self)
    Confirm own and requesting partner's attendance.
  • action_open_portal(self)
  • action_schedule(self)
    Redirect user to a simpler way to schedule this booking.
  • action_unschedule(self)
    Remove associated meetings.
  • message_get_suggested_recipients(self)

New fields (8)
  • active Boolean
    default=True index=True
  • booking_count Integer
    compute='_compute_booking_count' string='Booking count'
  • booking_ids One2many → resource.booking
    comodel_name='resource.booking' inverse_name='combination_id' string='Bookings'
  • forced_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' help="Force a specific calendar, instead of combining the resources'." index=True string='Forced calendar'
  • name Char
    compute='_compute_name' store=True
  • resource_ids Many2many → resource.resource
    comodel_name='resource.resource' help='Resources that must be free to be booked together.' required=True string='Resources'
  • type_count Integer
    compute='_compute_type_count' string='Booking types'
  • type_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' help='Resource booking types where this combination is available.' inverse_name='combination_id' string='Resource booking types'
Public methods (2)
  • action_open_bookings(self)
  • action_open_resource_booking_types(self)

New fields (14)
  • active Boolean
    default=True index=True
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Meetings will be created with these reminders by default.' string='Default reminders'
  • booking_count Integer
    compute='_compute_booking_count'
  • booking_ids One2many → resource.booking
    help='Bookings available for this type' string='Bookings' args: 'resource.booking', 'type_id'
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' help='Meetings will be created with these tags by default.' string='Default tags'
  • combination_assignment Selection
    default='random' help='Choose how to auto-assign resource combinations. It has no effect if assiged manually.' required=True args: [('sorted', 'Sorted: pick the first one that is free'), ('random', 'Randomly: order is not important')]
  • combination_rel_ids One2many → resource.booking.type.combination.rel
    comodel_name='resource.booking.type.combination.rel' help='Resource combinations available for this type of bookings.' inverse_name='type_id' string='Available resource combinations'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> help='Company where this booking type is available.' index=True readonly=False store=True string='Company'
  • duration Float
    default=0.5 help="Establish each interval's duration." required=True
  • location Char
  • modifications_deadline Float
    default=24 help='When this deadline has been exceeded, if a booking was not yet confirmed, it will be canceled automatically. Also, only booking managers will be able to unschedule or reschedule them. The value is expressed in hours.' required=True
  • name Char
    index=True required=True translate=True
  • requester_advice Text
    help='Text that will appear by default in portal invitation emails and in calendar views for scheduling.' translate=True
  • resource_calendar_id Many2one → resource.calendar
    comodel_name='resource.calendar' default=<expr> help='Restrict bookings to this schedule.' index=True ondelete='restrict' required=True string='Availability Calendar'
Public methods (1)
  • action_open_bookings(self)

New fields (4)
  • combination_id Many2one → resource.booking.combination
    index=True ondelete='cascade' required=True string='Combination' args: 'resource.booking.combination'
  • sequence Integer
    default=100 index=True required=True
  • type_id Many2one → resource.booking.type
    index=True ondelete='cascade' required=True string='Type' args: 'resource.booking.type'
  • type_name Char
    related='type_id.name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/calendar
PULL REQUEST
PULL REQUEST[19.0][MIG] resource_booking: Migration to 19.0 (#217)