diff --git a/gracedb/superevents/api/mixins.py b/gracedb/superevents/api/mixins.py index c37e6828537834f8b4a2996ecf54be617d2cfec9..373a67bfea5ad51fa08f48248ae2f00aa4087c07 100644 --- a/gracedb/superevents/api/mixins.py +++ b/gracedb/superevents/api/mixins.py @@ -28,3 +28,19 @@ class GetParentSupereventMixin(GetParentMixin): # Currently, superevent_id ~ S0001, where 1 is the PK return {'id': int(superevent_id[1:])} + +class BaseGetObjectMixin(object): + query_field = None + + def __init__(self, *args, **kwargs): + super(BaseGetObjectMixin, self).__init__(*args, **kwargs) + if self.query_field is None: + self.query_field = self.lookup_field + + def get_object(self): + # TODO: do we need some kind of permissions check in here somewhere? + queryset = self.filter_queryset(self.get_queryset()) + query_value = self.kwargs.get(self.lookup_field) + filter_kwargs = {self.query_field: query_value} + obj = get_object_or_404(queryset, **filter_kwargs) + return obj diff --git a/gracedb/superevents/api/views.py b/gracedb/superevents/api/views.py index e2fc68bca2166327ff121ed4b72d34446812d0d9..3a5b2332734fe2aaabc74d8def6bb194b47917e4 100644 --- a/gracedb/superevents/api/views.py +++ b/gracedb/superevents/api/views.py @@ -22,7 +22,7 @@ from events.view_utils import reverse as gracedb_reverse #from events.api.views import IsAuthorizedForPipeline, LigoLwRenderer from events.api.backends import LigoAuthentication -from .mixins import GetParentSupereventMixin +from .mixins import GetParentSupereventMixin, BaseGetObjectMixin from .paginators import BasePaginationFactory, CustomLabelPagination, \ CustomLogTagPagination, CustomSupereventPagination from .serializers import SupereventSerializer, SupereventUpdateSerializer, \ @@ -111,11 +111,13 @@ class SupereventEventViewSet(mixins.ListModelMixin, class SupereventLabelViewSet(GetParentSupereventMixin, + BaseGetObjectMixin, viewsets.ModelViewSet): """Superevent labels""" serializer_class = SupereventLabelSerializer pagination_class = CustomLabelPagination lookup_field = 'label_name' + query_field = 'label__name' def get_queryset(self): superevent = self.get_parent() @@ -123,13 +125,6 @@ class SupereventLabelViewSet(GetParentSupereventMixin, queryset = superevent.labelling_set.all() return queryset - def get_object(self): - queryset = self.filter_queryset(self.get_queryset()) - label_name = self.kwargs.get(self.lookup_field, None) - filter_kwargs = {'label__name': label_name} - obj = get_object_or_404(queryset, **filter_kwargs) - return obj - def destroy(self, request, *args, **kwargs): instance = self.get_object() remove_label_from_superevent(instance, request.user, @@ -141,6 +136,7 @@ class SupereventLogViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, GetParentSupereventMixin, + BaseGetObjectMixin, viewsets.GenericViewSet): """ View for log messages attached to a superevent. @@ -157,18 +153,9 @@ class SupereventLogViewSet(mixins.ListModelMixin, # filter for those tagged with external access tagname if is_external(request.user) return queryset - # TODO: generalize this method, can be used for superevent, superevent-event, etc. - def get_object(self): - logger.warning('can probably do this generically on some mixin') - queryset = self.filter_queryset(self.get_queryset()) - N = self.kwargs.get(self.lookup_field, None) - filter_kwargs = {'N': N} - obj = get_object_or_404(queryset, **filter_kwargs) - logger.warning('check permissions here? or just in get_queryset?') - return obj - class SupereventLogTagViewSet(GetParentSupereventMixin, + BaseGetObjectMixin, viewsets.ModelViewSet): """ View for tags attached to a log message which is attached to a superevent. @@ -176,6 +163,7 @@ class SupereventLogTagViewSet(GetParentSupereventMixin, serializer_class = SupereventLogTagSerializer pagination_class = CustomLogTagPagination lookup_field = 'tag_name' + query_field = 'name' def get_parent_log(self): # TODO: check superevent permissions here @@ -187,18 +175,12 @@ class SupereventLogTagViewSet(GetParentSupereventMixin, parent_log = self.get_parent_log() return parent_log.tags.all() - def get_object(self): - queryset = self.filter_queryset(self.get_queryset()) - tag_name = self.kwargs.get(self.lookup_field, None) - filter_kwargs = {'name': tag_name} - obj = get_object_or_404(queryset, **filter_kwargs) - return obj - def perform_destroy(self, instance): parent_log = self.get_parent_log() remove_tag_from_log(parent_log, instance, self.request.user, add_log_message=True, issue_alert=True) + # TODO: add permissions to this viewset class SupereventFileViewSet(GetParentSupereventMixin, viewsets.ViewSet): @@ -261,6 +243,7 @@ class SupereventVOEventViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, GetParentSupereventMixin, + BaseGetObjectMixin, viewsets.GenericViewSet): """ View for VOEvents attached to a superevent. @@ -275,14 +258,6 @@ class SupereventVOEventViewSet(mixins.ListModelMixin, # filter for those tagged with external access tagname if is_external(request.user) return queryset - # TODO: generalize this method, can be used for superevent, superevent-event, etc. - def get_object(self): - queryset = self.filter_queryset(self.get_queryset()) - N = self.kwargs.get(self.lookup_field, None) - filter_kwargs = {'N': N} - obj = get_object_or_404(queryset, **filter_kwargs) - return obj - class SupereventEMObservationViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, @@ -302,10 +277,3 @@ class SupereventEMObservationViewSet(mixins.ListModelMixin, # filter for those tagged with external access tagname if is_external(request.user) return queryset - # TODO: generalize this method, can be used for superevent, superevent-event, etc. - def get_object(self): - queryset = self.filter_queryset(self.get_queryset()) - N = self.kwargs.get(self.lookup_field, None) - filter_kwargs = {'N': N} - obj = get_object_or_404(queryset, **filter_kwargs) - return obj