class CollectionSerializer(serializers.ModelSerializer): namespace = fields.NamespaceObjectField() href = serializers.SerializerMethodField() versions_url = serializers.SerializerMethodField() latest_version = serializers.SerializerMethodField() class Meta: model = models.Collection fields = ( 'id', 'href', 'name', 'namespace', 'versions_url', 'latest_version', 'deprecated', 'created', 'modified', ) def get_href(self, obj): return reverse( 'api:v2:collection-detail', kwargs={ 'namespace': obj.namespace.name, 'name': obj.name, }, request=self.context.get('request'), ) def get_versions_url(self, obj): return reverse( 'api:v2:version-list', kwargs={ 'namespace': obj.namespace.name, 'name': obj.name, }, request=self.context.get('request'), ) def get_latest_version(self, obj): if not obj.latest_version: return None version = obj.latest_version.version return { "version": version, "href": reverse( 'api:v2:version-detail', kwargs={ 'namespace': obj.namespace.name, 'name': obj.name, 'version': version, }, request=self.context.get('request'), ) }
class VersionDetailSerializer(serializers.ModelSerializer): """Collection version with detailed data.""" id = serializers.IntegerField(source='pk') href = fields.VersionUrlField(source='*') download_url = serializers.SerializerMethodField() artifact = serializers.SerializerMethodField() namespace = fields.NamespaceObjectField(source='collection.namespace') collection = serializers.SerializerMethodField() metadata = serializers.JSONField(binary=False) class Meta: model = models.CollectionVersion fields = ( 'id', 'href', 'download_url', 'artifact', 'namespace', 'collection', 'version', 'hidden', 'metadata', ) def get_download_url(self, obj): ca = obj.get_content_artifact() return reverse( 'api:artifact-download', kwargs={'filename': ca.relative_path}, request=self.context.get('request'), ) def get_artifact(self, obj): ca = obj.get_content_artifact() return BaseArtifactSerializer(ca).data def get_collection(self, obj): ns_name = obj.collection.namespace.name name = obj.collection.name result = { 'id': obj.collection.pk, 'href': reverse( 'api:v2:collection-detail', kwargs={'namespace': ns_name, 'name': name}, request=self.context.get('request'), ), 'name': name, } return result
class CollectionImportSerializer(BaseTaskSerializer): messages = _MessageSerializer(many=True) lint_records = serializers.JSONField() namespace = fields.NamespaceObjectField() imported_version = serializers.SerializerMethodField() class Meta: model = models.CollectionImport fields = BaseTaskSerializer.Meta.fields + ( 'namespace', 'name', 'version', 'messages', 'lint_records', 'imported_version', ) # TODO(cutwater): Replace with custom field def get_imported_version(self, obj): if obj.imported_version is None: return None return { 'id': obj.imported_version.pk, 'href': reverse('api:v2:version-detail', args=[obj.imported_version.pk], request=self.context.get('request')), }