Skip to content

Commit 51994ee

Browse files
authored
Merge pull request #253 from ModellingWebLab/134-fitting-result
Introduction of runnable base class to assist with introduction of fitting specs
2 parents 2505944 + 8cb7486 commit 51994ee

24 files changed

Lines changed: 300 additions & 79 deletions

requirements/dev.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ defusedxml==0.5.0 # via python3-openid, social-auth-core
1616
dj-database-url==0.4.2
1717
django-braces==1.11.0
1818
django-guardian==1.4.9
19-
django==1.11.27
20-
first==2.0.2 # via pip-tools
19+
django==1.11.28
2120
flake8==3.4.1
2221
gitdb2==2.0.5 # via gitpython
2322
gitpython==2.1.7

requirements/test.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ pycodestyle==2.5.0 # via flake8
2828
pyflakes==2.1.1 # via flake8
2929
pyjwt==1.7.1 # via social-auth-core
3030
pytest-cov==2.5.1
31-
pytest-django==3.1.2
32-
pytest==3.2.0
31+
pytest-django==3.8.0
32+
pytest==3.6.0
3333
python3-openid==3.1.0 # via social-auth-core
3434
pytz==2018.9 # via django
3535
requests-oauthlib==1.2.0 # via social-auth-core

weblab/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def queued_experiment(model_with_version, protocol_with_version):
177177
experiment__protocol=protocol_with_version,
178178
experiment__protocol_version=protocol_with_version.repocache.latest_version,
179179
)
180-
recipes.running_experiment.make(experiment_version=version)
180+
recipes.running_experiment.make(runnable=version)
181181
return version
182182

183183

weblab/core/recipes.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
from model_mommy.recipe import Recipe, foreign_key, seq
22

33

4-
user = Recipe('accounts.User', institution='UCL')
4+
user = Recipe('accounts.User', institution='UCL', full_name=seq('test user '))
55

66
model = Recipe(
77
'ModelEntity',
8-
entity_type='model', name=seq('mymodel')
8+
entity_type='model', name=seq('my model')
99
)
1010
protocol = Recipe(
1111
'ProtocolEntity',
12-
entity_type='protocol', name=seq('myprotocol')
12+
entity_type='protocol', name=seq('my protocol')
1313
)
1414
fittingspec = Recipe(
1515
'FittingSpec',
16-
entity_type='fittingspec', name=seq('myspec'),
16+
entity_type='fittingspec', name=seq('my spec'),
1717
protocol=foreign_key(protocol),
1818
)
1919

@@ -38,13 +38,15 @@
3838
protocol_version=foreign_key(cached_protocol_version),
3939
)
4040

41+
runnable = Recipe('Runnable')
42+
4143
experiment_version = Recipe('ExperimentVersion', experiment=foreign_key(experiment))
4244

43-
running_experiment = Recipe('RunningExperiment', experiment_version=foreign_key(experiment_version))
45+
running_experiment = Recipe('RunningExperiment', runnable=foreign_key(runnable))
4446

4547

4648
dataset = Recipe('Dataset',
47-
name=seq('mydataset'),
49+
name=seq('my dataset'),
4850
protocol=foreign_key(protocol))
4951

