def test_get_attribute(self, mock_super): field = PaymentTypeField(choices=Payment.PAYMENT_TYPE) obj = Payment() obj.payment = False self.assertEqual(field.get_attribute(obj), PaymentTypeField.NO_PAYMENT) obj.payment = True field.get_attribute(obj) mock_super.assert_called()
class AdminOrderSerializer(serializers.ModelSerializer): class Meta: model = Order fields = ("pk", "payment", "product", "name", "member", "display_name") payment = PaymentTypeField(source="payment.type", choices=Payment.PAYMENT_TYPE, required=False) display_name = serializers.SerializerMethodField("_display_name") def _display_name(self, instance): if instance.member: return instance.member.get_full_name() return instance.name def validate(self, attrs): if attrs.get("member") and attrs.get("name"): raise ValidationError({ "member": _("Either specify a member or a name"), "name": _("Either specify a member or a name"), }) if not (attrs.get("member") or attrs.get("name")) and not self.partial: attrs["member"] = self.context["request"].member return super().validate(attrs) def create(self, validated_data: Any) -> Any: del validated_data["payment"] return super().create(validated_data) def update(self, instance: Model, validated_data: Any) -> Any: del validated_data["payment"] return super().update(instance, validated_data)
class OrderSerializer(serializers.ModelSerializer): class Meta: model = Order fields = ("pk", "payment", "product", "name", "member") read_only_fields = ("pk", "payment", "name", "member") payment = PaymentTypeField(source="payment.type", choices=Payment.PAYMENT_TYPE, read_only=True)
class EventRegistrationAdminListSerializer(EventRegistrationListSerializer): """Custom registration admin list serializer""" class Meta: model = EventRegistration fields = ( "pk", "member", "name", "registered_on", "is_cancelled", "is_late_cancellation", "queue_position", "payment", "present", "avatar", ) registered_on = serializers.DateTimeField(source="date") is_cancelled = serializers.SerializerMethodField("_is_cancelled") is_late_cancellation = serializers.SerializerMethodField("_is_late_cancellation") queue_position = serializers.SerializerMethodField("_queue_position") payment = PaymentTypeField(source="payment.type", choices=Payment.PAYMENT_TYPE) def _is_late_cancellation(self, instance): return instance.is_late_cancellation() def _queue_position(self, instance): pos = instance.queue_position return pos if pos > 0 else None def _is_cancelled(self, instance): return instance.date_cancelled is not None def _name(self, instance): if instance.member: return instance.member.get_full_name() return instance.name
class EventRegistrationSerializer(serializers.ModelSerializer): """Registration serializer""" information_fields = None class Meta: model = EventRegistration fields = ( "pk", "member", "name", "photo", "avatar", "registered_on", "is_late_cancellation", "is_cancelled", "queue_position", "fields", "payment", "present", ) name = serializers.SerializerMethodField("_name") photo = serializers.SerializerMethodField("_photo") avatar = serializers.SerializerMethodField("_avatar") member = serializers.SerializerMethodField("_member") payment = PaymentTypeField(source="payment.type", choices=Payment.PAYMENT_TYPE) registered_on = serializers.DateTimeField(source="date", read_only=True) is_cancelled = serializers.SerializerMethodField("_is_cancelled") is_late_cancellation = serializers.SerializerMethodField("_is_late_cancellation") queue_position = serializers.SerializerMethodField( "_queue_position", read_only=False ) fields = serializers.HiddenField(default="") def _is_late_cancellation(self, instance): val = instance.is_late_cancellation() return False if val is None else val def _is_cancelled(self, instance): return instance.date_cancelled is not None def _queue_position(self, instance): pos = instance.queue_position return pos if pos > 0 else None def _member(self, instance): if instance.member: return instance.member.pk return None def _name(self, instance): if instance.member: return instance.member.profile.display_name() return instance.name def _photo(self, instance): if instance.member and instance.member.profile.photo: return self.context["request"].build_absolute_uri( f"{settings.MEDIA_URL}{instance.member.profile.photo}" ) return self.context["request"].build_absolute_uri( static("members/images/default-avatar.jpg") ) def _avatar(self, instance): placeholder = self.context["request"].build_absolute_uri( static("members/images/default-avatar.jpg") ) file = None if instance.member and instance.member.profile.photo: file = instance.member.profile.photo return create_image_thumbnail_dict( self.context["request"], file, placeholder=placeholder, size_large="800x800" ) def __init__(self, instance=None, data=empty, **kwargs): super().__init__(instance, data, **kwargs) try: if instance: self.information_fields = services.registration_fields( kwargs["context"]["request"], registration=instance ) except RegistrationError: pass def get_fields(self): fields = super().get_fields() if self.information_fields: for key, field in self.information_fields.items(): key = "fields[{}]".format(key) field_type = field["type"] if field_type == RegistrationInformationField.BOOLEAN_FIELD: fields[key] = serializers.BooleanField( required=False, write_only=True ) elif field_type == RegistrationInformationField.INTEGER_FIELD: fields[key] = serializers.IntegerField( required=field["required"], write_only=True, allow_null=not field["required"], ) elif field_type == RegistrationInformationField.TEXT_FIELD: fields[key] = serializers.CharField( required=field["required"], write_only=True, allow_blank=not field["required"], allow_null=not field["required"], ) fields[key].label = field["label"] fields[key].help_text = field["description"] fields[key].initial = field["value"] fields[key].default = field["value"] try: if key in self.information_fields: fields[key].initial = self.validated_data[key] except AssertionError: pass return fields def to_representation(self, instance): data = super().to_representation(instance) data["fields"] = self.information_fields return data def field_values(self): return ( (name[7 : len(name) - 1], value) for name, value in self.validated_data.items() if "info_field" in name )