Skip to content

Commit 47f29a2

Browse files
authored
Merge pull request #9 from ssec-jhu/adapt-models
Adapt models
2 parents 098447e + 24fabde commit 47f29a2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+493
-750
lines changed

.dockerignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ coverage.*
1313
__pycache__
1414
*.sqlite3
1515
db
16-
spectral_data
16+
array_data
1717
raw_data
1818
datasets
1919
log

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ cython_debug/
170170

171171
# Project stuff
172172
raw_data/
173-
spectral_data/
173+
array_data/
174174
datasets/
175175
log/
176176
run/

biodb/apps/catalog/admin.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def has_delete_permission(self, request, obj=None):
2727
@admin.register(Dataset)
2828
class DatasetAdmin(AuthMixin, admin.ModelAdmin):
2929
search_fields = ["created_at", "name", "version", "query__name"]
30-
list_display = ["name", "version", "file", "created_at", "size", "n_rows", "n_spectral_data_files"]
30+
list_display = ["name", "version", "file", "created_at", "size", "n_rows", "n_array_data_files"]
3131
date_hierarchy = "created_at"
3232
ordering = ("-updated_at",)
3333
list_filter = ("name",)
@@ -40,8 +40,8 @@ class DatasetAdmin(AuthMixin, admin.ModelAdmin):
4040
"updated_at",
4141
"id",
4242
"n_rows",
43-
"n_spectral_data_files",
44-
"spectral_data_filenames",
43+
"n_array_data_files",
44+
"array_data_filenames",
4545
"data_sha256"]
4646

4747
fieldsets = [
@@ -73,14 +73,14 @@ class DatasetAdmin(AuthMixin, admin.ModelAdmin):
7373
"app_version",
7474
"id",
7575
"n_rows",
76-
"n_spectral_data_files"],
76+
"n_array_data_files"],
7777
}
7878
),
7979
(
80-
"Spectral Data Filenames",
80+
"Array Data Filenames",
8181
{
8282
"classes": ["collapse"],
83-
"fields": ["spectral_data_filenames"],
83+
"fields": ["array_data_filenames"],
8484
}
8585
),
8686
]
@@ -91,9 +91,9 @@ def size(self, obj):
9191
return f"{int(obj.file.size / 1e6)} MB"
9292

9393
@admin.display
94-
def n_spectral_data_files(self, obj):
95-
if obj.spectral_data_filenames:
96-
return len(obj.spectral_data_filenames)
94+
def n_array_data_files(self, obj):
95+
if obj.array_data_filenames:
96+
return len(obj.array_data_filenames)
9797
return 0
9898

9999

