Пример #1
0
class ImageSerializer(serializers.HyperlinkedModelSerializer):
    created_by = UserSummarySerializer(read_only=True)
    tags = TagRelatedField(many=True)
    versions = ImageVersionRelatedField(many=True)
    icon = serializers.CharField(source="get_icon_url", read_only=True)
    is_public = SwapBooleanField(source='private')
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:application-detail', )
    metrics_url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:applicationmetric-detail', )

    class Meta:
        model = Image
        fields = (
            'id',
            'url',
            'uuid',
            'name',
            # Adtl. Fields
            'metrics_url',
            'created_by',
            'description',
            'end_date',
            'is_public',
            'icon',
            'start_date',
            'tags',
            'versions')
Пример #2
0
class ImageSerializer(serializers.HyperlinkedModelSerializer):
    created_by = UserSummarySerializer(read_only=True)
    access_list = ModelRelatedField(
        many=True,
        queryset=filter_current_user_queryset,
        serializer_class=PatternMatchSummarySerializer,
        style={'base_template': 'input.html'})
    tags = TagRelatedField(many=True)
    versions = ImageVersionRelatedField(many=True)
    icon = serializers.CharField(source="get_icon_url", read_only=True)
    is_public = SwapBooleanField(source='private')
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:application-detail', )
    metrics_url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:applicationmetric-detail', )

    class Meta:
        model = Image
        fields = (
            'id',
            'url',
            'uuid',
            'name',
            # Adtl. Fields
            'metrics_url',
            'created_by',
            'description',
            'end_date',
            'is_public',
            'icon',
            'start_date',
            'access_list',
            'tags',
            'versions')
Пример #3
0
class InstanceSuperSummarySerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.PrimaryKeyRelatedField(
        source='created_by',
        read_only=True)
    provider = serializers.PrimaryKeyRelatedField(
        source='created_by_identity.provider',
        read_only=True)
    status = serializers.CharField(source='esh_status', read_only=True)
    uuid = serializers.CharField(source='provider_alias')
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:instance-detail',
        uuid_field='provider_alias'
    )
    class Meta:
        model = Instance
        fields = (
            'id',
            'uuid',
            'url',
            'name',
            'status',
            'ip_address',
            'shell',
            'vnc',
            'user',
            'provider',
            'start_date',
            'end_date',
        )
Пример #4
0
class CredentialSerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:credential-detail', )
    identity = IdentitySummarySerializer()

    class Meta:
        model = Credential
        fields = ('id', 'uuid', 'url', 'identity', 'key', 'value')
Пример #5
0
class AllocationSummarySerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:allocation-detail',
    )
    class Meta:
        model = Allocation
        fields = ('id', 'uuid', 'url', 'threshold', 'delta')
Пример #6
0
class LicenseSerializer(serializers.HyperlinkedModelSerializer):
    text = serializers.CharField(source='license_text')
    type = ModelRelatedField(lookup_field='name',
                             source='license_type',
                             queryset=LicenseType.objects.all(),
                             serializer_class=LicenseTypeSummarySerializer,
                             style={'base_template': 'input.html'})
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:license-detail', )
    created_by = serializers.SlugRelatedField(
        slug_field='username',
        queryset=AtmosphereUser.objects.all(),
        required=False)

    def is_valid(self, raise_exception=False):
        """
        """
        raw_type = self.initial_data.get("type", "").lower()
        if 'raw text' in raw_type:
            LicenseType.objects.get_or_create(name="Raw Text")
        elif 'url' in raw_type:
            LicenseType.objects.get_or_create(name="URL")
        return super(LicenseSerializer,
                     self).is_valid(raise_exception=raise_exception)

    def create(self, validated_data):

        if 'created_by' not in validated_data:
            request = self.context.get('request')
            if request and request.user:
                validated_data['created_by'] = request.user
        return super(LicenseSerializer, self).create(validated_data)

    class Meta:
        model = License
        fields = ('id', 'url', 'uuid', 'created_by', 'title', 'text', 'type')
Пример #7
0
class VolumeSummarySerializer(serializers.HyperlinkedModelSerializer):
    identity = IdentitySummarySerializer(
        source='instance_source.created_by_identity'
    )
    provider = serializers.PrimaryKeyRelatedField(
        source='instance_source.provider', read_only=True
    )
    start_date = serializers.DateTimeField(source='instance_source.start_date')
    end_date = serializers.DateTimeField(source='instance_source.end_date')
    uuid = serializers.CharField(source='instance_source.identifier')
    user = serializers.SlugRelatedField(
        slug_field="username",
        source='instance_source.created_by',
        read_only=True
    )
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:volume-detail',
        uuid_field='identifier',
    )

    class Meta:
        model = Volume
        fields = (
            'id', 'uuid', 'url', 'name', 'size', 'user', 'identity', 'provider',
            'start_date', 'end_date'
        )
Пример #8
0
class InstanceStatusHistorySerializer(serializers.HyperlinkedModelSerializer):
    instance = ModelRelatedField(
        queryset=Instance.objects.all(),
        serializer_class=InstanceSuperSummarySerializer,
        style={'base_template': 'input.html'})
    size = SizeRelatedField(queryset=Size.objects.none())
    provider = ProviderSummarySerializer(source='instance.get_provider')
    image = ImageSummarySerializer(
        source='instance.provider_machine.application_version.application')
    status = serializers.SlugRelatedField(slug_field='name', read_only=True)
    activity = serializers.CharField(max_length=36, allow_blank=True)
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:instancestatushistory-detail', )

    class Meta:
        model = InstanceStatusHistory
        fields = (
            'id',
            'uuid',
            'url',
            'instance',
            'status',
            'activity',
            'size',
            'provider',
            'image',
            'extra',
            'start_date',
            'end_date',
        )
Пример #9
0
class BootScriptSerializer(serializers.HyperlinkedModelSerializer):
    created_by = serializers.SlugRelatedField(
        slug_field='username', queryset=AtmosphereUser.objects.all(),
        required=False)
    text = serializers.CharField(source='script_text')
    type = serializers.SlugRelatedField(
        source='script_type',
        slug_field='name',
        queryset=ScriptType.objects.all())
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:bootscript-detail',
    )

    def is_valid(self, raise_exception=False):
        """
        """
        raw_type = self.initial_data.get("type", "").lower()
        if 'raw text' in raw_type:
            ScriptType.objects.get_or_create(name="Raw Text")
        elif 'url' in raw_type:
            ScriptType.objects.get_or_create(name="URL")
        return super(BootScriptSerializer, self).is_valid(
                raise_exception=raise_exception)

    def create(self, validated_data):
        if 'created_by' not in validated_data:
            request = self.context.get('request')
            if request and request.user:
                validated_data['created_by'] = request.user
        return super(BootScriptSerializer, self).create(validated_data)

    class Meta:
        model = BootScript
        fields = ('id', 'url', 'uuid', 'created_by', 'title', 'text', 'type')
Пример #10
0
class StatusTypeSerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:statustype-detail', )

    class Meta:
        model = StatusType
        fields = ('id', 'url', 'uuid', 'name', 'description', 'start_date',
                  'end_date')
Пример #11
0
class InstanceStatusHistorySerializer(serializers.HyperlinkedModelSerializer):
    instance = InstanceRelatedField(queryset=Instance.objects.none())
    size = SizeRelatedField(queryset=Size.objects.none())
    provider = ProviderSummarySerializer(
        source='instance.provider_machine.provider')
    image = ImageSummarySerializer(
        source='instance.provider_machine.application_version.application')
    status = serializers.SlugRelatedField(slug_field='name', read_only=True)
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:instancestatushistory-detail',
    )

    class Meta:
        model = InstanceStatusHistory
        fields = (
            'id',
            'uuid',
            'url',
            'instance',
            'status',
            'size',
            'provider',
            'image',
            'start_date',
            'end_date',
        )
