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>