Skip to content

Commit a020fd4

Browse files
committed
Fixed import, added some missing fields parsing. Fixed available_geography for the Signal model.
1 parent 2a83b16 commit a020fd4

15 files changed

+316
-60
lines changed

src/base/admin.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
DescriptedFilter,
77
DescriptedFilterField,
88
Link,
9+
License
910
)
1011

1112

@@ -27,3 +28,12 @@ class LinkAdmin(admin.ModelAdmin):
2728
Admin interface for managing link objects.
2829
"""
2930
list_display: tuple[Literal['url'], Literal['link_type']] = ('url', 'link_type')
31+
32+
33+
@admin.register(License)
34+
class GeographyAdmin(admin.ModelAdmin):
35+
"""
36+
Admin interface for managing license objects.
37+
"""
38+
list_display: tuple[Literal['name'], Literal['use_restrictions']] = ('name', 'use_restrictions')
39+
search_fields: tuple[Literal['name']] = ('name',)

src/base/migrations/0004_license.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 4.2.10 on 2024-06-07 12:15
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('base', '0003_descriptedfilter_alter_link_link_type_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.CreateModel(
14+
name='License',
15+
fields=[
16+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
17+
('name', models.CharField(help_text='License', max_length=256, unique=True)),
18+
('use_restrictions', models.TextField(blank=True, help_text='Use Restrictions', null=True)),
19+
],
20+
),
21+
]

src/base/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,20 @@ def get_preview(self) -> LinkPreview:
123123
return {
124124
'description': _('No description available'),
125125
}
126+
127+
128+
class License(models.Model):
129+
"""
130+
A model representing a License.
131+
"""
132+
name: models.CharField = models.CharField(help_text=_('License'), max_length=256, unique=True)
133+
use_restrictions: models.TextField = models.TextField(help_text=_('Use Restrictions'), blank=True, null=True)
134+
135+
def __str__(self) -> str:
136+
"""
137+
Returns the name of the license as a string.
138+
139+
:return: The name of the license as a string.
140+
:rtype: str
141+
"""
142+
return self.name
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 4.2.10 on 2024-06-07 12:15
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('base', '0004_license'),
11+
('datasources', '0005_sourcesubdivision_external_name'),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name='datasource',
17+
name='source_license',
18+
field=models.ForeignKey(help_text='License', on_delete=django.db.models.deletion.PROTECT, related_name='source_license', to='base.license'),
19+
),
20+
]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 4.2.10 on 2024-06-07 12:47
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('base', '0004_license'),
11+
('datasources', '0006_alter_datasource_source_license'),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name='datasource',
17+
name='source_license',
18+
field=models.ForeignKey(help_text='License', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='data_sources', to='base.license'),
19+
),
20+
]

src/datasources/models.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,15 @@ class DataSource(TimeStampedModel):
7878
null=True,
7979
blank=True
8080
)
81-
source_license: models.CharField = models.CharField(
81+
82+
source_license: models.ForeignKey = models.ForeignKey(
83+
'base.License',
84+
related_name='data_sources',
8285
help_text=_('License'),
83-
max_length=128
86+
on_delete=models.PROTECT,
87+
null=True
8488
)
89+
8590
links: models.ManyToManyField = models.ManyToManyField(
8691
'base.Link',
8792
help_text=_('DataSource links'),

src/datasources/resources.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from import_export import resources
66
from import_export.fields import Field, widgets
77

8-
from base.models import Link, LinkTypeChoices
8+
from base.models import Link, LinkTypeChoices, License
99
from datasources.models import DataSource, SourceSubdivision
1010

1111

@@ -40,6 +40,7 @@ def before_import_row(self, row, **kwargs) -> None:
4040
any additional links specified in 'DUA' or 'Link' columns.
4141
"""
4242
self.process_links(row)
43+
self.process_licenses(row)
4344
self.process_datasource(row)
4445

4546
def process_links(self, row) -> None:
@@ -58,6 +59,13 @@ def process_links(self, row) -> None:
5859
link, created = Link.objects.get_or_create(url=link_url, link_type=link_type)
5960
row['Links'] += row['Links'] + f'|{link.url}'
6061

62+
def process_licenses(self, row) -> None:
63+
if row['License']:
64+
license: License
65+
created: bool
66+
license, created = License.objects.get_or_create(name=row['License'])
67+
row['License'] = license
68+
6169
def process_datasource(self, row) -> None:
6270
if row['Name']:
6371
data_source: DataSource
@@ -71,4 +79,6 @@ def process_datasource(self, row) -> None:
7179
}
7280
)
7381
links: QuerySet[Link] = Link.objects.filter(url__in=row['Links'].split('|')).values_list('id', flat=True)
82+
license: License = License.objects.filter(name=row['License']).first()
7483
data_source.links.add(*links)
84+
data_source.source_license = license

src/signals/admin.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
Signal,
1212
SignalCategory,
1313
SignalType,
14+
GeographySignal,
1415
)
1516
from signals.resources import SignalBaseResource, SignalResource
1617

@@ -42,6 +43,15 @@ class GeographyAdmin(admin.ModelAdmin):
4243
search_fields: tuple[Literal['name']] = ('name',)
4344

4445