Пример #12
0
class QuotaSummarySerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:quota-detail', )

    class Meta:
        model = Quota
        fields = ('id', 'url', 'uuid', 'cpu', 'memory', 'storage',
                  'storage_count', 'suspended_count')
Пример #13
0
class SizeSummarySerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:size-detail', )

    class Meta:
        model = Size
        fields = ('id', 'uuid', 'url', 'alias', 'name', 'cpu', 'disk', 'root',
                  'mem', 'active', 'start_date', 'end_date')
Пример #14
0
class ProviderSerializer(serializers.HyperlinkedModelSerializer):
    name = serializers.CharField(source='location')
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:provider-detail', )
    type = ProviderTypeSerializer()
    virtualization = PlatformTypeSerializer()
    sizes = SizeSummarySerializer(source='size_set', many=True)
    is_admin = serializers.SerializerMethodField()

    def get_is_admin(self, provider):
        user = self.context['request'].user
        if user.is_staff or user.is_superuser:
            return True
        return False

    class Meta:
        model = Provider
        fields = (
            'id',
            'url',
            'uuid',
            'name',
            'description',
            'type',
            'virtualization',
            'active',
            'public',
            'auto_imaging',
            'sizes',
            'start_date',
            'end_date',
            'is_admin',
        )
Пример #15
0
class QuotaSerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:quota-detail', )

    def validate_cpu(self, value):
        return self._is_positive_int('cpu', value)

    def validate_memory(self, value):
        return self._is_positive_int('memory', value)

    def validate_storage(self, value):
        return self._is_positive_int('storage', value)

    def validate_storage_count(self, value):
        return self._is_positive_int('storage_count', value)

    def validate_suspended_count(self, value):
        return self._is_positive_int('suspended_count', value)

    def _is_positive_int(self, key, value):
        if type(value) != int or value < 1:
            raise serializers.ValidationError("Value of %s should be >= 1" %
                                              key)
        return value

    class Meta:
        model = Quota
        fields = ('id', 'uuid', 'url', 'cpu', 'memory', 'storage',
                  'storage_count', 'suspended_count')
Пример #16
0
class ImageMetricSerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:applicationmetric-detail',
    )
    is_featured = serializers.SerializerMethodField()
    metrics = serializers.SerializerMethodField()

    def get_is_featured(self, application):
        return application.featured()

    def get_metrics(self, application):
        request = self.context.get('request', None)
        user = self.context.get('user', request.user)
        if not user:
            raise Exception(
                "This serializer expects 'user' or an authenticated "
                "'request' including 'user' to be passed in via serializer "
                "context! context={'user':user}"
            )
        # Summarized metrics example
        return _get_summarized_application_metrics(application)

    class Meta:
        model = Image
        fields = (
            'id',
            'url',
            'uuid',
            'name',
        # Adtl. Fields
            'metrics',
            'is_featured',
        )
Пример #17
0
class UserResourceRequestSerializer(serializers.HyperlinkedModelSerializer):
    def validate_status(self, value):
        if str(value) not in ["pending", "closed"]:
            raise serializers.ValidationError(
                "Users can only open and close requests.")
        return value

    quota = QuotaRelatedField(read_only=True)
    allocation = AllocationRelatedField(read_only=True)
    status = StatusTypeRelatedField(queryset=StatusType.objects.none(),
                                    allow_null=True,
                                    required=False)
    admin_message = serializers.CharField(read_only=True)
    uuid = serializers.CharField(read_only=True)
    created_by = UserRelatedField(read_only=True)
    user = UserSummarySerializer(source='membership.identity.created_by',
                                 read_only=True)
    identity = IdentityRelatedField(source='membership.identity',
                                    queryset=Identity.objects.none())
    provider = ProviderSummarySerializer(source='membership.identity.provider',
                                         read_only=True)
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:resourcerequest-detail', )

    class Meta:
        model = ResourceRequest
        fields = ('id', 'uuid', 'url', 'request', 'description', 'status',
                  'created_by', 'user', 'identity', 'provider',
                  'admin_message', 'quota', 'allocation')
