Skip to content

[IMP] project: implement new project task state - #107593

Closed
bastvdn wants to merge 1 commit into
odoo:masterfrom
odoo-dev:master-mark-as-done-2
Closed

[IMP] project: implement new project task state#107593
bastvdn wants to merge 1 commit into
odoo:masterfrom
odoo-dev:master-mark-as-done-2

Conversation

@bastvdn

@bastvdn bastvdn commented Dec 9, 2022

Copy link
Copy Markdown
Contributor

Specs Mark as Done

Overview

Before this PR the task state was fixed by the kanban_state field which was useful when you use the stage of the project as parts of a pipeline,
but not relevant when users are using stages as bucket lists. (specific examples at the end of the specs)

The goal of this PR is to provide users a way to mark their tasks as done with a simple button press,
while keeping the option to label a task as Approved, Canceled or Requesting changes like in the old kanban_state field.

The kanban_state of a task had no impact whatsoever on other tasks of the pipe, we would like to change that and make the task state have an influence on its dependent tasks.

The state will also have influence over the 'recurrent' tasks (to be implemented in Task #3084945)

If you want a better description of those changes with screenshot and colors check specs of:

Task-3084930

PRs:

See https://github.com/odoo/enterprise/pull/35359
See https://github.com/odoo/upgrade/pull/4367


Interaction with blocking tasks:

the closed values which mark the task as closed or finished:

  • Done
  • Canceled

The Open values when the task isn't finished yet:

  • In progress
  • Changes Requested
  • Approved
  • Waiting (which is not selectable)

Where to change the state of a task:

  • For kanban and form views: same place as kanban_state (bottom right of kanban card, top right of form view)
  • For list view: left of list (after task priority)
    more details about the state widget in state field widgets part

Interaction with existing fields

  • is_closed: which was determined by the task.stage_id.fold, now a task is closed when in one of the following stages

    • Done
    • Canceled
      a closed task is considered as finished, the time of the closing will be stored in the date_last_stage_update field
  • is_blocked: a task is considered blocked if ANY of its blocking task is in one of the blocking states (more details about this in the following part Interaction with blocking tasks):

    • in Progress
    • Changes Requested
    • Approved
    • Waiting

!! important !! is_closed and is_blocked are not mutually exclusive, you can have a task that blocked and is closed at the same time, the reason why will be explained late

date_last_stage_update: this field is updated everytime the task goes into a closing state OR when the task changes stage.
We need to check that the value is updated in each case (using the already available filter)

Interaction with blocking tasks

the state of a task can now be changed by its blocking tasks following the logic:

if ANY of the blocking tasks is NOT closed (so its state is in one of the open values) the task is considered as blocked

  • if a task is blocked and NOT closed its state will switch to Waiting
    • the Waiting state will display an unclickable hourglass icon on the task kanban/list views, once in the waiting state you can't change the state of the taskfrom the kanban/list views
    • a blocked task state can be changed through the form view, so you can override the 'block' by choosing a closed state (only done or canceled)
      • once overriden, the task will change to the closed state the user wants, but the task is still blocked so in case where the user comes back to an open state, the task will automatically switch back to the waiting state (according to the state before the block)
  • if the blocking task switches to a non-blocking state, the task will not be considered as blocked anymore and its state will switch back to In Progress

image

Default values

the default value is always in progress

Special cases

when a task is moved from a stage to another one

  • if the state was in one of the open states (approved, changes requested, in progress ) the state goes back to In Progress
  • if not, the state stays the same

when a task is moved from a project to another one

  • the state goes back to In Progress
    when a task is duplicated
  • if the state was in one of the open states (approved, changes requested, in progress ) the state goes back to In Progress
  • if not, the state stays the same

@robodoo

robodoo commented Dec 9, 2022

Copy link
Copy Markdown
Contributor

Pull request status dashboard

@C3POdoo
C3POdoo requested review from a team December 9, 2022 09:19
@bastvdn bastvdn changed the title [IMP] project: implement new kanban state [IMP] project: implement new project task state Dec 9, 2022
@C3POdoo C3POdoo added the RD research & development, internal work label Dec 9, 2022
@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch 3 times, most recently from cbf7388 to 5469fc4 Compare December 15, 2022 16:43
@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch 2 times, most recently from 32152ac to 9afd4f4 Compare December 26, 2022 14:35
@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch from edddeaa to 943ef5d Compare January 3, 2023 09:17
Comment thread addons/project/models/project.py Outdated
Comment on lines +67 to +68
'state',
'state_approval_mode'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if those fields are writable in project sharing then they are also readable. 🙂
That is, no need to add those fields in the readable fields. 🙂

@property
def SELF_READABLE_FIELDS(self):
return PROJECT_TASK_READABLE_FIELDS | self.SELF_WRITABLE_FIELDS

@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch from 943ef5d to 37b6542 Compare January 10, 2023 17:18
@brboi
brboi requested review from a team, FrancoisGe and adr-odoo and removed request for a team January 11, 2023 10:31
@bastvdn
bastvdn marked this pull request as draft January 18, 2023 08:26
@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch 7 times, most recently from 2455620 to 30c6f6e Compare January 20, 2023 14:44
@adr-odoo
adr-odoo removed their request for review January 23, 2023 10:02
@adr-odoo

Copy link
Copy Markdown
Contributor

Feel free to ping me when this PR is ready.

@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch from 30c6f6e to 5486664 Compare January 26, 2023 12:38
@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch 5 times, most recently from d5acc1c to b003140 Compare February 17, 2023 16:16

@MissingNoShiny MissingNoShiny left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello, congratulations for your work! 🤩
I left some comments 🙂

Comment thread addons/project/models/project.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
task.is_closed = True if task.state in CLOSED_STATES else False
task.is_closed = task.state in CLOSED_STATES

😇

Comment on lines 17 to 38

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If these are not used anymore, don't forget to remove them

Comment thread addons/project/controllers/portal.py Outdated
Comment on lines 354 to 355

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit too many if else, how about something like this?

# We build a dictionary that maps every state value to its key
state_dict = dict(map(reversed, self.env['project.task']._fields['state']._description_selection(request.env)))
search_domain.append([('state', 'ilike', state_dict.get(search, search))])

Comment thread addons/project/models/project.py Outdated
Comment on lines 2441 to 2447

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't forget to remove this

Comment thread addons/project/models/project.py Outdated
Comment on lines 75 to 85

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I understand correctly, a state can only be either blocking or closed? Could we not just use CLOSED_STATES then? That way, if we add a blocking state but forget to add it in BLOCKING_STATES, it won't be a problem.

To avoid repeating information, you could even make CLOSED_STATES a dictionary, and use its items in the state field, like this:

CLOSED_STATES = {
    'done': 'Done',
    'canceled': 'Canceled',
}
    state = fields.Selection([
        ('in_progress', 'In Progress'),
        ('changes_requested', 'Changes Requested'),
        ('approved', 'Approved'),
        *CLOSED_STATES.items(),
        ('waiting_normal', 'Waiting'),
    ], string='Status', copy=False, default='in_progress', required=True, compute='_compute_state', readonly=False, store=True, recursive=True, task_dependency_tracking=True, tracking=True)

The in operator on dictionaries checks the keys, so all your task.state in CLOSED_STATES would keep the same behavior

Comment thread addons/project/report/project_report.py Outdated
Comment on lines 37 to 41

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't forget to remove this

Comment thread addons/project/models/project.py Outdated
Comment on lines 1435 to 1437

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't forget to remove this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't forget to remove this if it's not used anymore

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This means that the task will have the technical name of the state on hover (for example, "changes_requested"). I don't think that's what we want

Comment thread addons/project/models/project.py Outdated
@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch from 4832124 to 2282668 Compare February 22, 2023 09:59
@bastvdn

bastvdn commented Feb 22, 2023

Copy link
Copy Markdown
Contributor Author

Thanks a lot for the review :) very insightful
I fixed the majority of minor problems you pointed
Some of the problems will need a little bit more time but will be done short-term: (hopefully done by the 24 Feb)

  • write last implementation tests
  • remove all ref to kanban_state_label and legend_**
  • finish migration script

