Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d26f06b
Introduction of runnable entity
sroderick-g5sro Feb 13, 2020
460aea3
Runnable class - resolve unit test failures
sroderick-g5sro Feb 27, 2020
f28644c
Runnable class - resolve unit test failures
sroderick-g5sro Feb 27, 2020
a0eb411
Changed linkage to experiment via experiment version
sroderick-g5sro Feb 27, 2020
d6f2972
renamed migration method to reference correct entity
sroderick-g5sro Feb 27, 2020
c982b88
Whitespace issue
sroderick-g5sro Feb 27, 2020
d6f0629
change migration path for upgrade to runnable base class
sroderick-g5sro Feb 28, 2020
ae7aa19
revert accidental check-in
sroderick-g5sro Feb 28, 2020
34ad42a
Changed migration link to runnable
sroderick-g5sro Mar 6, 2020
90e70f8
Corrected mapping to experiment in email template
sroderick-g5sro Mar 6, 2020
6da1298
Changed migration link to runnable
sroderick-g5sro Mar 6, 2020
13e86e8
Refactor experiment_version to runnable
sroderick-g5sro Mar 16, 2020
dfe184f
isort correction
sroderick-g5sro Mar 16, 2020
41a8e98
Alternative approach to migrations
jonc125 Mar 16, 2020
f094e49
Fix template so it refers to runnable
jonc125 Mar 17, 2020
7f8bbdc
Tidying
jonc125 Mar 17, 2020
0450c51
I missed a migration!
jonc125 Mar 17, 2020
b10b447
Fix the expt detail view
jonc125 Mar 17, 2020
8b1ee4b
Why don't tests flag this as an error?
jonc125 Mar 17, 2020
4abf49f
Now the test fails for the right reason!
jonc125 Mar 17, 2020
f6a190c
Fix the test again
jonc125 Mar 17, 2020
3384655
Fix other tests that assumed entity names
jonc125 Mar 17, 2020
8cb7486
Merge pull request #260 from ModellingWebLab/template-testing
jonc125 Mar 17, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions requirements/dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ defusedxml==0.5.0 # via python3-openid, social-auth-core
dj-database-url==0.4.2
django-braces==1.11.0
django-guardian==1.4.9
django==1.11.27
first==2.0.2 # via pip-tools
django==1.11.28
flake8==3.4.1
gitdb2==2.0.5 # via gitpython
gitpython==2.1.7
Expand Down
4 changes: 2 additions & 2 deletions requirements/test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ pycodestyle==2.5.0 # via flake8
pyflakes==2.1.1 # via flake8
pyjwt==1.7.1 # via social-auth-core
pytest-cov==2.5.1
pytest-django==3.1.2
pytest==3.2.0
pytest-django==3.8.0
pytest==3.6.0
python3-openid==3.1.0 # via social-auth-core
pytz==2018.9 # via django
requests-oauthlib==1.2.0 # via social-auth-core
Expand Down
2 changes: 1 addition & 1 deletion weblab/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ def queued_experiment(model_with_version, protocol_with_version):
experiment__protocol=protocol_with_version,
experiment__protocol_version=protocol_with_version.repocache.latest_version,
)
recipes.running_experiment.make(experiment_version=version)
recipes.running_experiment.make(runnable=version)
return version


Expand Down
14 changes: 8 additions & 6 deletions weblab/core/recipes.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
from model_mommy.recipe import Recipe, foreign_key, seq


user = Recipe('accounts.User', institution='UCL')
user = Recipe('accounts.User', institution='UCL', full_name=seq('test user '))

model = Recipe(
'ModelEntity',
entity_type='model', name=seq('mymodel')
entity_type='model', name=seq('my model')
)
protocol = Recipe(
'ProtocolEntity',
entity_type='protocol', name=seq('myprotocol')
entity_type='protocol', name=seq('my protocol')
)
fittingspec = Recipe(
'FittingSpec',
entity_type='fittingspec', name=seq('myspec'),
entity_type='fittingspec', name=seq('my spec'),
protocol=foreign_key(protocol),
)

Expand All @@ -38,13 +38,15 @@
protocol_version=foreign_key(cached_protocol_version),
)

runnable = Recipe('Runnable')

experiment_version = Recipe('ExperimentVersion', experiment=foreign_key(experiment))

running_experiment = Recipe('RunningExperiment', experiment_version=foreign_key(experiment_version))
running_experiment = Recipe('RunningExperiment', runnable=foreign_key(runnable))


dataset = Recipe('Dataset',
name=seq('mydataset'),
name=seq('my dataset'),
protocol=foreign_key(protocol))

dataset_file = Recipe('DatasetFile',
Expand Down
46 changes: 23 additions & 23 deletions weblab/entities/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -431,10 +431,10 @@ def test_complex_visibilities(self, client, logged_in_user, other_user, helpers)
assert len(interfaces) == 4

expected = {
'myprotocol1': {'required': ['p1r2'], 'optional': ['p1o2']},
'myprotocol2': {'required': ['p2r2'], 'optional': ['p2o2']},
'myprotocol3': {'required': ['p3r1'], 'optional': ['p3o1']},
'myprotocol4': {'required': ['p4r3'], 'optional': ['p4o3']},
protocol1.name: {'required': ['p1r2'], 'optional': ['p1o2']},
protocol2.name: {'required': ['p2r2'], 'optional': ['p2o2']},
protocol3.name: {'required': ['p3r1'], 'optional': ['p3o1']},
protocol4.name: {'required': ['p4r3'], 'optional': ['p4o3']},
}
for iface in interfaces:
assert iface['name'] in expected
Expand Down Expand Up @@ -483,7 +483,7 @@ def test_applies_visibility(self, client, helpers, experiment_version):
exp.model.set_version_visibility('latest', 'public')
exp.protocol.set_version_visibility('latest', 'public')
protocol_version = helpers.add_version(protocol, visibility='private')
recipes.experiment_version.make(
recipes.runnable.make(
experiment__protocol=protocol,
experiment__protocol_version=protocol.repocache.get_version(protocol_version.sha),
experiment__model=exp.model,
Expand Down Expand Up @@ -1666,7 +1666,7 @@ def test_download_archive(self, client, helpers):
archive = zipfile.ZipFile(BytesIO(response.content))
assert archive.filelist[0].filename == 'file1.txt'
assert response['Content-Disposition'] == (
'attachment; filename=%s_%s.zip' % (model.name, commit.sha)
'attachment; filename=%s_%s.zip' % (model.name.replace(' ', '_'), commit.sha)
)

def test_returns_404_if_no_commits_yet(self, logged_in_user, client):
Expand Down Expand Up @@ -2115,7 +2115,7 @@ def test_view_run_experiment_model(self, client, helpers, logged_in_user):
assert response.status_code == 200
assert response.context['object_list'] == [{'id': protocol.pk,
'entity': protocol,
'name': 'myprotocol1',
'name': protocol.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2147,14 +2147,14 @@ def test_view_run_experiment_model_multiple_users(self, client, helpers, logged_
assert response.status_code == 200
assert response.context['object_list'] == [{'id': protocol.pk,
'entity': protocol,
'name': 'myprotocol1',
'name': protocol.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
assert response.context['other_object_list'] == [
{'id': other_protocol.pk,
'entity': other_protocol,
'name': 'myprotocol2',
'name': other_protocol.name,
'versions': [{'commit': other_version2, 'tags': ['v1'], 'latest': True},
{'commit': other_version1, 'tags': [], 'latest': False}]},
]
Expand All @@ -2179,7 +2179,7 @@ def test_view_run_experiment_model_post(self, client, helpers, logged_in_user):
assert response.status_code == 200
assert response.context['object_list'] == [{'id': protocol.pk,
'entity': protocol,
'name': 'myprotocol1',
'name': protocol.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2229,7 +2229,7 @@ def test_view_run_experiment_model_post_exclude_existing(self, client, helpers,
assert response.status_code == 200
assert response.context['object_list'] == [{'id': protocol.pk,
'entity': protocol,
'name': 'myprotocol1',
'name': protocol.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2281,14 +2281,14 @@ def test_view_run_experiment_post_model_multiple_users(self, client, helpers, lo
assert response.status_code == 200
assert response.context['object_list'] == [{'id': protocol.pk,
'entity': protocol,
'name': 'myprotocol1',
'name': protocol.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
assert response.context['other_object_list'] == [
{'id': other_protocol.pk,
'entity': other_protocol,
'name': 'myprotocol2',
'name': other_protocol.name,
'versions': [{'commit': other_version2, 'tags': ['v1'], 'latest': True},
{'commit': other_version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2338,7 +2338,7 @@ def test_view_run_experiment_model_not_latest(self, client, helpers, logged_in_u
assert response.status_code == 200
assert response.context['object_list'] == [{'id': protocol.pk,
'entity': protocol,
'name': 'myprotocol1',
'name': protocol.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2384,7 +2384,7 @@ def test_view_run_experiment_protocol(self, client, helpers, logged_in_user):
assert response.status_code == 200
assert response.context['object_list'] == [{'id': model.pk,
'entity': model,
'name': 'mymodel1',
'name': model.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2416,14 +2416,14 @@ def test_view_run_experiment_protocol_multiple_users(self, client, helpers, logg
assert response.status_code == 200
assert response.context['object_list'] == [{'id': model.pk,
'entity': model,
'name': 'mymodel1',
'name': model.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
assert response.context['other_object_list'] == [
{'id': other_model.pk,
'entity': other_model,
'name': 'mymodel2',
'name': other_model.name,
'versions': [{'commit': other_version2, 'tags': ['v1'], 'latest': True},
{'commit': other_version1, 'tags': [], 'latest': False}]},
]
Expand All @@ -2446,7 +2446,7 @@ def test_view_run_experiment_protocol_post(self, client, helpers, logged_in_user
assert response.status_code == 200
assert response.context['object_list'] == [{'id': model.pk,
'entity': model,
'name': 'mymodel1',
'name': model.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2502,7 +2502,7 @@ def test_view_run_experiment_protocol_post_exclude_existing(self, client, helper
assert response.status_code == 200
assert response.context['object_list'] == [{'id': model.pk,
'entity': model,
'name': 'mymodel1',
'name': model.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2551,14 +2551,14 @@ def test_view_run_experiment_post_protocol_multiple_users(self, client, helpers,
assert response.status_code == 200
assert response.context['object_list'] == [{'id': model.pk,
'entity': model,
'name': 'mymodel1',
'name': model.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
assert response.context['other_object_list'] == [
{'id': other_model.pk,
'entity': other_model,
'name': 'mymodel2',
'name': other_model.name,
'versions': [{'commit': other_version2, 'tags': ['v1'], 'latest': True},
{'commit': other_version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2605,7 +2605,7 @@ def test_view_run_experiment_none_checked(self, client, helpers, logged_in_user)
assert response.status_code == 200
assert response.context['object_list'] == [{'id': protocol.pk,
'entity': protocol,
'name': 'myprotocol1',
'name': protocol.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
Expand Down Expand Up @@ -2653,7 +2653,7 @@ def test_view_run_experiment_protocol_not_latest(self, client, helpers, logged_i
assert response.status_code == 200
assert response.context['object_list'] == [{'id': model.pk,
'entity': model,
'name': 'mymodel1',
'name': model.name,
'versions': [{'commit': version2, 'tags': ['v1'], 'latest': True},
{'commit': version1, 'tags': [], 'latest': False}]},
]
Expand Down
2 changes: 1 addition & 1 deletion weblab/entities/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,7 @@ def check_access_token(self, token):
"""
from entities.models import AnalysisTask
from experiments.models import RunningExperiment
entity_field = 'experiment_version__experiment__%s' % self.kwargs['entity_type']
entity_field = 'runnable__experimentversion__experiment__%s' % self.kwargs['entity_type']
self_id = self._get_object().id
return (RunningExperiment.objects.filter(
id=token,
Expand Down
6 changes: 3 additions & 3 deletions weblab/experiments/apps.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from django.apps import AppConfig
from django.db.models.signals import pre_delete

from .signals import experiment_version_deleted, running_experiment_deleted
from .signals import runnable_deleted, running_experiment_deleted


class ExperimentsConfig(AppConfig):
name = 'experiments'

def ready(self):
from .models import ExperimentVersion, RunningExperiment
from .models import Runnable, RunningExperiment
Comment thread
sroderick-g5sro marked this conversation as resolved.

pre_delete.connect(experiment_version_deleted, ExperimentVersion)
pre_delete.connect(runnable_deleted, Runnable)
pre_delete.connect(running_experiment_deleted, RunningExperiment)
6 changes: 3 additions & 3 deletions weblab/experiments/emails.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
from django.template.loader import render_to_string


def send_experiment_finished_email(experiment_version):
author = experiment_version.author
def send_experiment_finished_email(runnable):
author = runnable.author

if author.receive_emails:
body = render_to_string(
'emails/experiment_finished.txt',
{
'user': author,
'experiment_version': experiment_version,
'runnable': runnable,
'base_url': settings.BASE_URL,
}
)
Expand Down
27 changes: 27 additions & 0 deletions weblab/experiments/migrations/0025_auto_20200316_1652.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2020-03-16 16:52
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('experiments', '0024_merge_20200211_0929'),
]

operations = [
migrations.RenameModel(
old_name='ExperimentVersion',
new_name='Runnable',
),
migrations.RemoveIndex(
model_name='runnable',
name='experiments_created_00e2f1_idx',
),
migrations.AddIndex(
model_name='runnable',
index=models.Index(fields=['created_at'], name='experiments_created_a4e4b7_idx'),
),
]
27 changes: 27 additions & 0 deletions weblab/experiments/migrations/0026_experimentversion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2020-03-16 17:00
from __future__ import unicode_literals

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):
Comment thread
sroderick-g5sro marked this conversation as resolved.

dependencies = [
('experiments', '0025_auto_20200316_1652'),
]

operations = [
migrations.CreateModel(
name='ExperimentVersion',
fields=[
('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')),
('experiment_key', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='versions_copy', to='experiments.Experiment')),
],
options={
'abstract': False,
},
bases=('experiments.runnable',),
),
]
35 changes: 35 additions & 0 deletions weblab/experiments/migrations/0027_move_runnable.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2020-03-16 17:02
from __future__ import unicode_literals

from django.db import migrations



def runnable_to_exp_version(apps, schema_editor):
ExperimentVersion = apps.get_model('experiments', 'ExperimentVersion')
Runnable = apps.get_model('experiments', 'Runnable')
for runnable in Runnable.objects.all():
experiment_version = ExperimentVersion(runnable_ptr=runnable,
experiment_key_id=runnable.experiment_id)
experiment_version.save_base(raw=True)


def exp_version_to_runnable(apps, schema_editor):
ExperimentVersion = apps.get_model('experiments', 'ExperimentVersion')
Runnable = apps.get_model('experiments', 'Runnable')
for experiment_version in ExperimentVersion.objects.all():
runnable = experiment_version.runnable_ptr
runnable.experiment_id = experiment_version.experiment_key_id
runnable.save()


class Migration(migrations.Migration):

dependencies = [
('experiments', '0026_experimentversion'),
]

operations = [
migrations.RunPython(runnable_to_exp_version, exp_version_to_runnable),
]
Loading