Skip to content

Commit c5798d5

Browse files
committed
Project statistics: add requirement status breakdown table
Closes #2206 Closes #2196
1 parent b167718 commit c5798d5

File tree

12 files changed

+330
-129
lines changed

12 files changed

+330
-129
lines changed

strictdoc/export/html/generators/project_statistics.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,13 @@ def export(
8484

8585
# STATUS
8686
if requirement.reserved_status is None:
87-
document_tree_stats.requirements_status_none += 1
87+
document_tree_stats.requirements_status_breakdown[
88+
None
89+
] += 1
8890
else:
89-
if requirement.reserved_status == "Backlog":
90-
document_tree_stats.requirements_status_backlog += 1
91-
elif requirement.reserved_status == "Draft":
92-
document_tree_stats.requirements_status_draft += 1
93-
elif requirement.reserved_status == "Active":
94-
document_tree_stats.requirements_status_active += 1
95-
else:
96-
document_tree_stats.requirements_status_other += 1
91+
document_tree_stats.requirements_status_breakdown[
92+
requirement.reserved_status
93+
] += 1
9794

9895
for requirement_field_ in node.enumerate_fields():
9996
field_value = requirement_field_.get_text_value()
@@ -102,6 +99,8 @@ def export(
10299
if "TBC" in field_value:
103100
document_tree_stats.total_tbc += 1
104101

102+
document_tree_stats.sort_requirements_status_breakdown()
103+
105104
view_object = ProjectStatisticsViewObject(
106105
document_tree_stats=document_tree_stats,
107106
traceability_index=traceability_index,

strictdoc/export/html/generators/view_objects/project_statistics_view_object.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,7 @@ def is_empty_tree(self) -> bool:
5555

5656
def get_datetime(self) -> str:
5757
return datetime.today().strftime("%Y-%m-%d %H:%M:%S")
58+
59+
def document_status_have_status(self) -> bool:
60+
statuses = self.document_tree_stats.requirements_status_breakdown.keys()
61+
return any(key is not None for key in statuses)

strictdoc/export/html/generators/view_objects/project_tree_stats.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# mypy: disable-error-code="arg-type"
1+
from collections import defaultdict
22
from dataclasses import dataclass, field
3-
from typing import List, Optional
3+
from typing import Dict, List, Optional
44

55
from strictdoc.backend.sdoc.models.node import SDocNode
66

@@ -30,13 +30,15 @@ class DocumentTreeStats:
3030
requirements_no_rationale: int = 0
3131

3232
# STATUS
33-
requirements_status_none: int = 0
34-
requirements_status_draft: int = 0
35-
requirements_status_backlog: int = 0
36-
requirements_status_active: int = 0
37-
requirements_status_other: int = 0
38-
39-
# Document-level stats.
40-
document_level_stats: List[DocumentStats] = field(
41-
default_factory=DocumentStats
33+
requirements_status_breakdown: Dict[Optional[str], int] = field(
34+
default_factory=lambda: defaultdict(int)
4235
)
36+
37+
def sort_requirements_status_breakdown(self) -> None:
38+
self.requirements_status_breakdown = dict(
39+
sorted(
40+
self.requirements_status_breakdown.items(),
41+
key=lambda item: (item[0] is not None, item[1]),
42+
reverse=True,
43+
)
44+
)
Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,16 @@
1-
{# table_key_value #}
1+
{% assert key_value_pair is defined %}
22

3-
<div class="sdoc-table_key_value">
4-
{% for obj in table_key_value %}
5-
6-
{% if obj["Section"] is defined %}
7-
<div class="sdoc-table_key_value-section">{{ obj["Section"] }}</div>
3+
{% if key_value_pair["Section"] is defined %}
4+
<div class="sdoc-table_key_value-section">{{ key_value_pair["Section"] }}</div>
5+
{% else %}
6+
{% if view_object.project_config.is_activated_search() and key_value_pair["Link"] is defined %}
7+
<a
8+
class="sdoc-table_key_value-key"
9+
data-testid="search-{{ key_value_pair["Key"].lower().replace(" ", "-") }}"
10+
href="{{ key_value_pair["Link"] }}">{{ key_value_pair["Key"] }}
11+
</a>
812
{% else %}
9-
{% if view_object.project_config.is_activated_search() and obj["Link"] is defined %}
10-
<a
11-
class="sdoc-table_key_value-key"
12-
data-testid="search-{{ obj["Key"].lower().replace(" ", "-") }}"
13-
href="{{ obj["Link"] }}">{{ obj["Key"] }}
14-
</a>
15-
{% else %}
16-
<div class="sdoc-table_key_value-key">{{ obj["Key"] }}</div>
17-
{% endif %}
18-
<div class="sdoc-table_key_value-value">{{ obj["Value"] }}</div>
13+
<div class="sdoc-table_key_value-key">{{ key_value_pair["Key"] }}</div>
1914
{% endif %}
20-
21-
{% endfor %}
22-
</div>
15+
<div class="sdoc-table_key_value-value">{{ key_value_pair["Value"] }}</div>
16+
{% endif %}

strictdoc/export/html/templates/screens/git/changelog_content.jinja

Lines changed: 67 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,36 +20,73 @@
2020
{% set _requirements_modified = "No requirements were modified." %}
2121
{% endif %}
2222

23-
{%- with table_key_value = [
24-
{"Section":"Compared revisions"},
25-
{
26-
"Key":"Left",
27-
"Value": view_object.left_revision,
28-
},
29-
{
30-
"Key":"Right",
31-
"Value": view_object.right_revision,
32-
},
33-
{"Section":"Summary of the changes"},
34-
{
35-
"Key":"Nodes modified",
36-
"Value": view_object.change_container.change_stats.get_total_changes(),
37-
},
38-
{
39-
"Key":"Documents modified",
40-
"Value": _documents_modified,
41-
},
42-
{
43-
"Key":"Sections modified",
44-
"Value": _sections_modified,
45-
},
46-
{
47-
"Key":"Requirements modified",
48-
"Value": _requirements_modified,
49-
},
50-
] -%}
51-
{% include "components/table_key_value/index.jinja" %}
52-
{%- endwith -%}
23+
<div class="sdoc-table_key_value">
24+
{% with key_value_pair =
25+
{"Section":"Compared revisions"}
26+
%}
27+
{% include "components/table_key_value/index.jinja" %}
28+
{% endwith %}
29+
30+
{% with key_value_pair =
31+
{
32+
"Key":"Left",
33+
"Value": view_object.left_revision,
34+
}
35+
%}
36+
{% include "components/table_key_value/index.jinja" %}
37+
{% endwith %}
38+
39+
{% with key_value_pair =
40+
{
41+
"Key":"Right",
42+
"Value": view_object.right_revision,
43+
}
44+
%}
45+
{% include "components/table_key_value/index.jinja" %}
46+
{% endwith %}
47+
48+
{% with key_value_pair =
49+
{"Section":"Summary of the changes"}
50+
%}
51+
{% include "components/table_key_value/index.jinja" %}
52+
{% endwith %}
53+
54+
{% with key_value_pair =
55+
{
56+
"Key":"Nodes modified",
57+
"Value": view_object.change_container.change_stats.get_total_changes(),
58+
}
59+
%}
60+
{% include "components/table_key_value/index.jinja" %}
61+
{% endwith %}
62+
63+
{% with key_value_pair =
64+
{
65+
"Key":"Documents modified",
66+
"Value": _documents_modified,
67+
}
68+
%}
69+
{% include "components/table_key_value/index.jinja" %}
70+
{% endwith %}
71+
72+
{% with key_value_pair =
73+
{
74+
"Key":"Sections modified",
75+
"Value": _sections_modified,
76+
}
77+
%}
78+
{% include "components/table_key_value/index.jinja" %}
79+
{% endwith %}
80+
81+
{% with key_value_pair =
82+
{
83+
"Key":"Requirements modified",
84+
"Value": _requirements_modified,
85+
}
86+
%}
87+
{% include "components/table_key_value/index.jinja" %}
88+
{% endwith %}
89+
</div>{# / .sdoc-table_key_value #}
5390

5491
<div class="changelog_changes">
5592
{% for change in view_object.change_container.change_stats.changes %}

0 commit comments

Comments
 (0)