Skip to content

Commit b001d04

Browse files
authored
Merge pull request #1103 from NASA-IMPACT/1093-write-tests-for-two-column-tags-functionality
Refactor Two Column to work with Delta Urls
2 parents 1308ebc + 547401c commit b001d04

15 files changed

+1575
-18
lines changed

sde_collections/admin.py

Lines changed: 97 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import csv
22

3+
from django import forms
34
from django.contrib import admin, messages
45
from django.http import HttpResponse
56

@@ -11,6 +12,7 @@
1112

1213
from .models.candidate_url import CandidateURL, ResolvedTitle
1314
from .models.collection import Collection, WorkflowHistory
15+
from .models.collection_choice_fields import TDAMMTags
1416
from .models.delta_url import CuratedUrl, DeltaUrl, DumpUrl
1517
from .models.pattern import DivisionPattern, IncludePattern, TitlePattern
1618
from .tasks import fetch_and_replace_full_text, import_candidate_urls_from_api
@@ -249,6 +251,7 @@ class CollectionAdmin(admin.ModelAdmin, ExportCsvMixin, UpdateConfigMixin):
249251
"new_collection",
250252
"is_multi_division",
251253
)
254+
252255
readonly_fields = ("config_folder",)
253256
list_filter = ("division", "curation_status", "workflow_status", "turned_on", "is_multi_division")
254257
search_fields = ("name", "url", "config_folder")
@@ -282,11 +285,90 @@ def exclude_and_delete_children(modeladmin, request, queryset):
282285
candidate_url.get_children().delete()
283286

284287

285-
class CandidateURLAdmin(admin.ModelAdmin):
286-
"""Admin View for CandidateURL"""
288+
class TDAMMFormMixin(forms.ModelForm):
289+
"""Mixin for forms that need TDAMM tag fields"""
290+
291+
tdamm_tag_manual = forms.MultipleChoiceField(
292+
choices=TDAMMTags.choices,
293+
required=False,
294+
label="TDAMM Manual Tags",
295+
widget=forms.CheckboxSelectMultiple,
296+
)
297+
298+
tdamm_tag_ml = forms.MultipleChoiceField(
299+
choices=TDAMMTags.choices,
300+
required=False,
301+
label="TDAMM ML Tags",
302+
widget=forms.CheckboxSelectMultiple,
303+
)
287304

288-
list_display = ("url", "scraped_title", "collection")
289-
list_filter = ("collection",)
305+
306+
class TDAMMAdminMixin:
307+
"""Mixin for admin classes that handle TDAMM tags"""
308+
309+
list_display = ("url", "scraped_title", "generated_title", "collection")
310+
list_filter = ["collection"]
311+
search_fields = ("url", "collection__name")
312+
313+
def get_fieldsets(self, request, obj=None):
314+
fieldsets = [
315+
(
316+
"Overall Information",
317+
{
318+
"fields": (
319+
"collection",
320+
"url",
321+
"scraped_title",
322+
"scraped_text",
323+
"generated_title",
324+
"visited",
325+
"document_type",
326+
"division",
327+
)
328+
},
329+
),
330+
(
331+
"TDAMM Tags",
332+
{
333+
"fields": (
334+
"tdamm_tag_ml",
335+
"tdamm_tag_manual",
336+
),
337+
"classes": ("collapse",),
338+
},
339+
),
340+
]
341+
return fieldsets
342+
343+
344+
class CandidateURLForm(TDAMMFormMixin):
345+
class Meta:
346+
model = CandidateURL
347+
fields = "__all__"
348+
349+
350+
class DumpURLForm(TDAMMFormMixin, forms.ModelForm):
351+
class Meta:
352+
model = DumpUrl
353+
fields = "__all__"
354+
355+
356+
class DeltaURLForm(TDAMMFormMixin, forms.ModelForm):
357+
class Meta:
358+
model = DeltaUrl
359+
fields = "__all__"
360+
361+
362+
class CuratedURLForm(TDAMMFormMixin, forms.ModelForm):
363+
class Meta:
364+
model = CuratedUrl
365+
fields = "__all__"
366+
367+
368+
class CandidateURLAdmin(TDAMMAdminMixin, admin.ModelAdmin):
369+
"""Admin view for CandidateURL"""
370+
371+
form = CandidateURLForm
290372

291373

292374
class TitlePatternAdmin(admin.ModelAdmin):
@@ -344,25 +426,27 @@ class DeltaDivisionPatternAdmin(admin.ModelAdmin):
344426
search_fields = ("match_pattern", "division")
345427

346428

347-
class DumpUrlAdmin(admin.ModelAdmin):
429+
class DumpUrlAdmin(TDAMMAdminMixin, admin.ModelAdmin):
348430
"""Admin View for DumpUrl"""
349431