Here are some improvements that should be done in more long term

  • Remove all ref to is_closed and is_blocked
  • Some improvements for the frontend
    • some changes on the progressbar
    • fixed width for the tree view widget
    • write Javascript tests
  • Create a tour

What would you say is the more important?

And i have a small question to finish, haven't you seen any problem with the access rights/groups? I did not implement this feature with the access rights in mind at all (it does not seem that important for that small of a feature but still.. may be important)

@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch 5 times, most recently from 7001444 to d494ac0 Compare February 23, 2023 09:23
@MissingNoShiny

Copy link
Copy Markdown
Contributor

Here are some improvements that should be done in more long term

  • Remove all ref to is_closed and is_blocked

  • Some improvements for the frontend

    • some changes on the progressbar
    • fixed width for the tree view widget
    • write Javascript tests
  • Create a tour

What would you say is the more important?

I would say tests/tours can wait a bit if necessary, eliminating visible problems is more important (and other bugs that might arise in testing).
is_closed and is_blocked should be removed in this PR if possible.

And i have a small question to finish, haven't you seen any problem with the access rights/groups? I did not implement this feature with the access rights in mind at all (it does not seem that important for that small of a feature but still.. may be important)

I didn't notice anything problematic besides the portal rights. Hopefully if there are big issues, they will come up during testing 🙂

@bastvdn
bastvdn force-pushed the master-mark-as-done-2 branch 7 times, most recently from d6c8ae4 to 6f44962 Compare February 27, 2023 17:57

@xavierbol xavierbol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great job! Thanks for your work, I left some comments. 🙂

Comment thread addons/project/models/project.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return
break

? 🤔

Otherwise you will exit the method and not the for loop

@bastvdn bastvdn Mar 6, 2023

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If i break there i'll just get out of the last loop and end up in the if task.state == '04_waiting_normal' condition.

Comment thread addons/project/models/project.py Outdated
Comment on lines 1372 to 1388

@xavierbol xavierbol Mar 3, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am wondering if we could not do something like this:

Suggested change
for task in self:
if task.allow_task_dependencies:
for dependent_task in task.depend_on_ids:
# if one of the blocking task is in a blocking state
if dependent_task.state not in CLOSED_STATES:
# here we check that the blocked task is not alread in a closed state (if the task is already done we don't put it in waiting state)
if task.state not in CLOSED_STATES:
task.state = '04_waiting_normal'
return
# if the task as no blocking dependencies and is in waiting_normal, the task goes back to in progress
if task.state == '04_waiting_normal':
task.state = '01_in_progress'
tasks_with_dependencies_feature = self.filtered("allow_dependencies")
dependent_tasks = self.env["project.task"].search([
("dependent_ids", 'in', tasks_with_dependencies.ids),
("state", "not in", CLOSED_STATES)
])
for task in self:
# if one of the blocking task is in a blocking state
if dependent_task.state not in CLOSED_STATES:
# here we check that the blocked task is not already
# in a closed state (if the task is already done we
# don't put it in waiting state)
if task.state not in CLOSED_STATES and task in dependent_tasks:
task.state = '04_waiting_normal'
elif task.state == '04_waiting_normal':
# if the task as no blocking dependencies and is in
# waiting_normal, the task goes back to in progress
task.state = '01_in_progress'

I didn't test the code

Comment thread addons/project/models/project.py Outdated
Comment on lines 1385 to 1393

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should not it be in the _compute_state? Since the allow_task_dependencies is a setting in the project model

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mmmh i don't think so,
Here we need to catch the transition of allow_task_dependencies from True to False
-> in this case every task that was in waiting_normal is just resets to in_progress, How can you make this distinction in the compute_state? isn't the function always going to reset the task to in_progress when the allow_task_dependencies is False?

@xavierbol xavierbol Mar 6, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we have to know that we can just check if the allow_task_dependencies=False then we do the change accordingly, for instance, if I change a little bit your compute method:

    @api.depends('depend_on_ids.state', 'allow_task_dependencies')
    def _compute_state(self):
        for task in self:
            dependent_open_tasks = []
            if task.allow_task_dependencies:
                dependent_open_tasks = [dependent_task for dependent_task in task.depend_on_ids if dependent_task.state not in CLOSED_STATES]
            # if one of the blocking task is in a blocking state
            if dependent_open_tasks:
                # here we check that the blocked task is not already in a closed state (if the task is already done we don't put it in waiting state)
                if task.state not in CLOSED_STATES:
                    task.state = '04_waiting_normal'
            # if the task as no blocking dependencies and is in waiting_normal, the task goes back to in progress
            elif task.state == '04_waiting_normal':
                task.state = '01_in_progress'

when allow_task_dependencies is False we have to do the same things than when we don't have any dependencies.

(FYI, break stops the for loop, I think here we want to go to the next task in self and so you have to use continue instead)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok does work indeed, i can remove the onchange allow_task_dependencies

Comment thread addons/project/models/project.py Outdated
Comment on lines 1390 to 1403

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am wondering if it should not be in the _compute_state too.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same thing as for allow task dependencies, here we are just trying to handle a change of stage,
how can you handle that in the _compute function?

@xavierbol xavierbol Mar 6, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can let this onchange, you are right. 🙂

Comment thread addons/project/models/project.py Outdated
Comment on lines 1395 to 1408

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same, it could be in the _compute_state, IMO
What do you think? 🤔

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same thing as for allow_task_dependencies and onchange_stage_id :p

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you are right, however, I think the compute is triggered when the project changed because we have allow_task_dependencies (project_id.allow_task_dependencies) in the dependencies, so maybe this onchange is useless. 🤔

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the compute is triggered but it won't reset the state unless it was in waiting_normal, we want it to reset under every circumstance (except if it is still blocked by task and the project allow_task_dependencies)

Comment thread addons/project/tests/test_task_state.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'state': '03_approved'
'state': '03_approved',

😇

Comment thread addons/project/tests/test_task_state.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'state': '1_done'
'state': '1_done',

😇

Comment thread addons/project/tests/test_task_state.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'state': '1_done'
'state': '1_done',

😇

Comment thread addons/project/views/project_views.xml Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it really needed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess it is needed. 🤷🏼‍♂️

Comment thread addons/project/views/project_views.xml Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then we can remove the div? 🤔

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we are keeping the date_deadline finally (couldn't remove it because another view was referring to this div)

Comment on lines 5 to 10

@xavierbol xavierbol Mar 7, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not doing this:

Suggested change
<xpath expr="//span[@t-esc='formattedValue']" position="replace">
<s t-if="['1_done', '1_canceled'].includes(this.props.record.data.state) and ['kanban', 'list'].includes(this.props.record.activeFields[this.props.name].viewType)" t-esc="formattedValue"/>
<span t-else="" t-esc="formattedValue"/>
</xpath>
<xpath expr="//span[@t-esc='formattedValue']" position="before">
<s t-if="['1_done', '1_canceled'].includes(this.props.record.data.state) and ['kanban', 'list'].includes(this.props.record.activeFields[this.props.name].viewType)" t-esc="formattedValue"/>
</xpath>
<xpath expr="//span[@t-esc='formattedValue']" position="attributes">
<attribute name="t-else">""</attribute>
</xpath>

? 🤔

What is the s element? 🤔
You didn't want to put span instead?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s is for striked value (when the task is done/canceled)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh right 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not doing this:

? 🤔

What is the s element? 🤔 You didn't want to put span instead?

Don't forget to check that when you have time, I think we can avoid doing a replace here. 🙂

Thanks in advance!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes sorry :) it's done

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cool 🤩

