Skip to content

Commit 31be88f

Browse files
authored
Merge pull request #716 from xchem/m2ms-1552-cset-refactor
Refactor ComputedSet model to use numeric id rather than name as pk (Issue1552)
2 parents 50cb245 + 7b3cb7a commit 31be88f

24 files changed

+529
-62
lines changed

api/urls.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@
124124
router.register(
125125
"metadata_upload", viewer_views.UploadMetadataView, basename='metadata_upload'
126126
)
127-
router.register(
128-
"computedset_download",
129-
viewer_views.DownloadComputedSetView,
130-
basename='computedset_download',
131-
)
127+
# router.register(
128+
# "computedset_download",
129+
# viewer_views.DownloadComputedSetView,
130+
# basename='computedset_download',
131+
# )
132132

133133
# Squonk Jobs
134134
router.register(

viewer/cset_upload.py

+29-14
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def __init__(
175175
version,
176176
zfile,
177177
zfile_hashvals,
178-
computed_set_name,
178+
computed_set_id,
179179
):
180180
self.user_id = user_id
181181
self.sdf_filename = sdf_filename
@@ -185,7 +185,7 @@ def __init__(
185185
self.version = version
186186
self.zfile = zfile
187187
self.zfile_hashvals = zfile_hashvals
188-
self.computed_set_name = computed_set_name
188+
self.computed_set_id = computed_set_id
189189

190190
# using the same mechanism to pass messages as validation
191191
self.messages: dict[str, Any] = {
@@ -766,12 +766,13 @@ def task(self) -> tuple[ComputedSet, dict]:
766766

767767
# Do we have any existing ComputedSets?
768768
try:
769-
computed_set = ComputedSet.objects.get(name=self.computed_set_name)
769+
computed_set = ComputedSet.objects.get(pk=self.computed_set_id)
770770
# refresh some attributes
771771
computed_set.md_ordinal = F("md_ordinal") + 1
772772
computed_set.upload_date = datetime.date.today()
773773
computed_set.save()
774-
except ComputedSet.DoesNotExist:
774+
except (ValueError, ComputedSet.DoesNotExist):
775+
# ValueError when pk is None
775776
# no, create new
776777

777778
today: datetime.date = datetime.date.today()
@@ -790,16 +791,30 @@ def task(self) -> tuple[ComputedSet, dict]:
790791
f"{truncated_submitter_method}-{str(today)}-"
791792
+ f"{get_column_letter(new_ordinal)}"
792793
)
793-
logger.info('Creating new ComputedSet "%s"', cs_name)
794-
795-
computed_set = ComputedSet(
796-
name=cs_name,
797-
md_ordinal=new_ordinal,
798-
upload_date=today,
799-
method=self.submitter_method[: ComputedSet.LENGTH_METHOD],
800-
target=target,
801-
spec_version=float(self.version.strip("ver_")),
802-
)
794+
795+
# now that I have a name, I can check whether this
796+
# target already has this set
797+
try:
798+
# this feels wrong, I think it's better if the
799+
# object is resolved in the view.. or maybe in
800+
# validate task..
801+
computed_set = ComputedSet.objects.get(
802+
name=cs_name,
803+
target=target,
804+
)
805+
except ComputedSet.DoesNotExist:
806+
# and only now create new set
807+
logger.info('Creating new ComputedSet "%s"', cs_name)
808+
809+
computed_set = ComputedSet(
810+
name=cs_name,
811+
md_ordinal=new_ordinal,
812+
upload_date=today,
813+
method=self.submitter_method[: ComputedSet.LENGTH_METHOD],
814+
target=target,
815+
spec_version=float(self.version.strip('ver_')),
816+
)
817+
803818
if self.user_id:
804819
try:
805820
computed_set.owner_user = User.objects.get(id=self.user_id)

viewer/filters.py

+13
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
CanonSite,
88
CanonSiteConf,
99
Compound,
10+
ComputedSet,
1011
Experiment,
1112
ExperimentUpload,
1213
Pose,
@@ -128,6 +129,18 @@ class Meta:
128129
fields = ("target",)
129130

130131

132+
class ComputedSetFilter(filters.FilterSet):
133+
project = django_filters.CharFilter(
134+
field_name="project",
135+
lookup_expr="icontains",
136+
label="Project",
137+
)
138+
139+
class Meta:
140+
model = ComputedSet
141+
fields = ("name", "target", "project")
142+
143+
131144
class ExperimentUploadFilter(filters.FilterSet):
132145
class Meta:
133146
model = ExperimentUpload

viewer/managers.py

+21
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,27 @@ def by_target(self, target):
415415
return self.get_queryset().filter_qs().filter(target=target.id)
416416

417417

418+
class ComputedSetQueryset(QuerySet):
419+
def filter_qs(self):
420+
ComputedSet = apps.get_model("viewer", "ComputedSet")
421+
qs = ComputedSet.objects.annotate(
422+
project=F("target__project__title"),
423+
)
424+
425+
return qs
426+
427+
428+
class ComputedSetDataManager(Manager):
429+
def get_queryset(self):
430+
return ComputedSetQueryset(self.model, using=self._db)
431+
432+
def filter_qs(self):
433+
return self.get_queryset().filter_qs()
434+
435+
def by_target(self, target):
436+
return self.get_queryset().filter_qs().filter(target=target.id)
437+
438+
418439
class ExperimentUploadQueryset(QuerySet):
419440
def annotated_qs(self):
420441
ExperimentUpload = apps.get_model("viewer", "ExperimentUpload")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Generated by Django 3.2.25 on 2024-12-02 11:57
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('viewer', '0084_auto_20241108_1119'),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name='computedset',
15+
name='computed_molecules',
16+
),
17+
migrations.AlterField(
18+
model_name='computedsetcomputedmolecule',
19+
name='computed_set',
20+
field=models.TextField(null=True),
21+
),
22+
migrations.AlterField(
23+
model_name='jobrequest',
24+
name='computed_set',
25+
field=models.TextField(null=True),
26+
),
27+
migrations.AlterField(
28+
model_name='scoredescription',
29+
name='computed_set',
30+
field=models.TextField(null=True),
31+
),
32+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 3.2.25 on 2024-12-02 12:05
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('viewer', '0085_auto_20241202_1157'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='computedset',
15+
name='new_id',
16+
field=models.IntegerField(default=0),
17+
),
18+
migrations.AddField(
19+
model_name='historicalcomputedset',
20+
name='new_id',
21+
field=models.IntegerField(default=0),
22+
),
23+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 3.2.25 on 2024-12-02 12:06
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('viewer', '0086_auto_20241202_1205'),
10+
]
11+
12+
def populate_ids(apps, schema_editor):
13+
ComputedSet = apps.get_model('viewer', 'ComputedSet')
14+
15+
for i, obj in enumerate(ComputedSet.objects.all()):
16+
obj.new_id = i + 1
17+
obj.save()
18+
19+
def reverse_populate_ids(apps, schema_editor):
20+
pass
21+
22+
operations = [
23+
migrations.RunPython(populate_ids, reverse_populate_ids),
24+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 3.2.25 on 2024-12-02 12:24
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('viewer', '0087_auto_20241202_1206'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='computedset',
15+
name='name',
16+
field=models.TextField(),
17+
),
18+
migrations.AlterField(
19+
model_name='computedset',
20+
name='new_id',
21+
field=models.IntegerField(primary_key=True, serialize=False),
22+
),
23+
migrations.AlterField(
24+
model_name='historicalcomputedset',
25+
name='name',
26+
field=models.TextField(),
27+
),
28+
migrations.AlterField(
29+
model_name='historicalcomputedset',
30+
name='new_id',
31+
field=models.IntegerField(db_index=True),
32+
),
33+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 3.2.25 on 2024-12-02 12:30
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('viewer', '0088_auto_20241202_1224'),
10+
]
11+
12+
operations = [
13+
migrations.RenameField(
14+
model_name='computedset',
15+
old_name='new_id',
16+
new_name='id',
17+
),
18+
migrations.RenameField(
19+
model_name='historicalcomputedset',
20+
old_name='new_id',
21+
new_name='id',
22+
),
23+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 3.2.25 on 2024-12-02 12:31
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('viewer', '0089_auto_20241202_1230'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='computedset',
15+
name='id',
16+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
17+
),
18+
migrations.AlterField(
19+
model_name='historicalcomputedset',
20+
name='id',
21+
field=models.BigIntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID'),
22+
),
23+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Generated by Django 3.2.25 on 2024-12-02 12:34
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('viewer', '0090_auto_20241202_1231'),
10+
]
11+
12+
operations = [
13+
migrations.RemoveConstraint(
14+
model_name='computedsetcomputedmolecule',
15+
name='unique_computedsetcomputedmolecule',
16+
),
17+
migrations.RenameField(
18+
model_name='computedsetcomputedmolecule',
19+
old_name='computed_set',
20+
new_name='computed_set_txt',
21+
),
22+
migrations.RenameField(
23+
model_name='jobrequest',
24+
old_name='computed_set',
25+
new_name='computed_set_txt',
26+
),
27+
migrations.RenameField(
28+
model_name='scoredescription',
29+
old_name='computed_set',
30+
new_name='computed_set_txt',
31+
),
32+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Generated by Django 3.2.25 on 2024-12-02 13:22
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+
('viewer', '0091_auto_20241202_1234'),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name='computedsetcomputedmolecule',
16+
name='computed_set',
17+
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='viewer.computedset'),
18+
),
19+
migrations.AddField(
20+
model_name='jobrequest',
21+
name='computed_set',
22+
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='viewer.computedset'),
23+
),
24+
migrations.AddField(
25+
model_name='scoredescription',
26+
name='computed_set',
27+
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='viewer.computedset'),
28+
),
29+
]

0 commit comments

Comments
 (0)