Example #1
0
class UserProfileFullSerializer(serializers.ModelSerializer):
    """Full serializer for UserProfile with detailed information and events."""

    from bodies.serializer_min import BodySerializerMin
    from bodies.models import Body

    email = serializers.SerializerMethodField()

    events_interested = serializers.SerializerMethodField()
    get_events_interested = lambda self, obj: self.get_events(obj, 1)

    events_going = serializers.SerializerMethodField()
    get_events_going = lambda self, obj: self.get_events(obj, 2)

    followed_bodies = BodySerializerMin(many=True, read_only=True)
    followed_bodies_id = serializers.PrimaryKeyRelatedField(
        many=True,
        read_only=False,
        queryset=Body.objects.all(),
        source='followed_bodies')

    roles = RoleSerializer(many=True, read_only=True)
    former_roles = RoleSerializerMinAlt(many=True, read_only=True)
    institute_roles = InstituteRoleSerializer(many=True, read_only=True)

    class Meta:
        model = UserProfile
        fields = ('id', 'name', 'profile_pic', 'events_interested',
                  'events_going', 'email', 'roll_no', 'contact_no', 'about',
                  'followed_bodies', 'followed_bodies_id', 'roles',
                  'institute_roles', 'website_url', 'ldap_id', 'hostel',
                  'former_roles')

    def get_email(self, obj):
        """Gets the email only if a user is logged in."""
        if self.context['request'].user.is_authenticated:
            return obj.email
        return 'N/A'

    def get_events(self, obj, status):
        """Returns serialized events for given status."""
        from events.serializers import EventSerializer
        request = self.context['request']
        return EventSerializer(get_r_fresh_prioritized_events(
            obj.followed_events.filter(ues__status=status), request),
                               many=True).data

    @staticmethod
    def setup_eager_loading(queryset):
        """Perform necessary eager loading of data."""
        queryset = queryset.prefetch_related('followed_bodies', 'roles',
                                             'roles__body',
                                             'roles__body__children',
                                             'roles__users', 'former_roles',
                                             'former_roles__body')
        return queryset
Example #2
0
class UserInfoSerializer(serializers.ModelSerializer):
    staff_map = {1: '具有管理后台权限', 0: '不具备后台管理权限'}
    active_map = {1: '激活', 0: '禁止'}

    is_staff_value = serializers.SerializerMethodField(
        method_name='get_is_staff')
    is_active_value = serializers.SerializerMethodField(
        method_name='get_is_active')
    role = RoleSerializer()

    class Meta:
        model = User
        fields = ('id', 'is_superuser', 'username', 'email', 'is_staff',
                  'is_active', 'date_joined', 'is_staff_value',
                  'is_active_value', 'role')

    def get_is_staff(self, obj):
        return self.staff_map.get(obj.is_staff)

    def get_is_active(self, obj):
        return self.active_map.get(obj.is_active)
Example #3
0
class UserProfileFullSerializer(serializers.ModelSerializer):
    """Full serializer for UserProfile with detailed information and events."""

    from bodies.serializer_min import BodySerializerMin
    from bodies.models import Body

    email = serializers.SerializerMethodField()
    contact_no = serializers.SerializerMethodField()

    events_interested = serializers.SerializerMethodField()
    get_events_interested = lambda self, obj: self.get_events(obj, 1)

    events_going = serializers.SerializerMethodField()
    get_events_going = lambda self, obj: self.get_events(obj, 2)

    followed_bodies = BodySerializerMin(many=True, read_only=True)

    roles = RoleSerializer(many=True, read_only=True)
    former_roles = RoleSerializerMinAlt(many=True, read_only=True)
    institute_roles = InstituteRoleSerializer(many=True, read_only=True)

    class Meta:
        model = UserProfile
        fields = ('id', 'name', 'profile_pic', 'events_interested',
                  'events_going', 'email', 'roll_no', 'contact_no', 'about',
                  'followed_bodies', 'fcm_id', 'android_version', 'roles',
                  'institute_roles', 'website_url', 'ldap_id', 'hostel',
                  'former_roles')

    def get_email(self, obj):
        """Gets the email only if a user is logged in."""
        if self.context['request'].user.is_authenticated:
            return obj.email
        return 'N/A'

    def get_contact_no(self, obj):
        """Gets contact no only if a user is logged in."""
        if self.context['request'].user.is_authenticated:
            return obj.contact_no
        return 'N/A'

    def get_events(self, obj, status):
        """Returns serialized events for given status."""
        from events.serializers import EventSerializer
        request = self.context['request']
        return EventSerializer(get_fresh_prioritized_events(
            obj.followed_events.filter(ues__status=status), request, delta=60),
                               many=True).data

    @staticmethod
    def setup_eager_loading(queryset):
        """Perform necessary eager loading of data."""
        queryset = queryset.prefetch_related('followed_bodies', 'roles',
                                             'roles__body',
                                             'roles__body__children',
                                             'roles__users', 'former_roles',
                                             'former_roles__body')
        return queryset

    def to_representation(self, instance):
        result = super().to_representation(instance)
        result.pop('fcm_id')
        result.pop('android_version')
        return settings.USER_PROFILE_FULL_SERIALIZER_TRANSFORM(result)