5052
dataset_file = Recipe('DatasetFile',

weblab/entities/tests/test_views.py

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -431,10 +431,10 @@ def test_complex_visibilities(self, client, logged_in_user, other_user, helpers)
431431
assert len(interfaces) == 4
432432

433433
expected = {
434-
'myprotocol1': {'required': ['p1r2'], 'optional': ['p1o2']},
435-
'myprotocol2': {'required': ['p2r2'], 'optional': ['p2o2']},
436-
'myprotocol3': {'required': ['p3r1'], 'optional': ['p3o1']},
437-
'myprotocol4': {'required': ['p4r3'], 'optional': ['p4o3']},
434+
protocol1.name: {'required': ['p1r2'], 'optional': ['p1o2']},
435+
protocol2.name: {'required': ['p2r2'], 'optional': ['p2o2']},
436+
protocol3.name: {'required': ['p3r1'], 'optional': ['p3o1']},
437+
protocol4.name: {'required': ['p4r3'], 'optional': ['p4o3']},
438438
}
439439
for iface in interfaces:
440440
assert iface['name'] in expected
@@ -483,7 +483,7 @@ def test_applies_visibility(self, client, helpers, experiment_version):
483483
exp.model.set_version_visibility('latest', 'public')
484484
exp.protocol.set_version_visibility('latest', 'public')
485485
protocol_version = helpers.add_version(protocol, visibility='private')
486-
recipes.experiment_version.make(
486+
recipes.runnable.make(
487487
experiment__protocol=protocol,
488488
experiment__protocol_version=protocol.repocache.get_version(protocol_version.sha),
489489
experiment__model=exp.model,
@@ -1666,7 +1666,7 @@ def test_download_archive(self, client, helpers):
16661666
archive = zipfile.ZipFile(BytesIO(response.content))
16671667
assert archive.filelist[0].filename == 'file1.txt'
16681668
assert response['Content-Disposition'] == (
1669-
'attachment; filename=%s_%s.zip' % (model.name, commit.sha)
1669+
'attachment; filename=%s_%s.zip' % (model.name.replace(' ', '_'), commit.sha)
16701670
)
16711671

16721672
def test_returns_404_if_no_commits_yet(self, logged_in_user, client):
@@ -2115,7 +2115,7 @@ def test_view_run_experiment_model(self, client, helpers, logged_in_user):
21152115
assert response.status_code == 200
21162116
assert response.context['object_list'] == [{'id': protocol.pk,
21172117
'entity': protocol,
2118-
'name': 'myprotocol1',
2118+
'name': protocol.name,
21192119
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
21202120
{'commit': version1, 'tags': [], 'latest': False}]},
21212121
]
@@ -2147,14 +2147,14 @@ def test_view_run_experiment_model_multiple_users(self, client, helpers, logged_
21472147
assert response.status_code == 200
21482148
assert response.context['object_list'] == [{'id': protocol.pk,
21492149
'entity': protocol,
2150-
'name': 'myprotocol1',
2150+
'name': protocol.name,
21512151
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
21522152
{'commit': version1, 'tags': [], 'latest': False}]},
21532153
]
21542154
assert response.context['other_object_list'] == [
21552155
{'id': other_protocol.pk,
21562156
'entity': other_protocol,
2157-
'name': 'myprotocol2',
2157+
'name': other_protocol.name,
21582158
'versions': [{'commit': other_version2, 'tags': ['v1'], 'latest': True},
21592159
{'commit': other_version1, 'tags': [], 'latest': False}]},
21602160
]
@@ -2179,7 +2179,7 @@ def test_view_run_experiment_model_post(self, client, helpers, logged_in_user):
21792179
assert response.status_code == 200
21802180
assert response.context['object_list'] == [{'id': protocol.pk,
21812181
'entity': protocol,
2182-
'name': 'myprotocol1',
2182+
'name': protocol.name,
21832183
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
21842184
{'commit': version1, 'tags': [], 'latest': False}]},
21852185
]
@@ -2229,7 +2229,7 @@ def test_view_run_experiment_model_post_exclude_existing(self, client, helpers,
22292229
assert response.status_code == 200
22302230
assert response.context['object_list'] == [{'id': protocol.pk,
22312231
'entity': protocol,
2232-
'name': 'myprotocol1',
2232+
'name': protocol.name,
22332233
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
22342234
{'commit': version1, 'tags': [], 'latest': False}]},
22352235
]
@@ -2281,14 +2281,14 @@ def test_view_run_experiment_post_model_multiple_users(self, client, helpers, lo
22812281
assert response.status_code == 200
22822282
assert response.context['object_list'] == [{'id': protocol.pk,
22832283
'entity': protocol,
2284-
'name': 'myprotocol1',
2284+
'name': protocol.name,
22852285
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
22862286
{'commit': version1, 'tags': [], 'latest': False}]},
22872287
]
22882288
assert response.context['other_object_list'] == [
22892289
{'id': other_protocol.pk,
22902290
'entity': other_protocol,
2291-
'name': 'myprotocol2',
2291+
'name': other_protocol.name,
22922292
'versions': [{'commit': other_version2, 'tags': ['v1'], 'latest': True},
22932293
{'commit': other_version1, 'tags': [], 'latest': False}]},
22942294
]
@@ -2338,7 +2338,7 @@ def test_view_run_experiment_model_not_latest(self, client, helpers, logged_in_u
23382338
assert response.status_code == 200
23392339
assert response.context['object_list'] == [{'id': protocol.pk,
23402340
'entity': protocol,
2341-
'name': 'myprotocol1',
2341+
'name': protocol.name,
23422342
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
23432343
{'commit': version1, 'tags': [], 'latest': False}]},
23442344
]
@@ -2384,7 +2384,7 @@ def test_view_run_experiment_protocol(self, client, helpers, logged_in_user):
23842384
assert response.status_code == 200
23852385
assert response.context['object_list'] == [{'id': model.pk,
23862386
'entity': model,
2387-
'name': 'mymodel1',
2387+
'name': model.name,
23882388
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
23892389
{'commit': version1, 'tags': [], 'latest': False}]},
23902390
]
@@ -2416,14 +2416,14 @@ def test_view_run_experiment_protocol_multiple_users(self, client, helpers, logg
24162416
assert response.status_code == 200
24172417
assert response.context['object_list'] == [{'id': model.pk,
24182418
'entity': model,
2419-
'name': 'mymodel1',
2419+
'name': model.name,
24202420
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
24212421
{'commit': version1, 'tags': [], 'latest': False}]},
24222422
]
24232423
assert response.context['other_object_list'] == [
24242424
{'id': other_model.pk,
24252425
'entity': other_model,
2426-
'name': 'mymodel2',
2426+
'name': other_model.name,
24272427
'versions': [{'commit': other_version2, 'tags': ['v1'], 'latest': True},
24282428
{'commit': other_version1, 'tags': [], 'latest': False}]},
24292429
]
@@ -2446,7 +2446,7 @@ def test_view_run_experiment_protocol_post(self, client, helpers, logged_in_user
24462446
assert response.status_code == 200
24472447
assert response.context['object_list'] == [{'id': model.pk,
24482448
'entity': model,
2449-
'name': 'mymodel1',
2449+
'name': model.name,
24502450
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
24512451
{'commit': version1, 'tags': [], 'latest': False}]},
24522452
]
@@ -2502,7 +2502,7 @@ def test_view_run_experiment_protocol_post_exclude_existing(self, client, helper
25022502
assert response.status_code == 200
25032503
assert response.context['object_list'] == [{'id': model.pk,
25042504
'entity': model,
2505-
'name': 'mymodel1',
2505+
'name': model.name,
25062506
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
25072507
{'commit': version1, 'tags': [], 'latest': False}]},
25082508
]
@@ -2551,14 +2551,14 @@ def test_view_run_experiment_post_protocol_multiple_users(self, client, helpers,
25512551
assert response.status_code == 200
25522552
assert response.context['object_list'] == [{'id': model.pk,
25532553
'entity': model,
2554-
'name': 'mymodel1',
2554+
'name': model.name,
25552555
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
25562556
{'commit': version1, 'tags': [], 'latest': False}]},
25572557
]
25582558
assert response.context['other_object_list'] == [
25592559
{'id': other_model.pk,
25602560
'entity': other_model,
2561-
'name': 'mymodel2',
2561+
'name': other_model.name,
25622562
'versions': [{'commit': other_version2, 'tags': ['v1'], 'latest': True},
25632563
{'commit': other_version1, 'tags': [], 'latest': False}]},
25642564
]
@@ -2605,7 +2605,7 @@ def test_view_run_experiment_none_checked(self, client, helpers, logged_in_user)
26052605
assert response.status_code == 200
26062606
assert response.context['object_list'] == [{'id': protocol.pk,
26072607
'entity': protocol,
2608-
'name': 'myprotocol1',
2608+
'name': protocol.name,
26092609
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
26102610
{'commit': version1, 'tags': [], 'latest': False}]},
26112611
]
@@ -2653,7 +2653,7 @@ def test_view_run_experiment_protocol_not_latest(self, client, helpers, logged_i
26532653
assert response.status_code == 200
26542654
assert response.context['object_list'] == [{'id': model.pk,
26552655
'entity': model,
2656-
'name': 'mymodel1',
2656+
'name': model.name,
26572657
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
26582658
{'commit': version1, 'tags': [], 'latest': False}]},
26592659
]

weblab/entities/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ def check_access_token(self, token):
663663
"""
664664
from entities.models import AnalysisTask
665665
from experiments.models import RunningExperiment
666-
entity_field = 'experiment_version__experiment__%s' % self.kwargs['entity_type']
666+
entity_field = 'runnable__experimentversion__experiment__%s' % self.kwargs['entity_type']
667667
self_id = self._get_object().id
668668
return (RunningExperiment.objects.filter(
669669
id=token,

weblab/experiments/apps.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from django.apps import AppConfig
22
from django.db.models.signals import pre_delete
33

4-
from .signals import experiment_version_deleted, running_experiment_deleted
4+
from .signals import runnable_deleted, running_experiment_deleted
55

66

77
class ExperimentsConfig(AppConfig):
88
name = 'experiments'
99

1010
def ready(self):
11-
from .models import ExperimentVersion, RunningExperiment
11+
from .models import Runnable, RunningExperiment
1212

13-
pre_delete.connect(experiment_version_deleted, ExperimentVersion)
13+
pre_delete.connect(runnable_deleted, Runnable)
1414
pre_delete.connect(running_experiment_deleted, RunningExperiment)

weblab/experiments/emails.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
from django.template.loader import render_to_string
44

55

6-
def send_experiment_finished_email(experiment_version):
7-
author = experiment_version.author
6+
def send_experiment_finished_email(runnable):
7+
author = runnable.author
88

99
if author.receive_emails:
1010
body = render_to_string(
1111
'emails/experiment_finished.txt',
1212
{
1313
'user': author,
14-
'experiment_version': experiment_version,
14+
'runnable': runnable,
1515
'base_url': settings.BASE_URL,
1616
}
1717
)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.20 on 2020-03-16 16:52
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('experiments', '0024_merge_20200211_0929'),
12+
]
13+
14+
operations = [
15+
migrations.RenameModel(
16+
old_name='ExperimentVersion',
17+
new_name='Runnable',
18+
),
19+
migrations.RemoveIndex(
20+
model_name='runnable',
21+
name='experiments_created_00e2f1_idx',
22+
),
23+
migrations.AddIndex(
24+
model_name='runnable',
25+
index=models.Index(fields=['created_at'], name='experiments_created_a4e4b7_idx'),
26+
),
27+
]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.20 on 2020-03-16 17:00
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
import django.db.models.deletion
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('experiments', '0025_auto_20200316_1652'),
13+
]
14+
15+
operations = [
16+
migrations.CreateModel(
17+
name='ExperimentVersion',
18+
fields=[
19+
('runnable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='experiments.Runnable')),
20+
('experiment_key', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='versions_copy', to='experiments.Experiment')),
21+
],
22+
options={
23+
'abstract': False,
24+
},
25+
bases=('experiments.runnable',),
26+
),
27+
]

0 commit comments

Comments
 (0)