From 0132ced8e1b69ec2a5573e96c6a19217a08c7b12 Mon Sep 17 00:00:00 2001 From: Tanner Prestegard <tanner.prestegard@ligo.org> Date: Thu, 7 Jun 2018 15:23:44 -0500 Subject: [PATCH] Move some imports in superevents/serializers.py Some imports in superevents/serializers.py were moved to function-level. This is because several functions from superevents/utils.py are used in the serializers for deserialization (object creation), but the serializers are also used in the alerts app to serialize objects to dicts. This created a circular import issue. We also fix some of the reverses so that they work without a request object being present. --- gracedb/superevents/api/serializers.py | 48 +++++++++++++++++--------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/gracedb/superevents/api/serializers.py b/gracedb/superevents/api/serializers.py index 36ef1f45d..16f14785c 100644 --- a/gracedb/superevents/api/serializers.py +++ b/gracedb/superevents/api/serializers.py @@ -3,10 +3,6 @@ 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, 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, \ - get_or_create_tag, get_or_create_tags from .fields import ParentObjectDefault from .settings import SUPEREVENT_LOOKUP_FIELD @@ -73,6 +69,8 @@ class SupereventSerializer(serializers.ModelSerializer): return data def create(self, validated_data): + # Function-level import to prevent circular import in alerts + from ..utils import create_superevent submitter = validated_data.pop('user') # TODO: @@ -89,7 +87,8 @@ class SupereventSerializer(serializers.ModelSerializer): def get_links(self, obj): bound_reverse = functools.partial(gracedb_reverse, - args=[obj.superevent_id], request=self.context['request']) + args=[obj.superevent_id], + request=self.context.get('request', None)) link_dict = { 'events': bound_reverse('superevent-event-list'), 'labels': bound_reverse('superevent-label-list'), @@ -135,11 +134,15 @@ class SupereventUpdateSerializer(SupereventSerializer): return data def update(self, instance, validated_data): + # Function-level import to prevent circular import in alerts + from ..utils import update_superevent + # CurrentUserDefault doesn't work for PATCH requests since the # serializer has self.partial == True, the default function is never # called to fill empty data values. So we just grab the user directly # from the request. - updater = self.context['request'].user + request = self.context.get('request', None) + updater = getattr(request, 'user', None) instance = update_superevent(instance, updater, issue_alert=True, **validated_data) return instance @@ -164,7 +167,7 @@ class SupereventEventSerializer(serializers.ModelSerializer): def get_self(self, obj): return gracedb_reverse('event-detail', args=[obj.graceid()], - request=self.context['request']) + request=self.context.get('request', None)) def validate(self, data): data = super(SupereventEventSerializer, self).validate(data) @@ -174,6 +177,9 @@ class SupereventEventSerializer(serializers.ModelSerializer): return data def create(self, validated_data): + # Function-level import to prevent circular import in alerts + from ..utils import add_event_to_superevent + superevent = validated_data.pop('superevent') event = validated_data.pop('event') submitter = validated_data.pop('user') @@ -205,12 +211,14 @@ class SupereventLabelSerializer(serializers.ModelSerializer): 'superevent') def get_self(self, obj): - superevent_id = self.context['view'].kwargs.get( - SUPEREVENT_LOOKUP_FIELD) return gracedb_reverse('superevent-label-detail', args=[ - superevent_id, obj.label.name], request=self.context['request']) + obj.superevent.superevent_id, obj.label.name], + request=self.context.get('request', None)) def create(self, validated_data): + # Function-level import to prevent circular import in alerts + from ..utils import add_label_to_superevent + creator = validated_data.pop('submitter') superevent = validated_data.pop('superevent') label = validated_data.pop('label') @@ -257,10 +265,9 @@ class SupereventLogSerializer(serializers.ModelSerializer): 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']) + obj.superevent.superevent_id, obj.N], + request=self.context.get('request', None)) def validate(self, data): data = super(SupereventLogSerializer, self).validate(data) @@ -273,9 +280,12 @@ class SupereventLogSerializer(serializers.ModelSerializer): return data def create(self, validated_data): + # Function-level import to prevent circular import in alerts + from ..utils import create_log, get_or_create_tags + + # TODO: # Check user permissions here, or somewhere else? Maybe just on viewset # create resource - logger.debug(validated_data) # Convert data to be used with create_log function issuer = validated_data.get('submitter', None) @@ -316,7 +326,8 @@ class SupereventLogTagSerializer(serializers.ModelSerializer): SUPEREVENT_LOOKUP_FIELD) log_N = self.context['view'].kwargs.get('N') return gracedb_reverse('superevent-log-tag-detail', args=[ - superevent_id, log_N, obj.name], request=self.context['request']) + superevent_id, log_N, obj.name], + request=self.context.get('request', None)) def __init__(self, *args, **kwargs): super(SupereventLogTagSerializer, self).__init__(*args, **kwargs) @@ -345,6 +356,9 @@ class SupereventLogTagSerializer(serializers.ModelSerializer): return data def create(self, validated_data): + # Function-level import to prevent circular import in alerts + from ..utils import add_tag_to_log, get_or_create_tag + # Get parent log message parent_log = validated_data.pop('parent_log') @@ -379,12 +393,12 @@ class SupereventVOEventSerializer(serializers.ModelSerializer): obj.file_version) file_link = gracedb_reverse('superevent-file-detail', args=[ obj.superevent.superevent_id, file_name], - request=self.context['request']), + request=self.context.get('request', None)), link_dict = { 'self': gracedb_reverse('superevent-voevent-detail', args=[ obj.superevent.superevent_id, obj.N], - request=self.context['request']), + request=self.context.get('request', None)), 'file': file_link } return link_dict -- GitLab