From 2199dfe9761813a3aac35fef513b20fb464d0d20 Mon Sep 17 00:00:00 2001
From: thibaud <thibaud@le-filament.com>
Date: Wed, 15 Nov 2023 16:32:52 +0100
Subject: [PATCH] [IMP] Acces rights & Ruff
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- Created new group "Gestion des sessions & séances"
- Access right for this group have been set up so only members from this group can CRUD event sessions
- Access right for all other users (out side of the group) have been downgraded to only read access of event and event sessions
- Session related fields have been set invisible and a new button has apperead to turn enable/disable event session type
- Replaced flake8 and black with Ruff in the pre-commit file
---
 .eslintrc.yml                |  1 +
 .gitignore                   |  1 +
 .pre-commit-config.yaml      | 55 +++++++++++++++---------------------
 .pylintrc-mandatory          | 12 ++++----
 .ruff.toml                   | 30 ++++++++++++++++++++
 __manifest__.py              |  1 +
 data/group_session.xml       |  6 ++++
 models/event.py              | 14 +++++++--
 security/ir.model.access.csv |  3 ++
 views/event_views.xml        | 43 ++++++++++++++++++++++++++--
 10 files changed, 122 insertions(+), 44 deletions(-)
 create mode 100644 .ruff.toml
 create mode 100644 data/group_session.xml

diff --git a/.eslintrc.yml b/.eslintrc.yml
index 9429bc6..fed88d7 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -22,6 +22,7 @@ globals:
   odoo: readonly
   openerp: readonly
   owl: readonly
+  luxon: readonly
 
 # Styling is handled by Prettier, so we only need to enable AST rules;
 # see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890
diff --git a/.gitignore b/.gitignore
index 9c283fd..0090721 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@ __pycache__/
 *.py[cod]
 /.venv
 /.pytest_cache
+/.ruff_cache
 
 # C extensions
 *.so
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 10acf1e..3efb4d9 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -12,6 +12,10 @@ exclude: |
   /static/(src/)?lib/|
   # Repos using Sphinx to generate docs don't need prettying
   ^docs/_templates/.*\.html$|
+  # Don't bother non-technical authors with formatting issues in docs
+  readme/.*\.(rst|md)$|
+  # Ignore build and dist directories in addons
+  /build/|/dist/|
   # You don't usually want a bot to modify your legal texts
   (LICENSE.*|COPYING.*)
 default_language_version:
@@ -33,27 +37,25 @@ repos:
         language: fail
         files: '[a-zA-Z0-9_]*/i18n/en\.po$'
   - repo: https://github.com/oca/maintainer-tools
-    rev: 4cd2b852214dead80822e93e6749b16f2785b2fe
+    rev: f71041f22b8cd68cf7c77b73a14ca8d8cd190a60
     hooks:
       # update the NOT INSTALLABLE ADDONS section above
       - id: oca-update-pre-commit-excluded-addons
       - id: oca-fix-manifest-website
         args: ["https://le-filament.com"]
-  - repo: https://github.com/myint/autoflake
-    rev: v1.6.1
-    hooks:
-      - id: autoflake
+      - id: oca-gen-addon-readme
         args:
-          - --expand-star-imports
-          - --ignore-init-module-imports
-          - --in-place
-          - --remove-all-unused-imports
-          - --remove-duplicate-keys
-          - --remove-unused-variables
-  - repo: https://github.com/psf/black
-    rev: 22.8.0
+          - --addons-dir=.
+          - --branch=16.0
+          - --org-name=lefilament
+          - --repo-name=template_module
+          - --if-source-changed
+          - --keep-source-digest
+  - repo: https://github.com/OCA/odoo-pre-commit-hooks
+    rev: v0.0.25
     hooks:
-      - id: black
+      - id: oca-checks-odoo-module
+      - id: oca-checks-po
   - repo: https://github.com/pre-commit/mirrors-prettier
     rev: v2.7.1
     hooks:
@@ -95,27 +97,14 @@ repos:
       - id: check-xml
       - id: mixed-line-ending
         args: ["--fix=lf"]