350-
list_display = ("url", "scraped_title", "collection")
351-
list_filter = ("collection",)
432+
form = DumpURLForm
352433

353434

354-
class DeltaUrlAdmin(admin.ModelAdmin):
435+
class DeltaUrlAdmin(TDAMMAdminMixin, admin.ModelAdmin):
355436
"""Admin View for DeltaUrl"""
356437

357-
list_display = ("url", "scraped_title", "generated_title", "collection")
358-
list_filter = ("collection",)
438+
form = DeltaURLForm
359439

440+
def get_fieldsets(self, request, obj=None):
441+
fieldsets = super().get_fieldsets(request, obj)
442+
fieldsets[0][1]["fields"] += ("to_delete",)
443+
return fieldsets
360444

361-
class CuratedUrlAdmin(admin.ModelAdmin):
445+
446+
class CuratedUrlAdmin(TDAMMAdminMixin, admin.ModelAdmin):
362447
"""Admin View for CuratedUrl"""
363448

364-
list_display = ("url", "scraped_title", "generated_title", "collection")
365-
list_filter = ("collection",)
449+
form = CuratedURLForm
366450

367451

368452
admin.site.register(WorkflowHistory, WorkflowHistoryAdmin)
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Generated by Django 4.2.9 on 2024-11-20 06:39
2+
3+
import django.contrib.postgres.fields
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("sde_collections", "0058_candidateurl_division_collection_is_multi_division_and_more"),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name="candidateurl",
16+
name="tdamm_tag_manual",
17+
field=django.contrib.postgres.fields.ArrayField(
18+
base_field=models.CharField(
19+
choices=[
20+
("MMA_M_EM", "Messenger - EM Radiation"),
21+
("MMA_M_EM_G", "Messenger - EM Radiation - Gamma rays"),
22+
("MMA_M_EM_X", "Messenger - EM Radiation - X-rays"),
23+
("MMA_M_EM_U", "Messenger - EM Radiation - Ultraviolet"),
24+
("MMA_M_EM_O", "Messenger - EM Radiation - Optical"),
25+
("MMA_M_EM_I", "Messenger - EM Radiation - Infrared"),
26+
("MMA_M_EM_M", "Messenger - EM Radiation - Microwave"),
27+
("MMA_M_EM_R", "Messenger - EM Radiation - Radio"),
28+
("MMA_M_G", "Messenger - Gravitational Waves"),
29+
("MMA_M_G_CBI", "Messenger - Gravitational Waves - Compact Binary Inspiral"),
30+
("MMA_M_G_S", "Messenger - Gravitational Waves - Stochastic"),
31+
("MMA_M_G_CON", "Messenger - Gravitational Waves - Continuous"),
32+
("MMA_M_G_B", "Messenger - Gravitational Waves - Burst"),
33+
("MMA_M_C", "Messenger - Cosmic Rays"),
34+
("MMA_M_N", "Messenger - Neutrinos"),
35+
("MMA_O_BI", "Objects - Binaries"),
36+
("MMA_O_BI_BBH", "Objects - Binaries - Binary Black Holes"),
37+
("MMA_O_BI_BNS", "Objects - Binaries - Binary Neutron Stars"),
38+
("MMA_O_BI_C", "Objects - Binaries - Cataclysmic Variables"),
39+
("MMA_O_BI_N", "Objects - Binaries - Neutron Star-Black Hole"),
40+
("MMA_O_BI_B", "Objects - Binaries - Binary Pulsars"),
41+
("MMA_O_BI_W", "Objects - Binaries - White Dwarf Binaries"),
42+
("MMA_O_BH", "Objects - Black Holes"),
43+
("MMA_O_BH_AGN", "Objects - Black Holes - Active Galactic Nuclei"),
44+
("MMA_O_BH_IM", "Objects - Black Holes - Intermediate mass"),
45+
("MMA_O_BH_STM", "Objects - Black Holes - Stellar mass"),
46+
("MMA_O_BH_SUM", "Objects - Black Holes - Supermassive"),
47+
("MMA_O_E", "Objects - Exoplanets"),
48+
("MMA_O_N", "Objects - Neutron Stars"),
49+
("MMA_O_N_M", "Objects - Neutron Stars - Magnetars"),
50+
("MMA_O_N_P", "Objects - Neutron Stars - Pulsars"),
51+
("MMA_O_N_PWN", "Objects - Neutron Stars - Pulsar Wind Nebula"),
52+
("MMA_O_S", "Objects - Supernova Remnants"),
53+
("MMA_S_F", "Signals - Fast Radio Bursts"),
54+
("MMA_S_G", "Signals - Gamma-ray Bursts"),
55+
("MMA_S_K", "Signals - Kilonovae"),
56+
("MMA_S_N", "Signals - Novae"),
57+
("MMA_S_P", "Signals - Pevatrons"),
58+
("MMA_S_ST", "Signals - Stellar flares"),
59+
("MMA_S_SU", "Signals - Supernovae"),
60+
],
61+
max_length=255,
62+
),
63+
blank=True,
64+
db_column="tdamm_tag_manual",
65+
null=True,
66+
size=None,
67+
),
68+
),
69+
migrations.AddField(
70+
model_name="candidateurl",
71+
name="tdamm_tag_ml",
72+
field=django.contrib.postgres.fields.ArrayField(
73+
base_field=models.CharField(
74+
choices=[
75+
("MMA_M_EM", "Messenger - EM Radiation"),
76+
("MMA_M_EM_G", "Messenger - EM Radiation - Gamma rays"),
77+
("MMA_M_EM_X", "Messenger - EM Radiation - X-rays"),
78+
("MMA_M_EM_U", "Messenger - EM Radiation - Ultraviolet"),
79+
("MMA_M_EM_O", "Messenger - EM Radiation - Optical"),
80+
("MMA_M_EM_I", "Messenger - EM Radiation - Infrared"),
81+
("MMA_M_EM_M", "Messenger - EM Radiation - Microwave"),
82+
("MMA_M_EM_R", "Messenger - EM Radiation - Radio"),
83+
("MMA_M_G", "Messenger - Gravitational Waves"),
84+
("MMA_M_G_CBI", "Messenger - Gravitational Waves - Compact Binary Inspiral"),
85+
("MMA_M_G_S", "Messenger - Gravitational Waves - Stochastic"),
86+
("MMA_M_G_CON", "Messenger - Gravitational Waves - Continuous"),
87+
("MMA_M_G_B", "Messenger - Gravitational Waves - Burst"),
88+
("MMA_M_C", "Messenger - Cosmic Rays"),
89+
("MMA_M_N", "Messenger - Neutrinos"),
90+
("MMA_O_BI", "Objects - Binaries"),
91+
("MMA_O_BI_BBH", "Objects - Binaries - Binary Black Holes"),
92+
("MMA_O_BI_BNS", "Objects - Binaries - Binary Neutron Stars"),
93+
("MMA_O_BI_C", "Objects - Binaries - Cataclysmic Variables"),
94+
("MMA_O_BI_N", "Objects - Binaries - Neutron Star-Black Hole"),
95+
("MMA_O_BI_B", "Objects - Binaries - Binary Pulsars"),
96+
("MMA_O_BI_W", "Objects - Binaries - White Dwarf Binaries"),
97+
("MMA_O_BH", "Objects - Black Holes"),
98+
("MMA_O_BH_AGN", "Objects - Black Holes - Active Galactic Nuclei"),
99+
("MMA_O_BH_IM", "Objects - Black Holes - Intermediate mass"),
100+
("MMA_O_BH_STM", "Objects - Black Holes - Stellar mass"),
101+
("MMA_O_BH_SUM", "Objects - Black Holes - Supermassive"),
102+
("MMA_O_E", "Objects - Exoplanets"),
103+
("MMA_O_N", "Objects - Neutron Stars"),
104+
("MMA_O_N_M", "Objects - Neutron Stars - Magnetars"),
105+
("MMA_O_N_P", "Objects - Neutron Stars - Pulsars"),
106+
("MMA_O_N_PWN", "Objects - Neutron Stars - Pulsar Wind Nebula"),
107+
("MMA_O_S", "Objects - Supernova Remnants"),
108+
("MMA_S_F", "Signals - Fast Radio Bursts"),
109+
("MMA_S_G", "Signals - Gamma-ray Bursts"),
110+
("MMA_S_K", "Signals - Kilonovae"),
111+
("MMA_S_N", "Signals - Novae"),
112+
("MMA_S_P", "Signals - Pevatrons"),
113+
("MMA_S_ST", "Signals - Stellar flares"),
114+
("MMA_S_SU", "Signals - Supernovae"),
115+
],
116+
max_length=255,
117+
),
118+
blank=True,
119+
db_column="tdamm_tag_ml",
120+
null=True,
121+
size=None,
122+
),
123+
),
124+
migrations.AlterModelTable(
125+
name="candidateurl",
126+
table="sde_collections_candidateurl",
127+
),
128+
]
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Generated by Django 4.2.9 on 2024-11-20 07:58
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("sde_collections", "0059_candidateurl_tdamm_tag_manual_and_more"),
10+
("sde_collections", "0065_rename_delete_deltaurl_to_delete_and_more"),
11+
]
12+
13+
operations = []
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 4.2.9 on 2024-11-20 16:12
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("sde_collections", "0066_merge_20241120_0158"),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name="candidateurl",
15+
name="tdamm_tag_manual",
16+
),
17+
migrations.RemoveField(
18+
model_name="candidateurl",
19+
name="tdamm_tag_ml",
20+
),
21+
]

0 commit comments

Comments
 (0)