class LibraryListingSerializer(serializers.HyperlinkedModelSerializer): small_icon = image_serializers.ImageSerializer(required=False) large_icon = image_serializers.ImageSerializer(required=False) banner_icon = image_serializers.ImageSerializer(required=False) owners = listing_serializers.CreateListingProfileSerializer( required=False, allow_null=True, many=True) listing_type = listing_serializers.ListingTypeSerializer(required=False, allow_null=True) class Meta: model = models.Listing fields = ('id', 'title', 'unique_name', 'launch_url', 'small_icon', 'large_icon', 'banner_icon', 'owners', 'security_marking', 'is_enabled', 'listing_type') read_only_fields = ('title', 'unique_name', 'launch_url', 'small_icon', 'large_icon', 'banner_icon', 'owners', 'security_marking', 'is_enabled', 'listing_type') # Any AutoFields on your model (which is what the automatically # generated id key is) are set to read-only by default when Django # REST Framework is creating fields in the background. read-only fields # will not be part of validated_data. Override that behavior using the # extra_kwargs extra_kwargs = { "id": { "read_only": False, "required": False, }, }
class StorefrontListingSerializer(serializers.HyperlinkedModelSerializer): agency = agency_serializers.CreateAgencySerializer(required=False) large_banner_icon = image_serializers.ImageSerializer(required=False, allow_null=True) banner_icon = image_serializers.ImageSerializer(required=False, allow_null=True) owners = listing_serializers.CreateListingProfileSerializer(required=False, allow_null=True, many=True) listing_type = listing_serializers.ListingTypeSerializer(required=False, allow_null=True) class Meta: model = models.Listing fields = ('id', 'title', 'agency', 'avg_rate', 'total_votes', 'total_reviews', 'feedback_score', 'is_private', 'is_bookmarked', 'feedback', 'description_short', 'security_marking', 'usage_requirements', 'system_requirements', 'launch_url', 'large_banner_icon', 'banner_icon', 'owners', 'unique_name', 'is_enabled', 'listing_type', 'edited_date', 'approved_date') def _is_bookmarked(self, request_user, request_listing): # TODO: put in listing model_access.py call from there > creative name for method bookmarks = models.ApplicationLibraryEntry.objects.filter(listing=request_listing, owner=request_user) return len(bookmarks) >= 1 def _feedback(self, request_user, request_listing): # TODO: put in listing model_access.py call from there > creative name for method recommendation = models.RecommendationFeedback.objects.for_user(request_user).filter(target_profile=request_user, target_listing=request_listing).first() if recommendation is None: return 0 return recommendation.feedback def to_representation(self, data): ret = super(StorefrontListingSerializer, self).to_representation(data) request_user = generic_model_access.get_profile(self.context['request'].user) # TODO: Get the profile from view request instead of getting it from db again ret['feedback'] = self._feedback(request_user, data) ret['is_bookmarked'] = self._is_bookmarked(request_user, data) return ret
class ScreenshotSerializer(serializers.ModelSerializer): small_image = image_serializers.ImageSerializer() large_image = image_serializers.ImageSerializer() class Meta: model = models.Screenshot fields = ('order', 'small_image', 'large_image', 'description') extra_kwargs = { 'description': {'validators': []} }
def list(self, request): queryset = self.get_queryset() serializer = serializers.ImageSerializer(queryset, many=True, context={'request': request}) serializer_iterator = recommend_utils.ListIterator(serializer.data) pipeline_list = [ pipes.ListingDictPostSecurityMarkingCheckPipe( request.user.username) ] recommended_listings = pipeline.Pipeline(serializer_iterator, pipeline_list).to_list() return Response(recommended_listings)
def list(self, request): queryset = self.get_queryset() serializer = serializers.ImageSerializer(queryset, many=True, context={'request': request}) return Response(serializer.data)
class ListingSerializer(serializers.ModelSerializer): is_bookmarked = serializers.ReadOnlyField() feedback = serializers.ReadOnlyField() screenshots = ScreenshotSerializer(many=True, required=False) doc_urls = DocUrlSerializer(many=True, required=False) owners = CreateListingProfileSerializer(required=False, many=True) categories = category_serializers.ListingCategorySerializer(many=True, required=False) tags = TagSerializer(many=True, required=False) custom_fields = CustomFieldValueSerializer(many=True, required=False) contacts = contact_type_serializers.ContactSerializer(many=True, required=False) intents = intent_serializers.IntentSerializer(many=True, required=False) small_icon = image_serializers.ImageSerializer(required=False, allow_null=True) large_icon = image_serializers.ImageSerializer(required=False, allow_null=True) banner_icon = image_serializers.ImageSerializer(required=False, allow_null=True) large_banner_icon = image_serializers.ImageSerializer(required=False, allow_null=True) agency = agency_serializers.CreateAgencySerializer(required=False) last_activity = ListingActivitySerializer(required=False, read_only=True) current_rejection = RejectionListingActivitySerializer(required=False, read_only=True) listing_type = ListingTypeSerializer(required=False, allow_null=True) cert_issues = CertIssuesField(required=False) class Meta: model = models.Listing depth = 2 fields = '__all__' @staticmethod def setup_eager_loading(queryset): # prefetch_related many-to-many relationships queryset = queryset.prefetch_related('agency__icon') queryset = queryset.prefetch_related('screenshots') queryset = queryset.prefetch_related('screenshots__small_image') queryset = queryset.prefetch_related('screenshots__large_image') queryset = queryset.prefetch_related('doc_urls') queryset = queryset.prefetch_related('owners') queryset = queryset.prefetch_related('owners__user') queryset = queryset.prefetch_related('owners__organizations') queryset = queryset.prefetch_related('owners__stewarded_organizations') queryset = queryset.prefetch_related('categories') queryset = queryset.prefetch_related('tags') queryset = queryset.prefetch_related('contacts') queryset = queryset.prefetch_related('contacts__contact_type') queryset = queryset.prefetch_related('listing_type') queryset = queryset.prefetch_related('last_activity') queryset = queryset.prefetch_related('last_activity__change_details') queryset = queryset.prefetch_related('last_activity__author') queryset = queryset.prefetch_related('last_activity__author__organizations') queryset = queryset.prefetch_related('last_activity__author__stewarded_organizations') queryset = queryset.prefetch_related('last_activity__listing') queryset = queryset.prefetch_related('last_activity__listing__contacts') queryset = queryset.prefetch_related('last_activity__listing__owners') queryset = queryset.prefetch_related('last_activity__listing__owners__user') queryset = queryset.prefetch_related('last_activity__listing__categories') queryset = queryset.prefetch_related('last_activity__listing__tags') queryset = queryset.prefetch_related('last_activity__listing__intents') queryset = queryset.prefetch_related('current_rejection') queryset = queryset.prefetch_related('intents') queryset = queryset.prefetch_related('intents__icon') return queryset def _is_bookmarked(self, request_user, request_listing): # TODO: put in listing model_access.py call from there > creative name for method bookmarks = models.ApplicationLibraryEntry.objects.filter(listing=request_listing, owner=request_user) return len(bookmarks) >= 1 def _feedback(self, request_user, request_listing): # TODO: put in listing model_access.py call from there > creative name for method recommendation = models.RecommendationFeedback.objects.for_user(request_user).filter(target_profile=request_user, target_listing=request_listing).first() if recommendation is None: return 0 return recommendation.feedback def to_representation(self, data): ret = super(ListingSerializer, self).to_representation(data) anonymize_identifiable_data = system_anonymize_identifiable_data(self.context['request'].user.username) request_user = generic_model_access.get_profile(self.context['request'].user) # TODO: Get the profile from view request instead of getting it from db again if anonymize_identifiable_data: ret['contacts'] = [] check_failed = [] # owners if 'owners' in ret and not anonymize_identifiable_data: for owner in ret['owners']: user_dict = owner.get('user') user_username = None if user_dict is None else user_dict.get('username') # if not user_username: # raise serializers.ValidationError('Owner field requires correct format') owner_profile = generic_model_access.get_profile(user_username) # if not owner_profile: # raise serializers.ValidationError('Owner Profile not found') # Don't allow user to select a security marking that is above # their own access level\ try: if system_has_access_control(owner_profile.user.username, ret.get('security_marking')) is False: check_failed.append(owner_profile.user.username) # raise serializers.ValidationError(owner_profile.user.username + 'User certificate is invalid') except Exception: check_failed.append(owner_profile.user.username) ret['cert_issues'] = check_failed ret['feedback'] = self._feedback(request_user, data) ret['is_bookmarked'] = self._is_bookmarked(request_user, data) return ret def validate(self, data): return validate_listing(self, data) def create(self, validated_data): return create_listing(self, validated_data) def update(self, instance, validated_data): return update_listing(self, instance, validated_data)