Move 124 sale modules to oca-sale, create oca-project with 56 project modules from oca-workflow-process

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Ernad Husremovic 2025-08-30 18:04:10 +02:00
parent 9eb7ae5807
commit 6094c218b2
2332 changed files with 125826 additions and 0 deletions

View file

@ -0,0 +1,97 @@
=============
Project Scrum
=============
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:9205339e8f7a2d8db0498032ce054de9c0db6a0555bdab29eb354e8393711c9b
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/tree/16.0/project_scrum
:alt: OCA/project
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/project-16-0/project-16-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&target_branch=16.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 <https://github.com/OCA/project/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/project/issues/new?body=module:%20project_scrum%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
~~~~~~~
* Binhex
Contributors
~~~~~~~~~~~~
* `Binhex <https://www.binhex.cloud>_`:
* Adasat Torres de León <a.torres@binhex.cloud>
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 <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-adasatorres|
This module is part of the `OCA/project <https://github.com/OCA/project/tree/16.0/project_scrum>`_ 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 (https://www.gnu.org/licenses/agpl.html).
from . import models

View file

@ -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": "16.0.1.0.0",
"category": "Project",
"website": "https://github.com/OCA/project",
"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"],
}

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="cron_update_sprint_state" model="ir.cron">
<field name="name">Update sprint state</field>
<field name="model_id" ref="model_project_sprint" />
<field name="interval_number">5</field>
<field name="interval_type">minutes</field>
<field name="numbercall">-1</field>
<field name="state">code</field>
<field name="code">
model.cron_update_sprint_state()
</field>
</record>
</odoo>

View file

