diff --git a/README.md b/README.md index 9d36e3c0..49911786 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,11 @@ project-agile [//]: # (addons) -This part will be replaced when running the oca-gen-addons-table script from OCA/maintainer-tools. +Available addons +---------------- +addon | version | maintainers | summary +--- | --- | --- | --- +[project_scrum](project_scrum/) | 18.0.1.0.0 | [![adasatorres](https://github.com/adasatorres.png?size=30px)](https://github.com/adasatorres) | This addon allow use the scrum methodology in projects [//]: # (end addons) diff --git a/project_scrum/README.rst b/project_scrum/README.rst new file mode 100644 index 00000000..b08f77e5 --- /dev/null +++ b/project_scrum/README.rst @@ -0,0 +1,98 @@ +============= +Project Scrum +============= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f313867496a11d7d8bd4270c860ec53f30f2d53d7dc5d6183301a05cabfe716b + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/licence-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%2Fproject-lightgray.png?logo=github + :target: https://github.com/OCA/project-agile/tree/18.0/project_scrum + :alt: OCA/project-agile +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/project-agile-18-0/project-agile-18-0-project_scrum + :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/project-agile&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This addon allow you to manage your project with scrum methodology. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +This addon you can create and manage your project with scrum +methodology. For create a sprint you need to go to the project and click +on the "Sprint" button. You can create a sprint with a name, a start +date, an end date, a project and a objetive. You can create a sprint +from configuration menu. You can access the all options from the project +options on kanban view or from project view form. From the project +options on kanban view you can access the sprint timeline view and the +backlog view. + +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 +------- + +* Binhex + +Contributors +------------ + +- \`Binhex \_\`: + + - Adasat Torres de León + +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. + +.. |maintainer-adasatorres| image:: https://github.com/adasatorres.png?size=40px + :target: https://github.com/adasatorres + :alt: adasatorres + +Current `maintainer `__: + +|maintainer-adasatorres| + +This module is part of the `OCA/project-agile `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/project_scrum/__init__.py b/project_scrum/__init__.py new file mode 100644 index 00000000..4b76c7b2 --- /dev/null +++ b/project_scrum/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/project_scrum/__manifest__.py b/project_scrum/__manifest__.py new file mode 100644 index 00000000..4df367a3 --- /dev/null +++ b/project_scrum/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2024 Binhex - Adasat Torres de León (https://www.binhex.cloud) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "Project Scrum", + "version": "18.0.1.0.0", + "category": "Project", + "website": "https://github.com/OCA/project-agile", + "author": "Binhex, Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "application": False, + "summary": "This addon allow use the scrum methodology in projects", + "depends": ["project_timeline"], + "data": [ + "security/ir.model.access.csv", + "views/project_sprint_views.xml", + "views/project_task_views.xml", + "views/project_views.xml", + "data/ir_cron_data.xml", + ], + "maintainers": ["adasatorres"], +} diff --git a/project_scrum/data/ir_cron_data.xml b/project_scrum/data/ir_cron_data.xml new file mode 100644 index 00000000..55951994 --- /dev/null +++ b/project_scrum/data/ir_cron_data.xml @@ -0,0 +1,13 @@ + + + + Update sprint state + + 5 + minutes + code + + model.cron_update_sprint_state() + + + diff --git a/project_scrum/i18n/it.po b/project_scrum/i18n/it.po new file mode 100644 index 00000000..2fdd91d3 --- /dev/null +++ b/project_scrum/i18n/it.po @@ -0,0 +1,477 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_scrum +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-06-25 09:25+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\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.10.4\n" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__1_months +msgid "1 Month" +msgstr "1 mese" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__1_weeks +msgid "1 Week" +msgstr "1 settimana" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__1_years +msgid "1 Year" +msgstr "1 anno" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__2_months +msgid "2 Month" +msgstr "2 mesi" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__2_weeks +msgid "2 Weeks" +msgstr "2 settimane" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__2_years +msgid "2 Years" +msgstr "2 anni" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form +msgid "" +"\n" +" Tasks\n" +" " +msgstr "" +"\n" +" Lavori\n" +" " + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit +msgid "" +"\n" +" Backlog\n" +" " +msgstr "" +"\n" +" Backlog\n" +" " + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit +msgid "" +"\n" +" Sprints\n" +" " +msgstr "" +"\n" +" Sprint\n" +" " + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_ids +msgid "Activities" +msgstr "Attività" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decorazione eccezione attività" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_state +msgid "Activity State" +msgstr "Stato attività" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icona tipo attività" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_attachment_count +msgid "Attachment Count" +msgstr "Conteggio allegati" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project.py:0 +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit +msgid "Backlog" +msgstr "Backlog" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_project__backlog_count +msgid "Backlog Count" +msgstr "Conteggio backlog" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__custom +msgid "Custom" +msgstr "Personalizzato" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Date End" +msgstr "Data fine" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_option +msgid "Date Option" +msgstr "Opzione data" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Date Start" +msgstr "Data inizio" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__description +msgid "Description" +msgstr "Descrizione" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: project_scrum +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__done +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Done" +msgstr "Eseguito" + +#. module: project_scrum +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__draft +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Draft" +msgstr "Bozza" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_end +msgid "End Date" +msgstr "Data fine" + +#. module: project_scrum +#: model:ir.model.constraint,message:project_scrum.constraint_project_sprint_date_check +msgid "Error: End date must be greater than start date!" +msgstr "Errore: la data fine deve essere maggiore della data inizio!" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_follower_ids +msgid "Followers" +msgstr "Seguito da" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icona Font Awesome es. fa-tasks" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Group By" +msgstr "Raggruppa per" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__has_message +msgid "Has Message" +msgstr "Ha un messaggio" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__id +msgid "ID" +msgstr "ID" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_exception_icon +msgid "Icon" +msgstr "Icona" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icona per indicare un'attività eccezione." + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "In Progress" +msgstr "In corso" + +#. module: project_scrum +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__in_progress +msgid "In progress" +msgstr "In corso" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_is_follower +msgid "Is Follower" +msgstr "Segue" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__user_ids +msgid "Members" +msgstr "Membri" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Scadenza mia attività" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__name +msgid "Name" +msgstr "Nome" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Scadenza prossima attività" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_summary +msgid "Next Activity Summary" +msgstr "Riepilogo prossima attività" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo prossima attività" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_has_error_counter +msgid "Number of errors" +msgstr "Numero di errori" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: project_scrum +#: model:ir.model,name:project_scrum.model_project_project +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__project_id +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Project" +msgstr "Progetto" + +#. module: project_scrum +#: model:ir.model,name:project_scrum.model_project_sprint +msgid "Project Sprint" +msgstr "Sprint progetto" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__rating_ids +msgid "Ratings" +msgstr "Valutazioni" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_user_id +msgid "Responsible User" +msgstr "Utente responsabile" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_task__sprint_id +#: model_terms:ir.ui.view,arch_db:project_scrum.project_task_inherit_search_view +msgid "Sprint" +msgstr "Sprint" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_project__sprint_count +msgid "Sprint Count" +msgstr "Conteggio sprint" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_task_inherit_search_view +msgid "Sprint In Progress" +msgstr "Sprint in corso" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_task__sprint_state +msgid "Sprint State" +msgstr "Stato sprint" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project.py:0 +msgid "Sprint Timeline" +msgstr "Timeline sprint" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project.py:0 +#: model:ir.actions.act_window,name:project_scrum.project_sprint_action +#: model:ir.model.fields,field_description:project_scrum.field_project_project__sprint_ids +#: model:ir.ui.menu,name:project_scrum.project_sprint_menu +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit +#: model_terms:ir.ui.view,arch_db:project_scrum.view_sprint_timeline +msgid "Sprints" +msgstr "Sprint" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit +msgid "Sprints Timeline" +msgstr "Timeline print" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form +msgid "Start" +msgstr "Avvio" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_start +msgid "Start Date" +msgstr "Data inizio" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__state +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "State" +msgstr "Stato" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Stato in base alle attività\n" +"Scaduto: la data richiesta è trascorsa\n" +"Oggi: la data attività è oggi\n" +"Pianificato: attività future." + +#. module: project_scrum +#: model:ir.model,name:project_scrum.model_project_task +msgid "Task" +msgstr "Lavoro" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__task_ids +msgid "Tasks" +msgstr "Lavori" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__tasks_count +msgid "Tasks Count" +msgstr "Conteggio lavori" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_task.py:0 +msgid "The assignees must be part of the sprint." +msgstr "L'assegnatario deve essere parte dello sprint." + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo di attività eccezione sul record." + +#. module: project_scrum +#: model:ir.actions.server,name:project_scrum.cron_update_sprint_state_ir_actions_server +msgid "Update sprint state" +msgstr "Aggiorna stato sprint" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__website_message_ids +msgid "Website communication history" +msgstr "Cronologia comunicazioni sito web" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + +#~ msgid "Main Attachment" +#~ msgstr "Allegato principale" diff --git a/project_scrum/i18n/nl.po b/project_scrum/i18n/nl.po new file mode 100644 index 00000000..25fe3c2e --- /dev/null +++ b/project_scrum/i18n/nl.po @@ -0,0 +1,479 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_scrum +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-11-21 15:06+0000\n" +"Last-Translator: Dennis Sluijk \n" +"Language-Team: none\n" +"Language: nl\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: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__1_months +msgid "1 Month" +msgstr "1 Maand" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__1_weeks +msgid "1 Week" +msgstr "1 Week" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__1_years +msgid "1 Year" +msgstr "1 Jaar" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__2_months +msgid "2 Month" +msgstr "2 Maanden" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__2_weeks +msgid "2 Weeks" +msgstr "2 Weken" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__2_years +msgid "2 Years" +msgstr "2 Jaar" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form +msgid "" +"\n" +" Tasks\n" +" " +msgstr "" +"\n" +" Taken\n" +" " + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit +msgid "" +"\n" +" Backlog\n" +" " +msgstr "" +"\n" +" Backlog\n" +" " + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit +#, fuzzy +msgid "" +"\n" +" Sprints\n" +" " +msgstr "" +"\n" +" Sprints\n" +" " + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_needaction +msgid "Action Needed" +msgstr "Vereist actie" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_ids +msgid "Activities" +msgstr "Activiteiten" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Activiteit uitzondering decoratie" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_state +msgid "Activity State" +msgstr "Activiteitsfase" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_type_icon +msgid "Activity Type Icon" +msgstr "Activiteitensoort icoon" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_attachment_count +msgid "Attachment Count" +msgstr "Aantal bijlagen" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project.py:0 +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit +msgid "Backlog" +msgstr "Backlog" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_project__backlog_count +msgid "Backlog Count" +msgstr "Aantal in backlog" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__create_uid +msgid "Created by" +msgstr "Aangemaakt door" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__create_date +msgid "Created on" +msgstr "Aangemaakt op" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__custom +msgid "Custom" +msgstr "Aangepast" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Date End" +msgstr "Einddatum" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_option +msgid "Date Option" +msgstr "Datumoptie" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Date Start" +msgstr "Startdatum" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__description +msgid "Description" +msgstr "Omschrijving" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__display_name +msgid "Display Name" +msgstr "Weergavenaam" + +#. module: project_scrum +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__done +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Done" +msgstr "Afgerond" + +#. module: project_scrum +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__draft +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Draft" +msgstr "Concept" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_end +msgid "End Date" +msgstr "Einddatum" + +#. module: project_scrum +#: model:ir.model.constraint,message:project_scrum.constraint_project_sprint_date_check +msgid "Error: End date must be greater than start date!" +msgstr "Fout: Einddatum moet later zijn dan startdatum!" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_follower_ids +msgid "Followers" +msgstr "Volgers" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_partner_ids +msgid "Followers (Partners)" +msgstr "Volgers (Relaties)" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Font awesome icon bijv. fa-tasks" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Group By" +msgstr "Groepeer op" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__has_message +msgid "Has Message" +msgstr "Heeft bericht" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__id +msgid "ID" +msgstr "ID" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_exception_icon +msgid "Icon" +msgstr "Icoon" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icoon om uitzondering op activiteit aan te geven." + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Wanneer aangevinkt, hebben nieuwe berichten uw aandacht nodig." + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" +"Als deze optie is aangevinkt, hebben sommige berichten een afleverfout." + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "In Progress" +msgstr "Lopend" + +#. module: project_scrum +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__in_progress +msgid "In progress" +msgstr "Lopend" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_is_follower +msgid "Is Follower" +msgstr "Is volger" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__user_ids +msgid "Members" +msgstr "Leden" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_has_error +msgid "Message Delivery error" +msgstr "Bericht leveringsfout" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_ids +msgid "Messages" +msgstr "Berichten" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Deadline voor mijn activiteit" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__name +msgid "Name" +msgstr "Naam" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Deadline voor volgende activiteit" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_summary +msgid "Next Activity Summary" +msgstr "Samenvatting volgende activiteit" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_type_id +msgid "Next Activity Type" +msgstr "Volgende activiteitstype" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_needaction_counter +msgid "Number of Actions" +msgstr "Aantal acties" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_has_error_counter +msgid "Number of errors" +msgstr "Aantal fouten" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Aantal berichten dat actie vereist" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Aantal berichten met leveringsfout" + +#. module: project_scrum +#: model:ir.model,name:project_scrum.model_project_project +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__project_id +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Project" +msgstr "Project" + +#. module: project_scrum +#: model:ir.model,name:project_scrum.model_project_sprint +msgid "Project Sprint" +msgstr "Project Sprint" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__rating_ids +msgid "Ratings" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_user_id +msgid "Responsible User" +msgstr "Verantwoordelijke gebruiker" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_task__sprint_id +#: model_terms:ir.ui.view,arch_db:project_scrum.project_task_inherit_search_view +msgid "Sprint" +msgstr "Sprint" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_project__sprint_count +msgid "Sprint Count" +msgstr "Aantal sprints" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_task_inherit_search_view +msgid "Sprint In Progress" +msgstr "Sprint lopend" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_task__sprint_state +msgid "Sprint State" +msgstr "Sprintstatus" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project.py:0 +msgid "Sprint Timeline" +msgstr "Sprint tijdlijn" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project.py:0 +#: model:ir.actions.act_window,name:project_scrum.project_sprint_action +#: model:ir.model.fields,field_description:project_scrum.field_project_project__sprint_ids +#: model:ir.ui.menu,name:project_scrum.project_sprint_menu +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit +#: model_terms:ir.ui.view,arch_db:project_scrum.view_sprint_timeline +msgid "Sprints" +msgstr "Sprints" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit +msgid "Sprints Timeline" +msgstr "Sprints tijdlijn" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form +msgid "Start" +msgstr "Start" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_start +msgid "Start Date" +msgstr "Startdatum" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__state +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "State" +msgstr "Status" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Status gebaseerd op activiteiten\n" +"Te laat: Datum is al verstreken\n" +"Vandaag: Activiteitsdatum is vandaag\n" +"Gepland: Toekomstige activiteiten." + +#. module: project_scrum +#: model:ir.model,name:project_scrum.model_project_task +msgid "Task" +msgstr "Taak" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__task_ids +msgid "Tasks" +msgstr "Taken" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__tasks_count +msgid "Tasks Count" +msgstr "Aantal taken" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_task.py:0 +msgid "The assignees must be part of the sprint." +msgstr "De toegewezen personen moeten deel uitmaken van de sprint." + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Type van activiteit uitzondering op record." + +#. module: project_scrum +#: model:ir.actions.server,name:project_scrum.cron_update_sprint_state_ir_actions_server +msgid "Update sprint state" +msgstr "Sprintstatussen bijwerken" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__website_message_ids +msgid "Website Messages" +msgstr "Websiteberichten" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__website_message_ids +msgid "Website communication history" +msgstr "Website communicatiegeschiedenis" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst bijgewerkt op" + +#~ msgid "Main Attachment" +#~ msgstr "Hoofdbijlage" diff --git a/project_scrum/i18n/project_scrum.pot b/project_scrum/i18n/project_scrum.pot new file mode 100644 index 00000000..bdcf834e --- /dev/null +++ b/project_scrum/i18n/project_scrum.pot @@ -0,0 +1,455 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_scrum +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.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: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__1_months +msgid "1 Month" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__1_weeks +msgid "1 Week" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__1_years +msgid "1 Year" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__2_months +msgid "2 Month" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__2_weeks +msgid "2 Weeks" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__2_years +msgid "2 Years" +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form +msgid "" +"\n" +" Tasks\n" +" " +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit +msgid "" +"\n" +" Backlog\n" +" " +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit +msgid "" +"\n" +" Sprints\n" +" " +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_ids +msgid "Activities" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_state +msgid "Activity State" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project.py:0 +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit +msgid "Backlog" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_project__backlog_count +msgid "Backlog Count" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__create_uid +msgid "Created by" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__create_date +msgid "Created on" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__date_option__custom +msgid "Custom" +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Date End" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_option +msgid "Date Option" +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Date Start" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__description +msgid "Description" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__display_name +msgid "Display Name" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__done +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Done" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__draft +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Draft" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_end +msgid "End Date" +msgstr "" + +#. module: project_scrum +#: model:ir.model.constraint,message:project_scrum.constraint_project_sprint_date_check +msgid "Error: End date must be greater than start date!" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Group By" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__has_message +msgid "Has Message" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__id +msgid "ID" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "In Progress" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__in_progress +msgid "In progress" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__write_date +msgid "Last Updated on" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__user_ids +msgid "Members" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_ids +msgid "Messages" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__name +msgid "Name" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: project_scrum +#: model:ir.model,name:project_scrum.model_project_project +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__project_id +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "Project" +msgstr "" + +#. module: project_scrum +#: model:ir.model,name:project_scrum.model_project_sprint +msgid "Project Sprint" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__rating_ids +msgid "Ratings" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_task__sprint_id +#: model_terms:ir.ui.view,arch_db:project_scrum.project_task_inherit_search_view +msgid "Sprint" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_project__sprint_count +msgid "Sprint Count" +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_task_inherit_search_view +msgid "Sprint In Progress" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_task__sprint_state +msgid "Sprint State" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project.py:0 +msgid "Sprint Timeline" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project.py:0 +#: model:ir.actions.act_window,name:project_scrum.project_sprint_action +#: model:ir.model.fields,field_description:project_scrum.field_project_project__sprint_ids +#: model:ir.ui.menu,name:project_scrum.project_sprint_menu +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit +#: model_terms:ir.ui.view,arch_db:project_scrum.view_sprint_timeline +msgid "Sprints" +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit +msgid "Sprints Timeline" +msgstr "" + +#. module: project_scrum +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form +msgid "Start" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_start +msgid "Start Date" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__state +#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search +msgid "State" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: project_scrum +#: model:ir.model,name:project_scrum.model_project_task +msgid "Task" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_sprint.py:0 +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__task_ids +msgid "Tasks" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__tasks_count +msgid "Tasks Count" +msgstr "" + +#. module: project_scrum +#. odoo-python +#: code:addons/project_scrum/models/project_task.py:0 +msgid "The assignees must be part of the sprint." +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: project_scrum +#: model:ir.actions.server,name:project_scrum.cron_update_sprint_state_ir_actions_server +msgid "Update sprint state" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: project_scrum +#: model:ir.model.fields,help:project_scrum.field_project_sprint__website_message_ids +msgid "Website communication history" +msgstr "" diff --git a/project_scrum/models/__init__.py b/project_scrum/models/__init__.py new file mode 100644 index 00000000..24b25645 --- /dev/null +++ b/project_scrum/models/__init__.py @@ -0,0 +1,3 @@ +from . import project_sprint +from . import project +from . import project_task diff --git a/project_scrum/models/project.py b/project_scrum/models/project.py new file mode 100644 index 00000000..80049013 --- /dev/null +++ b/project_scrum/models/project.py @@ -0,0 +1,79 @@ +from odoo import fields, models + + +class ProjectProject(models.Model): + _inherit = "project.project" + + sprint_ids = fields.One2many( + comodel_name="project.sprint", + inverse_name="project_id", + string="Sprints", + ) + sprint_count = fields.Integer(compute="_compute_sprint_count") + backlog_count = fields.Integer(compute="_compute_backlog_count") + + def _compute_backlog_count(self): + backlogs_count_by_sprint = dict( + self.env["project.task"]._read_group( + [ + ("project_id", "in", self.ids), + ("sprint_id", "=", False), + ("state", "!=", "1_done"), + ], + ["project_id"], + ["__count"], + ) + ) + for project in self: + project.backlog_count = backlogs_count_by_sprint.get(project, 0) + + def _compute_sprint_count(self): + assigned_sprint_count = dict( + self.env["project.sprint"]._read_group( + [("project_id", "in", self.ids)], ["project_id"], ["__count"] + ) + ) + unassigned_sprint_count = self.env["project.sprint"].search_count( + [("project_id", "=", False)] + ) + for project in self: + project.sprint_count = ( + assigned_sprint_count.get(project, 0) + unassigned_sprint_count + ) + + def action_sprints(self): + self.ensure_one() + return { + "name": self.env._("Sprints"), + "type": "ir.actions.act_window", + "res_model": "project.sprint", + "view_mode": "list,form,timeline", + "domain": ["|", ("project_id", "=", self.id), ("project_id", "=", False)], + "context": {"default_project_id": self.id}, + } + + def action_backlog(self): + self.ensure_one() + return { + "name": self.env._("Backlog"), + "type": "ir.actions.act_window", + "res_model": "project.task", + "view_mode": "list,form", + "domain": [ + ("project_id", "=", self.id), + ("sprint_id", "=", False), + ("state", "!=", "1_done"), + ], + "context": {"default_project_id": self.id}, + } + + def action_sprint_timeline(self): + self.ensure_one() + return { + "name": self.env._("Sprint Timeline"), + "type": "ir.actions.act_window", + "res_model": "project.task", + "view_mode": "timeline", + "domain": [("project_id", "=", self.id), ("sprint_id", "!=", False)], + "context": {"default_project_id": self.id, "no_create": True}, + } diff --git a/project_scrum/models/project_sprint.py b/project_scrum/models/project_sprint.py new file mode 100644 index 00000000..383c5118 --- /dev/null +++ b/project_scrum/models/project_sprint.py @@ -0,0 +1,141 @@ +from dateutil.relativedelta import relativedelta + +from odoo import api, fields, models +from odoo.tools import LazyTranslate + +_lt = LazyTranslate(__name__, default_lang="en_US") + +DATE_OPTIONS = [ + ("1_weeks", str(_lt("1 Week"))), + ("2_weeks", str(_lt("2 Weeks"))), + ("1_months", str(_lt("1 Month"))), + ("2_months", str(_lt("2 Month"))), + ("1_years", str(_lt("1 Year"))), + ("2_years", str(_lt("2 Years"))), + ("custom", str(_lt("Custom"))), +] + + +class ProjectSprint(models.Model): + _name = "project.sprint" + _inherit = ["mail.thread", "mail.activity.mixin"] + _description = "Project Sprint" + _sql_constraints = [ + ( + "date_check", + "CHECK (date_start <= date_end)", + "Error: End date must be greater than start date!", + ), + ] + + name = fields.Char(required=True, tracking=True) + user_ids = fields.Many2many( + comodel_name="res.users", + string="Members", + required=True, + domain="[('share', '=', False), ('active', '=', True)]", + tracking=True, + relation="project_sprint_user_rel", + ) + description = fields.Text(tracking=True) + project_id = fields.Many2one( + comodel_name="project.project", + string="Project", + tracking=True, + ) + task_ids = fields.One2many( + comodel_name="project.task", + inverse_name="sprint_id", + string="Tasks", + domain="[('project_id', '=', project_id)]", + ) + date_start = fields.Date( + string="Start Date", default=fields.Date.context_today, required=True + ) + date_option = fields.Selection( + selection=DATE_OPTIONS, default=DATE_OPTIONS[0][0], required=True + ) + date_end = fields.Date( + string="End Date", + required=True, + compute="_compute_date_end", + store=True, + readonly=False, + ) + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("in_progress", "In progress"), + ("done", "Done"), + ], + default="draft", + tracking=True, + ) + tasks_count = fields.Integer(compute="_compute_tasks_count") + + def _compute_tasks_count(self): + tasks_count_by_sprint = dict( + self.env["project.task"]._read_group( + [("sprint_id", "in", self.ids)], ["sprint_id"], ["__count"] + ) + ) + for sprint in self: + sprint.tasks_count = tasks_count_by_sprint.get(sprint, 0) + + def action_start(self): + self.write({"state": "in_progress"}) + + def action_done(self): + self.write({"state": "done"}) + self._check_task_state() + + def action_tasks(self): + self.ensure_one() + return { + "name": self.env._("Tasks"), + "type": "ir.actions.act_window", + "res_model": "project.task", + "view_mode": "list,form", + "domain": [("sprint_id", "=", self.id)], + "context": { + "default_project_id": self.project_id.id, + "default_sprint_id": self.id, + }, + } + + @api.model + def cron_update_sprint_state(self): + date = fields.Date.context_today(self) + for sprint in self.search([("state", "=", "draft")]): + if date >= sprint.date_start: + sprint.write({"state": "in_progress"}) + + for sprint in self.search([("state", "=", "in_progress")]): + if date >= sprint.date_end: + sprint.write({"state": "done"}) + sprint._check_task_state() + + def _check_task_state(self): + self.ensure_one() + in_progress_sprints = self.project_id.sprint_ids.filtered( + lambda sprint: sprint.state == "in_progress" + ) + self.task_ids.filtered(lambda task: task.state != "1_done").write( + { + "sprint_id": ( + in_progress_sprints[0].id if in_progress_sprints else False + ), + "user_ids": False, + } + ) + + @api.depends("date_start", "date_option") + def _compute_date_end(self): + for record in self: + if record.date_option != "custom": + num, interval = record.date_option.split("_") + record.date_end = record.date_start + relativedelta( + **{interval: int(num)} + ) + else: + record.date_end = record.date_start + relativedelta(days=1) diff --git a/project_scrum/models/project_task.py b/project_scrum/models/project_task.py new file mode 100644 index 00000000..2e9b3a8d --- /dev/null +++ b/project_scrum/models/project_task.py @@ -0,0 +1,31 @@ +from odoo import api, fields, models +from odoo.exceptions import ValidationError + + +class ProjectTask(models.Model): + _inherit = "project.task" + + sprint_id = fields.Many2one( + comodel_name="project.sprint", + string="Sprint", + tracking=True, + domain="[('state', '!=', 'done'),'|', ('project_id', '=', False), " + "('project_id', '=', project_id)]", + ) + + sprint_state = fields.Selection( + related="sprint_id.state", string="Sprint State", store=True + ) + + @api.constrains("user_ids") + def _check_user_ids(self): + for task in self: + if task.user_ids and task.sprint_id: + if not task.user_ids <= task.sprint_id.user_ids: + raise ValidationError( + self.env._("The assignees must be part of the sprint.") + ) + + @api.onchange("sprint_id") + def _onchange_sprint_id(self): + self.user_ids = False diff --git a/project_scrum/pyproject.toml b/project_scrum/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/project_scrum/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/project_scrum/readme/CONTRIBUTORS.md b/project_scrum/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..38b12549 --- /dev/null +++ b/project_scrum/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- \`Binhex \<\>\_\`: + - Adasat Torres de León \<\> diff --git a/project_scrum/readme/DESCRIPTION.md b/project_scrum/readme/DESCRIPTION.md new file mode 100644 index 00000000..e0b02e06 --- /dev/null +++ b/project_scrum/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This addon allow you to manage your project with scrum methodology. diff --git a/project_scrum/readme/USAGE.md b/project_scrum/readme/USAGE.md new file mode 100644 index 00000000..e89234ce --- /dev/null +++ b/project_scrum/readme/USAGE.md @@ -0,0 +1,8 @@ +This addon you can create and manage your project with scrum +methodology. For create a sprint you need to go to the project and click +on the "Sprint" button. You can create a sprint with a name, a start +date, an end date, a project and a objetive. You can create a sprint +from configuration menu. You can access the all options from the project +options on kanban view or from project view form. From the project +options on kanban view you can access the sprint timeline view and the +backlog view. diff --git a/project_scrum/security/ir.model.access.csv b/project_scrum/security/ir.model.access.csv new file mode 100644 index 00000000..a91b804e --- /dev/null +++ b/project_scrum/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_project_sprint_user,project.sprint.user,model_project_sprint,project.group_project_user,1,0,0,0 +access_project_sprint_admin,project.sprint.admin,model_project_sprint,project.group_project_manager,1,1,1,1 diff --git a/project_scrum/static/description/icon.png b/project_scrum/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/project_scrum/static/description/icon.png differ diff --git a/project_scrum/static/description/index.html b/project_scrum/static/description/index.html new file mode 100644 index 00000000..6a976c55 --- /dev/null +++ b/project_scrum/static/description/index.html @@ -0,0 +1,440 @@ + + + + + +Project Scrum + + + +
+

Project Scrum

+ + +

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

+

This addon allow you to manage your project with scrum methodology.

+

Table of contents

+ +
+

Usage

+

This addon you can create and manage your project with scrum +methodology. For create a sprint you need to go to the project and click +on the “Sprint” button. You can create a sprint with a name, a start +date, an end date, a project and a objetive. You can create a sprint +from configuration menu. You can access the all options from the project +options on kanban view or from project view form. From the project +options on kanban view you can access the sprint timeline view and the +backlog view.

+
+
+

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

+
    +
  • Binhex
  • +
+
+
+

Contributors

+ +
+
+

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.

+

Current maintainer:

+

adasatorres

+

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

+

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

+
+
+
+ + diff --git a/project_scrum/tests/__init__.py b/project_scrum/tests/__init__.py new file mode 100644 index 00000000..07cf6baa --- /dev/null +++ b/project_scrum/tests/__init__.py @@ -0,0 +1,3 @@ +from . import test_project_sprint +from . import test_project_project +from . import test_project_task diff --git a/project_scrum/tests/test_project_project.py b/project_scrum/tests/test_project_project.py new file mode 100644 index 00000000..6ce9ddb5 --- /dev/null +++ b/project_scrum/tests/test_project_project.py @@ -0,0 +1,82 @@ +from odoo.addons.base.tests.common import BaseCommon + + +class TestProjectProject(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_demo = cls.env.ref("base.user_demo") + cls.user_admin = cls.env.ref("base.user_admin") + + cls.project = cls.env["project.project"].create( + {"name": "Test Project", "user_id": cls.user_demo.id} + ) + cls.sprint = cls.env["project.sprint"].create( + { + "name": "Test Sprint", + "user_ids": [(4, cls.user_demo.id)], + "project_id": cls.project.id, + "date_start": "2024-08-30", + "date_end": "2024-09-15", + } + ) + cls.task_1 = cls.env["project.task"].create( + { + "name": "Test Task 1", + "project_id": cls.project.id, + "user_ids": [(4, cls.user_demo.id)], + "sprint_id": cls.sprint.id, + } + ) + cls.task_2 = cls.env["project.task"].create( + { + "name": "Test Task 2", + "project_id": cls.project.id, + "user_ids": [(4, cls.user_demo.id)], + } + ) + + def test_backlog_count(self): + self.project._compute_backlog_count() + self.assertEqual(self.project.backlog_count, 1) + self.task_2.sprint_id = self.sprint.id + self.project._compute_backlog_count() + self.assertEqual(self.project.backlog_count, 0) + + def test_sprint_count(self): + self.project._compute_sprint_count() + self.assertEqual(self.project.sprint_count, 1) + + def test_action_sprints(self): + action = self.project.action_sprints() + self.assertEqual(action["res_model"], "project.sprint") + self.assertEqual( + action["domain"], + ["|", ("project_id", "=", self.project.id), ("project_id", "=", False)], + ) + self.assertEqual(action["context"], {"default_project_id": self.project.id}) + + def test_action_backlog(self): + action = self.project.action_backlog() + self.assertEqual(action["res_model"], "project.task") + self.assertEqual( + action["domain"], + [ + ("project_id", "=", self.project.id), + ("sprint_id", "=", False), + ("state", "!=", "1_done"), + ], + ) + self.assertEqual(action["context"], {"default_project_id": self.project.id}) + + def test_action_sprint_timeline(self): + action = self.project.action_sprint_timeline() + self.assertEqual(action["res_model"], "project.task") + self.assertEqual( + action["domain"], + [("project_id", "=", self.project.id), ("sprint_id", "!=", False)], + ) + self.assertEqual( + action["context"], + {"default_project_id": self.project.id, "no_create": True}, + ) diff --git a/project_scrum/tests/test_project_sprint.py b/project_scrum/tests/test_project_sprint.py new file mode 100644 index 00000000..f588a12c --- /dev/null +++ b/project_scrum/tests/test_project_sprint.py @@ -0,0 +1,82 @@ +from freezegun import freeze_time + +from odoo.addons.base.tests.common import BaseCommon + + +class TestProjectSprint(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_demo = cls.env.ref("base.user_demo") + cls.user_admin = cls.env.ref("base.user_admin") + cls.project = cls.env["project.project"].create( + {"name": "Test Project", "user_id": cls.user_demo.id} + ) + cls.sprint = cls.env["project.sprint"].create( + { + "name": "Test Sprint", + "user_ids": [(4, cls.user_demo.id)], + "project_id": cls.project.id, + "date_start": "2024-08-28", + "date_end": "2024-09-15", + } + ) + cls.task = cls.env["project.task"].create( + { + "name": "Test Task", + "project_id": cls.project.id, + "user_ids": [(4, cls.user_demo.id)], + "sprint_id": cls.sprint.id, + } + ) + + def test_state_project_sprint(self): + self.assertEqual(self.sprint.state, "draft") + self.sprint.action_start() + self.assertEqual(self.sprint.state, "in_progress") + self.sprint.action_done() + self.assertEqual(self.sprint.state, "done") + + @freeze_time("2024-08-30") + def test_check_project_update(self): + self.sprint_2 = self.env["project.sprint"].create( + { + "name": "Test Sprint 2", + "user_ids": [(4, self.user_demo.id)], + "project_id": self.project.id, + "date_start": "2024-08-10", + "date_end": "2024-08-28", + "state": "in_progress", + } + ) + self.sprint.state = "draft" + self.sprint.cron_update_sprint_state() + self.assertEqual(self.sprint.state, "in_progress") + self.assertEqual(self.sprint_2.state, "done") + + def test_task_count(self): + self.assertEqual(self.sprint.tasks_count, 1) + self.task.sprint_id = False + self.sprint._compute_tasks_count() + self.assertEqual(self.sprint.tasks_count, 0) + + def test_compute_end_date(self): + self.assertEqual(self.sprint.date_end.strftime("%Y-%m-%d"), "2024-09-15") + self.sprint.date_option = "1_months" + self.sprint._compute_date_end() + self.assertEqual(self.sprint.date_end.strftime("%Y-%m-%d"), "2024-09-28") + self.sprint.date_option = "custom" + self.sprint._compute_date_end() + self.assertEqual(self.sprint.date_end.strftime("%Y-%m-%d"), "2024-08-29") + + def test_action_task(self): + action = self.sprint.action_tasks() + self.assertEqual(action["res_model"], "project.task") + self.assertEqual(action["domain"], [("sprint_id", "=", self.sprint.id)]) + self.assertEqual( + action["context"], + { + "default_project_id": self.project.id, + "default_sprint_id": self.sprint.id, + }, + ) diff --git a/project_scrum/tests/test_project_task.py b/project_scrum/tests/test_project_task.py new file mode 100644 index 00000000..e30ace43 --- /dev/null +++ b/project_scrum/tests/test_project_task.py @@ -0,0 +1,39 @@ +from odoo.exceptions import ValidationError + +from odoo.addons.base.tests.common import BaseCommon + + +class TestProjectTask(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_demo = cls.env.ref("base.user_demo") + cls.user_admin = cls.env.ref("base.user_admin") + cls.project = cls.env["project.project"].create( + {"name": "Test Project", "user_id": cls.user_demo.id} + ) + cls.sprint = cls.env["project.sprint"].create( + { + "name": "Test Sprint", + "user_ids": [(4, cls.user_demo.id)], + "project_id": cls.project.id, + "date_start": "2021-01-01", + "date_end": "2021-01-15", + } + ) + cls.task = cls.env["project.task"].create( + { + "name": "Test Task", + "project_id": cls.project.id, + "user_ids": [(4, cls.user_demo.id)], + "sprint_id": cls.sprint.id, + } + ) + + def test_check_user_ids(self): + with self.assertRaises(ValidationError): + self.task.user_ids = [(4, self.user_admin.id)] + + def test_onchange_sprint_id(self): + self.task._onchange_sprint_id() + self.assertEqual(len(self.task.user_ids), 0) diff --git a/project_scrum/views/project_sprint_views.xml b/project_scrum/views/project_sprint_views.xml new file mode 100644 index 00000000..2cb9302e --- /dev/null +++ b/project_scrum/views/project_sprint_views.xml @@ -0,0 +1,165 @@ + + + + project.sprint.view.form + project.sprint + +
+
+
+ +
+ +
+
+ + +
+
+ + project.sprint.view.list + project.sprint + + + + + + + + + + + + project.sprint.view.search + project.sprint + + + + + + + + + + + + + + + + + + + + + + project.sprint + timeline + + + + +
+ + + +
+
+
+
+
+
+ + Sprints + project.sprint + timeline,list,form + + +
diff --git a/project_scrum/views/project_task_views.xml b/project_scrum/views/project_task_views.xml new file mode 100644 index 00000000..9a6c5260 --- /dev/null +++ b/project_scrum/views/project_task_views.xml @@ -0,0 +1,76 @@ + + + + project.task.inherit.quick_create.form.view + project.task + + + + + + + + + project.task.inherit.form.view + project.task + + + + + + + + + project.task.inherit.list.view + project.task + + + + + + + + + project.task.inherit.search.view + project.task + + + + + + + + + + + + + project.task + timeline + + + + sprint_id + False + False + + + + + project.task + + + + + + + + diff --git a/project_scrum/views/project_views.xml b/project_scrum/views/project_views.xml new file mode 100644 index 00000000..a2e6b5d9 --- /dev/null +++ b/project_scrum/views/project_views.xml @@ -0,0 +1,67 @@ + + + + project.project.view.form.inherit + project.project + + + + + + + + + + project.project.view.kanban.inherit + project.project + + + +
+ Sprints +
+
+ Backlog +
+
+ + + +
+
+
diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml new file mode 100644 index 00000000..b267a2ef --- /dev/null +++ b/setup/_metapackage/pyproject.toml @@ -0,0 +1,11 @@ +[project] +name = "odoo-addons-oca-project-agile" +version = "18.0.20250528.0" +dependencies = [ + "odoo-addon-project_scrum==18.0.*", +] +classifiers=[ + "Programming Language :: Python", + "Framework :: Odoo", + "Framework :: Odoo :: 18.0", +] diff --git a/setup/project_scrum/odoo/addons/project_scrum b/setup/project_scrum/odoo/addons/project_scrum new file mode 120000 index 00000000..80f9edb4 --- /dev/null +++ b/setup/project_scrum/odoo/addons/project_scrum @@ -0,0 +1 @@ +../../../../project_scrum \ No newline at end of file diff --git a/setup/project_scrum/setup.py b/setup/project_scrum/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/project_scrum/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)