Files
prowler/dashboard/common_methods.py
2025-05-21 12:46:47 +02:00

3151 lines
106 KiB
Python

import re
import dash_bootstrap_components as dbc
import plotly.graph_objs as go
from dash import dash_table, dcc, html
from dashboard.config import fail_emoji, info_emoji, manual_emoji, pass_emoji
def version_tuple(version):
version = re.sub("[a-zA-Z]", "", version)
if version == "" or version == "-" or version == " " or version == "_":
return version
else:
if "." in version:
delimiter = "."
elif "-" in version:
delimiter = "-"
elif "_" in version:
delimiter = "_"
else:
delimiter = None
# clean up all the strings that end with . or - or _ (few cases)
while version[-1] == ".":
version = version.replace(".", "", 1)
while version[-1] == "-":
version = version.replace("-", "", 1)
while version[-1] == "_":
version = version.replace("_", "", 1)
if delimiter:
return tuple(
int(segment) for segment in version.split(delimiter) if segment
)
else:
return version
def map_status_to_icon(status):
if status == "FAIL":
return fail_emoji
elif status == "PASS":
return pass_emoji
elif status == "INFO":
return info_emoji
elif status == "MANUAL":
return manual_emoji
return status
def get_section_containers_cis(data, section_1, section_2):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
data.sort_values(by=section_1, key=lambda x: x.map(version_tuple), inplace=True)
data[section_1] = data[section_1].astype(str)
findings_counts_section = (
data.groupby([section_2, "STATUS"]).size().unstack(fill_value=0)
)
findings_counts_id = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
section_containers = []
for section in data[section_2].unique():
success_section = (
findings_counts_section.loc[section, pass_emoji]
if pass_emoji in findings_counts_section.columns
else 0
)
failed_section = (
findings_counts_section.loc[section, fail_emoji]
if fail_emoji in findings_counts_section.columns
else 0
)
fig_section = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_section],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_section],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_section.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_section + failed_section,
y=0,
xref="x",
yref="y",
text=str(success_section),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_section),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_section.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_section.add_annotation(
x=failed_section,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_section = dcc.Graph(
figure=fig_section, config={"staticPlot": True}, className="info-bar"
)
graph_div = html.Div(graph_section, className="graph-section")
direct_internal_items = []
for req_id in data[data[section_2] == section][section_1].unique():
specific_data = data[
(data[section_2] == section) & (data[section_1] == req_id)
]
success_req = (
findings_counts_id.loc[req_id, pass_emoji]
if pass_emoji in findings_counts_id.columns
else 0
)
failed_req = (
findings_counts_id.loc[req_id, fail_emoji]
if fail_emoji in findings_counts_id.columns
else 0
)
# Create the DataTable for req_id
data_table = dash_table.DataTable(
data=specific_data.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in ["CHECKID", "STATUS", "REGION", "ACCOUNTID", "RESOURCEID"]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
# Create the graph for req_id
fig_req = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_req],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_req],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_req.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_req + failed_req,
y=0,
xref="x",
yref="y",
text=str(success_req),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_req),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_req.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_req.add_annotation(
x=failed_req,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_req = dcc.Graph(
figure=fig_req, config={"staticPlot": True}, className="info-bar-child"
)
graph_div_req = html.Div(graph_req, className="graph-section-req")
title_internal = (
f"{req_id} - {specific_data['REQUIREMENTS_DESCRIPTION'].iloc[0]}"
)
# Cut the title if it's too long
title_internal = (
title_internal[:130] + " ..."
if len(title_internal) > 130
else title_internal
)
internal_accordion_item = dbc.AccordionItem(
title=title_internal,
children=[html.Div([data_table], className="inner-accordion-content")],
)
internal_section_container = html.Div(
[
graph_div_req,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner--child",
)
direct_internal_items.append(internal_section_container)
accordion_item = dbc.AccordionItem(
title=f"{section}", children=direct_internal_items
)
section_container = html.Div(
[
graph_div,
dbc.Accordion([accordion_item], start_collapsed=True, flush=True),
],
className="accordion-inner",
)
section_containers.append(section_container)
return html.Div(section_containers, className="compliance-data-layout")
def get_section_containers_format1(data, section_1, section_2):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
data.sort_values(by=section_2, key=lambda x: x.map(version_tuple), inplace=True)
data[section_2] = data[section_2].astype(str)
findings_counts_section = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
findings_counts_id = (
data.groupby([section_2, "STATUS"]).size().unstack(fill_value=0)
)
section_containers = []
for section in data[section_1].unique():
success_section = (
findings_counts_section.loc[section, pass_emoji]
if pass_emoji in findings_counts_section.columns
else 0
)
failed_section = (
findings_counts_section.loc[section, fail_emoji]
if fail_emoji in findings_counts_section.columns
else 0
)
fig_section = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_section],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_section],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_section.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_section + failed_section,
y=0,
xref="x",
yref="y",
text=str(success_section),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_section),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_section.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_section.add_annotation(
x=failed_section,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_section = dcc.Graph(
figure=fig_section, config={"staticPlot": True}, className="info-bar"
)
graph_div = html.Div(graph_section, className="graph-section")
direct_internal_items = []
for req_id in data[data[section_1] == section][section_2].unique():
specific_data = data[
(data[section_1] == section) & (data[section_2] == req_id)
]
success_req = (
findings_counts_id.loc[req_id, pass_emoji]
if pass_emoji in findings_counts_id.columns
else 0
)
failed_req = (
findings_counts_id.loc[req_id, fail_emoji]
if fail_emoji in findings_counts_id.columns
else 0
)
# Create the DataTable for req_id
data_table = dash_table.DataTable(
data=specific_data.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in ["CHECKID", "STATUS", "REGION", "ACCOUNTID", "RESOURCEID"]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
# Create the graph for req_id
fig_req = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_req],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_req],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_req.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_req + failed_req,
y=0,
xref="x",
yref="y",
text=str(success_req),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_req),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_req.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_req.add_annotation(
x=failed_req,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_req = dcc.Graph(
figure=fig_req, config={"staticPlot": True}, className="info-bar-child"
)
graph_div_req = html.Div(graph_req, className="graph-section-req")
internal_accordion_item = dbc.AccordionItem(
title=req_id,
children=[html.Div([data_table], className="inner-accordion-content")],
)
internal_section_container = html.Div(
[
graph_div_req,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner--child",
)
direct_internal_items.append(internal_section_container)
# Cut the title if it's too long
tittle_external = section[:70] + " ..." if len(section) > 70 else section
accordion_item = dbc.AccordionItem(
title=f"{tittle_external}", children=direct_internal_items
)
section_container = html.Div(
[
graph_div,
dbc.Accordion([accordion_item], start_collapsed=True, flush=True),
],
className="accordion-inner",
)
section_containers.append(section_container)
return html.Div(section_containers, className="compliance-data-layout")
def get_section_containers_format2(data, section_1, section_2):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
findings_counts_section = (
data.groupby([section_2, "STATUS"]).size().unstack(fill_value=0)
)
findings_counts_name = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
section_containers = []
for name in data[section_1].unique():
success_name = (
findings_counts_name.loc[name, pass_emoji]
if pass_emoji in findings_counts_name.columns
else 0
)
failed_name = (
findings_counts_name.loc[name, fail_emoji]
if fail_emoji in findings_counts_name.columns
else 0
)
fig_name = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_name],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_name],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_name.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_name + failed_name,
y=0,
xref="x",
yref="y",
text=str(success_name),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_name),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_name.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_name.add_annotation(
x=failed_name,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_name = dcc.Graph(
figure=fig_name, config={"staticPlot": True}, className="info-bar"
)
graph_div = html.Div(graph_name, className="graph-section")
direct_internal_items = []
for section in data[data[section_1] == name][section_2].unique():
specific_data = data[
(data[section_1] == name) & (data[section_2] == section)
]
success_section = (
findings_counts_section.loc[section, pass_emoji]
if pass_emoji in findings_counts_section.columns
else 0
)
failed_section = (
findings_counts_section.loc[section, fail_emoji]
if fail_emoji in findings_counts_section.columns
else 0
)
# Create the DataTable for req_id
data_table = dash_table.DataTable(
data=specific_data.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in ["CHECKID", "STATUS", "REGION", "ACCOUNTID", "RESOURCEID"]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
# Create the graph for req_id
fig_section = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_section],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_section],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_section.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_section + failed_section,
y=0,
xref="x",
yref="y",
text=str(success_section),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_section),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_section.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_section.add_annotation(
x=failed_section,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_section = dcc.Graph(
figure=fig_section,
config={"staticPlot": True},
className="info-bar-child",
)
graph_div_section = html.Div(graph_section, className="graph-section-req")
internal_accordion_item = dbc.AccordionItem(
title=section,
children=[html.Div([data_table], className="inner-accordion-content")],
)
internal_section_container = html.Div(
[
graph_div_section,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner--child",
)
direct_internal_items.append(internal_section_container)
accordion_item = dbc.AccordionItem(
title=f"{name}", children=direct_internal_items
)
section_container = html.Div(
[
graph_div,
dbc.Accordion([accordion_item], start_collapsed=True, flush=True),
],
className="accordion-inner",
)
section_containers.append(section_container)
return html.Div(section_containers, className="compliance-data-layout")
def get_section_containers_format3(data, section_1, section_2):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
data.sort_values(by=section_2, key=lambda x: x.map(version_tuple), inplace=True)
data[section_2] = data[section_2].astype(str)
findings_counts_section = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
findings_counts_id = (
data.groupby([section_2, "STATUS"]).size().unstack(fill_value=0)
)
section_containers = []
for section in data[section_1].unique():
success_section = (
findings_counts_section.loc[section, pass_emoji]
if pass_emoji in findings_counts_section.columns
else 0
)
failed_section = (
findings_counts_section.loc[section, fail_emoji]
if fail_emoji in findings_counts_section.columns
else 0
)
fig_section = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_section],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_section],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_section.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_section + failed_section,
y=0,
xref="x",
yref="y",
text=str(success_section),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_section),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_section.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_section.add_annotation(
x=failed_section,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_section = dcc.Graph(
figure=fig_section, config={"staticPlot": True}, className="info-bar"
)
graph_div = html.Div(graph_section, className="graph-section")
direct_internal_items = []
for req_id in data[data[section_1] == section][section_2].unique():
specific_data = data[
(data[section_1] == section) & (data[section_2] == req_id)
]
success_req = (
findings_counts_id.loc[req_id, pass_emoji]
if pass_emoji in findings_counts_id.columns
else 0
)
failed_req = (
findings_counts_id.loc[req_id, fail_emoji]
if fail_emoji in findings_counts_id.columns
else 0
)
# Create the DataTable for req_id
data_table = dash_table.DataTable(
data=specific_data.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in ["CHECKID", "STATUS", "REGION", "ACCOUNTID", "RESOURCEID"]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
# Create the graph for req_id
fig_req = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_req],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_req],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_req.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_req + failed_req,
y=0,
xref="x",
yref="y",
text=str(success_req),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_req),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_req.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_req.add_annotation(
x=failed_req,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_req = dcc.Graph(
figure=fig_req, config={"staticPlot": True}, className="info-bar-child"
)
graph_div_req = html.Div(graph_req, className="graph-section-req")
title_internal = (
f"{req_id} - {specific_data['REQUIREMENTS_DESCRIPTION'].iloc[0]}"
)
# Cut the title if it's too long
title_internal = (
title_internal[:130] + " ..."
if len(title_internal) > 130
else title_internal
)
internal_accordion_item = dbc.AccordionItem(
title=title_internal,
children=[html.Div([data_table], className="inner-accordion-content")],
)
internal_section_container = html.Div(
[
graph_div_req,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner--child",
)
direct_internal_items.append(internal_section_container)
tittle_external = (
f"{section} - {specific_data['REQUIREMENTS_DESCRIPTION'].iloc[0]}"
)
# Cut the title if it's too long
tittle_external = (
tittle_external[:70] + " ..."
if len(tittle_external) > 70
else tittle_external
)
accordion_item = dbc.AccordionItem(
title=f"{tittle_external}", children=direct_internal_items
)
section_container = html.Div(
[
graph_div,
dbc.Accordion([accordion_item], start_collapsed=True, flush=True),
],
className="accordion-inner",
)
section_containers.append(section_container)
return html.Div(section_containers, className="compliance-data-layout")
def get_section_containers_rbi(data, section_1):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
data[section_1] = data[section_1].astype(str)
findings_counts_id = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
direct_internal_items = []
for req_id in data[section_1].unique():
specific_data = data[data[section_1] == req_id]
success_req = (
findings_counts_id.loc[req_id, pass_emoji]
if pass_emoji in findings_counts_id.columns
else 0
)
failed_req = (
findings_counts_id.loc[req_id, fail_emoji]
if fail_emoji in findings_counts_id.columns
else 0
)
# Create the DataTable for req_id
data_table = dash_table.DataTable(
data=specific_data.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in ["CHECKID", "STATUS", "REGION", "ACCOUNTID", "RESOURCEID"]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
# Create the graph for req_id
fig_req = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_req],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_req],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_req.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_req + failed_req,
y=0,
xref="x",
yref="y",
text=str(success_req),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_req),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_req.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_req.add_annotation(
x=failed_req,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_req = dcc.Graph(
figure=fig_req, config={"staticPlot": True}, className="info-bar-child"
)
graph_div_req = html.Div(graph_req, className="graph-section-req")
title_internal = (
f"{req_id} - {specific_data['REQUIREMENTS_DESCRIPTION'].iloc[0]}"
)
# Cut the title if it's too long
title_internal = (
title_internal[:70] + " ..." if len(title_internal) > 70 else title_internal
)
internal_accordion_item = dbc.AccordionItem(
title=title_internal,
children=[html.Div([data_table], className="inner-accordion-content")],
)
internal_section_container = html.Div(
[
graph_div_req,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner",
)
direct_internal_items.append(internal_section_container)
return html.Div(direct_internal_items, className="compliance-data-layout")
def get_section_container_iso(data, section_1, section_2):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
data.sort_values(
by=section_1,
key=lambda x: x.map(version_tuple),
inplace=True,
)
data.sort_values(
by=section_2,
key=lambda x: x.map(version_tuple),
inplace=True,
)
findings_counts_objetive_id = (
data.groupby([section_2, "STATUS"]).size().unstack(fill_value=0)
)
findings_counts_category = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
section_containers = []
for category in data[section_1].unique():
success_category = (
findings_counts_category.loc[category, pass_emoji]
if pass_emoji in findings_counts_category.columns
else 0
)
failed_category = (
findings_counts_category.loc[category, fail_emoji]
if fail_emoji in findings_counts_category.columns
else 0
)
fig_category = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_category],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_category],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_category.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_category + failed_category,
y=0,
xref="x",
yref="y",
text=str(success_category),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_category),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_category.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_category.add_annotation(
x=failed_category,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_category = dcc.Graph(
figure=fig_category, config={"staticPlot": True}, className="info-bar"
)
graph_div = html.Div(graph_category, className="graph-section")
direct_internal_items = []
for objetive_id in data[data[section_1] == category][section_2].unique():
specific_data = data[
(data[section_1] == category) & (data[section_2] == objetive_id)
]
success_objetive_id = (
findings_counts_objetive_id.loc[objetive_id, pass_emoji]
if pass_emoji in findings_counts_objetive_id.columns
else 0
)
failed_objetive_id = (
findings_counts_objetive_id.loc[objetive_id, fail_emoji]
if fail_emoji in findings_counts_objetive_id.columns
else 0
)
# Create the DataTable for req_id
data_table = dash_table.DataTable(
data=specific_data.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in ["CHECKID", "STATUS", "REGION", "ACCOUNTID", "RESOURCEID"]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
# Create the graph for req_id
fig_objetive_id = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_objetive_id],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_objetive_id],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_objetive_id.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_objetive_id + failed_objetive_id,
y=0,
xref="x",
yref="y",
text=str(success_objetive_id),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_objetive_id),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_objetive_id.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_objetive_id.add_annotation(
x=failed_objetive_id,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_objetive_id = dcc.Graph(
figure=fig_objetive_id,
config={"staticPlot": True},
className="info-bar-child",
)
graph_div_objetive_id = html.Div(
graph_objetive_id, className="graph-section-req"
)
title_internal = f"{objetive_id} - {specific_data['REQUIREMENTS_ATTRIBUTES_OBJETIVE_NAME'].iloc[0]}"
# Cut the title if it's too long
title_internal = (
title_internal[:130] + " ..."
if len(title_internal) > 130
else title_internal
)
internal_accordion_item = dbc.AccordionItem(
title=title_internal,
children=[html.Div([data_table], className="inner-accordion-content")],
)
internal_objetive_id_container = html.Div(
[
graph_div_objetive_id,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner--child",
)
direct_internal_items.append(internal_objetive_id_container)
accordion_item = dbc.AccordionItem(
title=f"{category}", children=direct_internal_items
)
objetive_id_container = html.Div(
[
graph_div,
dbc.Accordion([accordion_item], start_collapsed=True, flush=True),
],
className="accordion-inner",
)
section_containers.append(objetive_id_container)
return html.Div(section_containers, className="compliance-data-layout")
def get_section_containers_format4(data, section_1):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
data[section_1] = data[section_1].astype(str)
findings_counts_service = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
direct_internal_items = []
for service in data[section_1].unique():
specific_data = data[data[section_1] == service]
success_service = (
findings_counts_service.loc[service, pass_emoji]
if pass_emoji in findings_counts_service.columns
else 0
)
failed_service = (
findings_counts_service.loc[service, fail_emoji]
if fail_emoji in findings_counts_service.columns
else 0
)
# Create the DataTable for service
data_table = dash_table.DataTable(
data=specific_data.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in ["CHECKID", "STATUS", "REGION", "ACCOUNTID", "RESOURCEID"]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
# Create the graph for service
fig_service = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_service],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_service],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_service.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_service + failed_service,
y=0,
xref="x",
yref="y",
text=str(success_service),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_service),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_service.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_service.add_annotation(
x=failed_service,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_service = dcc.Graph(
figure=fig_service, config={"staticPlot": True}, className="info-bar-child"
)
graph_div_service = html.Div(graph_service, className="graph-section-req")
if "REQUIREMENTS_NAME" not in specific_data.columns:
title_internal = f"{service}"
else:
title_internal = f"{service} - {specific_data['REQUIREMENTS_NAME'].iloc[0]}"
internal_accordion_item = dbc.AccordionItem(
title=title_internal,
children=[html.Div([data_table], className="inner-accordion-content")],
)
internal_section_container = html.Div(
[
graph_div_service,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner",
)
direct_internal_items.append(internal_section_container)
return html.Div(direct_internal_items, className="compliance-data-layout")
def get_section_containers_ens(data, section_1, section_2, section_3, section_4):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
findings_counts_marco = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
section_containers = []
for marco in data[section_1].unique():
success_marco = (
findings_counts_marco.loc[marco, pass_emoji]
if pass_emoji in findings_counts_marco.columns
else 0
)
failed_marco = (
findings_counts_marco.loc[marco, fail_emoji]
if fail_emoji in findings_counts_marco.columns
else 0
)
fig_name = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_marco],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_marco],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_name.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_marco + failed_marco,
y=0,
xref="x",
yref="y",
text=str(success_marco),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_marco),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_name.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_name.add_annotation(
x=failed_marco,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_name = dcc.Graph(
figure=fig_name, config={"staticPlot": True}, className="info-bar"
)
graph_div = html.Div(graph_name, className="graph-section")
direct_internal_items = []
for categoria in data[data[section_1] == marco][section_2].unique():
specific_data = data[
(data[section_1] == marco) & (data[section_2] == categoria)
]
findings_counts_categoria = (
specific_data.groupby([section_2, "STATUS"])
.size()
.unstack(fill_value=0)
)
success_categoria = (
findings_counts_categoria.loc[categoria, pass_emoji]
if pass_emoji in findings_counts_categoria.columns
else 0
)
failed_categoria = (
findings_counts_categoria.loc[categoria, fail_emoji]
if fail_emoji in findings_counts_categoria.columns
else 0
)
# Create the graph for req_id
fig_section = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_categoria],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_categoria],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_section.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_categoria + failed_categoria,
y=0,
xref="x",
yref="y",
text=str(success_categoria),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_categoria),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_section.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_section.add_annotation(
x=failed_categoria,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_section = dcc.Graph(
figure=fig_section,
config={"staticPlot": True},
className="info-bar-child",
)
graph_div_section = html.Div(graph_section, className="graph-section-req")
direct_internal_items_idgrupocontrol = []
for idgrupocontrol in specific_data[
(specific_data[section_1] == marco)
& (specific_data[section_2] == categoria)
][section_3].unique():
specific_data2 = specific_data[
(specific_data[section_1] == marco)
& (specific_data[section_2] == categoria)
& (specific_data[section_3] == idgrupocontrol)
]
findings_counts_idgrupocontrol = (
specific_data2.groupby([section_3, "STATUS"])
.size()
.unstack(fill_value=0)
)
success_idgrupocontrol = (
findings_counts_idgrupocontrol.loc[idgrupocontrol, pass_emoji]
if pass_emoji in findings_counts_idgrupocontrol.columns
else 0
)
failed_idgrupocontrol = (
findings_counts_idgrupocontrol.loc[idgrupocontrol, fail_emoji]
if fail_emoji in findings_counts_idgrupocontrol.columns
else 0
)
# Create the graph for req_id
fig_idgrupocontrol = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_idgrupocontrol],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_idgrupocontrol],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_idgrupocontrol.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_idgrupocontrol + failed_idgrupocontrol,
y=0,
xref="x",
yref="y",
text=str(success_idgrupocontrol),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_idgrupocontrol),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_idgrupocontrol.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_idgrupocontrol.add_annotation(
x=failed_idgrupocontrol,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_idgrupocontrol = dcc.Graph(
figure=fig_idgrupocontrol,
config={"staticPlot": True},
className="info-bar-child",
)
graph_div_idgrupocontrol = html.Div(
graph_idgrupocontrol, className="graph-section-req"
)
direct_internal_items_tipo = []
for tipo in specific_data2[
(specific_data2[section_1] == marco)
& (specific_data2[section_2] == categoria)
& (specific_data2[section_3] == idgrupocontrol)
][section_4].unique():
specific_data3 = specific_data2[
(specific_data2[section_1] == marco)
& (specific_data2[section_2] == categoria)
& (specific_data2[section_3] == idgrupocontrol)
& (specific_data2[section_4] == tipo)
]
findings_counts_tipo = (
specific_data3.groupby([section_4, "STATUS"])
.size()
.unstack(fill_value=0)
)
success_tipo = (
findings_counts_tipo.loc[tipo, pass_emoji]
if pass_emoji in findings_counts_tipo.columns
else 0
)
failed_tipo = (
findings_counts_tipo.loc[tipo, fail_emoji]
if fail_emoji in findings_counts_tipo.columns
else 0
)
# Create the DataTable for each tipo
data_table = dash_table.DataTable(
data=specific_data3.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in [
"CHECKID",
"STATUS",
"REGION",
"ACCOUNTID",
"RESOURCEID",
]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
# Create the graph for req_id
fig_tipo = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_tipo],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_tipo],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_tipo.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(
showticklabels=False, showgrid=False, zeroline=False
),
yaxis=dict(
showticklabels=False, showgrid=False, zeroline=False
),
annotations=[
dict(
x=success_tipo + failed_tipo,
y=0,
xref="x",
yref="y",
text=str(success_tipo),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_tipo),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_tipo.add_annotation(
x=50,
y=0,
text="",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
)
fig_tipo.add_annotation(
x=failed_tipo,
y=0.3,
text="|",
showarrow=False,
align="center",
xanchor="center",
yanchor="middle",
textangle=0,
font=dict(size=20),
)
graph_tipo = dcc.Graph(
figure=fig_tipo,
config={"staticPlot": True},
className="info-bar-child",
)
graph_div_tipo = html.Div(graph_tipo, className="graph-section-req")
internal_accordion_item_3 = dbc.AccordionItem(
title=tipo,
children=[
html.Div([data_table], className="inner-accordion-content")
],
)
internal_section_container_3 = html.Div(
[
graph_div_tipo,
dbc.Accordion(
[internal_accordion_item_3],
start_collapsed=True,
flush=True,
),
],
className="accordion-inner--child",
)
direct_internal_items_tipo.append(internal_section_container_3)
internal_accordion_item_2 = dbc.AccordionItem(
title=idgrupocontrol,
children=direct_internal_items_tipo,
)
internal_section_container_2 = html.Div(
[
graph_div_idgrupocontrol,
dbc.Accordion(
[internal_accordion_item_2],
start_collapsed=True,
flush=True,
),
],
className="accordion-inner--child",
)
direct_internal_items_idgrupocontrol.append(
internal_section_container_2
)
internal_accordion_item = dbc.AccordionItem(
title=categoria,
children=direct_internal_items_idgrupocontrol,
)
internal_section_container = html.Div(
[
graph_div_section,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner--child",
)
direct_internal_items.append(internal_section_container)
accordion_item = dbc.AccordionItem(
title=f"{marco}", children=direct_internal_items
)
section_container = html.Div(
[
graph_div,
dbc.Accordion([accordion_item], start_collapsed=True, flush=True),
],
className="accordion-inner",
)
section_containers.append(section_container)
return html.Div(section_containers, className="compliance-data-layout")
def get_section_containers_3_levels(data, section_1, section_2, section_3):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
findings_counts_marco = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
section_containers = []
data[section_1] = data[section_1].astype(str)
data[section_2] = data[section_2].astype(str)
data[section_3] = data[section_3].astype(str)
data.sort_values(
by=section_3,
key=lambda x: x.map(extract_numeric_values),
ascending=True,
inplace=True,
)
for marco in data[section_1].unique():
success_marco = findings_counts_marco.loc[marco].get(pass_emoji, 0)
failed_marco = findings_counts_marco.loc[marco].get(fail_emoji, 0)
fig_name = go.Figure(
[
go.Bar(
name="Failed",
x=[failed_marco],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_marco],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_name.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_marco + failed_marco,
y=0,
xref="x",
yref="y",
text=str(success_marco),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_marco),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_name.add_annotation(
x=failed_marco,
y=0.3,
text="|",
showarrow=False,
font=dict(size=20),
xanchor="center",
yanchor="middle",
)
graph_div = html.Div(
dcc.Graph(
figure=fig_name, config={"staticPlot": True}, className="info-bar"
),
className="graph-section",
)
direct_internal_items = []
for categoria in data[data[section_1] == marco][section_2].unique():
specific_data = data[
(data[section_1] == marco) & (data[section_2] == categoria)
]
findings_counts_categoria = (
specific_data.groupby([section_2, "STATUS"])
.size()
.unstack(fill_value=0)
)
success_categoria = findings_counts_categoria.loc[categoria].get(
pass_emoji, 0
)
failed_categoria = findings_counts_categoria.loc[categoria].get(
fail_emoji, 0
)
fig_section = go.Figure(
[
go.Bar(
name="Failed",
x=[failed_categoria],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_categoria],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_section.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_categoria + failed_categoria,
y=0,
xref="x",
yref="y",
text=str(success_categoria),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_categoria),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_section.add_annotation(
x=failed_categoria,
y=0.3,
text="|",
showarrow=False,
font=dict(size=20),
xanchor="center",
yanchor="middle",
)
graph_div_section = html.Div(
dcc.Graph(
figure=fig_section,
config={"staticPlot": True},
className="info-bar-child",
),
className="graph-section-req",
)
direct_internal_items_idgrupocontrol = []
for idgrupocontrol in specific_data[section_3].unique():
specific_data2 = specific_data[
specific_data[section_3] == idgrupocontrol
]
findings_counts_idgrupocontrol = (
specific_data2.groupby([section_3, "STATUS"])
.size()
.unstack(fill_value=0)
)
success_idgrupocontrol = findings_counts_idgrupocontrol.loc[
idgrupocontrol
].get(pass_emoji, 0)
failed_idgrupocontrol = findings_counts_idgrupocontrol.loc[
idgrupocontrol
].get(fail_emoji, 0)
fig_idgrupocontrol = go.Figure(
[
go.Bar(
name="Failed",
x=[failed_idgrupocontrol],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_idgrupocontrol],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_idgrupocontrol.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_idgrupocontrol + failed_idgrupocontrol,
y=0,
xref="x",
yref="y",
text=str(success_idgrupocontrol),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_idgrupocontrol),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_idgrupocontrol.add_annotation(
x=failed_idgrupocontrol,
y=0.3,
text="|",
showarrow=False,
font=dict(size=20),
xanchor="center",
yanchor="middle",
)
graph_div_idgrupocontrol = html.Div(
dcc.Graph(
figure=fig_idgrupocontrol,
config={"staticPlot": True},
className="info-bar-child",
),
className="graph-section-req",
)
data_table = dash_table.DataTable(
data=specific_data2.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in [
"CHECKID",
"STATUS",
"REGION",
"ACCOUNTID",
"RESOURCEID",
]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
internal_accordion_item_2 = dbc.AccordionItem(
title=idgrupocontrol,
children=[
graph_div_idgrupocontrol,
html.Div([data_table], className="inner-accordion-content"),
],
)
direct_internal_items_idgrupocontrol.append(
html.Div(
[
graph_div_idgrupocontrol,
dbc.Accordion(
[internal_accordion_item_2],
start_collapsed=True,
flush=True,
),
],
className="accordion-inner--child",
)
)
internal_accordion_item = dbc.AccordionItem(
title=categoria,
children=direct_internal_items_idgrupocontrol,
)
internal_section_container = html.Div(
[
graph_div_section,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner--child",
)
direct_internal_items.append(internal_section_container)
accordion_item = dbc.AccordionItem(title=marco, children=direct_internal_items)
section_container = html.Div(
[
graph_div,
dbc.Accordion([accordion_item], start_collapsed=True, flush=True),
],
className="accordion-inner",
)
section_containers.append(section_container)
return html.Div(section_containers, className="compliance-data-layout")
def get_section_containers_threatscore(data, section_1, section_2, section_3):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
findings_counts_marco = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
section_containers = []
data[section_1] = data[section_1].astype(str)
data[section_2] = data[section_2].astype(str)
data[section_3] = data[section_3].astype(str)
data.sort_values(
by=section_3,
key=lambda x: x.map(extract_numeric_values),
ascending=True,
inplace=True,
)
for marco in data[section_1].unique():
success_marco = findings_counts_marco.loc[marco].get(pass_emoji, 0)
failed_marco = findings_counts_marco.loc[marco].get(fail_emoji, 0)
fig_name = go.Figure(
[
go.Bar(
name="Failed",
x=[failed_marco],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_marco],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_name.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_marco + failed_marco,
y=0,
xref="x",
yref="y",
text=str(success_marco),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_marco),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_name.add_annotation(
x=failed_marco,
y=0.3,
text="|",
showarrow=False,
font=dict(size=20),
xanchor="center",
yanchor="middle",
)
graph_div = html.Div(
dcc.Graph(
figure=fig_name, config={"staticPlot": True}, className="info-bar"
),
className="graph-section",
)
direct_internal_items = []
for categoria in data[data[section_1] == marco][section_2].unique():
specific_data = data[
(data[section_1] == marco) & (data[section_2] == categoria)
]
findings_counts_categoria = (
specific_data.groupby([section_2, "STATUS"])
.size()
.unstack(fill_value=0)
)
success_categoria = findings_counts_categoria.loc[categoria].get(
pass_emoji, 0
)
failed_categoria = findings_counts_categoria.loc[categoria].get(
fail_emoji, 0
)
fig_section = go.Figure(
[
go.Bar(
name="Failed",
x=[failed_categoria],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_categoria],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_section.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_categoria + failed_categoria,
y=0,
xref="x",
yref="y",
text=str(success_categoria),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_categoria),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_section.add_annotation(
x=failed_categoria,
y=0.3,
text="|",
showarrow=False,
font=dict(size=20),
xanchor="center",
yanchor="middle",
)
graph_div_section = html.Div(
dcc.Graph(
figure=fig_section,
config={"staticPlot": True},
className="info-bar-child",
),
className="graph-section-req",
)
direct_internal_items_idgrupocontrol = []
for idgrupocontrol in specific_data[section_3].unique():
specific_data2 = specific_data[
specific_data[section_3] == idgrupocontrol
]
findings_counts_idgrupocontrol = (
specific_data2.groupby([section_3, "STATUS"])
.size()
.unstack(fill_value=0)
)
success_idgrupocontrol = findings_counts_idgrupocontrol.loc[
idgrupocontrol
].get(pass_emoji, 0)
failed_idgrupocontrol = findings_counts_idgrupocontrol.loc[
idgrupocontrol
].get(fail_emoji, 0)
fig_idgrupocontrol = go.Figure(
[
go.Bar(
name="Failed",
x=[failed_idgrupocontrol],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_idgrupocontrol],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_idgrupocontrol.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_idgrupocontrol + failed_idgrupocontrol,
y=0,
xref="x",
yref="y",
text=str(success_idgrupocontrol),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_idgrupocontrol),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
fig_idgrupocontrol.add_annotation(
x=failed_idgrupocontrol,
y=0.3,
text="|",
showarrow=False,
font=dict(size=20),
xanchor="center",
yanchor="middle",
)
graph_div_idgrupocontrol = html.Div(
dcc.Graph(
figure=fig_idgrupocontrol,
config={"staticPlot": True},
className="info-bar-child",
),
className="graph-section-req",
)
data_table = dash_table.DataTable(
data=specific_data2.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in [
"CHECKID",
"STATUS",
"REGION",
"ACCOUNTID",
"RESOURCEID",
]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
title_internal = f"{idgrupocontrol} - {specific_data2['REQUIREMENTS_DESCRIPTION'].iloc[0]}"
# Cut the title if it's too long
title_internal = (
title_internal[:130] + " ..."
if len(title_internal) > 130
else title_internal
)
internal_accordion_item_2 = dbc.AccordionItem(
title=title_internal,
children=[
graph_div_idgrupocontrol,
html.Div([data_table], className="inner-accordion-content"),
],
)
direct_internal_items_idgrupocontrol.append(
html.Div(
[
graph_div_idgrupocontrol,
dbc.Accordion(
[internal_accordion_item_2],
start_collapsed=True,
flush=True,
),
],
className="accordion-inner--child",
)
)
internal_accordion_item = dbc.AccordionItem(
title=categoria,
children=direct_internal_items_idgrupocontrol,
)
internal_section_container = html.Div(
[
graph_div_section,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner--child",
)
direct_internal_items.append(internal_section_container)
accordion_item = dbc.AccordionItem(title=marco, children=direct_internal_items)
section_container = html.Div(
[
graph_div,
dbc.Accordion([accordion_item], start_collapsed=True, flush=True),
],
className="accordion-inner",
)
section_containers.append(section_container)
return html.Div(section_containers, className="compliance-data-layout")
# This function extracts and compares up to two numeric values, ensuring correct sorting for version-like strings.
def extract_numeric_values(value):
numbers = re.findall(r"\d+", str(value))
if len(numbers) == 3:
return int(numbers[0]), int(numbers[1]), int(numbers[2])
elif len(numbers) == 2:
return int(numbers[0]), int(numbers[1])
elif len(numbers) == 1:
return int(numbers[0])
return 0, 0
def get_section_containers_kisa_ismsp(data, section_1, section_2):
data["STATUS"] = data["STATUS"].apply(map_status_to_icon)
data[section_1] = data[section_1].astype(str)
data[section_2] = data[section_2].astype(str)
data.sort_values(
by=section_1,
key=lambda x: x.map(extract_numeric_values),
ascending=True,
inplace=True,
)
findings_counts_section = (
data.groupby([section_2, "STATUS"]).size().unstack(fill_value=0)
)
findings_counts_name = (
data.groupby([section_1, "STATUS"]).size().unstack(fill_value=0)
)
section_containers = []
for name in data[section_1].unique():
success_name = (
findings_counts_name.loc[name, pass_emoji]
if pass_emoji in findings_counts_name.columns
else 0
)
failed_name = (
findings_counts_name.loc[name, fail_emoji]
if fail_emoji in findings_counts_name.columns
else 0
)
fig_name = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_name],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
width=[0.8],
),
go.Bar(
name="Success",
x=[success_name],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
width=[0.8],
),
]
)
fig_name.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_name + failed_name,
y=0,
xref="x",
yref="y",
text=str(success_name),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_name),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
graph_name = dcc.Graph(
figure=fig_name, config={"staticPlot": True}, className="info-bar"
)
graph_div = html.Div(graph_name, className="graph-section")
direct_internal_items = []
for section in data[data[section_1] == name][section_2].unique():
specific_data = data[
(data[section_1] == name) & (data[section_2] == section)
]
success_section = (
findings_counts_section.loc[section, pass_emoji]
if pass_emoji in findings_counts_section.columns
else 0
)
failed_section = (
findings_counts_section.loc[section, fail_emoji]
if fail_emoji in findings_counts_section.columns
else 0
)
data_table = dash_table.DataTable(
data=specific_data.to_dict("records"),
columns=[
{"name": i, "id": i}
for i in ["CHECKID", "STATUS", "REGION", "ACCOUNTID", "RESOURCEID"]
],
style_table={"overflowX": "auto"},
style_as_list_view=True,
style_cell={"textAlign": "left", "padding": "5px"},
)
fig_section = go.Figure(
data=[
go.Bar(
name="Failed",
x=[failed_section],
y=[""],
orientation="h",
marker=dict(color="#e77676"),
),
go.Bar(
name="Success",
x=[success_section],
y=[""],
orientation="h",
marker=dict(color="#45cc6e"),
),
]
)
fig_section.update_layout(
barmode="stack",
margin=dict(l=10, r=10, t=10, b=10),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
showlegend=False,
width=350,
height=30,
xaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
annotations=[
dict(
x=success_section + failed_section,
y=0,
xref="x",
yref="y",
text=str(success_section),
showarrow=False,
font=dict(color="#45cc6e", size=14),
xanchor="left",
yanchor="middle",
),
dict(
x=0,
y=0,
xref="x",
yref="y",
text=str(failed_section),
showarrow=False,
font=dict(color="#e77676", size=14),
xanchor="right",
yanchor="middle",
),
],
)
graph_section = dcc.Graph(
figure=fig_section,
config={"staticPlot": True},
className="info-bar-child",
)
graph_div_section = html.Div(graph_section, className="graph-section-req")
internal_accordion_item = dbc.AccordionItem(
title=section,
children=[html.Div([data_table], className="inner-accordion-content")],
)
internal_section_container = html.Div(
[
graph_div_section,
dbc.Accordion(
[internal_accordion_item], start_collapsed=True, flush=True
),
],
className="accordion-inner--child",
)
direct_internal_items.append(internal_section_container)
accordion_item = dbc.AccordionItem(
title=f"{name}", children=direct_internal_items
)
section_container = html.Div(
[
graph_div,
dbc.Accordion([accordion_item], start_collapsed=True, flush=True),
],
className="accordion-inner",
)
section_containers.append(section_container)
return html.Div(section_containers, className="compliance-data-layout")