diff --git a/.eslintrc.yml b/.eslintrc.yml
index 9429bc688aab4993eae460767368f65089afa323..fed88d70d23ecb3297ea28854b320c4d62ee3c26 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 9c283fd41f6cc3330653f1d90a820b85e23caf65..0090721f5d248bc5342cb3699b64d2ddc863da8b 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 10acf1e37e92961168f7539a4a84f689280f3710..3efb4d9157dc36d84e372eec5fc21e7f4a417a58 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 ed2c2171ffe63ac191e30ed0759c4b6211ad5f15..99064933ef82c469ba5fda5b2904447c05c99dbe 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 0000000000000000000000000000000000000000..0240c75f6a4ae4550f3473ad0a5faaef022bf6c7
--- /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 a687eb54efa624ecc77ee6d86d18aca9c3b81f6d..09dbdcac4762cd4a4a715220514190791731da92 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 0000000000000000000000000000000000000000..7254b28aee897b5e95d1909de46ce22b1d9a1acd
--- /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 8181f0849611a5e5efc89ff69a16a08635f66766..4036760fc8d1a0fde6e9fb99975f807be5de1488 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 1142c70acb7e3bc0c05d691d2bb4fcb6c33f3831..8bd54c046344ceaddf0e3d7563678ae31f658ddb 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 289815ef69d6026cbf776a21036e732ffc738080..3122bf55e08591e15eec7db221be951200f5a45a 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>