-  - repo: https://github.com/asottile/pyupgrade
-    rev: v2.38.2
-    hooks:
-      - id: pyupgrade
-        args: ["--keep-percent-format"]
-  - repo: https://github.com/PyCQA/isort
-    rev: 5.12.0
-    hooks:
-      - id: isort
-        name: isort except __init__.py
-        args:
-          - --settings=.
-        exclude: /__init__\.py$
-  - repo: https://github.com/PyCQA/flake8
-    rev: 3.9.2
+  - repo: https://github.com/astral-sh/ruff-pre-commit
+    rev: v0.1.3
     hooks:
-      - id: flake8
-        name: flake8
-        additional_dependencies: ["flake8-bugbear==21.9.2"]
+      - id: ruff
+        args: [--fix, --exit-non-zero-on-fix]
+      - id: ruff-format
   - repo: https://github.com/OCA/pylint-odoo
-    rev: 7.0.2
+    rev: v8.0.19
     hooks:
       - id: pylint_odoo
         name: pylint with optional checks
diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory
index ed2c217..9906493 100644
--- a/.pylintrc-mandatory
+++ b/.pylintrc-mandatory
@@ -4,12 +4,12 @@ load-plugins=pylint_odoo
 score=n
 
 [ODOOLINT]
-readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
-manifest_required_authors=Le Filament
-manifest_required_keys=license
-manifest_deprecated_keys=description,active
-license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
-valid_odoo_versions=16.0
+readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
+manifest-required-authors=Le Filament
+manifest-required-keys=license
+manifest-deprecated-keys=description,active
+license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
+valid-odoo-versions=16.0
 
 [MESSAGES CONTROL]
 disable=all
diff --git a/.ruff.toml b/.ruff.toml
new file mode 100644
index 0000000..0240c75
--- /dev/null
+++ b/.ruff.toml
@@ -0,0 +1,30 @@
+
+target-version = "py310"
+fix = true
+
+[lint]
+extend-select = [
+    "B",
+    "C90",
+    "E501",  # line too long (default 88)
+    "I",  # isort
+    "UP",  # pyupgrade
+]
+exclude = ["setup/*"]
+
+[format]
+exclude = ["setup/*"]
+
+[per-file-ignores]
+"__init__.py" = ["F401", "I001"]  # ignore unused and unsorted imports in __init__.py
+"__manifest__.py" = ["B018"]  # useless expression
+
+[isort]
+section-order = ["future", "standard-library", "third-party", "odoo", "odoo-addons", "first-party", "local-folder"]
+
+[isort.sections]
+"odoo" = ["odoo"]
+"odoo-addons" = ["odoo.addons"]
+
+[mccabe]
+max-complexity = 16
diff --git a/__manifest__.py b/__manifest__.py
index a687eb5..09dbdca 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -25,6 +25,7 @@
         "views/event_views.xml",
         "views/event_tag_views.xml",
         "data/mail_data.xml",
+        "data/group_session.xml",
         # report
     ],
     "assets": {
diff --git a/data/group_session.xml b/data/group_session.xml
new file mode 100644
index 0000000..7254b28
--- /dev/null
+++ b/data/group_session.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <record id="group_event_session" model="res.groups">
+      <field name="name">Gestion des sessions et séances</field>
+    </record>
+</odoo>
diff --git a/models/event.py b/models/event.py
index 8181f08..4036760 100644
--- a/models/event.py
+++ b/models/event.py
@@ -35,8 +35,7 @@ class Event(models.Model):
         required=True,
     )
     hide_website_event_title = fields.Boolean(
-        string="Masquer le titre de l'évènement sur le site web",
-        default=False
+        string="Masquer le titre de l'évènement sur le site web", default=False
     )
 
     # ------------------------------------------------------
@@ -47,6 +46,13 @@ class Event(models.Model):
         for event in self:
             event.type_event_cg = event.event_type_id.type_event_cg
 