Пример #18
0
class IdentitySerializer(serializers.HyperlinkedModelSerializer):
    quota = ModelRelatedField(queryset=Quota.objects.all(),
                              serializer_class=QuotaSummarySerializer,
                              lookup_field='id')
    usage = serializers.SerializerMethodField()
    credentials = CredentialSummarySerializer(many=True,
                                              source='credential_set')
    key = serializers.SerializerMethodField()
    is_leader = serializers.SerializerMethodField()
    user = UserSummarySerializer(source='created_by')
    members = GroupSummarySerializer(source='get_membership',
                                     many=True,
                                     read_only=True)
    provider = ProviderSummarySerializer()
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:identity-detail', )

    def update(self, core_identity, validated_data):
        quota = validated_data.get('quota')
        data = {'quota': quota.id, 'identity': core_identity.id}
        event_serializer = QuotaAssignedSerializer(data=data)
        if not event_serializer.is_valid():
            raise serializers.ValidationError(
                "Validation of EventSerializer failed with: %s" %
                event_serializer.errors)
        try:
            event_serializer.save()
        except Exception as exc:
            logger.exception("Unexpected error occurred during Event save")
            raise serializers.ValidationError(
                "Unexpected error occurred during Event save: %s" % exc)
        # Synchronous call to EventTable -> Set Quota for Identity's CloudProvider -> Save the Quota to Identity
        identity = Identity.objects.get(uuid=core_identity.uuid)
        return identity

    def get_usage(self, identity):
        return -1

    def get_is_leader(self, identity):
        """
        Returns true/false if the user requesting the object is the leader.
        """
        user = None
        if self.context:
            if 'request' in self.context:
                user = self.context['request'].user
            elif 'user' in self.context:
                user = self.context['user']
        if user == identity.created_by:
            return True
        return Identity.shared_with_user(
            user, is_leader=True).filter(id=identity.id).exists()

    def get_key(self, identity):
        return identity.get_key()

    class Meta:
        model = Identity
        fields = ('id', 'uuid', 'url', 'key', 'quota', 'credentials', 'usage',
                  'is_leader', 'provider', 'members', 'user')
Пример #19
0
class ProjectSummarySerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.StringRelatedField(source='owner.name')
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:project-detail', )

    class Meta:
        model = Project
        fields = ('id', 'url', 'uuid', 'name', 'description', 'owner',
                  'start_date', 'end_date')
Пример #20
0
class ResourceRequestSerializer(serializers.HyperlinkedModelSerializer):
    uuid = serializers.CharField(read_only=True)
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:resourcerequest-detail',
    )
    created_by = UserRelatedField(read_only=True)
    user = UserSummarySerializer(
        source='membership.identity.created_by',
        read_only=True)
    identity = IdentityRelatedField(source='membership.identity',
                                    queryset=Identity.objects.none())
    provider = ProviderSummarySerializer(
        source='membership.identity.provider',
        read_only=True)
    status = StatusTypeRelatedField(queryset=StatusType.objects.none(),
                                    allow_null=True,
                                    required=False)
    quota = QuotaRelatedField(queryset=Quota.objects.all(),
                              allow_null=True,
                              required=False)

    allocation = AllocationRelatedField(queryset=Allocation.objects.all(),
                                        allow_null=True,
                                        required=False)

    # TODO should be refactored to not use SerializerMethodField()
    current_quota = serializers.SerializerMethodField()
    current_allocation = serializers.SerializerMethodField()

    def get_current_quota(self, request):
        user_membership = IdentityMembership.objects.get(
            id=request.membership_id)
        return user_membership.quota.id if user_membership.quota else None

    def get_current_allocation(self, request):
        user_membership = IdentityMembership.objects.get(
            id=request.membership_id)
        return user_membership.allocation.id if user_membership.allocation else None

    class Meta:
        model = ResourceRequest
        fields = (
            'id',
            'uuid',
            'url',
            'request',
            'description',
            'status',
            'created_by',
            'user',
            'identity',
            'provider',
            'admin_message',
            'quota',
            'allocation',
            'current_quota',
            'current_allocation'
        )
