Skip to content
Snippets Groups Projects
Commit 0132ced8 authored by Tanner Prestegard's avatar Tanner Prestegard Committed by GraceDB
Browse files

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.
parent 47678d1c
No related branches found
No related tags found
1 merge request!8Superevents
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment