Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
131 changes: 131 additions & 0 deletions weblab/datasets/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -637,3 +637,134 @@ def test_nonexistent_dataset_redirects_anonymous_to_login(self, client, helpers,
def test_nonexistent_dataset_generates_404_for_user(self, client, logged_in_user, helpers, recipe, url):
response = client.get(url % 10000)
assert response.status_code == 404


@pytest.mark.django_db
class TestDatasetCompareFittingResultsView:
def test_shows_fittings_related_to_dataset(self, client, fittingresult_version):
fit = fittingresult_version.fittingresult

# should not be included, as it uses a different dataset
recipes.fittingresult_version.make()

response = client.get('/datasets/%d/fittings' % fit.dataset.pk)

assert response.status_code == 200
assert response.context['comparisons'] == [(fit.model, [fit])]

def test_groups_by_model(self, client, helpers, public_dataset):
m1, m2 = recipes.model.make(_quantity=2)
m1v = helpers.add_cached_version(m1, visibility='public')
m2v = helpers.add_cached_version(m2, visibility='public')

Comment thread
helenst marked this conversation as resolved.
# Create publicly visible fitting result versions
fit1_m1 = recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model=m1,
fittingresult__model_version=m1v,
fittingresult__fittingspec_version__visibility='public',
fittingresult__protocol_version__visibility='public',
).fittingresult

fit2_m1 = recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model=m1,
fittingresult__model_version=m1v,
fittingresult__fittingspec_version__visibility='public',
fittingresult__protocol_version__visibility='public',
).fittingresult

fit3_m2 = recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model=m2,
fittingresult__model_version=m2v,
fittingresult__fittingspec_version__visibility='public',
fittingresult__protocol_version__visibility='public',
).fittingresult

response = client.get('/datasets/%d/fittings' % public_dataset.id)

assert response.status_code == 200
assert response.context['comparisons'] == [
(m1, [fit2_m1, fit1_m1]),
(m2, [fit3_m2]),
]

def test_multiple_model_versions_for_dataset(self, client, helpers, public_dataset):
m1, m2 = recipes.model.make(_quantity=2)
m1v1 = helpers.add_cached_version(m1, visibility='public')
m1v2 = helpers.add_cached_version(m1, visibility='public')
m2v = helpers.add_cached_version(m2, visibility='public')

# Create publicly visible fitting result versions
fit1_m1v1 = recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model=m1,
fittingresult__model_version=m1v1,
fittingresult__fittingspec_version__visibility='public',
fittingresult__protocol_version__visibility='public',
).fittingresult

fit2_m1v2 = recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model=m1,
fittingresult__model_version=m1v2,
fittingresult__fittingspec_version__visibility='public',
fittingresult__protocol_version__visibility='public',
).fittingresult

fit3_m2v = recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model=m2,
fittingresult__model_version=m2v,
fittingresult__fittingspec_version__visibility='public',
fittingresult__protocol_version__visibility='public',
).fittingresult

response = client.get(
'/datasets/%d/fittings' % public_dataset.id
)

assert response.status_code == 200
assert response.context['comparisons'] == [
(m1, [fit2_m1v2, fit1_m1v1]),
(m2, [fit3_m2v]),
]

def test_ensure_private_results_are_not_shown(self, client, public_dataset):
recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model_version__visibility='private',
fittingresult__protocol_version__visibility='public',
fittingresult__fittingspec_version__visibility='public',
)

recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model_version__visibility='public',
fittingresult__protocol_version__visibility='private',
fittingresult__fittingspec_version__visibility='public',
)

recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model_version__visibility='public',
fittingresult__protocol_version__visibility='public',
fittingresult__fittingspec_version__visibility='private',
)

fit = recipes.fittingresult_version.make(
fittingresult__dataset=public_dataset,
fittingresult__model_version__visibility='public',
fittingresult__protocol_version__visibility='public',
fittingresult__fittingspec_version__visibility='public',
).fittingresult

response = client.get(
'/datasets/%d/fittings' % public_dataset.id
)

assert response.status_code == 200
assert response.context['comparisons'] == [
(fit.model, [fit]),
]
6 changes: 6 additions & 0 deletions weblab/datasets/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,10 @@
views.DatasetRenameView.as_view(),
name='rename',
),

url(
r'^(?P<pk>\d+)/fittings$',
views.DatasetCompareFittingResultsView.as_view(),
name='compare_fittings',
),
]
38 changes: 38 additions & 0 deletions weblab/datasets/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import mimetypes
import os.path
import shutil
from itertools import groupby
from zipfile import ZipFile

from braces.views import UserFormKwargsMixin
Expand All @@ -25,6 +26,7 @@
from accounts.forms import OwnershipTransferForm
from core.combine import ManifestWriter
from core.visibility import VisibilityMixin
from fitting.models import FittingResult

from .forms import (
DatasetAddFilesForm,
Expand Down Expand Up @@ -332,3 +334,39 @@ def post(self, request, *args, **kwargs):
def get_success_url(self, *args, **kwargs):
ns = self.request.resolver_match.namespace
return reverse(ns + ':detail', args=[self._get_object().id])


class DatasetCompareFittingResultsView(DetailView):
"""
List fitting results for this dataset, with selection boxes for comparison
"""
model = Dataset
template_name = 'datasets/compare_fittings.html'

def _get_object(self):
if not hasattr(self, 'object'):
self.object = self.get_object()
return self.object

def get_context_data(self, **kwargs):
dataset = self._get_object()

fittings = FittingResult.objects.filter(
dataset=dataset.pk,
).select_related(
'model',
).order_by('model', '-model_version__timestamp', '-protocol_version__timestamp')

# Ensure all are visible to user
fittings = [
fit for fit in fittings
if fit.is_visible_to_user(self.request.user)
]

# Group fittings by model
kwargs['comparisons'] = [
(obj, list(fits))
for (obj, fits) in groupby(fittings, lambda fit: fit.model)
]

return super().get_context_data(**kwargs)
5 changes: 5 additions & 0 deletions weblab/entities/templatetags/entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,11 @@ def name_of_protocol(experiment):
return '%s @ %s' % (experiment.protocol.name, experiment.protocol_version.get_name())


@register.filter
def name_of_fittingspec(experiment):
return '%s @ %s' % (experiment.fittingspec.name, experiment.fittingspec_version.get_name())


def _url_friendly_label(entity, version):
"""
Get URL-friendly version label for a commit
Expand Down
Loading