TIP: You can type at any time to perform a new search.
Calendar
calendar · odoo/odoo
⚠ Security warnings
calendar_attendee_rule_my— Record rule with an always-true domain grants portal/public users access to every record of its model rule-public-bypass · source
Found by automated static analysis: these patterns are usually risky, but only a manual review of the module can confirm a real issue.
- Repository
- odoo/odoo · module folder
- Module version
- 1.1
- Category
- Productivity/Calendar
- Folder size
- 9.57 MB
- License
- LGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- None
- Last tracking update
- 2026-08-15 22:44:18
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Christophe Simonis, Thibault Delavallée, odoo, Odoo Translation Bot, Aaron Bohy, Jairo Llopis, Lucas Perais, Julien Castiaux, Sébastien Theys, Julien Mougenot, Rémy Voet (ryv), Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Arnaud Joset, William Braeckman, Didier (did), luvi, Renaud Thiry, tsm-odoo, Louis Wicket (wil), Maximilien (malb), Victor Piryns (pivi), Julien (jula), Thomas Becquevort (thbe), amdi-odoo, Levi Siuzdak (sile), Maruan Aguerdouh (magm), Dylan Kiss (dyki), Mayurrajsinh Rathod, Rahul Prajapati, Noe Antoine, sesn-odoo, aktr-odoo, bary, Maryam Kia, jorv-odoo, reka-odoo, dhba, Bastien Fafchamps (bafa), Gabriel (gdpf), Tanguy Quéguineur, Chrysanthe (chgo), mano-odoo, aamo-odoo, guce, yagp-odoo, Pierre Pulinckx (PIPU), Ezzuldin Zaky (ezza), sben-odoo, st-yes, abdelrahmanfawzy, Pierre Pulinckx, Bastien PIERRE, nikj-odoo, Michaël Mattiello, Jeffrey Luo, kpt-odoo, Samuel Fritz Struble, pish-odoo, Krzysztof Magusiak (krma), krip-odoo, Sylvio Poliart (sypol), Gurpreet Singh, mojem, pajo, Laetitia (ldau), adip-odoo, Yagnik ✗ (yagp), assh-odoo, Kevin Gerard (kege), saurabh, Jan Suhr, alan-odoo, Kadam Darji, Farah (ahmfa), MostafaTwfiq, Julien Carion, ELCO, chpa-odoo, FedericoBraidi, Manoel Malafaia
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- calendar_event_type_multi_company, calendar_public_holiday, calendar_sms, crm, crm_phonecall, fieldservice_calendar, google_calendar, hr_calendar, hr_holidays, hr_homeworking_calendar, hr_recruitment, mail_activity_board, microsoft_calendar, pms_sale, resource_booking, test_discuss_full
- Description
This is a full-featured calendar system. ======================================== It supports: ------------ - Calendar of events - Recurring events If you need to manage your meetings, you should install the CRM module.
Code Analysis ⓘ
Views touched (19)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
calendar_alarm_view_form |
calendar.alarm.form | calendar.alarm | form | New |
calendar_popover_delete_view |
calendar.popover.delete.wizard.view.form | calendar.popover.delete.wizard | form | New |
calendar_provider_config_view_form |
calendar.provider.config.view.form | calendar.provider.config | form | New |
invitation_page_anonymous |
Calendar Invitation Page for anonymous users | ir.ui.view | qweb | New |
mail_activity_schedule_view_form |
mail.activity.schedule.inherit.calendar | mail.activity.schedule | calendar | Inherits mail.mail_activity_schedule_view_form |
mail_activity_view_form_popup |
mail.activity.form.inherit.calendar | mail.activity | calendar | Inherits mail.mail_activity_view_form_popup |
res_config_settings_view_form |
res.config.settings.view.form.inherit.calendar | res.config.settings | calendar | Inherits base.res_config_settings_view_form |
res_users_form_view |
res.users.form.calendar | res.users | calendar | Inherits base.view_users_form |
res_users_form_view_calendar_default_privacy |
res.users.preferences.form.inherit | res.users | form | Inherits base.view_users_form_simple_modif |
res_users_view_form |
res.users.view.form.inherit.calendar | res.users | calendar | Inherits base.view_users_form |
view_calendar_alarm_tree |
calendar.alarm.list | calendar.alarm | list | New |
view_calendar_event_calendar |
calendar.event.calendar | calendar.event | calendar | New |
view_calendar_event_form |
calendar.event.form | calendar.event | form | New |
view_calendar_event_form_quick_create |
calendar.event.form.quick_create | calendar.event | form | New |
view_calendar_event_search |
calendar.event.search | calendar.event | search | New |
view_calendar_event_tree |
calendar.event.list | calendar.event | list | New |
view_calendar_event_type_tree |
calendar.event.type | calendar.event.type | list | New |
view_event_delete_wizard_form |
calendar.popover.delete.wizard.form | calendar.popover.delete.wizard | form | New |
view_partners_form |
res_partner.view.form.calendar | res.partner | calendar | Inherits base.view_partner_form |
HTTP endpoints (10)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/calendar/meeting/accept |
CalendarController.accept_meeting |
calendar | http | ALL | sudo |
/calendar/recurrence/accept |
CalendarController.accept_recurrence |
calendar | http | ALL | sudo |
/calendar/meeting/join |
CalendarController.calendar_join_meeting |
user | http | ALL | sudo website |
/calendar/join_videocall/<string:access_token> |
CalendarController.calendar_join_videocall |
public | http | ALL | sudo |
/calendar/check_credentials |
CalendarController.check_calendar_credentials |
user | jsonrpc | ALL | |
/calendar/meeting/decline |
CalendarController.decline_meeting |
calendar | http | ALL | sudo |
/calendar/recurrence/decline |
CalendarController.decline_recurrence |
calendar | http | ALL | sudo |
/calendar/notify |
CalendarController.notify |
user | jsonrpc | ALL | |
/calendar/notify_ack |
CalendarController.notify_ack |
user | jsonrpc | ALL | sudo |
/calendar/meeting/view |
CalendarController.view_meeting |
calendar | http | ALL | sudo |
Models touched (18)
New fields (8)
-
alarm_typeSelectiondefault='email'required=Truestring='Type' args: [('notification', 'Notification'), ('email', 'Email')] -
bodyTexthelp='Additional message that would be sent with the notification for the reminder' args: 'Additional Message' -
durationIntegerdefault=1required=True args: 'Remind Before' -
duration_minutesIntegercompute='_compute_duration_minutes'search='_search_duration_minutes'store=True args: 'Duration in minutes' -
intervalSelectiondefault='hours'required=True args: list(_interval_selection.items()), 'Unit' -
mail_template_idMany2one → mail.templatecompute='_compute_mail_template_id'domain=[('model', 'in', ['calendar.attendee'])]help='Template used to render mail reminder content.'readonly=Falsestore=Truestring='Email Template' args: 'mail.template' -
nameCharrequired=Truetranslate=True args: 'Name' -
notify_responsibleBooleandefault=False args: 'Notify Responsible'
No public methods.
New fields (0)
No new fields.
Public methods (3)-
do_check_alarm_for_one_date(self, one_date, event, event_maxdelta, in_the_next_X_seconds, alarm_type, after=False, missing=False)Search for some alarms in the interval of time determined by some parameters (after, in_the_next_X_seconds, ...) :param one_date: date of the event to check (not the same that in the event browse if recurrent) :param event: Event browse record :param event_maxdelta: biggest duration from alarms for this event :param in_the_next_X_seconds: looking in the future (in seconds) :param after: if not False: will return alert if after this date (date as string - todo: change in master) :param missing: if not False: will return alert even if we are too late :param notif: Looking for type notification :param mail: looking for type email -
do_notif_reminder(self, alert) -
get_next_notif(self)@api.model
New fields (10)
-
access_tokenChardefault=_default_access_token args: 'Invitation Token' -
availabilitySelectionreadonly=True args: [('free', 'Available'), ('busy', 'Busy')], 'Available/Busy' -
common_nameCharcompute='_compute_common_name'store=True args: 'Common name' -
emailCharrelated='partner_id.email' args: 'Email' -
event_idMany2one → calendar.eventindex=Trueondelete='cascade'required=True args: 'calendar.event', 'Meeting linked' -
mail_tzSelectioncompute='_compute_mail_tz'help='Timezone used for displaying time in the mail template' args: _tz_get -
partner_idMany2one → res.partnerondelete='cascade'readonly=Truerequired=True args: 'res.partner', 'Attendee' -
phoneCharrelated='partner_id.phone' args: 'Phone' -
recurrence_idMany2one → calendar.recurrencerelated='event_id.recurrence_id' args: 'calendar.recurrence' -
stateSelectiondefault='needsAction'string='Status' args: STATE_SELECTION
-
copy(self, default=None) -
create(self, vals_list)@api.model_create_multi -
do_accept(self)Marks event invitation as Accepted. -
do_decline(self)Marks event invitation as Declined. -
do_tentative(self)Makes event invitation as Tentative. -
unlink(self) -
write(self, vals)
New fields (67)
-
accepted_countIntegercompute='_compute_attendees_count' -
access_tokenCharcopy=Falseindex=Truestore=True args: 'Invitation Token' -
activeBooleandefault=Truehelp='If the active field is set to false, it will allow you to hide the event alarm information without removing it.'tracking=True args: 'Active' -
activity_idsOne2many → mail.activitystring='Activities' args: 'mail.activity', 'calendar_event_id' -
alarm_idsMany2many → calendar.alarmhelp='Notifications sent to all attendees to remind of the meeting.'ondelete='restrict'string='Reminders' args: 'calendar.alarm', 'calendar_alarm_calendar_event_rel' -
alldayBooleandefault=False args: 'All Day' -
attendee_idsOne2many → calendar.attendeeargs: 'calendar.attendee', 'event_id', 'Participant' -
attendees_countIntegercompute='_compute_attendees_count' -
awaiting_countIntegercompute='_compute_attendees_count' -
bydaySelectioncompute='_compute_recurrence'readonly=Falsestring='By day' args: BYDAY_SELECTION -
categ_idsMany2many → calendar.event.typeargs: 'calendar.event.type', 'meeting_category_rel', 'event_id', 'type_id', 'Tags' -
countIntegercompute='_compute_recurrence'help='Repeat x times'readonly=Falsestring='Number of Repetitions' -
current_attendeeMany2one → calendar.attendeecompute='_compute_current_attendee'search='_search_current_attendee' args: 'calendar.attendee' -
current_statusSelectionreadonly=Falserelated='current_attendee.state'string='Attending?' -
dayIntegercompute='_compute_recurrence'readonly=False args: 'Date of month' -
declined_countIntegercompute='_compute_attendees_count' -
descriptionHtmlhelp='When synchronization with an external calendar is active, this description is synchronized with the one of the associated meeting in that external calendar. Any update will be propagated there and vice versa.' args: 'Description' -
display_descriptionBooleancompute='_compute_display_description' -
display_timeCharcompute='_compute_display_time' args: 'Event Time' -
durationFloatcompute='_compute_duration'readonly=Falsestore=True args: 'Duration' -
effective_privacySelectioncompute='_compute_effective_privacy'help='Whether the event is private, considering the user privacy' args: [('public', 'Public'), ('private', 'Private'), ('confidential', 'Only internal users')], 'Effective Privacy' -
end_typeSelectioncompute='_compute_recurrence'readonly=Falsestring='Recurrence Termination' args: END_TYPE_SELECTION -
event_tzSelectioncompute='_compute_recurrence'readonly=Falsestring='Timezone' args: _tz_get -
follow_recurrenceBooleandefault=False -
friBooleancompute='_compute_recurrence'readonly=False -
intervalIntegercompute='_compute_recurrence'help='Repeat every (Days/Week/Month/Year)'readonly=Falsestring='Repeat On' -
invalid_email_partner_idsMany2many → res.partnercompute='_compute_invalid_email_partner_ids' args: 'res.partner' -
is_highlightedBooleancompute='_compute_is_highlighted'string='Is the Event Highlighted' -
is_organizer_aloneBooleancompute='_compute_is_organizer_alone'help="Check if the organizer is alone in the event, i.e. if the organizer is the only one that hasn't declined\n the event (only if the organizer is not the only attendee)"string='Is the Organizer Alone' -
locationChartracking=True args: 'Location' -
monBooleancompute='_compute_recurrence'readonly=False -
month_bySelectioncompute='_compute_recurrence'readonly=Falsestring='Option' args: MONTH_BY_SELECTION -
nameCharrequired=True args: 'Meeting Subject' -
notesHtmlargs: 'Notes' -
partner_idMany2one → res.partnerreadonly=Truerelated='user_id.partner_id'string='Scheduled by' args: 'res.partner' -
partner_idsMany2many → res.partnerdefault=_default_partnersstring='Attendees' args: 'res.partner', 'calendar_event_res_partner_rel' -
privacySelectionhelp='People to whom this event will be visible.' args: [('public', 'Public'), ('private', 'Private'), ('confidential', 'Only internal users')], 'Privacy' -
recurrence_idMany2one → calendar.recurrenceindex='btree_not_null'string='Recurrence Rule' args: 'calendar.recurrence' -
recurrence_updateSelectioncopy=Falsedefault='self_only'help='Choose what to do with other events in the recurrence. Updating All Events is not allowed when dates or time is modified'store=False args: [('self_only', 'This event'), ('future_events', 'This and following events'), ('all_events', 'All events')] -
recurrencyBooleanargs: 'Recurrent' -
res_idMany2oneReferencemodel_field='res_model' args: 'Document ID' -
res_modelCharreadonly=Truerelated='res_model_id.model'store=True args: 'Document Model Name' -
res_model_idMany2one → ir.modelondelete='cascade' args: 'ir.model', 'Document Model' -
res_model_nameCharrelated='res_model_id.name' -
rruleCharcompute='_compute_recurrence'readonly=False args: 'Recurrent Rule' -
rrule_typeSelectioncompute='_compute_recurrence'help='Let the event automatically repeat at that interval'readonly=Falsestring='Recurrence' args: RRULE_TYPE_SELECTION -
rrule_type_uiSelectioncompute='_compute_rrule_type_ui'help='Let the event automatically repeat at that interval'readonly=Falsestring='Repeat' args: RRULE_TYPE_SELECTION_UI -
satBooleancompute='_compute_recurrence'readonly=False -
should_show_statusBooleancompute='_compute_should_show_status' -
show_asSelectiondefault='busy'help="If the time is shown as 'busy', this event will be visible to other people with either the full information or simply 'busy' written depending on its privacy. Use this option to let other people know that you are unavailable during that period of time. \n If the event is shown as 'free', other users know that you are available during that period of time."required=True args: [('free', 'Available'), ('busy', 'Busy')], 'Show as' -
startDatetimedefault=_default_starthelp='Start date of an event, without time for full days events'index=Truerequired=Truetracking=True args: 'Start' -
start_dateDatecompute='_compute_dates'inverse='_inverse_dates'store=Truetracking=True args: 'Start Date' -
stopDatetimecompute='_compute_stop'default=_default_stophelp='Stop date of an event, without time for full days events'readonly=Falserequired=Truestore=Truetracking=True args: 'Stop' -
stop_dateDatecompute='_compute_dates'inverse='_inverse_dates'store=Truetracking=True args: 'End Date' -
sunBooleancompute='_compute_recurrence'readonly=False -
tentative_countIntegercompute='_compute_attendees_count' -
thuBooleancompute='_compute_recurrence'readonly=False -
tueBooleancompute='_compute_recurrence'readonly=False -
unavailable_partner_idsMany2many → res.partnercompute='_compute_unavailable_partner_ids'string='Unavailable Attendees' args: 'res.partner' -
untilDatecompute='_compute_recurrence'readonly=False -
user_can_editBooleancompute='_compute_user_can_edit' -
user_idMany2one → res.usersdefault=<expr>index='btree_not_null' args: 'res.users', 'Organizer' -
videocall_channel_idMany2one → discuss.channelindex='btree_not_null' args: 'discuss.channel', 'Discuss Channel' -
videocall_locationCharcompute='_compute_videocall_location'copy=Truestore=True args: 'Meeting URL' -
videocall_sourceSelectioncompute='_compute_videocall_source' args: [('discuss', 'Discuss'), ('custom', 'Custom')] -
wedBooleancompute='_compute_recurrence'readonly=False -
weekdaySelectioncompute='_compute_recurrence'readonly=False args: WEEKDAY_SELECTION
-
action_join_meeting(self, partner_id)Method used when an existing user wants to join -
action_join_video_call(self) -
action_mass_archive(self, recurrence_update_setting)The aim of this action purpose is to be called from sync calendar module when mass deletion is not possible. -
action_mass_deletion(self, recurrence_update_setting) -
action_open_calendar_event(self) -
action_open_composer(self) -
action_sendmail(self) -
action_unlink_event(self, attendee_id=None, recurrence=False)Delete the event after displaying the delete wizard if necessary. :param attendee_id: The ID of the attendee for the event :param recurrence: Boolean indicating if the event is recurring :return: Action to delete the event -
change_attendee_status(self, status, recurrence_update_setting) -
clear_videocall_location(self) -
copy(self, default=None)When an event is copied, the attendees should be recreated to avoid sharing the same attendee records between copies -
create(self, vals_list)@api.model_create_multi -
default_get(self, fields)@api.model -
find_partner_customer(self) -
get_default_duration(self)@api.model -
get_discuss_videocall_location(self)@api.model -
get_display_time_tz(self, tz=False)get the display_time of the meeting, forcing the timezone. This method is called from email template, to not use sudo(). -
get_next_alarm_date(self, events_by_alarm) -
get_state_selections(self)@api.model -
set_discuss_videocall_location(self) -
unlink(self) -
write(self, vals)
New fields (2)
-
colorIntegerdefault=_default_color args: 'Color' -
nameCharrequired=True args: 'Name'
No public methods.
New fields (4)
-
activeBooleandefault=True args: 'Active' -
partner_checkedBooleandefault=True args: 'Checked' -
partner_idMany2one → res.partnerindex=Truerequired=True args: 'res.partner', 'Employee' -
user_idMany2one → res.usersdefault=<expr>index=Trueondelete='cascade'required=True args: 'res.users', 'Me'
-
unlink_from_partner_id(self, partner_id)@api.model
New fields (3)
-
calendar_event_idMany2one → calendar.eventargs: 'calendar.event', 'Calendar Event' -
deleteSelectiondefault='one' args: [('one', 'Delete this event'), ('next', 'Delete this and following events'), ('all', 'Delete all the events')] -
recipient_idsMany2many → res.partnercompute='_compute_recipient_ids'readonly=Falsestring='Recipients' args: 'res.partner'
-
action_delete(self)Delete the event based on the specified deletion type. :return: Action URL to redirect to the calendar view -
action_send_mail_and_delete(self)Send email notification and delete the event based on the specified deletion type. -
close(self)
New fields (7)
-
cal_client_idChardefault=<expr> args: 'Google Client_id' -
cal_client_secretChardefault=<expr> args: 'Google Client_key' -
cal_sync_pausedBooleandefault=<expr> args: 'Google Synchronization Paused' -
external_calendar_providerSelectiondefault='google' args: [('google', 'Google'), ('microsoft', 'Outlook')], 'Choose an external calendar to configure' -
microsoft_outlook_client_identifierChardefault=<expr> args: 'Outlook Client Id' -
microsoft_outlook_client_secretChardefault=<expr> args: 'Outlook Client Secret' -
microsoft_outlook_sync_pausedBooleandefault=<expr> args: 'Outlook Synchronization Paused'
-
action_calendar_prepare_external_provider_sync(self)@assert_log_admin_accessCalled by the wizard to configure an external calendar provider without requiring users to access the general settings page. Make sure that the provider calendar module is installed or install it. Then, set the API keys into the applicable config parameters.
New fields (23)
-
base_event_idMany2one → calendar.eventcopy=Falseondelete='set null' args: 'calendar.event' -
bydaySelectionstring='By day' args: BYDAY_SELECTION -
calendar_event_idsOne2many → calendar.eventargs: 'calendar.event', 'recurrence_id' -
countIntegerdefault=1 -
dayIntegerdefault=1 -
dtstartDatetimecompute='_compute_dtstart' -
end_typeSelectiondefault='count' args: END_TYPE_SELECTION -
event_tzSelectiondefault=<expr>string='Timezone' args: _tz_get -
friBoolean -
intervalIntegerdefault=1 -
monBoolean -
month_bySelectiondefault='date' args: MONTH_BY_SELECTION -
nameCharcompute='_compute_name'store=True -
rruleCharcompute='_compute_rrule'inverse='_inverse_rrule'store=True -
rrule_typeSelectiondefault='weekly' args: RRULE_TYPE_SELECTION -
satBoolean -
sunBoolean -
thuBoolean -
trigger_idMany2one → ir.cron.triggerargs: 'ir.cron.trigger' -
tueBoolean -
untilDateargs: 'Repeat Until' -
wedBoolean -
weekdaySelectionstring='Weekday' args: WEEKDAY_SELECTION
-
get_recurrence_name(self)
New fields (1)
-
calendar_event_idsOne2many → calendar.eventargs: 'calendar.event', 'videocall_channel_id'
No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (1)
-
calendar_event_idMany2one → calendar.eventindex='btree_not_null'ondelete='cascade'string='Calendar Meeting' args: 'calendar.event'
-
action_create_calendar_event(self) -
unlink_w_meeting(self) -
write(self, vals)
New fields (1)
-
activity_calendar_event_idMany2one → calendar.eventcompute='_compute_activity_calendar_event_id'groups='base.group_user'string='Next Activity Calendar Event' args: 'calendar.event'
No public methods.
New fields (0)
No new fields.
Public methods (1)-
action_create_calendar_event(self)
New fields (1)
-
categorySelectionselection_add=[('meeting', 'Meeting')]
No public methods.
New fields (3)
-
calendar_last_notif_ackDatetimedefault=fields.Datetime.now args: 'Last notification marked as read from base Calendar' -
meeting_countIntegercompute='_compute_meeting_count' args: '# Meetings' -
meeting_idsMany2many → calendar.eventcopy=Falsestring='Meetings' args: 'calendar.event', 'calendar_event_res_partner_rel', 'res_partner_id', 'calendar_event_id'
-
get_attendee_detail(self, meeting_ids)Return a list of dict of the given meetings with the attendees details Used by: - many2many_attendee.js: Many2ManyAttendee - calendar_model.js (calendar.CalendarModel) -
schedule_meeting(self)
New fields (1)
-
calendar_default_privacySelectioncompute='_compute_calendar_default_privacy'inverse='_inverse_calendar_res_users_settings' args: [('public', 'Public by default'), ('private', 'Private by default'), ('confidential', 'Internal users only')]
-
SELF_READABLE_FIELDS(self)@property -
SELF_WRITEABLE_FIELDS(self)@property -
check_calendar_credentials(self)@api.model -
check_synchronization_status(self) -
create(self, vals_list)@api.model_create_multiSet the calendar default privacy as the same as Default User Template when defined. -
get_selected_calendars_partner_ids(self, include_user=True)Retrieves the partner IDs of the attendees selected in the calendar view. :param bool include_user: Determines whether to include the current user's partner ID in the results. :return: A list of integer IDs representing the partners selected in the calendar view. If 'include_user' is True, the list will also include the current user's partner ID. :rtype: list -
write(self, vals)Forbid the calendar default privacy update from different users for keeping private events secured.
New fields (1)
-
calendar_default_privacySelectiondefault='public'help='Default privacy setting for whom the calendar events will be visible.'readonly=Falserequired=Truestore=True args: [('public', 'Public'), ('private', 'Private'), ('confidential', 'Only internal users')], 'Calendar Default Privacy'
No public methods.
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…