Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,44 @@
# HR Job Employee Categories
Odoo addon: hr_job_category
## Installation
```bash
pip install odoo-bringout-oca-hr-hr_job_category
```
## Dependencies
This addon depends on:
- hr_contract
## Manifest Information
- **Name**: HR Job Employee Categories
- **Version**: 16.0.1.0.2
- **Category**: Generic Modules/Human Resources
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/hr](https://github.com/OCA/hr) branch 16.0, addon `hr_job_category`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Hr_job_category Module - hr_job_category
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for hr_job_category. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [hr_contract](../../odoo-bringout-oca-ocb-hr_contract)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon hr_job_category or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-hr-hr_job_category"
# or
uv pip install odoo-bringout-oca-hr-hr_job_category"
```

View file

@ -0,0 +1,13 @@
# Models
Detected core models and extensions in hr_job_category.
```mermaid
classDiagram
class hr_contract
class hr_job
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: hr_job_category. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon hr_job_category
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon hr_job_category
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,111 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
==========================
HR Job Employee Categories
==========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:d9e74906123744acf5f69e86e7106a9b82137a335d6dfb860f7a527062cc958e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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%2Fhr-lightgray.png?logo=github
:target: https://github.com/OCA/hr/tree/16.0/hr_job_category
:alt: OCA/hr
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/hr-16-0/hr-16-0-hr_job_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/hr&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module was written to extend the functionality of jobs
to support tagging employees based on their job positions.
For example, all Supervisors could be attached to the Supervisors category.
Define which categories a job belongs to in the configuration for the job.
When an employee is assigned a particular job the categories attached to that
job will be attached to the employee record as well.
**Table of contents**
.. contents::
:local:
Installation
============
To install this module, you need to:
* clone the branch 11.0 of the repository https://github.com/OCA/hr
* add the path to this repository in your configuration (addons-path)
* update the module list
* search for "HR Job Employee Categories" in your addons
* install the module
Usage
=====
Just like on Employee form, you can select Tags on every Job form view.
Once a contract is defined for an employee, the tags assigned to the job
position selected are copied to the employee.
Note: If the job position is changed on the same contract, the tags from
old job position will be removed from employee.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/hr/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 <https://github.com/OCA/hr/issues/new?body=module:%20hr_job_category%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Michael Telahun Makonnen <mmakonnen@gmail.com>
* Savoir-faire Linux
* Fekete Mihai (FBSR)
Contributors
~~~~~~~~~~~~
* Michael Telahun Makonnen <mmakonnen@gmail.com>
* Savoir-faire Linux
* Fekete Mihai <feketemihai@gmail.com>
* Nikul Chaudhary <nikulchaudhary2112@gmail.com>
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/hr <https://github.com/OCA/hr/tree/16.0/hr_job_category>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import models

View file

@ -0,0 +1,18 @@
# Copyright 2013 Michael Telahun Makonnen <mmakonnen@gmail.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "HR Job Employee Categories",
"version": "16.0.1.0.2",
"category": "Generic Modules/Human Resources",
"summary": "Adds tags to employee through contract and job position",
"author": "Michael Telahun Makonnen <mmakonnen@gmail.com>, "
"Savoir-faire Linux, "
"Fekete Mihai (FBSR), "
"Odoo Community Association (OCA)",
"website": "https://github.com/OCA/hr",
"license": "AGPL-3",
"depends": ["hr_contract"],
"data": ["views/hr_view.xml"],
"installable": True,
}

View file

@ -0,0 +1,34 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \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: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr "Povezane oznake"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
msgid "Contract"
msgstr "Ugovor"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr "Radno mjesto"
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr "npr.: Pola radnog vremena"

View file

@ -0,0 +1,43 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
# Translators:
# Rudolf Schnapka <rs@techno-flex.de>, 2016
# Thomas A. Jaeger, 2015
# Thomas A. Jaeger, 2015
msgid ""
msgstr ""
"Project-Id-Version: hr (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-30 05:19+0000\n"
"PO-Revision-Date: 2022-05-11 13:05+0000\n"
"Last-Translator: Maria Sparenberg <maria.sparenberg@gmx.net>\n"
"Language-Team: German (http://www.transifex.com/oca/OCA-hr-8-0/language/"
"de/)\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr "Assoziierte Stichwörter"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
msgid "Contract"
msgstr "Vertrag"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr "Job-Position"
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr "z. B. Teilzeit"