46+
@admin.register(GeographySignal)
47+
class GeographySignalAdmin(admin.ModelAdmin):
48+
"""
49+
Admin interface for managing signal geography objects.
50+
"""
51+
list_display: tuple[Literal['geography']] = ('geography', 'signal', 'aggregated_by_delphi')
52+
search_fields: tuple[Literal['geography']] = ('geography', 'signal', 'aggregated_by_delphi')
53+
54+
4555
@admin.register(Pathogen)
4656
class PathogenAdmin(admin.ModelAdmin):
4757
"""
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Generated by Django 4.2.10 on 2024-06-07 12:47
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('base', '0004_license'),
11+
('signals', '0011_alter_geographysignal_geography_and_more'),
12+
]
13+
14+
operations = [
15+
migrations.RemoveField(
16+
model_name='signal',
17+
name='licence',
18+
),
19+
migrations.AddField(
20+
model_name='signal',
21+
name='license',
22+
field=models.ForeignKey(help_text='License', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='signals', to='base.license'),
23+
),
24+
migrations.DeleteModel(
25+
name='Licence',
26+
),
27+
]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 4.2.10 on 2024-06-07 14:14
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('signals', '0012_remove_signal_licence_signal_license_delete_licence'),
11+
]
12+
13+
operations = [
14+
migrations.RemoveField(
15+
model_name='signal',
16+
name='signal_type',
17+
),
18+
migrations.AddField(
19+
model_name='signal',
20+
name='signal_type',
21+
field=models.ForeignKey(help_text='Source Type', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='signals', to='signals.signaltype'),
22+
),
23+
]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 4.2.10 on 2024-06-07 15:16
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('signals', '0013_remove_signal_signal_type_signal_signal_type'),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name='signal',
15+
name='from_date',
16+
),
17+
migrations.RemoveField(
18+
model_name='signal',
19+
name='to_date',
20+
),
21+
]
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 4.2.10 on 2024-06-07 15:42
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('signals', '0014_remove_signal_from_date_remove_signal_to_date'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='signal',
15+
name='from_date',
16+
field=models.DateField(blank=True, help_text='From Date', null=True),
17+
),
18+
migrations.AddField(
19+
model_name='signal',
20+
name='to_date',
21+
field=models.DateField(blank=True, help_text='To Date', null=True),
22+
),
23+
migrations.AlterField(
24+
model_name='signal',
25+
name='temporal_scope_end',
26+
field=models.CharField(blank=True, help_text='Temporal Scope End', max_length=128, null=True),
27+
),
28+
migrations.AlterField(
29+
model_name='signal',
30+
name='temporal_scope_start',
31+
field=models.CharField(blank=True, help_text='Temporal Scope Start', max_length=128, null=True),
32+
),
33+
]

src/signals/models.py

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -264,26 +264,6 @@ class Organisation(TimeStampedModel):
264264
)
265265

266266

267-
class Licence(TimeStampedModel):
268-
"""
269-
A model representing a licence.
270-
"""
271-
name: models.CharField = models.CharField(
272-
help_text=_('Name'),
273-
max_length=128,
274-
unique=True
275-
)
276-
277-
def __str__(self) -> str:
278-
"""
279-
Returns the name of the licence as a string.
280-
281-
:return: The name of the licence as a string.
282-
:rtype: str
283-
"""
284-
return str(self.name)
285-
286-
287267
class Signal(TimeStampedModel):
288268
"""
289269
A model representing a signal.
@@ -309,10 +289,12 @@ class Signal(TimeStampedModel):
309289
related_name='signals',
310290
help_text=_('Pathogen/Disease Area'),
311291
)
312-
signal_type: models.ManyToManyField = models.ManyToManyField(
313-
'signals.SignalType',
292+
signal_type: models.ForeignKey = models.ForeignKey(
293+
'signals.signalType',
314294
related_name='signals',
315-
help_text=_('Signal Type')
295+
help_text=_('Source Type'),
296+
on_delete=models.PROTECT,
297+
null=True
316298
)
317299
active: models.BooleanField = models.BooleanField(
318300
help_text=_('Active'),
@@ -482,10 +464,12 @@ class Signal(TimeStampedModel):
482464
related_name='shared_signals'
483465
)
484466

485-
licence: models.ManyToManyField = models.ManyToManyField(
486-
'signals.Licence',
487-
help_text=_('Licence'),
488-
related_name='signals'
467+
license: models.ForeignKey = models.ForeignKey(
468+
'base.License',
469+
related_name='signals',
470+
help_text=_('License'),
471+
on_delete=models.PROTECT,
472+
null=True
489473
)
490474

491475
restrictions: models.TextField = models.TextField(
@@ -510,6 +494,19 @@ class Signal(TimeStampedModel):
510494
blank=True
511495
)
512496

497+
temporal_scope_start: models.CharField = models.CharField(
498+
help_text=_('Temporal Scope Start'),
499+
null=True,
500+
blank=True,
501+
max_length=128
502+
)
503+
temporal_scope_end: models.CharField = models.CharField(
504+
help_text=_('Temporal Scope End'),
505+
null=True,
506+
blank=True,
507+
max_length=128
508+
)
509+
513510
@property
514511
def is_access_public(self) -> bool:
515512
"""

0 commit comments

Comments
 (0)