from django.conf import settings from django.utils.translation import gettext as _ from rest_framework import serializers from .models import ProfileModel class ProfileSerializer(serializers.ModelSerializer): username = serializers.ReadOnlyField(source='user.username') avatar = serializers.ImageField(required=False) online = serializers.SerializerMethodField() class Meta: model = ProfileModel fields = ["username", "avatar", "id", 'online'] def get_online(self, obj: ProfileModel): from notice.consumers import notice_manager user = None request = self.context.get("request") if request and hasattr(request, "user"): user = request.user if user is None or not user.is_authenticated: return None if not user.profilemodel.is_friend(obj) and user.pk != obj.pk: return None return notice_manager.get_consumer_by_user(obj.user) is not None def validate_avatar(self, value): ''' Check that the image is not too large ''' if value.size > settings.PROFILE_PICTURE_MAX_SIZE: raise serializers.ValidationError(_('Image is too large.')) return value def to_representation(self, instance): data = super().to_representation(instance) data['avatar'] = data['avatar'][data['avatar'].find('/static/'):] return data