Comment on lines 45 to 46

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
}
else {
} else {

@xavierbol xavierbol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks again for your work, I left one comment and I will push a commit if you agree with the changes then you can squash it in yours. 🙂

Comment thread addons/project/views/project_views.xml Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess it is needed. 🤷🏼‍♂️

@xavierbol xavierbol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks again for your work. 🤩 🥳

May I ask you to edit the PR message to avoid having a big DEPRECATED? Thanks in advance! 🙂

robodoo r+

Before this PR the task state was fixed by the kanban_state field which was useful when you use the stage of the project as parts of a pipeline,
but not relevant when users are using stages as bucket lists. (specific examples at the end of the specs)

The goal of this PR is to provide users a way to mark their tasks as done with a simple button press,
while keeping the option to label a task as Approved, Canceled or Requesting changes like in the old kanban_state field.

The kanban_state of a task had no impact whatsoever on other tasks of the pipe, we would like to change that and make the task state have an influence on its dependent tasks.

The state will also have influence over the 'recurrent' tasks (to be implemented in Task #3084945)

If you want a better description of those changes with screenshot and colors check specs of:

Task-3084930

PRs:

See odoo/enterprise#35359
See odoo/upgrade#4367

-----------------------------------------

Interaction with blocking tasks:
the closed values which mark the task as closed or finished:
- Done
- Canceled

The Open values when the task isn't finished yet:
- In progress
- Changes Requested
- Approved
- Waiting (which is not selectable)

Where to change the state of a task:
- For kanban and form views: same place as kanban_state (bottom right of kanban card, top right of form view)
- For list view:  left of list (after task priority)
more details about the state widget in state field widgets part

Interaction with existing fields
- is_closed: which was determined by the task.stage_id.fold, now a task is closed when in one of the following stages
 - Done
 - Canceled
a closed task is considered as finished, the time of the closing will be stored in the date_last_stage_update field

- is_blocked: a task is considered blocked if ANY of its blocking task is in one of the blocking states (more details about this in the following part Interaction with blocking tasks):
 - in Progress
 - Changes Requested
 - Approved
 - Waiting

!! important !! is_closed and is_blocked are not mutually exclusive, you can have a task that blocked and is closed at the same time, the reason why will be explained late

date_last_stage_update: this field is updated everytime the task goes into a closing state OR when the task changes stage.
We need to check that the value is updated in each case (using the already available filter)

Interaction with blocking tasks
the state of a task can now be changed by its blocking tasks following the logic:

if ANY of the blocking tasks is NOT closed (so its state is in one of the open values) the task is considered as blocked

- if a task is blocked and NOT closed its state will switch to Waiting
 - the Waiting state will display an unclickable hourglass icon on the task kanban/list views, once in the waiting state you can't change the state of the taskfrom the kanban/list views
 - a blocked task state can be changed through the form view, so you can override the 'block' by choosing a closed state (only done or canceled)
  - once overriden, the task will change to the closed state the user wants, but the task is still blocked so in case where the user comes back to an open state, the task will automatically switch back to the waiting state (according to the state before the block)
- if the blocking task switches to a non-blocking state, the task will not be considered as blocked anymore and its state will switch back to In Progress

Default values
the default value is always in progress

Special cases
when a task is moved from a stage to another one
- if the state was in one of the open states (approved, changes requested, in progress ) the state goes back to In Progress
- if not, the state stays the same
when a task is moved from a project to another one
- the state goes back to In Progress
when a task is duplicated
- if the state was in one of the open states (approved, changes requested, in progress ) the state goes back to In Progress
- if not, the state stays the same
@xavierbol

Copy link
Copy Markdown
Contributor

robodoo r+

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

16.2 RD research & development, internal work

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants