Marking projects as done when all tasks' progress are 100%
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
4
down vote
favorite
We have project.task
model, where each task has many lines and each line has progress field indicating how much work has been done and how much still remaining (from 0 to 100 percent). The task cannot be done until all lines' progress is 100%.
@api.onchange('task_line_ids','task_line_rider_ids')
def progress_on_change(self):
for record in self:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
all_done = True
for line in record.task_line_ids or record.task_line_rider_ids:
if line.progress != 100:
all_done = False
break
if all_done == True:
record.state = 'done'
else:
record.state = 'open'
However, SonarQube reported a code smell:
How can the complexity be reduced?
python python-2.7 cyclomatic-complexity odoo
add a comment |Â
up vote
4
down vote
favorite
We have project.task
model, where each task has many lines and each line has progress field indicating how much work has been done and how much still remaining (from 0 to 100 percent). The task cannot be done until all lines' progress is 100%.
@api.onchange('task_line_ids','task_line_rider_ids')
def progress_on_change(self):
for record in self:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
all_done = True
for line in record.task_line_ids or record.task_line_rider_ids:
if line.progress != 100:
all_done = False
break
if all_done == True:
record.state = 'done'
else:
record.state = 'open'
However, SonarQube reported a code smell:
How can the complexity be reduced?
python python-2.7 cyclomatic-complexity odoo
add a comment |Â
up vote
4
down vote
favorite
up vote
4
down vote
favorite
We have project.task
model, where each task has many lines and each line has progress field indicating how much work has been done and how much still remaining (from 0 to 100 percent). The task cannot be done until all lines' progress is 100%.
@api.onchange('task_line_ids','task_line_rider_ids')
def progress_on_change(self):
for record in self:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
all_done = True
for line in record.task_line_ids or record.task_line_rider_ids:
if line.progress != 100:
all_done = False
break
if all_done == True:
record.state = 'done'
else:
record.state = 'open'
However, SonarQube reported a code smell:
How can the complexity be reduced?
python python-2.7 cyclomatic-complexity odoo
We have project.task
model, where each task has many lines and each line has progress field indicating how much work has been done and how much still remaining (from 0 to 100 percent). The task cannot be done until all lines' progress is 100%.
@api.onchange('task_line_ids','task_line_rider_ids')
def progress_on_change(self):
for record in self:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
all_done = True
for line in record.task_line_ids or record.task_line_rider_ids:
if line.progress != 100:
all_done = False
break
if all_done == True:
record.state = 'done'
else:
record.state = 'open'
However, SonarQube reported a code smell:
How can the complexity be reduced?
python python-2.7 cyclomatic-complexity odoo
edited Apr 18 at 14:31
200_success
123k14142399
123k14142399
asked Apr 17 at 15:49
Tessnim
336
336
add a comment |Â
add a comment |Â
2 Answers
2
active
oldest
votes
up vote
2
down vote
accepted
There appears to be a bug in your code. The line:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done')
Is followed by the line:
for line in record.task_line_ids or record.task_line_rider_ids
Since bool(record.task_line_ids)
will always be True
by the virtue of the list not being empty (as previously checked). This second line is equivalent to
for line in record.task_line_ids
This does not seem to be the intention of the code. Assuming you want to check all lines in either record.task_line_ids
and record.task_line_rider_ids
you may want to use the following code:
all_lines = record.task_line_ids + record.task_line_rider_ids
all_done = all(line.progress == 100 for line in all_lines)
Combined with the other answer's suggestion, this should result in a pretty clean function.
add a comment |Â
up vote
7
down vote
16 and 15 are pretty artificial values, you should aim for a better code quality rather than a higher/smaller metric in particular.
Let's see what can be improved...
- Your boolean comparison
if all_done == True:
could (and should) be written in a more concise way:if all_done:
. Python has an optional
else
onfor
loops which can be understood as "this loop exited the usual way, not via a break". This removes the need for theall_done
variable altogether:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
for line in record.task_line_ids or record.task_line_rider_ids:
if line.progress != 100:
record.state = 'open'
break
else:
record.state = 'done'You could use the
all
orany
builtin to rewrite this without thefor... else
logic:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
if all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids):
record.state = 'done'
else:
record.state = 'open'You could re-introduce the temporary variable and use ternary operator:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
all_done = all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids)
record.state = 'done' if all_done else 'open'
add a comment |Â
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
There appears to be a bug in your code. The line:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done')
Is followed by the line:
for line in record.task_line_ids or record.task_line_rider_ids
Since bool(record.task_line_ids)
will always be True
by the virtue of the list not being empty (as previously checked). This second line is equivalent to
for line in record.task_line_ids
This does not seem to be the intention of the code. Assuming you want to check all lines in either record.task_line_ids
and record.task_line_rider_ids
you may want to use the following code:
all_lines = record.task_line_ids + record.task_line_rider_ids
all_done = all(line.progress == 100 for line in all_lines)
Combined with the other answer's suggestion, this should result in a pretty clean function.
add a comment |Â
up vote
2
down vote
accepted
There appears to be a bug in your code. The line:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done')
Is followed by the line:
for line in record.task_line_ids or record.task_line_rider_ids
Since bool(record.task_line_ids)
will always be True
by the virtue of the list not being empty (as previously checked). This second line is equivalent to
for line in record.task_line_ids
This does not seem to be the intention of the code. Assuming you want to check all lines in either record.task_line_ids
and record.task_line_rider_ids
you may want to use the following code:
all_lines = record.task_line_ids + record.task_line_rider_ids
all_done = all(line.progress == 100 for line in all_lines)
Combined with the other answer's suggestion, this should result in a pretty clean function.
add a comment |Â
up vote
2
down vote
accepted
up vote
2
down vote
accepted
There appears to be a bug in your code. The line:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done')
Is followed by the line:
for line in record.task_line_ids or record.task_line_rider_ids
Since bool(record.task_line_ids)
will always be True
by the virtue of the list not being empty (as previously checked). This second line is equivalent to
for line in record.task_line_ids
This does not seem to be the intention of the code. Assuming you want to check all lines in either record.task_line_ids
and record.task_line_rider_ids
you may want to use the following code:
all_lines = record.task_line_ids + record.task_line_rider_ids
all_done = all(line.progress == 100 for line in all_lines)
Combined with the other answer's suggestion, this should result in a pretty clean function.
There appears to be a bug in your code. The line:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done')
Is followed by the line:
for line in record.task_line_ids or record.task_line_rider_ids
Since bool(record.task_line_ids)
will always be True
by the virtue of the list not being empty (as previously checked). This second line is equivalent to
for line in record.task_line_ids
This does not seem to be the intention of the code. Assuming you want to check all lines in either record.task_line_ids
and record.task_line_rider_ids
you may want to use the following code:
all_lines = record.task_line_ids + record.task_line_rider_ids
all_done = all(line.progress == 100 for line in all_lines)
Combined with the other answer's suggestion, this should result in a pretty clean function.
answered Apr 18 at 20:03
Jared Goguen
777212
777212
add a comment |Â
add a comment |Â
up vote
7
down vote
16 and 15 are pretty artificial values, you should aim for a better code quality rather than a higher/smaller metric in particular.
Let's see what can be improved...
- Your boolean comparison
if all_done == True:
could (and should) be written in a more concise way:if all_done:
. Python has an optional
else
onfor
loops which can be understood as "this loop exited the usual way, not via a break". This removes the need for theall_done
variable altogether:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
for line in record.task_line_ids or record.task_line_rider_ids:
if line.progress != 100:
record.state = 'open'
break
else:
record.state = 'done'You could use the
all
orany
builtin to rewrite this without thefor... else
logic:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
if all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids):
record.state = 'done'
else:
record.state = 'open'You could re-introduce the temporary variable and use ternary operator:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
all_done = all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids)
record.state = 'done' if all_done else 'open'
add a comment |Â
up vote
7
down vote
16 and 15 are pretty artificial values, you should aim for a better code quality rather than a higher/smaller metric in particular.
Let's see what can be improved...
- Your boolean comparison
if all_done == True:
could (and should) be written in a more concise way:if all_done:
. Python has an optional
else
onfor
loops which can be understood as "this loop exited the usual way, not via a break". This removes the need for theall_done
variable altogether:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
for line in record.task_line_ids or record.task_line_rider_ids:
if line.progress != 100:
record.state = 'open'
break
else:
record.state = 'done'You could use the
all
orany
builtin to rewrite this without thefor... else
logic:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
if all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids):
record.state = 'done'
else:
record.state = 'open'You could re-introduce the temporary variable and use ternary operator:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
all_done = all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids)
record.state = 'done' if all_done else 'open'
add a comment |Â
up vote
7
down vote
up vote
7
down vote
16 and 15 are pretty artificial values, you should aim for a better code quality rather than a higher/smaller metric in particular.
Let's see what can be improved...
- Your boolean comparison
if all_done == True:
could (and should) be written in a more concise way:if all_done:
. Python has an optional
else
onfor
loops which can be understood as "this loop exited the usual way, not via a break". This removes the need for theall_done
variable altogether:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
for line in record.task_line_ids or record.task_line_rider_ids:
if line.progress != 100:
record.state = 'open'
break
else:
record.state = 'done'You could use the
all
orany
builtin to rewrite this without thefor... else
logic:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
if all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids):
record.state = 'done'
else:
record.state = 'open'You could re-introduce the temporary variable and use ternary operator:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
all_done = all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids)
record.state = 'done' if all_done else 'open'
16 and 15 are pretty artificial values, you should aim for a better code quality rather than a higher/smaller metric in particular.
Let's see what can be improved...
- Your boolean comparison
if all_done == True:
could (and should) be written in a more concise way:if all_done:
. Python has an optional
else
onfor
loops which can be understood as "this loop exited the usual way, not via a break". This removes the need for theall_done
variable altogether:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
for line in record.task_line_ids or record.task_line_rider_ids:
if line.progress != 100:
record.state = 'open'
break
else:
record.state = 'done'You could use the
all
orany
builtin to rewrite this without thefor... else
logic:if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
if all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids):
record.state = 'done'
else:
record.state = 'open'You could re-introduce the temporary variable and use ternary operator:
if len(record.task_line_ids) != 0 and record.state in ('open', 'done'):
all_done = all(line.progress == 100 for line in record.task_line_ids or record.task_line_rider_ids)
record.state = 'done' if all_done else 'open'
edited Apr 18 at 13:24
answered Apr 17 at 16:06
Josay
23.8k13580
23.8k13580
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f192304%2fmarking-projects-as-done-when-all-tasks-progress-are-100%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password