Skip to content

Commit 41642d8

Browse files
Datamodel visualizer (#2600)
* fix abuseipdb * added datamodel visualizer * update datamodel visualizer * Fix datamodel creation * Updates visualizer * Updates visualizer * Updates data model visualizer * Updates data model visualizer * Added pdns table to data model visualizer * Fix pdns table to data model visualizer * Added signature table to data model visualizer * Updates signature table * Updates pdns table * Fix signature table * Fix level size * Fix visualizer * added _mokeypatch * added migration * fix signature table * fixes deepsource * fix
1 parent 8f2d56e commit 41642d8

File tree

3 files changed

+549
-0
lines changed

3 files changed

+549
-0
lines changed

api_app/visualizers_manager/classes.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,3 +548,10 @@ def pivots_reports(self) -> QuerySet:
548548
from api_app.pivots_manager.models import PivotReport
549549

550550
return PivotReport.objects.filter(job=self._job)
551+
552+
def data_models(self) -> QuerySet:
553+
from api_app.analyzers_manager.models import AnalyzerReport
554+
555+
data_model_class = AnalyzerReport.get_data_model_class(self._job)
556+
analyzer_reports_pk = [report.pk for report in self.analyzer_reports()]
557+
return data_model_class.objects.filter(analyzers_report__in=analyzer_reports_pk)
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
from django.db import migrations
2+
from django.db.models.fields.related_descriptors import (
3+
ForwardManyToOneDescriptor,
4+
ForwardOneToOneDescriptor,
5+
ManyToManyDescriptor,
6+
ReverseManyToOneDescriptor,
7+
ReverseOneToOneDescriptor,
8+
)
9+
10+
plugin = {
11+
"python_module": {
12+
"health_check_schedule": None,
13+
"update_schedule": None,
14+
"module": "data_model.DataModel",
15+
"base_path": "api_app.visualizers_manager.visualizers",
16+
},
17+
"playbooks": ["FREE_TO_USE_ANALYZERS"],
18+
"name": "Data_Model",
19+
"description": "Visualizer for Data Models",
20+
"disabled": False,
21+
"soft_time_limit": 60,
22+
"routing_key": "default",
23+
"health_check_status": True,
24+
"model": "visualizers_manager.VisualizerConfig",
25+
}
26+
27+
params = []
28+
29+
values = []
30+
31+
32+
def _get_real_obj(Model, field, value):
33+
def _get_obj(Model, other_model, value):
34+
if isinstance(value, dict):
35+
real_vals = {}
36+
for key, real_val in value.items():
37+
real_vals[key] = _get_real_obj(other_model, key, real_val)
38+
value = other_model.objects.get_or_create(**real_vals)[0]
39+
# it is just the primary key serialized
40+
else:
41+
if isinstance(value, int):
42+
if Model.__name__ == "PluginConfig":
43+
value = other_model.objects.get(name=plugin["name"])
44+
else:
45+
value = other_model.objects.get(pk=value)
46+
else:
47+
value = other_model.objects.get(name=value)
48+
return value
49+
50+
if (
51+
type(getattr(Model, field))
52+
in [
53+
ForwardManyToOneDescriptor,
54+
ReverseManyToOneDescriptor,
55+
ReverseOneToOneDescriptor,
56+
ForwardOneToOneDescriptor,
57+
]
58+
and value
59+
):
60+
other_model = getattr(Model, field).get_queryset().model
61+
value = _get_obj(Model, other_model, value)
62+
elif type(getattr(Model, field)) in [ManyToManyDescriptor] and value:
63+
other_model = getattr(Model, field).rel.model
64+
value = [_get_obj(Model, other_model, val) for val in value]
65+
return value
66+
67+
68+
def _create_object(Model, data):
69+
mtm, no_mtm = {}, {}
70+
for field, value in data.items():
71+
value = _get_real_obj(Model, field, value)
72+
if type(getattr(Model, field)) is ManyToManyDescriptor:
73+
mtm[field] = value
74+
else:
75+
no_mtm[field] = value
76+
try:
77+
o = Model.objects.get(**no_mtm)
78+
except Model.DoesNotExist:
79+
o = Model(**no_mtm)
80+
o.full_clean()
81+
o.save()
82+
for field, value in mtm.items():
83+
attribute = getattr(o, field)
84+
if value is not None:
85+
attribute.set(value)
86+
return False
87+
return True
88+
89+
90+
def migrate(apps, schema_editor):
91+
Parameter = apps.get_model("api_app", "Parameter")
92+
PluginConfig = apps.get_model("api_app", "PluginConfig")
93+
python_path = plugin.pop("model")
94+
Model = apps.get_model(*python_path.split("."))
95+
if not Model.objects.filter(name=plugin["name"]).exists():
96+
exists = _create_object(Model, plugin)
97+
if not exists:
98+
for param in params:
99+
_create_object(Parameter, param)
100+
for value in values:
101+
_create_object(PluginConfig, value)
102+
103+
104+
def reverse_migrate(apps, schema_editor):
105+
python_path = plugin.pop("model")
106+
Model = apps.get_model(*python_path.split("."))
107+
Model.objects.get(name=plugin["name"]).delete()
108+
109+
110+
class Migration(migrations.Migration):
111+
atomic = False
112+
dependencies = [
113+
("api_app", "0064_vt_sample_download"),
114+
("visualizers_manager", "0039_sample_download"),
115+
]
116+
117+
operations = [migrations.RunPython(migrate, reverse_migrate)]

0 commit comments

Comments
 (0)