@ -0,0 +1,476 @@
# 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"
"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
#, python-format
msgid "1 Month"
msgstr "1 mjesec"
#. 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
#, python-format
msgid "1 Week"
msgstr "1 tjedan"
#. 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
#, python-format
msgid "1 Year"
msgstr "1 godina"
#. 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
#, python-format
msgid "2 Month"
msgstr "2 meseca"
#. 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
#, python-format
msgid "2 Weeks"
msgstr "2 nedelje"
#. 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
#, python-format
msgid "2 Years"
msgstr "2 godine"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form
msgid ""
"<span class=\"o_stat_text\">\n"
" Tasks\n"
" </span>"
msgstr ""
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit
msgid ""
"<span class=\"o_stat_text\">\n"
" Backlog\n"
" </span>"
msgstr ""
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit
msgid ""
"<span class=\"o_stat_text\">\n"
" Sprints\n"
" </span>"
msgstr ""
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_needaction
msgid "Action Needed"
msgstr "Potrebna akcija"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_ids
msgid "Activities"
msgstr "Aktivnosti"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr "Dekoracija iznimke aktivnosti"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_state
msgid "Activity State"
msgstr "Status aktivnosti"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_type_icon
msgid "Activity Type Icon"
msgstr "Ikona tipa aktivnosti"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_attachment_count
msgid "Attachment Count"
msgstr "Broj priloga"
#. 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
#, python-format
msgid "Backlog"
msgstr "Zaostatak"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_project__backlog_count
msgid "Backlog Count"
msgstr "Broj zaostaka"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__create_date
msgid "Created on"
msgstr "Kreirano"
#. 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
#, python-format
msgid "Custom"
msgstr "Prilagođeno"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search
msgid "Date End"
msgstr "Datum završetka"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_option
msgid "Date Option"
msgstr "Opcija datuma"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search
msgid "Date Start"
msgstr "Datum početka"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__description
msgid "Description"
msgstr "Opis"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. 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 "Gotovo"
#. 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 "U pripremi"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_end
msgid "End Date"
msgstr "Datum završetka"
#. module: project_scrum
#. odoo-python
#: code:addons/project_scrum/models/project_sprint.py:0
#: model:ir.model.constraint,message:project_scrum.constraint_project_sprint_date_check
#, python-format
msgid "Error: End date must be greater than start date!"
msgstr "Greška: Datum završetka mora biti veći od datuma početka!"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_follower_ids
msgid "Followers"
msgstr "Pratioci"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_partner_ids
msgid "Followers (Partners)"
msgstr "Pratioci (Partneri)"
#. 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 ikona npr. fa-tasks"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search
msgid "Group By"
msgstr "Grupiši po"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__has_message
msgid "Has Message"
msgstr "Ima poruku"
#. 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 "Ikona"
#. module: project_scrum
#: model:ir.model.fields,help:project_scrum.field_project_sprint__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr "Ikona za prikaz iznimki."
#. module: project_scrum
#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_needaction
msgid "If checked, new messages require your attention."
msgstr "Ako je zakačeno, nove poruke će zahtjevati vašu pažnju"
#. 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 "Ako je označeno neke poruke mogu imati grešku u dostavi."
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_search
msgid "In Progress"
msgstr "U Toku"
#. module: project_scrum
#: model:ir.model.fields.selection,name:project_scrum.selection__project_sprint__state__in_progress
msgid "In progress"
msgstr "U tijeku"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_is_follower
msgid "Is Follower"
msgstr "Pratilac"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_main_attachment_id
msgid "Main Attachment"
msgstr "Glavna zakačka"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__user_ids
msgid "Members"
msgstr "Članovi"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_has_error
msgid "Message Delivery error"
msgstr "Greška pri isporuci poruke"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_ids
msgid "Messages"
msgstr "Poruke"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr "Rok za moju aktivnost"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__name
msgid "Name"
msgstr "Naziv:"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_date_deadline
msgid "Next Activity Deadline"
msgstr "Krajnji rok za sljedeću aktivnost"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_summary
msgid "Next Activity Summary"
msgstr "Pregled sljedeće aktivnosti"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_type_id
msgid "Next Activity Type"
msgstr "Tip sljedeće aktivnosti"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_needaction_counter
msgid "Number of Actions"
msgstr "Broj akcija"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__message_has_error_counter
msgid "Number of errors"
msgstr "Broj grešaka"
#. module: project_scrum
#: model:ir.model.fields,help:project_scrum.field_project_sprint__message_needaction_counter
msgid "Number of messages requiring action"
msgstr "Broj poruka koje zahtijevaju aktivnost"
#. 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 "Broj poruka sa greškama pri isporuci"
#. 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 "Projekat"
#. module: project_scrum
#: model:ir.model,name:project_scrum.model_project_sprint
msgid "Project Sprint"
msgstr "Sprint projekta"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__activity_user_id
msgid "Responsible User"
msgstr "Odgovorni korisnik"
#. 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 "Broj sprintova"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_task_inherit_search_view
msgid "Sprint In Progress"
msgstr "Sprint u toku"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_task__sprint_state
msgid "Sprint State"
msgstr "Stanje sprinta"
#. module: project_scrum
#. odoo-python
#: code:addons/project_scrum/models/project.py:0
#, python-format
msgid "Sprint Timeline"
msgstr "Vremenska linija sprinta"
#. 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
#, python-format
msgid "Sprints"
msgstr "Sprintovi"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_kanban_inherit
msgid "Sprints Timeline"
msgstr "Vremenska linija sprintova"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form
msgid "Start"
msgstr "Započni"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__date_start
msgid "Start Date"
msgstr "Početni datum"
#. 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 ""
#. module: project_scrum
#: model:ir.model,name:project_scrum.model_project_task
msgid "Task"
msgstr "Zadatak"
#. 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
#, python-format
msgid "Tasks"
msgstr "Zadaci"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__tasks_count
msgid "Tasks Count"
msgstr "Broj zadataka"
#. module: project_scrum
#. odoo-python
#: code:addons/project_scrum/models/project_task.py:0
#, python-format
msgid "The assignees must be part of the sprint."
msgstr "Dodeljeni moraju biti deo sprinta."
#. 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 "Vrsta aktivnosti iznimke na zapisu."
#. module: project_scrum
#: model:ir.actions.server,name:project_scrum.cron_update_sprint_state_ir_actions_server
#: model:ir.cron,cron_name:project_scrum.cron_update_sprint_state
msgid "Update sprint state"
msgstr "Ažuriraj stanje sprinta"
#. module: project_scrum
#: model:ir.model.fields,field_description:project_scrum.field_project_sprint__website_message_ids
msgid "Website Messages"
msgstr "Poruke sa website-a"
#. module: project_scrum
#: model:ir.model.fields,help:project_scrum.field_project_sprint__website_message_ids
msgid "Website communication history"
msgstr "Povijest komunikacije Web stranice"

View file

@ -0,0 +1,492 @@
# 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-28 23:06+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\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.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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
msgid "2 Years"
msgstr "2 anni"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form
msgid ""
"<span class=\"o_stat_text\">\n"
" Tasks\n"
" </span>"
msgstr ""
"<span class=\"o_stat_text\">\n"
" Lavori\n"
" </span>"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit
msgid ""
"<span class=\"o_stat_text\">\n"
" Backlog\n"
" </span>"
msgstr ""
"<span class=\"o_stat_text\">\n"
" Backlog\n"
" </span>"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit
msgid ""
"<span class=\"o_stat_text\">\n"
" Sprints\n"
" </span>"
msgstr ""
"<span class=\"o_stat_text\">\n"
" Sprint\n"
" </span>"
#. 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
#, python-format
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
#, python-format
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
#. odoo-python
#: code:addons/project_scrum/models/project_sprint.py:0
#: model:ir.model.constraint,message:project_scrum.constraint_project_sprint_date_check
#, python-format
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____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. 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__message_main_attachment_id
msgid "Main Attachment"
msgstr "Allegato principale"
#. 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__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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
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
#: model:ir.cron,cron_name:project_scrum.cron_update_sprint_state
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"

View file

@ -0,0 +1,493 @@
# 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 <d.sluijk@onestein.nl>\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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
msgid "2 Years"
msgstr "2 Jaar"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form
msgid ""
"<span class=\"o_stat_text\">\n"
" Tasks\n"
" </span>"
msgstr ""
"<span class=\"o_stat_text\">\n"
" Taken\n"
" </span>"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit
msgid ""
"<span class=\"o_stat_text\">\n"
" Backlog\n"
" </span>"
msgstr ""
"<span class=\"o_stat_text\">\n"
" Backlog\n"
" </span>"
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit
#, fuzzy
msgid ""
"<span class=\"o_stat_text\">\n"
" Sprints\n"
" </span>"
msgstr ""
"<span class=\"o_stat_text\">\n"
" Sprints\n"
" </span>"
#. 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
#, python-format
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
#, python-format
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
#. odoo-python
#: code:addons/project_scrum/models/project_sprint.py:0
#: model:ir.model.constraint,message:project_scrum.constraint_project_sprint_date_check
#, python-format
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____last_update
msgid "Last Modified on"
msgstr "Laatst bijgewerkt op"
#. 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__message_main_attachment_id
msgid "Main Attachment"
msgstr "Hoofdbijlage"
#. 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__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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
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
#: model:ir.cron,cron_name:project_scrum.cron_update_sprint_state
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"

View file

@ -0,0 +1,476 @@
# 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"
"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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
msgid "2 Years"
msgstr ""
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_sprint_view_form
msgid ""
"<span class=\"o_stat_text\">\n"
" Tasks\n"
" </span>"
msgstr ""
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit
msgid ""
"<span class=\"o_stat_text\">\n"
" Backlog\n"
" </span>"
msgstr ""
#. module: project_scrum
#: model_terms:ir.ui.view,arch_db:project_scrum.project_project_view_form_inherit
msgid ""
"<span class=\"o_stat_text\">\n"
" Sprints\n"
" </span>"
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
#, python-format
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
#, python-format
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
#. odoo-python
#: code:addons/project_scrum/models/project_sprint.py:0
#: model:ir.model.constraint,message:project_scrum.constraint_project_sprint_date_check
#, python-format
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____last_update
msgid "Last Modified on"
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__message_main_attachment_id
msgid "Main Attachment"
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__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
#, python-format
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
#, python-format
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
#, python-format
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
#, python-format
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
#: model:ir.cron,cron_name:project_scrum.cron_update_sprint_state
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 ""

View file

@ -0,0 +1,3 @@
from . import project_sprint
from . import project
from . import project_task

View file

@ -0,0 +1,65 @@
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):
for project in self:
project.backlog_count = len(
project.task_ids.filtered(
lambda task: not task.sprint_id and task.kanban_state != "done"
)
)
def _compute_sprint_count(self):
unassigned_sprint_count = self.env["project.sprint"].search(
[("project_id", "=", False)], count=True
)
for project in self:
project.sprint_count = len(project.sprint_ids) + unassigned_sprint_count
def action_sprints(self):
self.ensure_one()
return {
"name": _("Sprints"),
"type": "ir.actions.act_window",
"res_model": "project.sprint",
"view_mode": "tree,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": _("Backlog"),
"type": "ir.actions.act_window",
"res_model": "project.task",
"view_mode": "tree,form",
"domain": [
("project_id", "=", self.id),
("sprint_id", "=", False),
("kanban_state", "!=", "done"),
],
"context": {"default_project_id": self.id},
}
def action_sprint_timeline(self):
self.ensure_one()
return {
"name": _("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},
}

View file

@ -0,0 +1,132 @@
from dateutil.relativedelta import relativedelta
from odoo import _, api, fields, models
DATE_OPTIONS = [
("1_weeks", _("1 Week")),
("2_weeks", _("2 Weeks")),
("1_months", _("1 Month")),
("2_months", _("2 Month")),
("1_years", _("1 Year")),
("2_years", _("2 Years")),
("custom", _("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.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",
)
tasks_count = fields.Integer(compute="_compute_tasks_count")
def _compute_tasks_count(self):
for sprint in self:
sprint.tasks_count = len(sprint.task_ids)
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": _("Tasks"),
"type": "ir.actions.act_window",
"res_model": "project.task",
"view_mode": "tree,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.today()
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.kanban_state != "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)

View file

@ -0,0 +1,30 @@
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="['|', ('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(
_("The assignees must be part of the sprint.")
)
@api.onchange("sprint_id")
def _onchange_sprint_id(self):
self.user_ids = False

View file

@ -0,0 +1,4 @@
* `Binhex <https://www.binhex.cloud>_`:
* Adasat Torres de León <a.torres@binhex.cloud>

View file

@ -0,0 +1 @@
This addon allow you to manage your project with scrum methodology.

View file

@ -0,0 +1,6 @@
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.

View file

@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_project_sprint_user project.sprint.user model_project_sprint project.group_project_user 1 0 0 0
3 access_project_sprint_admin project.sprint.admin model_project_sprint project.group_project_manager 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,438 @@
<!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>Project Scrum</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" id="project-scrum">
<h1 class="title">Project Scrum</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:9205339e8f7a2d8db0498032ce054de9c0db6a0555bdab29eb354e8393711c9b
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/project/tree/16.0/project_scrum"><img alt="OCA/project" src="https://img.shields.io/badge/github-OCA%2Fproject-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/project-16-0/project-16-0-project_scrum"><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/project&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 addon allow you to manage your project with scrum methodology.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>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.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/project/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/project/issues/new?body=module:%20project_scrum%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">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Binhex</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li><cite>Binhex &lt;https://www.binhex.cloud&gt;_</cite>:<ul>
<li>Adasat Torres de León &lt;<a class="reference external" href="mailto:a.torres&#64;binhex.cloud">a.torres&#64;binhex.cloud</a>&gt;</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<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>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/adasatorres"><img alt="adasatorres" src="https://github.com/adasatorres.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/project/tree/16.0/project_scrum">OCA/project</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>
</body>
</html>

View file

@ -0,0 +1,3 @@
from . import test_project_sprint
from . import test_project_project
from . import test_project_task

View file

@ -0,0 +1,82 @@
from odoo.tests import TransactionCase
class TestProjectProject(TransactionCase):
@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),
("kanban_state", "!=", "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},
)

View file

@ -0,0 +1,82 @@
from freezegun import freeze_time
from odoo.tests import TransactionCase
class TestProjectSprint(TransactionCase):
@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,
},
)

View file

@ -0,0 +1,38 @@
from odoo.exceptions import ValidationError
from odoo.tests import TransactionCase
class TestProjectTask(TransactionCase):
@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)

View file

@ -0,0 +1,163 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="project_sprint_view_form" model="ir.ui.view">
<field name="name">project.sprint.view.form</field>
<field name="model">project.sprint</field>
<field name="arch" type="xml">
<form>
<header>
<button
name="action_start"
string="Start"
type="object"
states="draft"
class="btn btn-primary"
/>
<button
name="action_done"
string="Done"
type="object"
states="in_progress"
class="btn btn-primary"
/>
<field
name="state"
widget="statusbar"
statusbar_visible="draft,in_progress,done"
/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button
name="action_tasks"
type="object"
class="oe_stat_button"
icon="fa-tasks"
>
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="tasks_count" nolabel="1" />
</span>
<span class="o_stat_text">
Tasks
</span>
</div>
</button>
</div>
<label for="name" class="oe_edit_only " />
<h1>
<field name="name" />
</h1>
<group>
<group>
<field name="user_ids" widget="many2many_avatar_user" />
<field name="project_id" />
</group>
<group>
<field name="date_start" />
<field name="date_option" />
<field
name="date_end"
attrs="{'readonly' : [('date_option', '!=', 'custom')]}"
force_save="1"
/>
</group>
<field name="description" />
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" />
<field name="activity_ids" widget="mail_activity" />
<field name="message_ids" widget="mail_thread" />
</div>
</form>
</field>
</record>
<record id="project_sprint_view_tree" model="ir.ui.view">
<field name="name">project.sprint.view.tree</field>
<field name="model">project.sprint</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="project_id" />
<field name="date_start" />
<field name="date_end" />
<field name="state" />
</tree>
</field>
</record>
<record id="project_sprint_view_search" model="ir.ui.view">
<field name="name">project.sprint.view.search</field>
<field name="model">project.sprint</field>
<field name="arch" type="xml">
<search>
<field name="name" />
<field name="project_id" />
<field name="description" />
<separator />
<filter
string="Draft"
name="draft"
domain="[('state', '=', 'draft')]"
/>
<filter
string="In Progress"
name="progress"
domain="[('state', '=', 'in_progress')]"
/>
<filter string="Done" name="done" domain="[('state', '=', 'done')]" />
<separator />
<filter name="date_start" string="Date Start" date="date_start" />
<filter name="date_end" string="Date End" date="date_end" />
<separator />
<group expand="0" string="Group By">
<filter
name="project_id"
string="Project"
context="{'group_by':'project_id'}"
/>
<filter
name="state"
string="State"
context="{'group_by':'state'}"
/>
</group>
</search>
</field>
</record>
<record id="view_sprint_timeline" model="ir.ui.view">
<field name="model">project.sprint</field>
<field name="type">timeline</field>
<field name="arch" type="xml">
<timeline
date_start="date_start"
date_stop="date_end"
string="Sprints"
default_group_by="project_id"
event_open_popup="true"
>
<templates>
<t t-name="timeline-item">
<div class="o_project_timeline_item">
<span name="display_name">
<t t-esc="record.display_name" />
</span>
</div>
</t>
</templates>
</timeline>
</field>
</record>
<record id="project_sprint_action" model="ir.actions.act_window">
<field name="name">Sprints</field>
<field name="res_model">project.sprint</field>
<field name="view_mode">timeline,tree,form</field>
</record>
<menuitem
id="project_sprint_menu"
name="Sprints"
parent="project.menu_project_config"
action="project_sprint_action"
sequence="10"
/>
</odoo>

View file

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="project_task_inherit_form_view" model="ir.ui.view">
<field name="name">project.task.inherit.form.view</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_form2" />
<field name="arch" type="xml">
<xpath expr="//field[@name='project_id']" position="after">
<field name="sprint_id" />
</xpath>
</field>
</record>
<record id="project_task_inherit_tree_view" model="ir.ui.view">
<field name="name">project.task.inherit.tree.view</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_tree2" />
<field name="arch" type="xml">
<xpath expr="//field[@name='project_id']" position="after">
<field name="sprint_id" />
</xpath>
</field>
</record>
<record id="project_task_inherit_search_view" model="ir.ui.view">
<field name="name">project.task.inherit.search.view</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_search_form" />
<field name="arch" type="xml">
<xpath expr="//group" position="before">
<separator />
<filter
name="sprint_in_progress_task"
string="Sprint In Progress"
domain="[('sprint_state', '=', 'in_progress')]"
/>
</xpath>
<xpath expr="//group" position="inside">
<filter
name="sprint_id"
string="Sprint"
context="{'group_by':'sprint_id'}"
/>
</xpath>
</field>
</record>
<record id="view_task_timeline" model="ir.ui.view">
<field name="model">project.task</field>
<field name="type">timeline</field>
<field name="inherit_id" ref="project_timeline.project_task_timeline" />
<field name="arch" type="xml">
<xpath expr="//timeline" position="attributes">
<attribute name="default_group_by">sprint_id</attribute>
<attribute name="event_open_popup">False</attribute>
<attribute name="dependency_arrows">False</attribute>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="project_project_view_form_inherit" model="ir.ui.view">
<field name="name">project.project.view.form.inherit</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.edit_project" />
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button
class="oe_stat_button"
name="action_sprints"
type="object"
groups="project.group_project_manager"
icon="fa-hourglass"
>
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="sprint_count" nolabel="1" />
</span>
<span class="o_stat_text">
Sprints
</span>
</div>
</button>
<button
class="oe_stat_button"
name="action_backlog"
type="object"
groups="project.group_project_manager"
icon="fa-archive"
>
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="backlog_count" nolabel="1" />
</span>
<span class="o_stat_text">
Backlog
</span>
</div>
</button>
</xpath>
</field>
</record>
<record id="project_project_view_kanban_inherit" model="ir.ui.view">
<field name="name">project.project.view.kanban.inherit</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.view_project_kanban" />
<field name="arch" type="xml">
<xpath expr="//div[hasclass('o_kanban_manage_view')]" position="inside">
<div role="menuitem" groups="project.group_project_manager">
<a name="action_sprints" type="object">Sprints</a>
</div>
<div role="menuitem" groups="project.group_project_manager">
<a name="action_backlog" type="object">Backlog</a>
</div>
</xpath>
<xpath
expr="//div[hasclass('o_kanban_manage_reporting')]"
position="inside"
>
<div role="menuitem" groups="project.group_project_manager">
<a name="action_sprint_timeline" type="object">Sprints Timeline</a>
</div>
</xpath>
</field>
</record>
</odoo>