Navigation Menu

Skip to content
This repository has been archived by the owner on Aug 19, 2019. It is now read-only.

Commit

Permalink
API v1 fixes
Browse files Browse the repository at this point in the history
## Overview

- Fix retrieval of evaluations (only current version is supported, 400 in case older version is requested)
- Fix deleting strs, regions form a panel
- Fix retrieving regions, strs from a panel with an old panel id

## Tests

```
=== 295 passed, 10 warnings in 944.05 seconds ===
```
  • Loading branch information
Oleg Gerasimenko committed Jul 26, 2019
1 parent a7122c7 commit 37ee9cd
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 39 deletions.
2 changes: 1 addition & 1 deletion VERSION
@@ -1 +1 @@
2.4.2
2.4.3b1
40 changes: 31 additions & 9 deletions panelapp/api/v1/tests/test_api_v1.py
Expand Up @@ -350,12 +350,33 @@ def test_genes_endpoint_in_panel_version(self):
gene_symbols_v1 = [g["entity_name"] for g in j["results"]]
self.assertNotIn(gene_symbol, gene_symbols_v1)

def test_genes_endpoint_in_panel_version_old_pk(self):
gene_symbol = self.gpes.gene.get("gene_symbol")
self.gps_public.delete_gene(gene_symbol)
self.gps_public = self.gps_public.panel.active_panel

r = self.client.get(
reverse_lazy("api:v1:panels_genes-list", args=(self.gpes.panel.panel.old_pk,))
+ "?version=0.0"
)
j = r.json()
self.assertEqual(r.status_code, 200)
gene_symbols_v0 = [g["entity_name"] for g in j["results"]]
self.assertIn(gene_symbol, gene_symbols_v0)
r = self.client.get(
reverse_lazy("api:v1:panels_genes-list", args=(self.gpes.panel.panel.old_pk,))
)
j = r.json()
self.assertEqual(r.status_code, 200)
gene_symbols_v1 = [g["entity_name"] for g in j["results"]]
self.assertNotIn(gene_symbol, gene_symbols_v1)

def test_regions_endpoint_in_panel_version_old_panel_pk(self):
name = self.region.name
self.gps.delete_region(name)

r = self.client.get(
reverse_lazy("api:v1:panels_regions-list", args=(self.region.panel.panel.old_pk, ))
reverse_lazy("api:v1:panels-regions-list", args=(self.region.panel.panel.old_pk, ))
+ "?version=0.0"
)
j = r.json()
Expand All @@ -366,15 +387,15 @@ def test_regions_endpoint_in_panel_version(self):
self.gps.delete_region(name)

r = self.client.get(
reverse_lazy("api:v1:panels_regions-list", args=(self.region.panel.panel.pk, ))
reverse_lazy("api:v1:panels-regions-list", args=(self.region.panel.panel.pk, ))
+ "?version=0.0"
)
j = r.json()
self.assertEqual(r.status_code, 200)
names_v0 = [g["entity_name"] for g in j["results"]]
self.assertIn(name, names_v0)
r = self.client.get(
reverse_lazy("api:v1:panels_regions-list", args=(self.region.panel.panel.pk, ))
reverse_lazy("api:v1:panels-regions-list", args=(self.region.panel.panel.pk, ))
+ "?version=0.1"
)
j = r.json()
Expand Down Expand Up @@ -528,7 +549,8 @@ def test_strs_endpoint_in_panel_version_old_panel_pk(self):

def test_strs_endpoint_in_panel_version(self):
name = self.str.name
self.gps.delete_str(name)
deleted = self.gps.delete_str(name)
self.assertTrue(deleted)

