Skip to content

Commit 1f51f4b

Browse files
committed
Addmodels for Overview and Data Quality Panel along with migration script
Signed-off-by: Sampurna Pyne <sampurnapyne1710@gmail.com>
1 parent b6448af commit 1f51f4b

2 files changed

Lines changed: 215 additions & 0 deletions

File tree

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# Generated by Django 5.2.11 on 2026-08-08 22:59
2+
3+
import django.contrib.postgres.fields
4+
import django.db.models.deletion
5+
from django.db import migrations
6+
from django.db import models
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
("insights", "0001_initial"),
13+
]
14+
15+
operations = [
16+
migrations.CreateModel(
17+
name="OverviewInsight",
18+
fields=[
19+
(
20+
"id",
21+
models.AutoField(
22+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
23+
),
24+
),
25+
("total_advisories", models.IntegerField(default=0)),
26+
("total_packages", models.IntegerField(default=0)),
27+
("total_data_sources", models.IntegerField(default=0)),
28+
(
29+
"last_30days",
30+
django.contrib.postgres.fields.ArrayField(
31+
base_field=models.IntegerField(), default=list, size=None
32+
),
33+
),
34+
(
35+
"snapshot",
36+
models.OneToOneField(
37+
on_delete=django.db.models.deletion.CASCADE,
38+
related_name="overview",
39+
to="insights.dailysnapshot",
40+
),
41+
),
42+
],
43+
),
44+
migrations.CreateModel(
45+
name="OverviewCoverageInsight",
46+
fields=[
47+
(
48+
"id",
49+
models.AutoField(
50+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
51+
),
52+
),
53+
("source_name", models.CharField(max_length=100)),
54+
("count", models.IntegerField()),
55+
(
56+
"overview",
57+
models.ForeignKey(
58+
on_delete=django.db.models.deletion.CASCADE,
59+
related_name="coverage_insights",
60+
to="insights.overviewinsight",
61+
),
62+
),
63+
],
64+
),
65+
migrations.CreateModel(
66+
name="OverviewYearlyInsight",
67+
fields=[
68+
(
69+
"id",
70+
models.AutoField(
71+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
72+
),
73+
),
74+
("year", models.IntegerField()),
75+
("count", models.IntegerField()),
76+
(
77+
"overview",
78+
models.ForeignKey(
79+
on_delete=django.db.models.deletion.CASCADE,
80+
related_name="yearly_insights",
81+
to="insights.overviewinsight",
82+
),
83+
),
84+
],
85+
),
86+
migrations.CreateModel(
87+
name="DataQualityIssueByDatasourceInsight",
88+
fields=[
89+
(
90+
"id",
91+
models.AutoField(
92+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
93+
),
94+
),
95+
("issue_type", models.CharField(max_length=50)),
96+
("datasource_id", models.CharField(max_length=100)),
97+
("count", models.IntegerField(default=0)),
98+
(
99+
"snapshot",
100+
models.ForeignKey(
101+
on_delete=django.db.models.deletion.CASCADE,
102+
related_name="data_quality_issue_types",
103+
to="insights.dailysnapshot",
104+
),
105+
),
106+
],
107+
options={
108+
"constraints": [
109+
models.UniqueConstraint(
110+
fields=("snapshot", "issue_type", "datasource_id"),
111+
name="unique_snapshot_issue_type_datasource",
112+
)
113+
],
114+
},
115+
),
116+
migrations.CreateModel(
117+
name="DataQualityToDosResolutionInsight",
118+
fields=[
119+
(
120+
"id",
121+
models.AutoField(
122+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
123+
),
124+
),
125+
("datasource_id", models.CharField(max_length=100)),
126+
(
127+
"month",
128+
models.DateField(help_text="The first day of the month for this data point."),
129+
),
130+
("open_count", models.IntegerField(default=0)),
131+
("resolved_count", models.IntegerField(default=0)),
132+
(
133+
"snapshot",
134+
models.ForeignKey(
135+
on_delete=django.db.models.deletion.CASCADE,
136+
related_name="data_quality_todos_resolutions",
137+
to="insights.dailysnapshot",
138+
),
139+
),
140+
],
141+
options={
142+
"constraints": [
143+
models.UniqueConstraint(
144+
fields=("snapshot", "datasource_id", "month"),
145+
name="unique_snapshot_todos_resolution_datasource_month",
146+
)
147+
],
148+
},
149+
),
150+
]

insights/models.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,36 @@ class Meta:
2424
ordering = ["-created_at"]
2525

2626

27+
class OverviewInsight(models.Model):
28+
snapshot = models.OneToOneField(
29+
"DailySnapshot", related_name="overview", on_delete=models.CASCADE
30+
)
31+
32+
total_advisories = models.IntegerField(default=0)
33+
total_packages = models.IntegerField(default=0)
34+
total_data_sources = models.IntegerField(default=0)
35+
last_30days = ArrayField(
36+
models.IntegerField(),
37+
default=list,
38+
)
39+
40+
41+
class OverviewYearlyInsight(models.Model):
42+
overview = models.ForeignKey(
43+
OverviewInsight, related_name="yearly_insights", on_delete=models.CASCADE
44+
)
45+
year = models.IntegerField()
46+
count = models.IntegerField()
47+
48+
49+
class OverviewCoverageInsight(models.Model):
50+
overview = models.ForeignKey(
51+
OverviewInsight, related_name="coverage_insights", on_delete=models.CASCADE
52+
)
53+
source_name = models.CharField(max_length=100)
54+
count = models.IntegerField()
55+
56+
2757
class PackageInsight(models.Model):
2858
snapshot = models.ForeignKey(
2959
DailySnapshot, related_name="package_insights", on_delete=models.CASCADE
@@ -95,6 +125,41 @@ class Meta:
95125
]
96126

97127

128+
class DataQualityIssueByDatasourceInsight(models.Model):
129+
snapshot = models.ForeignKey(
130+
DailySnapshot, related_name="data_quality_issue_types", on_delete=models.CASCADE
131+
)
132+
issue_type = models.CharField(max_length=50)
133+
datasource_id = models.CharField(max_length=100)
134+
count = models.IntegerField(default=0)
135+
136+
class Meta:
137+
constraints = [
138+
models.UniqueConstraint(
139+
fields=["snapshot", "issue_type", "datasource_id"],
140+
name="unique_snapshot_issue_type_datasource",
141+
)
142+
]
143+
144+
145+
class DataQualityToDosResolutionInsight(models.Model):
146+
snapshot = models.ForeignKey(
147+
DailySnapshot, related_name="data_quality_todos_resolutions", on_delete=models.CASCADE
148+
)
149+
datasource_id = models.CharField(max_length=100)
150+
month = models.DateField(help_text="The first day of the month for this data point.")
151+
open_count = models.IntegerField(default=0)
152+
resolved_count = models.IntegerField(default=0)
153+
154+
class Meta:
155+
constraints = [
156+
models.UniqueConstraint(
157+
fields=["snapshot", "datasource_id", "month"],
158+
name="unique_snapshot_todos_resolution_datasource_month",
159+
)
160+
]
161+
162+
98163
@dataclass(frozen=True)
99164
class ChartDefinition:
100165
id: str

0 commit comments

Comments
 (0)