diff --git a/gracedb/superevents/api/serializers.py b/gracedb/superevents/api/serializers.py index 680b38d2f4809b4243b7dcae8ea208a666ccc4ed..1e47d7c01a56e68b1f10a2ed7ebc908321c87343 100644 --- a/gracedb/superevents/api/serializers.py +++ b/gracedb/superevents/api/serializers.py @@ -2,7 +2,7 @@ from rest_framework import serializers, validators from django.contrib.auth import get_user_model from django.utils.translation import ugettext_lazy as _ from django.conf import settings -from ..models import Superevent, Labelling, Log, VOEvent +from ..models import Superevent, Labelling, Log, VOEvent, EMObservation from ..forms import LogCreateForm from ..utils import create_superevent, update_superevent, add_tag_to_log, \ create_log, add_event_to_superevent, add_label_to_superevent @@ -10,7 +10,7 @@ from ..utils import create_superevent, update_superevent, add_tag_to_log, \ from .fields import ParentObjectDefault from .settings import SUPEREVENT_LOOKUP_FIELD -from events.models import Event, Label, Tag +from events.models import Event, Label, Tag, EMGroup from events.view_utils import reverse as gracedb_reverse from events.api.fields import EventGraceidField @@ -380,38 +380,47 @@ class SupereventVOEventSerializer(serializers.ModelSerializer): } return link_dict - #def get_text(self, obj): - # text = None - # if obj.filename: - # filepath = os.path.join(obj.superevent.datadir, obj.filename) - # text = open(filepath, 'r').read() + # TODO: + # VOEvent creation!! - # return text +class SupereventEMObservationSerializer(serializers.ModelSerializer): + # Read only fields + submitter = serializers.SlugRelatedField(slug_field='username', + read_only=True) + created = serializers.DateTimeField(format=settings.GRACE_STRFTIME_FORMAT, + read_only=True) + footprint_count = serializers.SerializerMethodField(read_only=True) + footprints = serializers.SerializerMethodField(read_only=True) - #def __init__(self, *args, **kwargs): - # super(SupereventLogSerializer, self).__init__(*args, **kwargs) - # self.fields['filename'].read_only = True - # self.fields['file_version'].read_only = True - - #def get_self(self, obj): - # superevent_id = self.context['view'].kwargs.get( - # SUPEREVENT_LOOKUP_FIELD) - # return gracedb_reverse('superevent-log-detail', args=[ - # superevent_id, obj.N], request=self.context['request']) - - #def create(self, validated_data): - # # Check user permissions here, or somewhere else? Maybe just on viewset - # # create resource - - # # Convert to be used with Django form for Logs - # validated_data['issuer'] = validated_data.pop('submitter').id - # validated_data['superevent'] = validated_data['superevent'].id - # if validated_data.has_key('data_file'): - # validated_data['filename'] = validated_data['data_file'].name + # Both + group = serializers.SlugRelatedField(slug_field='name', + queryset=EMGroup.objects.all()) - # form = LogCreateForm(validated_data, validated_data) - # if form.is_valid(): - # obj = form.save() + # Write only fields + user = serializers.HiddenField(write_only=True, + default=serializers.CurrentUserDefault()) - # return obj + class Meta: + model = EMObservation + fields = ('created', 'N', 'submitter', 'group', 'ra', 'raWidth', 'dec', + 'decWidth', 'footprint_count', 'footprints', 'user') + + def get_footprint_count(self, obj): + return obj.emfootprint_set.count() + + def get_footprints(self, obj): + return [{ + 'exposure_time': fp.exposure_time, + 'start_time': fp.start_time.strftime( + settings.GRACE_STRFTIME_FORMAT), + 'N': fp.N, + 'raWidth': fp.raWidth, + 'decWidth': fp.decWidth, + 'ra': fp.ra, + 'dec': fp.dec, + } for fp in obj.emfootprint_set.all().order_by('-N')] + return 'test' + + # TODO: + # EMObservation creation!! diff --git a/gracedb/superevents/api/urls.py b/gracedb/superevents/api/urls.py index a02bee915297947590ea922bf51f483e1b531f4a..8b02abf6c4e997c66b510d19b1cc822160ae282f 100644 --- a/gracedb/superevents/api/urls.py +++ b/gracedb/superevents/api/urls.py @@ -61,6 +61,15 @@ suburlpatterns = [ SupereventVOEventViewSet.lookup_field), SupereventVOEventViewSet.as_view({'get': 'retrieve'}), name='superevent-voevent-detail'), + + # EMObservations + url(r'^emobservations/$', SupereventEMObservationViewSet.as_view( + {'get': 'list', 'post': 'create'}), + name='superevent-emobservation-list'), + url(r'^emobservations/(?P<{lookup_field}>\d+)/$'.format(lookup_field= + SupereventEMObservationViewSet.lookup_field), + SupereventEMObservationViewSet.as_view({'get': 'retrieve'}), + name='superevent-emobservation-detail'), ] urlpatterns = router.urls + [ diff --git a/gracedb/superevents/api/view_templates.py b/gracedb/superevents/api/view_templates.py index 27e6d621aed6567d1036cd3667364a201877caaa..f80784f32eb5395066d28417b6a4ad953904a4c7 100644 --- a/gracedb/superevents/api/view_templates.py +++ b/gracedb/superevents/api/view_templates.py @@ -1,7 +1,8 @@ from events.view_utils import reverse from .views import SupereventViewSet, SupereventEventViewSet, \ SupereventLabelViewSet, SupereventLogViewSet, SupereventLogTagViewSet, \ - SupereventFileViewSet, SupereventVOEventViewSet + SupereventFileViewSet, SupereventVOEventViewSet, \ + SupereventEMObservationViewSet # Placeholder parameters for getting URLs with reverse @@ -13,6 +14,7 @@ PH = { SupereventLogTagViewSet.lookup_field: 'TAG_NAME', # tag name SupereventFileViewSet.lookup_field: 'FILE_NAME', # file name SupereventVOEventViewSet.lookup_field: '4444', # VOEvent number (N) + SupereventEMObservationViewSet.lookup_field: '5555', # EMObservation number (N) } @@ -38,6 +40,9 @@ def construct_api_url_templates(request=None): 'superevent-voevent-list': [], 'superevent-voevent-detail': [ PH[SupereventVOEventViewSet.lookup_field]], + 'superevent-emobservation-list': [], + 'superevent-emobservation-detail': [ + PH[SupereventEMObservationViewSet.lookup_field]], } # Dict of URL templates: diff --git a/gracedb/superevents/api/views.py b/gracedb/superevents/api/views.py index 8465abcffa34eea40e8ea793126407216f71c5cf..e2fc68bca2166327ff121ed4b72d34446812d0d9 100644 --- a/gracedb/superevents/api/views.py +++ b/gracedb/superevents/api/views.py @@ -28,7 +28,7 @@ from .paginators import BasePaginationFactory, CustomLabelPagination, \ from .serializers import SupereventSerializer, SupereventUpdateSerializer, \ SupereventEventSerializer, SupereventLabelSerializer, \ SupereventLogSerializer, SupereventLogTagSerializer, \ - SupereventVOEventSerializer + SupereventVOEventSerializer, SupereventEMObservationSerializer from .settings import SUPEREVENT_LOOKUP_FIELD, SUPEREVENT_LOOKUP_REGEX @@ -283,3 +283,29 @@ class SupereventVOEventViewSet(mixins.ListModelMixin, obj = get_object_or_404(queryset, **filter_kwargs) return obj + +class SupereventEMObservationViewSet(mixins.ListModelMixin, + mixins.RetrieveModelMixin, + mixins.CreateModelMixin, + GetParentSupereventMixin, + viewsets.GenericViewSet): + """ + View for EMObservations attached to a superevent. + """ + serializer_class = SupereventEMObservationSerializer + pagination_class = BasePaginationFactory(results_name='observations') + lookup_field = 'N' + + def get_queryset(self): + superevent = self.get_parent() + queryset = superevent.emobservation_set.all() + # 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