Пример #21
0
class ImageVersionSummarySerializer(serializers.HyperlinkedModelSerializer):
    # Required when its a uuid -- otherwise LONGINT
    id = serializers.CharField(read_only=True)
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:imageversion-detail',
                                       uuid_field='id')

    class Meta:
        model = ImageVersion
        fields = ('id', 'url', 'name')
Пример #22
0
class ImageSuperSummarySerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.PrimaryKeyRelatedField(source='created_by',
                                              read_only=True)
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:application-detail', )

    class Meta:
        model = Image
        fields = ('id', 'url', 'uuid', 'name', 'description', 'icon',
                  'start_date', 'end_date', 'user')
Пример #23
0
class BootScriptSummarySerializer(serializers.HyperlinkedModelSerializer):
    type = serializers.SlugRelatedField(source='script_type',
                                        slug_field='name',
                                        queryset=ScriptType.objects.all())
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:bootscript-detail', )

    class Meta:
        model = BootScript
        fields = ('id', 'url', 'uuid', 'title', 'type')
Пример #24
0
class InstanceSerializer(serializers.HyperlinkedModelSerializer):
    identity = IdentitySummarySerializer(source='created_by_identity')
    user = UserSummarySerializer(source='created_by')
    provider = ProviderSummarySerializer(source='created_by_identity.provider')
    status = serializers.CharField(source='esh_status', read_only=True)
    projects = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    scripts = ModelRelatedField(many=True,
                                required=False,
                                queryset=BootScript.objects.all(),
                                serializer_class=BootScriptSummarySerializer,
                                style={'base_template': 'input.html'})
    size = serializers.SerializerMethodField()
    image = serializers.SerializerMethodField()
    version = serializers.SerializerMethodField()
    uuid = serializers.CharField(source='provider_alias')
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:instance-detail',
                                       uuid_field='provider_alias')

    def get_size(self, obj):
        size = obj.get_size()
        serializer = SizeSummarySerializer(size, context=self.context)
        return serializer.data

    def get_image(self, obj):
        image_uuid = obj.application_uuid()
        image = Image.objects.get(uuid=image_uuid)
        serializer = ImageSummarySerializer(image, context=self.context)
        return serializer.data

    def get_version(self, obj):
        version = obj.source.providermachine.application_version
        serializer = ImageVersionSummarySerializer(version,
                                                   context=self.context)
        return serializer.data

    class Meta:
        model = Instance
        fields = (
            'id',
            'uuid',
            'url',
            'name',
            'status',
            'size',
            'ip_address',
            'shell',
            'vnc',
            'identity',
            'user',
            'provider',
            'image',
            'version',  # NOTE:Should replace image?
            'scripts',
            'projects',
            'start_date',
            'end_date',
        )
