From 4a75003907efbbc2b5e885f205c0dc13c528e376 Mon Sep 17 00:00:00 2001 From: MohamedOsman7 Date: Tue, 4 Aug 2026 11:03:59 +0000 Subject: [PATCH] [ADD] agreement_category: add agreement tagging functionality --- agreement_category/README.rst | 106 ++++ agreement_category/__init__.py | 1 + agreement_category/__manifest__.py | 17 + agreement_category/models/__init__.py | 2 + agreement_category/models/agreement.py | 14 + .../models/agreement_category.py | 28 ++ agreement_category/pyproject.toml | 3 + agreement_category/readme/CONTRIBUTORS.md | 2 + agreement_category/readme/DESCRIPTION.md | 9 + agreement_category/readme/USAGE.md | 12 + .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 30051 bytes .../static/description/index.html | 456 ++++++++++++++++++ .../views/agreement_category_views.xml | 42 ++ agreement_category/views/agreement_views.xml | 33 ++ 15 files changed, 728 insertions(+) create mode 100644 agreement_category/README.rst create mode 100644 agreement_category/__init__.py create mode 100644 agreement_category/__manifest__.py create mode 100644 agreement_category/models/__init__.py create mode 100644 agreement_category/models/agreement.py create mode 100644 agreement_category/models/agreement_category.py create mode 100644 agreement_category/pyproject.toml create mode 100644 agreement_category/readme/CONTRIBUTORS.md create mode 100644 agreement_category/readme/DESCRIPTION.md create mode 100644 agreement_category/readme/USAGE.md create mode 100644 agreement_category/security/ir.model.access.csv create mode 100644 agreement_category/static/description/icon.png create mode 100644 agreement_category/static/description/index.html create mode 100644 agreement_category/views/agreement_category_views.xml create mode 100644 agreement_category/views/agreement_views.xml diff --git a/agreement_category/README.rst b/agreement_category/README.rst new file mode 100644 index 000000000..a384e8b9b --- /dev/null +++ b/agreement_category/README.rst @@ -0,0 +1,106 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +==================== +Agreement - Category +==================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:7c6bfddf64bc58c7b9900d5f0728230df9e6cc95ceca82250e3758f903dcf432 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fagreement-lightgray.png?logo=github + :target: https://github.com/OCA/agreement/tree/19.0/agreement_category + :alt: OCA/agreement +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/agreement-19-0/agreement-19-0-agreement_category + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/agreement&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The Agreements app lets you classify agreements by type, but a type is a +flat list that also drives the sale/purchase domain of an agreement. + +This module adds tags on agreements, the same way contacts are tagged: + +- a new *Agreement Tags* model (``agreement.category``), maintained + from *Agreements > Configuration > Tags*, +- a *Tags* field on the agreement form and list view, +- agreements can be searched, filtered and grouped by tag. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To create agreement tags: + +1. Go to *Agreements > Configuration > Tags*. +2. Create a tag, pick a color. + +To tag an agreement: + +1. Go to *Agreements > Agreements* and open an agreement. +2. Add as many tags as needed in the *Tags* field. + +In the agreement list view, use *Group By > Tags* to review the +agreements per tag. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* glueckkanja AG + +Contributors +------------ + +- `glueckkanja AG `__: + + - Mohamed Osman + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/agreement `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/agreement_category/__init__.py b/agreement_category/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/agreement_category/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/agreement_category/__manifest__.py b/agreement_category/__manifest__.py new file mode 100644 index 000000000..b1270d15f --- /dev/null +++ b/agreement_category/__manifest__.py @@ -0,0 +1,17 @@ +{ + "name": "Agreement - Category", + "summary": "Classify agreements with tags", + "version": "19.0.1.0.0", + "category": "Contract", + "author": "glueckkanja AG, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/agreement", + "license": "AGPL-3", + "depends": ["agreement"], + "data": [ + "security/ir.model.access.csv", + "views/agreement_category_views.xml", + "views/agreement_views.xml", + ], + "development_status": "Beta", + "installable": True, +} diff --git a/agreement_category/models/__init__.py b/agreement_category/models/__init__.py new file mode 100644 index 000000000..b5282549a --- /dev/null +++ b/agreement_category/models/__init__.py @@ -0,0 +1,2 @@ +from . import agreement_category +from . import agreement diff --git a/agreement_category/models/agreement.py b/agreement_category/models/agreement.py new file mode 100644 index 000000000..508c2bf1f --- /dev/null +++ b/agreement_category/models/agreement.py @@ -0,0 +1,14 @@ +from odoo import fields, models + + +class Agreement(models.Model): + _inherit = "agreement" + + category_ids = fields.Many2many( + "agreement.category", + column1="agreement_id", + column2="category_id", + string="Tags", + tracking=True, + help="Classify the agreement with as many tags as needed.", + ) diff --git a/agreement_category/models/agreement_category.py b/agreement_category/models/agreement_category.py new file mode 100644 index 000000000..76a8aa65b --- /dev/null +++ b/agreement_category/models/agreement_category.py @@ -0,0 +1,28 @@ +from random import randint + +from odoo import fields, models + + +class AgreementCategory(models.Model): + _name = "agreement.category" + _description = "Agreement Tags" + _order = "name" + + def _get_default_color(self): + return randint(1, 11) + + name = fields.Char(required=True, translate=True) + color = fields.Integer( + default=lambda self: self._get_default_color(), aggregator=False + ) + active = fields.Boolean( + default=True, + help="The active field allows you to hide the tag without removing it.", + ) + agreement_ids = fields.Many2many( + "agreement", + column1="category_id", + column2="agreement_id", + string="Agreements", + copy=False, + ) diff --git a/agreement_category/pyproject.toml b/agreement_category/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/agreement_category/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/agreement_category/readme/CONTRIBUTORS.md b/agreement_category/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..b010ee49c --- /dev/null +++ b/agreement_category/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [glueckkanja AG](https://glueckkanja.com): + - Mohamed Osman \<\> diff --git a/agreement_category/readme/DESCRIPTION.md b/agreement_category/readme/DESCRIPTION.md new file mode 100644 index 000000000..837a14fe7 --- /dev/null +++ b/agreement_category/readme/DESCRIPTION.md @@ -0,0 +1,9 @@ +The Agreements app lets you classify agreements by type, but a type is a +flat list that also drives the sale/purchase domain of an agreement. + +This module adds tags on agreements, the same way contacts are tagged: + +- a new *Agreement Tags* model (`agreement.category`), maintained from + *Agreements \> Configuration \> Tags*, +- a *Tags* field on the agreement form and list view, +- agreements can be searched, filtered and grouped by tag. diff --git a/agreement_category/readme/USAGE.md b/agreement_category/readme/USAGE.md new file mode 100644 index 000000000..aa61141e0 --- /dev/null +++ b/agreement_category/readme/USAGE.md @@ -0,0 +1,12 @@ +To create agreement tags: + +1. Go to *Agreements \> Configuration \> Tags*. +2. Create a tag, pick a color. + +To tag an agreement: + +1. Go to *Agreements \> Agreements* and open an agreement. +2. Add as many tags as needed in the *Tags* field. + +In the agreement list view, use *Group By \> Tags* to review the agreements +per tag. \ No newline at end of file diff --git a/agreement_category/security/ir.model.access.csv b/agreement_category/security/ir.model.access.csv new file mode 100644 index 000000000..1cf71ec49 --- /dev/null +++ b/agreement_category/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_agreement_category_user,agreement.category.user,model_agreement_category,agreement.group_agreement_readonly,1,0,0,0 +access_agreement_category_manager,agreement.category.manager,model_agreement_category,agreement.group_agreement_manager,1,1,1,1 diff --git a/agreement_category/static/description/icon.png b/agreement_category/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..976ee9a3557481213d320ce20d50fe7667559aa9 GIT binary patch literal 30051 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 JR(<&I{{g^`ENuV) literal 0 HcmV?d00001 diff --git a/agreement_category/static/description/index.html b/agreement_category/static/description/index.html new file mode 100644 index 000000000..40bccb7af --- /dev/null +++ b/agreement_category/static/description/index.html @@ -0,0 +1,456 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Agreement - Category

+ +

Beta License: AGPL-3 OCA/agreement Translate me on Weblate Try me on Runboat

+

The Agreements app lets you classify agreements by type, but a type is a +flat list that also drives the sale/purchase domain of an agreement.

+

This module adds tags on agreements, the same way contacts are tagged:

+
    +
  • a new Agreement Tags model (agreement.category), maintained +from Agreements > Configuration > Tags,
  • +
  • a Tags field on the agreement form and list view,
  • +
  • agreements can be searched, filtered and grouped by tag.
  • +
+

Table of contents

+ +
+

Usage

+

To create agreement tags:

+
    +
  1. Go to Agreements > Configuration > Tags.
  2. +
  3. Create a tag, pick a color.
  4. +
+

To tag an agreement:

+
    +
  1. Go to Agreements > Agreements and open an agreement.
  2. +
  3. Add as many tags as needed in the Tags field.
  4. +
+

In the agreement list view, use Group By > Tags to review the +agreements per tag.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • glueckkanja AG
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/agreement project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+
+ + diff --git a/agreement_category/views/agreement_category_views.xml b/agreement_category/views/agreement_category_views.xml new file mode 100644 index 000000000..3fe3d6737 --- /dev/null +++ b/agreement_category/views/agreement_category_views.xml @@ -0,0 +1,42 @@ + + + agreement.category.list + agreement.category + + + + + + + + + + agreement.category.form + agreement.category + +
+ + + + + + + +
+
+
+ + + Agreement Categories + agreement.category + list,form + + +
diff --git a/agreement_category/views/agreement_views.xml b/agreement_category/views/agreement_views.xml new file mode 100644 index 000000000..a96897ae0 --- /dev/null +++ b/agreement_category/views/agreement_views.xml @@ -0,0 +1,33 @@ + + + + agreement.form.category + agreement + + + + + + + + + agreement.list.category + agreement + + + + + + + +