biodb/apps/catalog/migrations/0001_initial.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ class Migration(migrations.Migration):
3030
('app_version', models.CharField(blank=True, default=catalog.models.get_app_version, editable=False, help_text='App version used to create data product', max_length=32)),
3131
('sha256', models.CharField(blank=True, editable=False, help_text='Checksum of downloadable file', max_length=64, validators=[django.core.validators.MinLengthValidator(64)], verbose_name='SHA-256')),
3232
('n_rows', models.IntegerField(blank=True, editable=False, help_text='Number of data rows')),
33-
('data_sha256', models.CharField(blank=True, editable=False, help_text='Checksum of data table (not including any spectral data files).', max_length=64, validators=[django.core.validators.MinLengthValidator(64)], verbose_name='Data SHA-256')),
34-
('spectral_data_filenames', models.JSONField(blank=True, default=catalog.models.empty_list, editable=False, encoder=catalog.models.CustomDjangoJsonEncoder, help_text='List of spectral data filenames')),
33+
('data_sha256', models.CharField(blank=True, editable=False, help_text='Checksum of data table (not including any array data files).', max_length=64, validators=[django.core.validators.MinLengthValidator(64)], verbose_name='Data SHA-256')),
34+
('array_data_filenames', models.JSONField(blank=True, default=catalog.models.empty_list, editable=False, encoder=catalog.models.CustomDjangoJsonEncoder, help_text='List of array data filenames')),
3535
('query', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='dataset', to='explorer.query')),
3636
],
3737
options={

biodb/apps/catalog/models.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class Dataset(DatedModel):
4646
sha256 (:obj:`django.models.CharField`): The SHA-256 checksum of the entire zip file.
4747
n_rows (:obj:`django.models.IntegerField`): The number of rows in the zipped data file. Depending on the query, this could be the total number of patients or something else.
4848
data_sha256 (:obj:`django.models.IntegerField`): The SHA-256 checksum of the data file archived within the zip file.
49-
spectral_data_filenames (:obj:`django.models.JSONField`): A list of all the file names for all individual spectral data files zipped within the downloadable zip file.
49+
array_data_filenames (:obj:`django.models.JSONField`): A list of all the file names for all individual array data files zipped within the downloadable zip file.
5050
"""
5151

5252
class Meta:
@@ -99,13 +99,13 @@ class Meta:
9999
null=False,
100100
blank=True,
101101
verbose_name="Data SHA-256",
102-
help_text="Checksum of data table (not including any spectral data files).",
102+
help_text="Checksum of data table (not including any array data files).",
103103
validators=[MinLengthValidator(64)])
104-
spectral_data_filenames = models.JSONField(null=False,
104+
array_data_filenames = models.JSONField(null=False,
105105
default=empty_list,
106106
blank=True,
107107
editable=False,
108-
help_text="List of spectral data filenames",
108+
help_text="List of array data filenames",
109109
encoder=CustomDjangoJsonEncoder)
110110

111111
def __str__(self):
@@ -124,7 +124,7 @@ def clean(self, *args, **kwargs):
124124
if not self.file:
125125
# Create file from query.
126126
file, info = self.execute_query()
127-
filename, n_rows, data_sha256, spectral_data_filenames = info
127+
filename, n_rows, data_sha256, array_data_filenames = info
128128

129129
if not n_rows:
130130
raise ValidationError(_("Query returned no data."))
@@ -133,7 +133,7 @@ def clean(self, *args, **kwargs):
133133
self._filename = filename
134134
self.n_rows = n_rows
135135
self.data_sha256 = data_sha256
136-
self.spectral_data_filenames = spectral_data_filenames
136+
self.array_data_filenames = array_data_filenames
137137

138138
super().clean(*args, **kwargs)
139139

@@ -182,9 +182,9 @@ def meta_info(self, **kwargs):
182182
app_version=self.app_version,
183183
id=str(self.id),
184184
n_rows=self.n_rows,
185-
n_spectral_data_files=len(self.spectral_data_filenames),
185+
n_array_data_files=len(self.array_data_filenames),
186186
timestamp=str(datetime.datetime.now()),
187-
spectral_data_filenames=self.spectral_data_filenames)
187+
array_data_filenames=self.array_data_filenames)
188188
info.update(kwargs)
189189
return info
190190

biodb/apps/catalog/tests/conftest.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from catalog.models import Dataset
77
from uploader.tests.conftest import bio_sample_types, centers, instruments, mock_data_from_files, observables, \
8-
SimpleQueryFactory, spectra_measurement_types, sql_views, mock_data # noqa: F401
8+
SimpleQueryFactory, array_measurement_types, sql_views, mock_data # noqa: F401
99
from user.models import Center as UserCenter
1010

1111

@@ -23,7 +23,7 @@ def staffuser(centers): # noqa: F811
2323
return User.objects.create(username="staff",
2424
2525
password="secret",
26-
center=UserCenter.objects.get(name="jhu"),
26+
center=UserCenter.objects.get(name="JHU"),
2727
is_staff=True,
2828
is_superuser=False)
2929

@@ -33,7 +33,7 @@ def cataloguser(centers): # noqa: F811
3333
return User.objects.create(username="analyst",
3434
3535
password="secret",
36-
center=UserCenter.objects.get(name="jhu"),
36+
center=UserCenter.objects.get(name="JHU"),
3737
is_staff=True,
3838
is_superuser=False,
3939
is_catalogviewer=True)
@@ -44,7 +44,7 @@ def superuser(centers): # noqa: F811
4444
return User.objects.create(username="admin",
4545
4646
password="secret",
47-
center=UserCenter.objects.get(name="jhu"),
47+
center=UserCenter.objects.get(name="JHU"),
4848
is_staff=True,
4949
is_superuser=True)
5050

biodb/apps/catalog/tests/test_datasets.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from biodb import __version__
99
from catalog.models import Dataset
1010
from explorer.models import Query
11-
from uploader.models import SpectralData
11+
from uploader.models import ArrayData
1212

1313

1414
@pytest.mark.django_db(databases=["default", "bsr"])
@@ -49,7 +49,7 @@ def test_files(self, saved_dataset):
4949
namelist = z.namelist()
5050
namelist.remove(str(Path(saved_dataset.name).with_suffix(file_ext)))
5151
namelist.remove("INFO.json")
52-
data_dir = Path(SpectralData.UPLOAD_DIR)
52+
data_dir = Path(ArrayData.UPLOAD_DIR)
5353
for file in namelist:
5454
assert Path(file).parent == data_dir
5555

biodb/apps/uploader/admin.py

+21-45
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
from nested_admin import NestedStackedInline, NestedTabularInline, NestedModelAdmin
1212

1313
from biodb.util import to_bool
14-
from .models import BioSample, Observable, Instrument, Patient, SpectralData, Observation, UploadedFile, Visit,\
15-
QCAnnotator, QCAnnotation, Center, get_center, BioSampleType, SpectraMeasurementType
14+
from .models import BioSample, Observable, Instrument, Patient, ArrayData, Observation, UploadedFile, Visit,\
15+
QCAnnotator, QCAnnotation, Center, get_center, BioSampleType, ArrayMeasurementType
1616
from uploader.forms import ModelForm
1717
from user.admin import CenterAdmin as UserCenterAdmin
1818

@@ -127,10 +127,10 @@ def formfield_for_foreignkey(self, db_field, request, **kwargs):
127127
field.queryset = field.queryset.filter(visit__center=center)
128128
elif db_field.name == "bio_sample":
129129
field.queryset = field.queryset.filter(visit__patient__center=center)
130-
elif db_field.name == "spectral_data":
130+
elif db_field.name == "array_data":
131131
field.queryset = field.queryset.filter(bio_sample__visit__patient__center=center)
132132
elif db_field.name == "qc_annotation":
133-
field.queryset = field.queryset.filter(spectral_data__bio_sample__visit__patient__center=center)
133+
field.queryset = field.queryset.filter(array_data__bio_sample__visit__patient__center=center)
134134
elif db_field.name in ("annotator", "measurement_type", "sample_type"):
135135
# These aren't limited/restricted by center.
136136
pass
@@ -142,7 +142,7 @@ def formfield_for_foreignkey(self, db_field, request, **kwargs):
142142

143143

144144
admin.site.register(BioSampleType)
145-
admin.site.register(SpectraMeasurementType)
145+
admin.site.register(ArrayMeasurementType)
146146

147147

148148
@admin.register(Instrument)
@@ -163,18 +163,6 @@ class InstrumentAdmin(RestrictedByCenterMixin, ModelAdmin):
163163
"center"]
164164
}
165165
),
166-
(
167-
"Spectrometer",
168-
{
169-
"fields": ["spectrometer_manufacturer", "spectrometer_model", "spectrometer_serial_number"],
170-
}
171-
),
172-
(
173-
"Laser",
174-
{
175-
"fields": ["laser_manufacturer", "laser_model", "laser_serial_number"],
176-
}
177-
),
178166
(
179167
"More Details",
180168
{
@@ -218,7 +206,7 @@ class UploadedFileAdmin(RestrictedByCenterMixin, ModelAdmin):
218206
form = UploadedFileForm
219207
search_fields = ["created_at"]
220208
search_help_text = "Creation timestamp"
221-
list_display = ["pk", "created_at", "meta_data_file", "spectral_data_file", "center"]
209+
list_display = ["pk", "created_at", "meta_data_file", "array_data_file", "center"]
222210
readonly_fields = ["created_at", "updated_at"] # TODO: Might need specific user group.
223211
date_hierarchy = "created_at"
224212
ordering = ("-updated_at",)
@@ -246,13 +234,13 @@ def get_extra(self, request, obj=None, **kwargs):
246234
@admin.register(QCAnnotation)
247235
class QCAnnotationAdmin(RestrictedByCenterMixin, ModelAdmin):
248236
search_fields = ["annotator__name",
249-
"spectral_data__bio_sample__visit__patient__patient_id",
250-
"spectral_data__bio_sample__visit__patient__patient_cid"]
237+
"array_data__bio_sample__visit__patient__patient_id",
238+
"array_data__bio_sample__visit__patient__patient_cid"]
251239
search_help_text = "Annotator Name, Patient ID or CID"
252240
readonly_fields = ("value", "created_at", "updated_at") # TODO: Might need specific user group for timestamps.
253241
list_display = ["annotator_name", "value", "annotator_value_type", "updated_at"]
254242
ordering = ("-updated_at",)
255-
list_filter = ("spectral_data__bio_sample__visit__patient__center", "annotator__name")
243+
list_filter = ("array_data__bio_sample__visit__patient__center", "annotator__name")
256244

257245
@admin.display
258246
def annotator_name(self, obj):
@@ -268,7 +256,7 @@ def get_queryset(self, request):
268256
if request.user.is_superuser:
269257
return qs
270258
center = Center.objects.get(pk=request.user.center.pk)
271-
return qs.filter(spectral_data__bio_sample__visit__patient__center=center)
259+
return qs.filter(array_data__bio_sample__visit__patient__center=center)
272260

273261

274262
@admin.register(QCAnnotator)
@@ -452,7 +440,7 @@ class ObservationAdmin(ObservationMixin, RestrictedByCenterMixin, NestedModelAdm
452440
list_display = ["patient_id", "observable_name", "visit"]
453441

454442

455-
class SpectralDataMixin:
443+
class ArrayDataMixin:
456444
ordering = ("-updated_at",)
457445
readonly_fields = ["created_at", "updated_at"]
458446

@@ -468,8 +456,6 @@ class SpectralDataMixin:
468456
{
469457
"fields": ["measurement_id",
470458
"measurement_type",
471-
"atr_crystal",
472-
"n_coadditions",
473459
"acquisition_time",
474460
"resolution",
475461
"power",
@@ -479,16 +465,6 @@ class SpectralDataMixin:
479465
"date"],
480466
}
481467
),
482-
(
483-
"SERS Details",
484-
{
485-
"classes": ["collapse"],
486-
"fields": ["sers_description",
487-
"sers_particle_material",
488-
"sers_particle_size",
489-
"sers_particle_concentration"],
490-
}
491-
),
492468
(
493469
"More Details",
494470
{
@@ -510,8 +486,8 @@ def get_queryset(self, request):
510486
return qs.filter(bio_sample__visit__patient__center=Center.objects.get(pk=request.user.center.pk))
511487

512488

513-
@admin.register(SpectralData)
514-
class SpectralDataAdmin(SpectralDataMixin, RestrictedByCenterMixin, NestedModelAdmin):
489+
@admin.register(ArrayData)
490+
class ArrayDataAdmin(ArrayDataMixin, RestrictedByCenterMixin, NestedModelAdmin):
515491
search_fields = ["bio_sample__visit__patient__patient_id", "bio_sample__visit__patient__patient_cid"]
516492
search_help_text = "Patient ID or CID"
517493
readonly_fields = ["created_at", "updated_at"] # TODO: Might need specific user group.
@@ -525,20 +501,20 @@ class SpectralDataAdmin(SpectralDataMixin, RestrictedByCenterMixin, NestedModelA
525501
"bio_sample__visit__observation__observable")
526502

527503

528-
class SpectralDataAdminWithInlines(SpectralDataAdmin):
504+
class ArrayDataAdminWithInlines(ArrayDataAdmin):
529505
inlines = [QCAnnotationInline]
530506

531507

532-
class SpectralDataInline(SpectralDataMixin, RestrictedByCenterMixin, NestedStackedInline):
533-
model = SpectralData
508+
class ArrayDataInline(ArrayDataMixin, RestrictedByCenterMixin, NestedStackedInline):
509+
model = ArrayData
534510
extra = 1
535511
min_num = 0
536512
show_change_link = True
537513
fk_name = "bio_sample"
538514

539515
def get_extra(self, request, obj=None, **kwargs):
540516
# Only display inlines for those that exist, i.e., no expanded extras (if they exist).
541-
return 0 if obj and obj.pk and obj.spectral_data.count() else self.extra
517+
return 0 if obj and obj.pk and obj.array_data.count() else self.extra
542518

543519

544520
class BioSampleMixin:
@@ -600,7 +576,7 @@ class BioSampleAdmin(BioSampleMixin, RestrictedByCenterMixin, NestedModelAdmin):
600576

601577

602578
class BioSampleAdminWithInlines(BioSampleAdmin):
603-
inlines = [SpectralDataInline]
579+
inlines = [ArrayDataInline]
604580

605581

606582
class BioSampleInline(BioSampleMixin, RestrictedByCenterMixin, NestedStackedInline):
@@ -609,7 +585,7 @@ class BioSampleInline(BioSampleMixin, RestrictedByCenterMixin, NestedStackedInli
609585
min_num = 0
610586
show_change_link = True
611587
fk_name = "visit"
612-
inlines = [SpectralDataInline]
588+
inlines = [ArrayDataInline]
613589

614590
def get_extra(self, request, obj=None, **kwargs):
615591
# Only display inlines for those that exist, i.e., no expanded extras (if they exist).
@@ -796,7 +772,7 @@ class DataAdminSite(admin.AdminSite):
796772
Visit,
797773
Observation,
798774
BioSample,
799-
SpectralData,
775+
ArrayData,
800776
UploadedFile
801777
]
802778

@@ -815,7 +791,7 @@ def get_app_list(self, request, app_label=None):
815791
data_admin.register(Visit, admin_class=VisitAdminWithInlines)
816792
data_admin.register(Observation, admin_class=ObservationAdmin)
817793
data_admin.register(BioSample, admin_class=BioSampleAdminWithInlines)
818-
data_admin.register(SpectralData, admin_class=SpectralDataAdminWithInlines)
794+
data_admin.register(ArrayData, admin_class=ArrayDataAdminWithInlines)
819795
data_admin.register(UploadedFile, admin_class=UploadedFileAdmin)
820796
# data_admin.register(Instrument, admin_class=InstrumentAdmin)
821797
# data_admin.register(QCAnnotation, admin_class=QCAnnotationAdmin)

biodb/apps/uploader/base_models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def get_column_names(cls, help_text=False):
2020
"data",
2121
"date",
2222
"id",
23-
"spectral data file",
23+
"array data file",
2424
"updated at"}
2525

2626
if hasattr(cls, "parse_fields_from_pandas_series"): # Only models with this func have bulk data upload columns.

0 commit comments

Comments
 (0)