+    # ------------------------------------------------------
+    # Action button
+    # ------------------------------------------------------
+    def active_sessions(self):
+        self.ensure_one()
+        self.use_sessions = not self.use_sessions
+
     # ------------------------------------------------------
     # Default functions
     # ------------------------------------------------------
@@ -87,7 +93,7 @@ class Event(models.Model):
         return super(Event, self)._get_menu_update_fields() + ["website_session"]
 
     def _update_website_menus(self, menus_update_by_field=None):
-        super(Event, self)._update_website_menus(
+        record = super(Event, self)._update_website_menus(
             menus_update_by_field=menus_update_by_field
         )
         for event in self:
@@ -99,6 +105,8 @@ class Event(models.Model):
                     "website_session", "session_menu_ids", "session"
                 )
 
+        return record
+
     def _get_website_menu_entries(self):
         self.ensure_one()
         return super(Event, self)._get_website_menu_entries() + [
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index 1142c70..8bd54c0 100644
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -1,5 +1,8 @@
 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
 access_event_session__public,event.session.public,model_event_session,,1,0,0,0
+event.access_event_event_user,event.event.user,model_event_event,event.group_event_user,1,0,0,0
+access_event_session_not_in_group_session,event.session.not.in.group.session,model_event_event,base.group_user,1,0,0,0
+access_event_session_group_session,event.session.group.session,model_event_session,cgscop_website_event.group_event_session,1,1,1,1
 access_event_session_slot,event.track.session,model_event_session_slot,,1,0,0,0
 access_event_session_slot_manager,event.track.session.manager,model_event_session_slot,event.group_event_manager,1,1,1,1
 access_res_partner_intervenant,res.partner.intervenant,model_res_partner_intervenant,,1,0,0,0
diff --git a/views/event_views.xml b/views/event_views.xml
index 289815e..3122bf5 100644
--- a/views/event_views.xml
+++ b/views/event_views.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <odoo>
 
-     <record id="view_event_form_create_sessions" model="ir.ui.view">
+    <record id="view_event_form_create_sessions" model="ir.ui.view">
         <field name="model">event.event</field>
         <field name="name">event.event.form.inherit.button</field>
         <field name="inherit_id" ref="event_session.view_event_form_create_sessions" />
@@ -23,7 +23,7 @@
         <field name="arch" type="xml">
             <xpath expr="//field[@name='website_menu']" position="after">
                 <label for="website_session" string="Showcase Sessions" />
-                <field name="website_session" />
+                <field name="website_session" /><!-- Ajouter groups id pour sessions -->
             </xpath>
             <field name="event_type_id" position="before">
                 <field name="type_event_cg" />
@@ -42,4 +42,43 @@
             </field>
         </field>
     </record>
+
+    <record id="view_restrict_event_session_form" model="ir.ui.view">
+        <field name="model">event.event</field>
+        <field name="name">event session restrict</field>
+        <field name="inherit_id" ref="event_session.view_event_form_create_sessions" />
+        <field name="priority">50</field>
+        <field name="arch" type="xml">
+            <xpath expr="//header" position="inside">
+                <button
+                    name="active_sessions"
+                    type="object"
+                    string="Activer les séances"
+                    class="btn-outline-primary"
+                    attrs="{'invisible': [('use_sessions', '=', True)]}"
+                    groups="cgscop_website_event.group_event_session"
+                />
+                <button
+                    name="active_sessions"
+                    type="object"
+                    string="Désactiver les séances"
+                    class="btn-outline-primary"
+                    attrs="{'invisible': [('use_sessions', '!=', True)]}"
+                    groups="cgscop_website_event.group_event_session"
+                    confirm="La désactivation des séances va entrainer la suppression des séances de cet évènement."
+                />
+            </xpath>
+            <xpath expr="//field[@name='use_sessions']" position="attributes">
+                <attribute name="invisible">True</attribute>
+            </xpath>
+        </field>
+    </record>
+
+    <record model="ir.ui.menu" id="event_session.event_session_menu_report">
+        <field
+            name="groups_id"
+            eval="[(6,0,[ref('cgscop_website_event.group_event_session')])]"
+        />
+    </record>
+
 </odoo>
-- 
GitLab