r = self.client.get(
reverse_lazy("api:v1:panels-strs-list", args=(self.str.panel.panel.pk, ))
Expand Down Expand Up @@ -660,12 +682,12 @@ def test_genes_evaluations_old_version(self):
:return:
"""
gene_symbol = self.gpes.gene_core.gene_symbol
self.gps.delete_gene(gene_symbol)
self.gpes.panel.delete_gene(gene_symbol)

r = self.client.get(
reverse_lazy(
"api:v1:strs-evaluations-list",
args=(self.gps.panel.panel.pk, gene_symbol),
args=(self.gpes.panel.panel.pk, gene_symbol),
) + "?version=0.0"
)
self.assertEqual(r.status_code, 400)
Expand All @@ -687,7 +709,7 @@ def test_strs_evaluations_old_version(self):
:return:
"""
name = self.str.name
self.gps.delete_str(name)
self.str.panel.delete_str(name)

r = self.client.get(
reverse_lazy(
Expand All @@ -713,8 +735,8 @@ def test_region_evaluations_old_version(self):
:return:
"""
name = self.str.name
self.gps.delete_region(name)
name = self.region.name
self.region.panel.delete_region(name)

r = self.client.get(
reverse_lazy(
Expand Down
66 changes: 45 additions & 21 deletions panelapp/api/v1/viewsets.py
Expand Up @@ -60,6 +60,10 @@ class ReadOnlyListViewset(
CONFIDENCE_CHOICES = ((3, "Green"), (2, "Amber"), (1, "Red"), (0, "No List"))


class Http400(Exception):
pass


class NumberChoices(filters.ChoiceFilter, filters.NumberFilter):
pass

Expand Down Expand Up @@ -221,6 +225,7 @@ class EntityViewSet(viewsets.mixins.ListModelMixin, viewsets.GenericViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
lookup_field = "entity_name"
lookup_url_kwarg = "entity_name"
recent_version_only = False

def filter_list(self, obj):
entity_name = self.request.query_params.get("entity_name")
Expand Down Expand Up @@ -292,13 +297,21 @@ def list(self, request, *args, **kwargs):
detail="Incorrect version supplied", code="incorrect_version"
)

latest = GenePanelSnapshot.objects.filter(panel_id=self.kwargs["panel_pk"]).first()
panel_id = self.kwargs["panel_pk"]
id_kwarg = 'panel_id' if panel_id.isdigit() else 'panel__old_pk'
filter_kwargs = {
id_kwarg: panel_id
}

latest = GenePanelSnapshot.objects.filter(**filter_kwargs).first()

if str(latest.major_version) == major_version and str(latest.minor_version) == minor_version:
return super().list(request, *args, **kwargs)

obj = HistoricalSnapshot.objects.filter(
panel__pk=self.kwargs["panel_pk"],
if self.recent_version_only:
raise Http400('Endpoint doesnt support version parameter')

obj = HistoricalSnapshot.objects.filter(**filter_kwargs).filter(
major_version=major_version,
minor_version=minor_version,
).first()
Expand All @@ -311,22 +324,37 @@ def list(self, request, *args, **kwargs):
else:
return super().list(request, *args, **kwargs)

def dispatch(self, request, *args, **kwargs):
try:
response = super().dispatch(request, *args, **kwargs)
except Http400 as e:
response = Response({"error": str(e)}, status=400)
response = self.finalize_response(request, response, *args, **kwargs)
return response

def get_panel(self):
obj = GenePanelSnapshot.objects.get_active_annotated(
all=True, internal=True, deleted=True, name=self.kwargs["panel_pk"]
).first()

if not obj:
raise Http404

version = self.request.query_params.get("version")
if version:
obj = GenePanelSnapshot.objects.get_panel_version(
name=self.kwargs["panel_pk"], version=version
).first()
try:
major_version, minor_version = version.split(".")
if str(obj.major_version) == major_version and str(obj.minor_version) == minor_version:
return obj
else:
raise Http400('Endpoint doesnt support version parameter')
except ValueError:
raise APIException(
detail="Incorrect version supplied", code="incorrect_version"
)
else:
obj = GenePanelSnapshot.objects.get_active_annotated(
all=True, internal=True, deleted=True, name=self.kwargs["panel_pk"]
).first()

if obj:
return obj

raise Http404


class GeneViewSet(EntityViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
Expand All @@ -335,19 +363,13 @@ class GeneViewSet(EntityViewSet):
lookup_collection = "genes"

def get_queryset(self):
version = self.request.query_params.get("version", None)
if version:
return GenePanelEntrySnapshot.objects.none()
else:
obj = GenePanelSnapshot.objects.get_active_annotated(
all=True, internal=True, deleted=True, name=self.kwargs["panel_pk"]
).first()
return obj.get_all_genes.prefetch_related("evidence", "tags")
return self.get_panel().get_all_genes.prefetch_related("evidence", "tags")


class GeneEvaluationsViewSet(EntityViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
serializer_class = EvaluationSerializer
recent_version_only = True

def get_queryset(self):
panel = self.get_panel()
Expand All @@ -371,6 +393,7 @@ def get_queryset(self):
class STREvaluationsViewSet(EntityViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
serializer_class = EvaluationSerializer
recent_version_only = True

def get_queryset(self):
panel = self.get_panel()
Expand All @@ -395,6 +418,7 @@ def get_queryset(self):
class RegionEvaluationsViewSet(EntityViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
serializer_class = EvaluationSerializer
recent_version_only = True

def get_queryset(self):
panel = self.get_panel()
Expand Down
16 changes: 8 additions & 8 deletions panelapp/panels/models/genepanelsnapshot.py
Expand Up @@ -1073,10 +1073,10 @@ def delete_str(self, str_name, increment=True, user=None):
if self.has_str(str_name):
if increment:
self = self.increment_version()
else:
self.cached_strs.get(name=str_name).delete()
self.clear_cache()
self.clear_django_cache()

self.cached_strs.get(name=str_name).delete()
self.clear_cache()
self.clear_django_cache()

if user:
self.add_activity(
Expand All @@ -1094,10 +1094,10 @@ def delete_region(self, region_name, increment=True, user=None):
if self.has_region(region_name):
if increment:
self = self.increment_version()
else:
self.cached_regions.get(name=region_name).delete()
self.clear_cache()
self.clear_django_cache()

self.cached_regions.get(name=region_name).delete()
self.clear_cache()
self.clear_django_cache()

if user:
self.add_activity(
Expand Down

0 comments on commit 37ee9cd

Please sign in to comment.