Пример #25
0
class EventSerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:event-detail',
    )

    def _validate_ias_event(self, entity_id, payload):
        allocation_source_id = payload.get('allocation_source_id', '')
        instance_id = payload.get('instance_id', '')
        if entity_id != instance_id:
            raise serializers.ValidationError(
                "Expected entity ID to be the Instance ID: %s, Received: %s"
                % (instance_id, entity_id))
        user = self._get_request_user()
        if not user:
            raise serializers.ValidationError("Request user was not found")
        payload['username'] = user.username
        allocation_source = AllocationSource.for_user(user=user).filter(
            source_id=allocation_source_id).first()
        instance = Instance.for_user(user=user).filter(provider_alias=instance_id).first()
        if not allocation_source:
            raise serializers.ValidationError(
                "AllocationSource with source_id=%s DoesNotExist"
                % allocation_source_id)
        if not instance:
            raise serializers.ValidationError(
                "Instance with provider_alias=%s DoesNotExist"
                % instance_id)
        return True

    def _get_request_user(self):
        if 'request' not in self.context:
            raise ValueError("Expected 'request' context for this serializer")
        return self.context['request'].user

    def validate(self, data):
        name = data['name']
        entity_id = data['entity_id']
        payload = data['payload']
        if name.lower() == 'instance_allocation_source_changed':
            self._validate_ias_event(entity_id, payload)
        else:
            raise serializers.ValidationError(
                "Unknown event type %s" % name
            )
        return super(EventSerializer, self).validate(data)

    class Meta:
        model = EventTable
        fields = (
            'id',
            'uuid',
            'url',
            'entity_id',
            'name',
            'payload',
            'timestamp',
        )
Пример #26
0
class LicenseSummarySerializer(serializers.HyperlinkedModelSerializer):
    type = serializers.SlugRelatedField(source='license_type',
                                        slug_field='name',
                                        queryset=LicenseType.objects.all())
    text = serializers.CharField(source='license_text', read_only=True)
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:license-detail', )

    class Meta:
        model = License
        fields = ('id', 'url', 'uuid', 'title', 'type', 'text')
Пример #27
0
class GroupSummarySerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:group-detail', )

    class Meta:
        model = Group
        fields = (
            'id',
            'uuid',
            'url',
            'name',
        )
Пример #28
0
class GroupSerializer(serializers.HyperlinkedModelSerializer):
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:group-detail',
    )
    users = UserSummarySerializer(source='user_set', many=True)

    class Meta:
        model = Group
        fields = (
            'id',
            'url',
            'name',
            'users',
        )
Пример #29
0
class InstanceSummarySerializer(serializers.HyperlinkedModelSerializer):
    identity = IdentitySummarySerializer(source='created_by_identity')
    user = serializers.PrimaryKeyRelatedField(
        source='created_by',
        read_only=True)
    provider = serializers.PrimaryKeyRelatedField(
        source='created_by_identity.provider',
        read_only=True)
    status = serializers.CharField(source='esh_status', read_only=True)
    size = serializers.SerializerMethodField()
    image = serializers.SerializerMethodField()
    uuid = serializers.CharField(source='provider_alias')
    url = UUIDHyperlinkedIdentityField(
        view_name='api:v2:instance-detail',
        uuid_field='provider_alias'
    )

    def get_size(self, obj):
        size = obj.get_size()
        serializer = SizeSummarySerializer(size, context=self.context)
        return serializer.data

    def get_image(self, obj):
        image_uuid = obj.application_uuid()
        image = Image.objects.get(uuid=image_uuid)
        serializer = ImageSummarySerializer(image, context=self.context)
        return serializer.data

    class Meta:
        model = Instance
        view_name = 'api:v2:instance-detail'
        fields = (
            'id',
            'uuid',
            'url',
            'name',
            'status',
            'size',
            'ip_address',
            'shell',
            'vnc',
            'web_desktop',
            'identity',
            'user',
            'provider',
            'image',
            'start_date',
            'end_date',
        )
Пример #30
0
class ExternalLinkSerializer(serializers.HyperlinkedModelSerializer):
    created_by = UserSummarySerializer(read_only=True)
    url = UUIDHyperlinkedIdentityField(view_name='api:v2:externallink-detail',
                                       uuid_field='id')

    class Meta:
        model = ExternalLink
        fields = (
            'id',
            'url',
            'title',
            'description',
            'link',
            # Adtl. Fields
            'created_by')