From 11daed3155a09e0f1d09a80efd9e3fa69c40aea5 Mon Sep 17 00:00:00 2001 From: RemiFr82 Date: Tue, 17 Oct 2023 00:30:23 +0200 Subject: [PATCH] [ADD] event_to_calendar module --- event_to_calendar/__init__.py | 1 + event_to_calendar/__manifest__.py | 39 ++++++++ event_to_calendar/i18n/fr.po | 75 +++++++++++++++ event_to_calendar/models/__init__.py | 1 + event_to_calendar/models/event_event.py | 122 ++++++++++++++++++++++++ event_to_calendar/views/event_event.xml | 46 +++++++++ 6 files changed, 284 insertions(+) create mode 100644 event_to_calendar/__init__.py create mode 100644 event_to_calendar/__manifest__.py create mode 100644 event_to_calendar/i18n/fr.po create mode 100644 event_to_calendar/models/__init__.py create mode 100644 event_to_calendar/models/event_event.py create mode 100644 event_to_calendar/views/event_event.xml diff --git a/event_to_calendar/__init__.py b/event_to_calendar/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/event_to_calendar/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/event_to_calendar/__manifest__.py b/event_to_calendar/__manifest__.py new file mode 100644 index 0000000..0638ac5 --- /dev/null +++ b/event_to_calendar/__manifest__.py @@ -0,0 +1,39 @@ +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +{ + "name": "Event to Calendar", + "version": "1.0.0", + "summary": """ + Add/remove an event in your odoo calendar. + """, + "description": """ + TO WRITE + """, + "author": "RemiFr82", + "contributors": "", + "website": "https://remifr82.me", + "license": "LGPL-3", + "category": "Events", + # "price": 0, + # "currency": "EUR", + "application": False, + "installable": True, + "auto_install": False, + "pre_init_hook": "", + "post_init_hook": "", + "uninstall_hook": "", + "excludes": [], + "external_dependencies": [], + "depends": [ + "calendar", + "event", + ], + "data": [ + "views/event_event.xml", + ], + "css": [], + "images": [], + "js": [], + "test": [], + "demo": [], + "maintainer": "RemiFr82", +} diff --git a/event_to_calendar/i18n/fr.po b/event_to_calendar/i18n/fr.po new file mode 100644 index 0000000..bb89aaa --- /dev/null +++ b/event_to_calendar/i18n/fr.po @@ -0,0 +1,75 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * event_to_calendar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e-20230613\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-16 22:26+0000\n" +"PO-Revision-Date: 2023-10-16 22:26+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: event_to_calendar +#. odoo-python +#: code:addons/event_to_calendar/models/event_event.py:0 +#, python-format +msgid "" +"

Organizer: {}{}
Note:\n" +"

" +msgstr "" +"

Organisateur : {}{}
Note :\n" +"

" + +#. module: event_to_calendar +#: model:ir.actions.server,name:event_to_calendar.event_add_to_agenda_action_server +msgid "Add to agenda" +msgstr "Ajouter à l'agenda" + +#. module: event_to_calendar +#: model_terms:ir.ui.view,arch_db:event_to_calendar.view_event_form_inherit_event_to_calendar +msgid "Add to my agenda" +msgstr "Ajouter à mon agenda" + +#. module: event_to_calendar +#: model:ir.model,name:event_to_calendar.model_event_event +msgid "Event" +msgstr "Événement" + +#. module: event_to_calendar +#: model:ir.model.fields,field_description:event_to_calendar.field_event_event__in_user_agenda +msgid "In User agenda" +msgstr "Dans l'agenda de l'utilisateur" + +#. module: event_to_calendar +#: model:ir.model.fields,field_description:event_to_calendar.field_event_event__meeting_ids +msgid "Linked meetings" +msgstr "RDV associés" + +#. module: event_to_calendar +#: model:ir.model.fields,field_description:event_to_calendar.field_event_event__meeting_count +msgid "Meeting count" +msgstr "Nombre de RDV" + +#. module: event_to_calendar +#. odoo-python +#: code:addons/event_to_calendar/models/event_event.py:0 +#: model_terms:ir.ui.view,arch_db:event_to_calendar.view_event_form_inherit_event_to_calendar +#, python-format +msgid "Meetings" +msgstr "RDV d'Agenda" + +#. module: event_to_calendar +#: model:ir.actions.server,name:event_to_calendar.event_remove_from_agenda_action_server +msgid "Remove from agenda" +msgstr "Retirer de l'agenda" + +#. module: event_to_calendar +#: model_terms:ir.ui.view,arch_db:event_to_calendar.view_event_form_inherit_event_to_calendar +msgid "Remove from my agenda" +msgstr "Retirer de mon agenda" diff --git a/event_to_calendar/models/__init__.py b/event_to_calendar/models/__init__.py new file mode 100644 index 0000000..b6bc389 --- /dev/null +++ b/event_to_calendar/models/__init__.py @@ -0,0 +1 @@ +from . import event_event diff --git a/event_to_calendar/models/event_event.py b/event_to_calendar/models/event_event.py new file mode 100644 index 0000000..2087093 --- /dev/null +++ b/event_to_calendar/models/event_event.py @@ -0,0 +1,122 @@ +import pytz +from datetime import timedelta +from odoo import models, fields, api, _ + + +class EventEvent(models.Model): + _inherit = "event.event" + + meeting_ids = fields.One2many( + comodel_name="calendar.event", + inverse_name="res_id", + string="Linked meetings", + ) + meeting_count = fields.Integer( + string="Meeting count", + compute="_count_meetings", + ) + in_user_agenda = fields.Boolean( + "In User agenda", + compute="_get_in_user_agenda", + ) + + def _count_meetings(self): + for event in self: + event.meeting_count = len(event.meeting_ids) + + def _get_in_user_agenda(self): + uid = self.env.uid + for event in self: + event.in_user_agenda = uid in event.meeting_ids.mapped("user_id").ids + + def add_to_agenda(self, user_id=False): + vals_list = [] + self_model_id = self.env["ir.model"]._get_id(self._name) + uid = user_id or self.env.uid + to_add = self.filtered( + lambda ee: uid not in ee.meeting_ids.mapped("user_id.id") + ) + for event in to_add: + groupped_tags = {} + for tag in event.tag_ids: + categ = tag.category_id.name + if categ in groupped_tags: + groupped_tags[categ] += ", {}".format(tag.name) + else: + groupped_tags[categ] = tag.name + event_tz = pytz.timezone(event.date_tz) + vals_list.append( + { + "name": event.name + " (event Odoo)", + "description": _("

Organizer: {}{}
Note:\n

").format( + event.organizer_id.display_name, + "".join( + [ + "
{} : {}".format(tag_group[0], tag_group[1]) + for tag_group in groupped_tags.items() + ] + ), + event.note, + ), + "user_id": uid, + "location": event.address_inline, + "start": event_tz.localize(event.date_begin) + .astimezone(pytz.timezone(self.env.user.tz)) + .replace(tzinfo=None), + "stop": event_tz.localize(event.date_end) + .astimezone(pytz.timezone(self.env.user.tz)) + .replace(tzinfo=None), + "res_id": event.id, + "res_model_id": self_model_id, + # "event_tz": event.date_tz, + } + ) + if vals_list: + self.env["calendar.event"].create(vals_list) + + def remove_from_agenda(self, user_id=False): + to_unlink = self.mapped("meeting_ids").filtered( + lambda meeting: meeting.user_id.id == user_id or self.env.uid + ) + if to_unlink: + to_unlink.unlink() + + def display_meetings(self): + self.ensure_one() + date_begin = self.date_begin.date() + return { + "name": _("Meetings"), + "type": "ir.actions.act_window", + "res_model": "calendar.event", + "views": [(False, "tree"), (False, "calendar"), (False, "form")], + "domain": [("res_id", "=", self.id), ("res_model", "=", self._name)], + "context": { + "calendar_mode": "week", + "initial_date": fields.Date.to_string( + date_begin - timedelta(days=-date_begin.weekday()) + ), + }, + } + + @api.model + def agenda_fields(self): + return [ + "name", + "date_begin_located", + "date_end_located", + "date_tz", + "tag_ids", + "organizer_id", + "adress_inline", + "note", + ] + + def write(self, vals): + res = super().write(vals) + agenda_fields = self.agenda_fields() + meetings = self.mapped("meeting_ids") + if any(field in agenda_fields for field in vals.keys()) and meetings: + meetings.write( + dict([(field, vals[field]) for field in agenda_fields & vals.keys()]) + ) + return res diff --git a/event_to_calendar/views/event_event.xml b/event_to_calendar/views/event_event.xml new file mode 100644 index 0000000..5f69efb --- /dev/null +++ b/event_to_calendar/views/event_event.xml @@ -0,0 +1,46 @@ + + + + + event.event.view.form.inherit + event.event + + + + + + + + + + + + + Add to agenda + + + code + if records: + records.add_to_agenda() + + + + + Remove from agenda + + + code + if records: + records.remove_from_agenda() + + + + \ No newline at end of file