-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WEB-1435] chore: conflict free issue description #6120
base: preview
Are you sure you want to change the base?
Changes from all commits
e781ab9
cccc7b7
d3b443e
a7d8bee
745714a
baf1517
54ecea1
fcd06fc
547fc86
7448c5b
6275e2f
b3b1088
ccad0e7
389ee74
6667327
60d091e
6b437ee
a95143c
ef76bd0
e3ac9ef
02e3c48
e6787d8
ea4d201
4d7d4b6
1fcc3ab
3792699
11b0c82
84246ea
f409ee1
0b64cae
60b58ef
17f4806
9e5b104
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,3 +1,6 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Python imports | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import base64 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Django imports | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from django.utils import timezone | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from django.core.validators import URLValidator | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -625,12 +628,32 @@ class Meta: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
read_only_fields = fields | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class Base64BinaryField(serializers.CharField): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def to_representation(self, value): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Encode the binary data to base64 string for JSON response | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if value: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return base64.b64encode(value).decode("utf-8") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return None | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def to_internal_value(self, data): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Decode the base64 string to binary data when saving | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return base64.b64decode(data) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
except (TypeError, ValueError): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise serializers.ValidationError("Invalid base64-encoded data") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+631
to
+644
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add validation for binary data size and content. The
Consider applying this enhancement: class Base64BinaryField(serializers.CharField):
+ def __init__(self, *args, **kwargs):
+ self.max_size = kwargs.pop('max_size', 10 * 1024 * 1024) # 10MB default
+ super().__init__(*args, **kwargs)
+
def to_representation(self, value):
# Encode the binary data to base64 string for JSON response
if value:
return base64.b64encode(value).decode("utf-8")
return None
def to_internal_value(self, data):
# Decode the base64 string to binary data when saving
try:
+ if not data:
+ return None
decoded = base64.b64decode(data)
+ if len(decoded) > self.max_size:
+ raise serializers.ValidationError(
+ f"Binary data exceeds maximum size of {self.max_size} bytes"
+ )
return decoded
except TypeError:
- raise serializers.ValidationError("Invalid base64-encoded data")
+ raise serializers.ValidationError("Data is not a valid string")
+ except ValueError:
+ raise serializers.ValidationError("Invalid base64 encoding") 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class IssueDetailSerializer(IssueSerializer): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
description_html = serializers.CharField() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
description_binary = Base64BinaryField() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
is_subscribed = serializers.BooleanField(read_only=True) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class Meta(IssueSerializer.Meta): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fields = IssueSerializer.Meta.fields + ["description_html", "is_subscribed"] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fields = IssueSerializer.Meta.fields + [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"description_html", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"is_subscribed", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"description_binary", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
read_only_fields = fields | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using Base64BinaryField for consistency and validation
The
description_binary
field is implemented as a plainCharField
which could lead to:Base64BinaryField
Consider using the same field type as other serializers:
Also applies to: 271-274