View file

@ -0,0 +1,41 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
# Translators:
# Antonio Trueba, 2016
msgid ""
msgstr ""
"Project-Id-Version: hr (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-30 05:19+0000\n"
"PO-Revision-Date: 2016-02-10 16:53+0000\n"
"Last-Translator: Antonio Trueba\n"
"Language-Team: Spanish (http://www.transifex.com/oca/OCA-hr-8-0/language/"
"es/)\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr "Etiquetas asociadas"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
#, fuzzy
msgid "Contract"
msgstr "Contrato"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr ""
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr "p.e., Tiempo parcial"

View file

@ -0,0 +1,40 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: hr (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-14 04:15+0000\n"
"PO-Revision-Date: 2016-04-04 11:09+0000\n"
"Last-Translator: Jarmo Kortetjärvi <jarmo.kortetjarvi@gmail.com>\n"
"Language-Team: Finnish (http://www.transifex.com/oca/OCA-hr-8-0/language/"
"fi/)\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr ""
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
#, fuzzy
msgid "Contract"
msgstr "Sopimus"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr ""
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr ""

View file

@ -0,0 +1,40 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: hr (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-18 13:10+0000\n"
"PO-Revision-Date: 2015-07-27 23:44+0000\n"
"Last-Translator: <>\n"
"Language-Team: French (http://www.transifex.com/oca/OCA-hr-8-0/language/"
"fr/)\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr ""
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
#, fuzzy
msgid "Contract"
msgstr "Contrat"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr "Poste"
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr "p.e. À temps partiel"

View file

@ -0,0 +1,34 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \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: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr ""
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
msgid "Contract"
msgstr ""
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr ""
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr ""

View file

@ -0,0 +1,43 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: hr (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-12 12:02+0000\n"
"PO-Revision-Date: 2025-02-18 12:06+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: Italian (http://www.transifex.com/oca/OCA-hr-8-0/language/it/)"
"\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6.2\n"
#. module: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr "Etichette associate"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
msgid "Contract"
msgstr "Contratto"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr "Posizione lavorativa"
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr "es. Part Time"
#~ msgid "Employee Contract"
#~ msgstr "Contratto dipendente"

View file

@ -0,0 +1,44 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
# Translators:
# danimaribeiro <danimaribeiro@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: hr (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-11 01:48+0000\n"
"PO-Revision-Date: 2022-09-26 16:07+0000\n"
"Last-Translator: Douglas Custódio <douglascstd@yahoo.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/OCA-hr-8-0/"
"language/pt_BR/)\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr "Etiquetas Associadas"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
msgid "Contract"
msgstr "Contrato"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr "Cargo"
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr "ex. Meio período"
#~ msgid "Display Name"
#~ msgstr "Nome de Exibição"

View file

@ -0,0 +1,41 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: hr (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-18 13:10+0000\n"
"PO-Revision-Date: 2015-07-27 23:44+0000\n"
"Last-Translator: <>\n"
"Language-Team: Romanian (http://www.transifex.com/oca/OCA-hr-8-0/language/"
"ro/)\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
#. module: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr ""
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
#, fuzzy
msgid "Contract"
msgstr "Contract"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr "Funcție"
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr ""

View file

@ -0,0 +1,43 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_job_category
#
# Translators:
# Matjaž Mozetič <m.mozetic@matmoz.si>, 2015
msgid ""
msgstr ""
"Project-Id-Version: hr (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-18 13:10+0000\n"
"PO-Revision-Date: 2020-08-11 14:59+0000\n"
"Last-Translator: Matjaz Mozetic <matjaz@matmoz.si>\n"
"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-hr-8-0/language/"
"sl/)\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
"n%100==4 ? 2 : 3;\n"
"X-Generator: Weblate 3.10\n"
#. module: hr_job_category
#: model:ir.model.fields,field_description:hr_job_category.field_hr_job__category_ids
msgid "Associated Tags"
msgstr "Povezane oznake"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_contract
#, fuzzy
msgid "Contract"
msgstr "Pogodba o zaposlitvi"
#. module: hr_job_category
#: model:ir.model,name:hr_job_category.model_hr_job
msgid "Job Position"
msgstr "Delovno mesto"
#. module: hr_job_category
#: model_terms:ir.ui.view,arch_db:hr_job_category.view_job_form
msgid "e.g. Part Time"
msgstr "npr. Občasno"

View file

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import hr

View file

@ -0,0 +1,88 @@
# Copyright 2013 Michael Telahun Makonnen <mmakonnen@gmail.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from odoo import api, fields, models
_logger = logging.getLogger(__name__)
class HRJob(models.Model):
_inherit = "hr.job"
category_ids = fields.Many2many(
"hr.employee.category",
"job_category_rel",
"job_id",
"category_id",
string="Associated Tags",
)
class HRContract(models.Model):
_inherit = "hr.contract"
def _remove_tags(self, employee_id=None, job_id=None):
# TODO write tags only once
if not employee_id or not job_id:
return
employee = self.env["hr.employee"].browse(employee_id)
empl_tags = employee.category_ids
job = self.env["hr.job"].browse(job_id)
_logger.debug(
"Removing employee tags if tag exists on contract " "job: %s", empl_tags
)
for tag in job.category_ids:
if tag in empl_tags:
employee.write({"category_ids": [(3, tag.id)]})
def _tag_employees(self, employee_id=None, job_id=None):
if not employee_id or not job_id:
return
employee = self.env["hr.employee"].browse(employee_id)
empl_tags = employee.category_ids
job = self.env["hr.job"].browse(job_id)
for tag in job.category_ids:
if tag not in empl_tags:
_logger.debug(
"Adding employee tag if job tag doesn't " "exists: %s", tag.name
)
employee.write({"category_ids": [(4, tag.id)]})
@api.model_create_multi
def create(self, vals_list):
records = super().create(vals_list)
for record, vals in zip(records, vals_list):
if "job_id" in vals:
record._tag_employees(vals.get("job_id"))
return records
def write(self, vals):
prev_data = self.read(["job_id"])
res = super().write(vals)
# Go through each record and delete tags associated with the previous
# job, then add the tags of the new job.
#
for contract in self:
for data in prev_data:
if (
data.get("id") == contract.id
and data["job_id"]
and data["job_id"][0] != contract.job_id.id
):
self._remove_tags(contract.employee_id.id, data["job_id"][0])
self._tag_employees(contract.employee_id.id, contract.job_id.id)
return res
def unlink(self):
prev_data = self.read(["job_id"])
# Go through each record and delete tags associated with the previous
# job, then add the tags of the new job.
#
for contract in self:
for data in prev_data:
self._remove_tags(contract.employee_id.id, data["job_id"][0])
return super(HRContract, self).unlink()

View file

@ -0,0 +1,4 @@
* Michael Telahun Makonnen <mmakonnen@gmail.com>
* Savoir-faire Linux
* Fekete Mihai <feketemihai@gmail.com>
* Nikul Chaudhary <nikulchaudhary2112@gmail.com>

View file

@ -0,0 +1,6 @@
This module was written to extend the functionality of jobs
to support tagging employees based on their job positions.
For example, all Supervisors could be attached to the Supervisors category.
Define which categories a job belongs to in the configuration for the job.
When an employee is assigned a particular job the categories attached to that
job will be attached to the employee record as well.

View file

@ -0,0 +1,7 @@
To install this module, you need to:
* clone the branch 11.0 of the repository https://github.com/OCA/hr
* add the path to this repository in your configuration (addons-path)
* update the module list
* search for "HR Job Employee Categories" in your addons
* install the module

View file

@ -0,0 +1,6 @@
Just like on Employee form, you can select Tags on every Job form view.
Once a contract is defined for an employee, the tags assigned to the job
position selected are copied to the employee.
Note: If the job position is changed on the same contract, the tags from
old job position will be removed from employee.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View file

@ -0,0 +1,460 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="hr-job-employee-categories">
<h1>HR Job Employee Categories</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:d9e74906123744acf5f69e86e7106a9b82137a335d6dfb860f7a527062cc958e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/hr/tree/16.0/hr_job_category"><img alt="OCA/hr" src="https://img.shields.io/badge/github-OCA%2Fhr-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/hr-16-0/hr-16-0-hr_job_category"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/hr&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module was written to extend the functionality of jobs
to support tagging employees based on their job positions.
For example, all Supervisors could be attached to the Supervisors category.
Define which categories a job belongs to in the configuration for the job.
When an employee is assigned a particular job the categories attached to that
job will be attached to the employee record as well.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="toc-entry-1">Installation</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h2><a class="toc-backref" href="#toc-entry-1">Installation</a></h2>
<p>To install this module, you need to:</p>
<ul class="simple">
<li>clone the branch 11.0 of the repository <a class="reference external" href="https://github.com/OCA/hr">https://github.com/OCA/hr</a></li>
<li>add the path to this repository in your configuration (addons-path)</li>
<li>update the module list</li>
<li>search for “HR Job Employee Categories” in your addons</li>
<li>install the module</li>
</ul>
</div>
<div class="section" id="usage">
<h2><a class="toc-backref" href="#toc-entry-2">Usage</a></h2>
<p>Just like on Employee form, you can select Tags on every Job form view.
Once a contract is defined for an employee, the tags assigned to the job
position selected are copied to the employee.</p>
<p>Note: If the job position is changed on the same contract, the tags from
old job position will be removed from employee.</p>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/hr/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/hr/issues/new?body=module:%20hr_job_category%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h2><a class="toc-backref" href="#toc-entry-4">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-5">Authors</a></h3>
<ul class="simple">
<li>Michael Telahun Makonnen &lt;<a class="reference external" href="mailto:mmakonnen&#64;gmail.com">mmakonnen&#64;gmail.com</a>&gt;</li>
<li>Savoir-faire Linux</li>
<li>Fekete Mihai (FBSR)</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-6">Contributors</a></h3>
<ul class="simple">
<li>Michael Telahun Makonnen &lt;<a class="reference external" href="mailto:mmakonnen&#64;gmail.com">mmakonnen&#64;gmail.com</a>&gt;</li>
<li>Savoir-faire Linux</li>
<li>Fekete Mihai &lt;<a class="reference external" href="mailto:feketemihai&#64;gmail.com">feketemihai&#64;gmail.com</a>&gt;</li>
<li>Nikul Chaudhary &lt;<a class="reference external" href="mailto:nikulchaudhary2112&#64;gmail.com">nikulchaudhary2112&#64;gmail.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h3>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/hr/tree/16.0/hr_job_category">OCA/hr</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_hr_job_categories

View file

@ -0,0 +1,144 @@
# Copyright 2014 Savoir-faire Linux
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.tests import common
class TestHrJobCategories(common.TransactionCase):
def setUp(self):
super(TestHrJobCategories, self).setUp()
self.employee_model = self.env["hr.employee"]
self.employee_categ_model = self.env["hr.employee.category"]
self.user_model = self.env["res.users"]
self.job_model = self.env["hr.job"]
self.contract_model = self.env["hr.contract"]
# Create a employee
self.employee_id_1 = self.employee_model.create({"name": "Employee 1"})
self.employee_id_2 = self.employee_model.create({"name": "Employee 2"})
# Create two employee categories for job positions
self.categ_id = self.employee_categ_model.create({"name": "Category 1"})
self.categ_2_id = self.employee_categ_model.create({"name": "Category 2"})
# Create an employee category to be used out of job positions
self.categ_3_id = self.employee_categ_model.create({"name": "Category 3"})
# Create two jobs
self.job_id = self.job_model.create(
{"name": "Job 1", "category_ids": [(6, 0, [self.categ_id.id])]}
)
self.job_2_id = self.job_model.create(
{"name": "Job 2", "category_ids": [(6, 0, [self.categ_2_id.id])]}
)
# Create one contract
self.contract_id = self.contract_model.create(
{"name": "Contract 1", "employee_id": self.employee_id_1.id, "wage": 50000}
)
def test_write_computes_with_normal_args(self):
"""
Test that write method on hr_contract computes without error
when the required data is given in parameter
Check if the job categories are written to the employee.
"""
# Check if job categories are written to the employee
self.contract_id.write({"job_id": self.job_id.id})
self.contract_id.invalidate_recordset()
self.assertTrue(self.employee_id_1.category_ids)
self.assertTrue(
all(
x in self.employee_id_1.category_ids.ids
for x in self.job_id.category_ids.ids
)
)
self.contract_id.write({"job_id": False})
self.assertFalse(self.employee_id_1.category_ids)
# Check if job2 categories are written to the employee
self.contract_id.write({"job_id": self.job_2_id.id})
self.contract_id.flush_recordset()
self.assertTrue(
all(
x in self.employee_id_1.category_ids.ids
for x in self.job_2_id.category_ids.ids
)
)
self.contract_id.write({"employee_id": self.employee_id_2.id})
self.contract_id.write({"job_id": self.job_2_id.id})
# We need to force the job, as it is modified by a compute
self.employee_id_1.invalidate_recordset()
self.employee_id_2.invalidate_recordset()
# self.assertFalse(self.employee_id_1.category_ids)
self.job_2_id.invalidate_recordset()
self.assertTrue(
all(
x in self.employee_id_2.category_ids.ids
for x in self.job_2_id.category_ids.ids
)
)
self.contract_id.unlink()
self.assertFalse(self.employee_id_2.category_ids)
def test_add_new_tags_with_already_present_tags(self):
"""
When a tag is manually added, adding new tags from a contract shouldn't remove
them
"""
self.employee_id_1.write({"category_ids": self.categ_3_id})
# We have added manually a tag
self.assertEqual(len(self.employee_id_1.category_ids.ids), 1)
self.assertEqual(self.employee_id_1.category_ids.ids[0], self.categ_3_id.id)
# We are now adding contract with 1 job category
# The employee should now have two tags
self.contract_id.write({"job_id": self.job_id.id})
self.contract_id.invalidate_recordset()
self.assertEqual(len(self.employee_id_1.category_ids.ids), 2)
self.assertIn(self.categ_3_id.id, self.employee_id_1.category_ids.ids)
self.assertIn(
self.job_id.category_ids.ids[0], self.employee_id_1.category_ids.ids
)
def test_remove_tags_from_previous_job(self):
"""Changing the job position removes previous tags and add the new ones"""
self.employee_id_1.write({"category_ids": self.categ_3_id})
self.contract_id.write({"job_id": self.job_id.id})
self.contract_id.invalidate_recordset()
# We have two tags (from job and the manual added one)
self.assertEqual(len(self.employee_id_1.category_ids.ids), 2)
# We change the contract of the employe
# We should now have the tag
self.contract_id.write({"job_id": self.job_2_id.id})
self.contract_id.flush_recordset()
self.assertEqual(len(self.employee_id_1.category_ids.ids), 2)
self.assertIn(self.categ_3_id.id, self.employee_id_1.category_ids.ids)
self.assertNotIn(
self.job_id.category_ids.ids[0], self.employee_id_1.category_ids.ids
)
self.assertIn(
self.job_2_id.category_ids.ids[0], self.employee_id_1.category_ids.ids
)
def test_unlink_contract(self):
"""When we unlink a contract, it should remove only the tags related to it"""
self.employee_id_1.write({"category_ids": self.categ_3_id})
self.contract_id.write({"job_id": self.job_id.id})
self.contract_id.invalidate_recordset()
# We have two tags (from job and the manual added one)
self.assertEqual(len(self.employee_id_1.category_ids.ids), 2)
self.contract_id.unlink()
self.assertEqual(len(self.employee_id_1.category_ids.ids), 1)
self.assertIn(self.categ_3_id.id, self.employee_id_1.category_ids.ids)
self.assertNotIn(
self.job_id.category_ids.ids[0], self.employee_id_1.category_ids.ids
)

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_job_form" model="ir.ui.view">
<field name="name">hr.job.category</field>
<field name="model">hr.job</field>
<field name="inherit_id" ref="hr.view_hr_job_form" />
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_title')]" position="inside">
<label for="category_ids" groups="hr.group_hr_manager" />
<field
name="category_ids"
widget="many2many_tags"
placeholder="e.g. Part Time"
groups="hr.group_hr_manager"
/>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-hr-hr_job_category"
version = "16.0.0"
description = "HR Job Employee Categories - Adds tags to employee through contract and job position"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-hr-hr_contract>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["hr_job_category"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]