class EventSearchSerializer(serializers.ModelSerializer): cover = ImageField(required=False, options={"height": 500}) thumbnail = ImageField( source="cover", required=False, options={ "height": 500, "width": 500, "smart": True }, ) text = ContentSerializerField() activation_time = ActivationTimeField() class Meta: model = Event fields = ( "id", "title", "description", "cover", "text", "event_type", "location", "start_time", "thumbnail", "end_time", "total_capacity", "company", "registration_count", "tags", "activation_time", "pinned", ) read_only = True
class GalleryPictureSerializer(serializers.ModelSerializer): file = ImageField(required=True, options={'height': 700, 'smart': True}) thumbnail = ImageField(source='file', read_only=True, options={ 'height': 200, 'width': 300, 'smart': True }) raw_file = FileField(source='file', read_only=True) comments = CommentSerializer(read_only=True, many=True) comment_target = CharField(read_only=True) taggees = PublicUserField(many=True, queryset=User.objects.all(), required=False) class Meta: model = GalleryPicture fields = ('id', 'gallery', 'description', 'taggees', 'active', 'file', 'thumbnail', 'raw_file', 'comments', 'comment_target') read_only_fields = ('raw_file', 'thumbnail', 'gallery') def validate(self, attrs): gallery = Gallery.objects.get( pk=self.context['view'].kwargs['gallery_pk']) return {'gallery': gallery, **attrs}
class GalleryPictureSerializer(serializers.ModelSerializer): file = ImageField(required=True, options={"height": 700, "smart": True}) thumbnail = ImageField( source="file", read_only=True, options={"height": 200, "width": 300, "smart": True}, ) raw_file = FileField(source="file", read_only=True) comments = CommentSerializer(read_only=True, many=True) content_target = CharField(read_only=True) taggees = PublicUserField(many=True, queryset=User.objects.all(), required=False) class Meta: model = GalleryPicture fields = ( "id", "gallery", "description", "taggees", "active", "file", "thumbnail", "raw_file", "comments", "content_target", ) read_only_fields = ("raw_file", "thumbnail", "gallery") def validate(self, attrs): gallery = Gallery.objects.get(pk=self.context["view"].kwargs["gallery_pk"]) return {"gallery": gallery, **attrs}
class EventReadSerializer(TagSerializerMixin, BasisModelSerializer): company = CompanyField(queryset=Company.objects.all()) cover = ImageField(required=False, options={"height": 500}) thumbnail = ImageField( source="cover", required=False, options={ "height": 500, "width": 500, "smart": True }, ) class Meta: model = Event fields = ( "id", "title", "description", "cover", "event_type", "location", "start_time", "thumbnail", "total_capacity", "company", "registration_count", "tags", ) read_only = True
class CompanyListSerializer(BasisModelSerializer): logo = ImageField(required=False, options={"height": 500}) thumbnail = ImageField( source="logo", required=False, options={"height": 500, "width": 500, "smart": True}, ) event_count = serializers.SerializerMethodField() joblisting_count = serializers.SerializerMethodField() def get_event_count(self, obj): return obj.events.filter(start_time__gt=timezone.now()).count() def get_joblisting_count(self, obj): return obj.joblistings.filter(visible_to__gte=timezone.now()).count() class Meta: model = Company fields = ( "id", "name", "description", "event_count", "joblisting_count", "website", "company_type", "address", "logo", "thumbnail", "active", )
class GalleryCoverSerializer(serializers.ModelSerializer): file = ImageField(required=False, options={"height": 700, "smart": True}) thumbnail = ImageField( source="file", read_only=True, options={"height": 300, "width": 300, "smart": True}, ) class Meta: model = GalleryPicture fields = ("file", "thumbnail", "id")
class CompanyListSerializer(BasisModelSerializer): logo = ImageField(required=False, options={'height': 500}) thumbnail = ImageField(source='logo', required=False, options={ 'height': 500, 'width': 500, 'smart': True }) class Meta: model = Company fields = ('id', 'name', 'description', 'website', 'company_type', 'address', 'logo', 'thumbnail')
class GalleryCoverSerializer(serializers.ModelSerializer): file = ImageField(required=False, options={'height': 700, 'smart': True}) thumbnail = ImageField(source='file', read_only=True, options={ 'height': 300, 'width': 300, 'smart': True }) class Meta: model = GalleryPicture fields = ('file', 'thumbnail', 'id')
class EventReadDetailedSerializer(TagSerializerMixin, BasisModelSerializer): comments = CommentSerializer(read_only=True, many=True) comment_target = CharField(read_only=True) cover = ImageField(required=False, options={'height': 500}) company = CompanyField(queryset=Company.objects.all()) responsible_group = AbakusGroupField(queryset=AbakusGroup.objects.all(), required=False, allow_null=True) pools = PoolReadSerializer(many=True) active_capacity = serializers.ReadOnlyField() text = ContentSerializerField() created_by = PublicUserSerializer() class Meta: model = Event fields = ('id', 'title', 'description', 'cover', 'text', 'event_type', 'location', 'comments', 'comment_target', 'start_time', 'end_time', 'merge_time', 'pools', 'unregistration_deadline', 'company', 'responsible_group', 'active_capacity', 'feedback_description', 'feedback_required', 'is_priced', 'price_member', 'price_guest', 'use_stripe', 'payment_due_date', 'use_captcha', 'waiting_registration_count', 'tags', 'is_merged', 'heed_penalties', 'created_by', 'is_abakom_only', 'registration_count', 'survey') read_only = True
class DetailedAbakusGroupSerializer(serializers.ModelSerializer): logo = ImageField( required=False, allow_null=True, options={"height": 400, "width": 400} ) class Meta: model = AbakusGroup fields = ( "id", "name", "description", "contact_email", "parent", "permissions", "type", "text", "logo", "number_of_users", "show_badge", ) def create(self, validated_data): if validated_data.get("type", None) == "interesse": validated_data["parent"] = AbakusGroup.objects.get(name="Interessegrupper") group = super(DetailedAbakusGroupSerializer, self).create(validated_data) user = self.context["request"].user Membership.objects.create( **{"user": user, "abakus_group": group, "role": constants.LEADER} ) return group
class PublicListAbakusGroupSerializer(PublicAbakusGroupSerializer): logo = ImageField(required=False, options={'height': 400, 'width': 400}) class Meta: model = AbakusGroup fields = PublicAbakusGroupSerializer.Meta.fields + ( 'number_of_users', )
class DetailedArticleSerializer(TagSerializerMixin, BasisModelSerializer): author = PublicUserSerializer(read_only=True, source="created_by") comments = CommentSerializer(read_only=True, many=True) cover = ImageField(required=False, options={"height": 500}) content_target = CharField(read_only=True) content = ContentSerializerField(source="text") reactions_grouped = serializers.SerializerMethodField() def get_reactions_grouped(self, obj): user = self.context["request"].user return obj.get_reactions_grouped(user) class Meta: model = Article fields = ( "id", "title", "cover", "author", "description", "comments", "content_target", "tags", "content", "created_at", "pinned", "reactions_grouped", "youtube_url", )
class CompanyAdminDetailSerializer(BasisModelSerializer): comments = CommentSerializer(read_only=True, many=True) content_target = CharField(read_only=True) student_contact = PublicUserField(required=False, allow_null=True, queryset=User.objects.all()) semester_statuses = SemesterStatusDetailSerializer(many=True, read_only=True) company_contacts = CompanyContactSerializer(many=True, read_only=True) logo = ImageField(required=False, options={"height": 500}) files = CompanyFileSerializer(many=True, read_only=True) class Meta: model = Company fields = ( "id", "name", "student_contact", "description", "phone", "company_type", "website", "address", "payment_mail", "comments", "content_target", "semester_statuses", "active", "admin_comment", "logo", "files", "company_contacts", )
class Oauth2UserDataSerializer(serializers.ModelSerializer): """ Basic serailizer """ abakus_groups = PublicAbakusGroupSerializer(many=True) memberships = MembershipSerializer(many=True) profile_picture = ImageField(required=False, options={"height": 200, "width": 200}) is_student = serializers.SerializerMethodField() is_abakus_member = serializers.BooleanField() class Meta: model = User fields = ( "id", "username", "first_name", "last_name", "full_name", "email_address", "profile_picture", "gender", "is_active", "is_student", "abakus_groups", "is_abakus_member", "is_abakom_member", "memberships", ) def get_is_student(self, user): return user.is_verified_student()
class PageDetailSerializer(BasisModelSerializer): content = ContentSerializerField() picture = ImageField(required=False, options={"height": 500}) class Meta: model = Page fields = ("pk", "title", "slug", "content", "picture", "category")
class PageListSerializer(BasisModelSerializer): picture = ImageField(required=False, options={'height': 200, 'width': 200}) class Meta: model = Page fields = ('pk', 'title', 'slug', 'picture')
class CompanyDetailSerializer(BasisModelSerializer): logo = ImageField(required=False, options={'height': 500}) class Meta: model = Company fields = ('id', 'name', 'description', 'phone', 'company_type', 'website', 'address', 'logo')
class DetailedUserSerializer(serializers.ModelSerializer): abakus_groups = PublicAbakusGroupSerializer(many=True) past_memberships = PastMembershipSerializer(many=True) penalties = serializers.SerializerMethodField("get_valid_penalties") profile_picture = ImageField(required=False, options={"height": 200, "width": 200}) def get_valid_penalties(self, user): qs = Penalty.objects.valid().filter(user=user) serializer = PenaltySerializer(instance=qs, many=True) return serializer.data class Meta: model = User fields = ( "id", "username", "first_name", "last_name", "full_name", "gender", "email", "email_address", "email_lists_enabled", "profile_picture", "allergies", "is_active", "penalties", "abakus_groups", "past_memberships", "permissions_per_group", )
class PageDetailSerializer(BasisModelSerializer): picture = ImageField(required=False, options={'height': 500}) class Meta: model = Page fields = ('pk', 'title', 'slug', 'content', 'picture')
class EventCreateAndUpdateSerializer(TagSerializerMixin, BasisModelSerializer): cover = ImageField(required=False, options={'height': 500}) responsible_group = AbakusGroupField(queryset=AbakusGroup.objects.all(), required=False, allow_null=True) pools = PoolCreateAndUpdateSerializer(many=True, required=False) text = ContentSerializerField() is_abakom_only = BooleanField(required=False, default=False) registration_close_time = serializers.DateTimeField(read_only=True) class Meta: model = Event fields = ('id', 'title', 'cover', 'description', 'text', 'company', 'responsible_group', 'feedback_description', 'feedback_required', 'event_type', 'location', 'is_priced', 'price_member', 'price_guest', 'use_stripe', 'payment_due_date', 'start_time', 'end_time', 'merge_time', 'use_captcha', 'tags', 'pools', 'unregistration_deadline', 'pinned', 'heed_penalties', 'is_abakom_only', 'registration_deadline_hours', 'registration_close_time') def create(self, validated_data): pools = validated_data.pop('pools', []) is_abakom_only = validated_data.pop('is_abakom_only', False) with transaction.atomic(): event = super().create(validated_data) for pool in pools: permission_groups = pool.pop('permission_groups') created_pool = Pool.objects.create(event=event, **pool) created_pool.permission_groups.set(permission_groups) event.set_abakom_only(is_abakom_only) return event def update(self, instance, validated_data): pools = validated_data.pop('pools', None) is_abakom_only = validated_data.pop('is_abakom_only', False) with transaction.atomic(): if pools is not None: existing_pools = list(instance.pools.all().values_list( 'id', flat=True)) for pool in pools: pool_id = pool.get('id', None) if pool_id in existing_pools: existing_pools.remove(pool_id) permission_groups = pool.pop('permission_groups') created_pool = Pool.objects.update_or_create( event=instance, id=pool_id, defaults={ 'name': pool.get('name'), 'capacity': pool.get('capacity', 0), 'activation_date': pool.get('activation_date'), })[0] created_pool.permission_groups.set(permission_groups) for pool_id in existing_pools: Pool.objects.get(id=pool_id).delete() instance.set_abakom_only(is_abakom_only) return super().update(instance, validated_data)
class SearchArticleSerializer(TagSerializerMixin, BasisModelSerializer): cover = ImageField(required=False, options={'height': 500}) content = ContentSerializerField(source='text') class Meta: model = Article fields = ('id', 'title', 'cover', 'description', 'tags', 'content', 'pinned', 'created_at')
class EventReadSerializer(TagSerializerMixin, BasisModelSerializer): company = CompanyField(queryset=Company.objects.all()) cover = ImageField(required=False, options={'height': 500}) thumbnail = ImageField(source='cover', required=False, options={ 'height': 500, 'width': 500, 'smart': True }) class Meta: model = Event fields = ('id', 'title', 'description', 'cover', 'event_type', 'location', 'start_time', 'thumbnail', 'total_capacity', 'company', 'registration_count', 'tags') read_only = True
class EventReadDetailedSerializer(TagSerializerMixin, BasisModelSerializer): comments = CommentSerializer(read_only=True, many=True) content_target = CharField(read_only=True) cover = ImageField(required=False, options={"height": 500}) company = CompanyField(queryset=Company.objects.all()) responsible_group = AbakusGroupField(queryset=AbakusGroup.objects.all(), required=False, allow_null=True) pools = PoolReadSerializer(many=True) active_capacity = serializers.ReadOnlyField() text = ContentSerializerField() created_by = PublicUserSerializer() registration_close_time = serializers.DateTimeField(read_only=True) class Meta: model = Event fields = ( "id", "title", "description", "cover", "text", "event_type", "event_status_type", "location", "comments", "content_target", "start_time", "end_time", "merge_time", "pools", "registration_close_time", "registration_deadline_hours", "unregistration_deadline", "company", "responsible_group", "active_capacity", "feedback_description", "feedback_required", "is_priced", "price_member", "price_guest", "use_stripe", "payment_due_date", "use_captcha", "waiting_registration_count", "tags", "is_merged", "heed_penalties", "created_by", "is_abakom_only", "registration_count", "survey", "use_consent", "youtube_url", ) read_only = True
class PublicArticleSerializer(TagSerializerMixin, BasisModelSerializer): cover = ImageField(required=False, options={'height': 300}) author = PublicUserSerializer(read_only=True, source='created_by') class Meta: model = Article fields = ('id', 'title', 'cover', 'author', 'description', 'tags', 'created_at', 'pinned')
class EventSearchSerializer(serializers.ModelSerializer): cover = ImageField(required=False, options={'height': 500}) thumbnail = ImageField(source='cover', required=False, options={ 'height': 500, 'width': 500, 'smart': True }) text = ContentSerializerField() class Meta: model = Event fields = ('id', 'title', 'description', 'cover', 'text', 'event_type', 'location', 'start_time', 'thumbnail', 'end_time', 'total_capacity', 'company', 'registration_count', 'tags', 'pinned') read_only = True
class PageDetailAuthSerializer(BasisModelSerializer, ObjectPermissionsSerializerMixin): content = ContentSerializerField() picture = ImageField(required=False, options={"height": 500}) class Meta: model = Page fields = (PageDetailSerializer.Meta.fields + ObjectPermissionsSerializerMixin.Meta.fields)
class MeSerializer(serializers.ModelSerializer): """ Serializer for the /me, retrieve and update endpoint with EDIT permissions. Also used by our JWT handler and returned to the user when a user obtains a JWT token. """ abakus_groups = PublicAbakusGroupSerializer(many=True) memberships = MembershipSerializer(many=True) profile_picture = ImageField(required=False, options={ 'height': 200, 'width': 200 }) ical_token = serializers.SerializerMethodField('get_user_ical_token') penalties = serializers.SerializerMethodField('get_valid_penalties') is_student = serializers.SerializerMethodField() is_abakus_member = serializers.BooleanField() past_memberships = PastMembershipSerializer(many=True) def get_user_ical_token(self, user): ical_token = ICalToken.objects.get_or_create(user=user)[0] return ical_token.token def get_valid_penalties(self, user): qs = Penalty.objects.valid().filter(user=user) serializer = PenaltySerializer(instance=qs, many=True) return serializer.data def get_is_student(self, user): return user.is_verified_student() def validate_username(self, username): """ It is not possible to change username tom something that exists. Used to remove case-sensitivity. """ username_exists = User.objects \ .filter(username__iexact=username) \ .exclude(id=self.instance.id) \ .exists() if username_exists: raise exceptions.ValidationError('Username exists') return username class Meta: model = User fields = ('id', 'username', 'first_name', 'last_name', 'full_name', 'email', 'email_address', 'email_lists_enabled', 'profile_picture', 'gender', 'allergies', 'is_active', 'is_student', 'abakus_groups', 'is_abakus_member', 'is_abakom_member', 'penalties', 'ical_token', 'memberships', 'past_memberships')
class DetailedArticleSerializer(TagSerializerMixin, BasisModelSerializer): author = PublicUserSerializer(read_only=True, source='created_by') comments = CommentSerializer(read_only=True, many=True) cover = ImageField(required=False, options={'height': 500}) comment_target = CharField(read_only=True) content = ContentSerializerField(source='text') class Meta: model = Article fields = ('id', 'title', 'cover', 'author', 'description', 'comments', 'comment_target', 'tags', 'content', 'created_at', 'pinned')
class PublicUserSerializer(serializers.ModelSerializer): profile_picture = ImageField(required=False, options={ 'height': 200, 'width': 200 }) class Meta: model = User fields = ('id', 'username', 'first_name', 'last_name', 'full_name', 'gender', 'profile_picture') read_only_fields = ('username', )
class PublicAbakusGroupSerializer(serializers.ModelSerializer): logo = ImageField(required=False, options={'height': 400, 'width': 400}) class Meta: model = AbakusGroup fields = ( 'id', 'name', 'description', 'contact_email', 'parent', 'logo', 'type', )