Skip to content

Commit 1deaa5f

Browse files
Merge pull request #2078 from IFRCGo/feature/check-svg-file-type
Feature/check svg file type
2 parents f80e097 + b445069 commit 1deaa5f

File tree

11 files changed

+541
-200
lines changed

11 files changed

+541
-200
lines changed

api/models.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,13 @@ class Meta:
647647
verbose_name_plural = _('region snippets')
648648

649649
def __str__(self):
650-
return self.snippet
650+
return (
651+
self.snippet[:80] if self.snippet else None
652+
) or (
653+
self.image.url
654+
if getattr(self, 'image', None) and self.image.url
655+
else ''
656+
)
651657

652658

653659
@reversion.register(follow=('region',))
@@ -664,7 +670,7 @@ class Meta:
664670
verbose_name_plural = _('region emergencies snippets')
665671

666672
def __str__(self):
667-
return self.snippet
673+
return (self.snippet[:80] if self.snippet else None) or self.title or ''
668674

669675

670676
@reversion.register(follow=('region',))
@@ -681,7 +687,7 @@ class Meta:
681687
verbose_name_plural = _('region preparedness snippets')
682688

683689
def __str__(self):
684-
return self.snippet
690+
return (self.snippet[:80] if self.snippet else None) or self.title or ''
685691

686692

687693
@reversion.register(follow=('region',))
@@ -698,7 +704,7 @@ class Meta:
698704
verbose_name_plural = _('region profile snippets')
699705

700706
def __str__(self):
701-
return self.snippet
707+
return (self.snippet[:80] if self.snippet else None) or self.title or ''
702708

703709
# class RegionAdditionalLink(models.Model):
704710
# region = models.ForeignKey(Region, related_name='additional_links', on_delete=models.CASCADE)
@@ -724,7 +730,13 @@ class Meta:
724730
verbose_name_plural = _('country snippets')
725731

726732
def __str__(self):
727-
return self.snippet
733+
return (
734+
self.snippet[:80] if self.snippet else None
735+
) or (
736+
self.image.url
737+
if getattr(self, 'image', None) and self.image.url
738+
else ''
739+
)
728740

729741

730742
@reversion.register()
@@ -1020,7 +1032,13 @@ class Meta:
10201032
verbose_name_plural = _('snippets')
10211033

10221034
def __str__(self):
1023-
return self.snippet if self.snippet else ''
1035+
return (
1036+
self.snippet[:80] if self.snippet else None
1037+
) or (
1038+
self.image.url
1039+
if getattr(self, 'image', None) and self.image.url
1040+
else ''
1041+
)
10241042

10251043

10261044
class SituationReportType(models.Model):

api/serializers.py

Lines changed: 69 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
)
7878
from local_units.serializers import MiniDelegationOfficeSerializer
7979
from local_units.models import DelegationOffice
80+
from utils.file_check import validate_file_type
8081

8182

8283
class GeoSerializerMixin:
@@ -200,6 +201,10 @@ class Meta:
200201
"average_household_size",
201202
)
202203

204+
def validate_logo(self, logo):
205+
validate_file_type(logo)
206+
return logo
207+
203208

204209
class CountryGeoSerializer(ModelSerializer):
205210
bbox = serializers.SerializerMethodField()
@@ -487,6 +492,10 @@ class Meta:
487492
"id",
488493
)
489494

495+
def validate_image(self, image):
496+
validate_file_type(image)
497+
return image
498+
490499

491500
class RegionEmergencySnippetSerializer(ModelSerializer):
492501
class Meta:
@@ -551,6 +560,10 @@ class Meta:
551560
"id",
552561
)
553562

563+
def validate_image(self, image):
564+
validate_file_type(image)
565+
return image
566+
554567

555568
class RegionLinkSerializer(ModelSerializer):
556569
class Meta:
@@ -778,6 +791,7 @@ def get_country_delegation(self, country):
778791

779792
class CountryKeyDocumentSerializer(ModelSerializer):
780793
country_details = MiniCountrySerializer(source='country', read_only=True)
794+
781795
class Meta:
782796
model = CountryKeyDocument
783797
fields = "__all__"
@@ -832,6 +846,10 @@ class Meta:
832846
"tab_display",
833847
)
834848

849+
def validate_image(self, image):
850+
validate_file_type(image)
851+
return image
852+
835853

836854
class EventContactSerializer(ModelSerializer):
837855
class Meta:
@@ -931,6 +949,7 @@ class Meta:
931949

932950

933951
class EventFeaturedDocumentSerializer(serializers.ModelSerializer):
952+
934953
class Meta:
935954
model = EventFeaturedDocument
936955
fields = (
@@ -941,6 +960,14 @@ class Meta:
941960
"file",
942961
)
943962

963+
def validate_thumbnail(self, thumbnail):
964+
validate_file_type(thumbnail)
965+
return thumbnail
966+
967+
def validate_file(self, file):
968+
validate_file_type(file)
969+
return file
970+
944971

945972
class EventLinkSerializer(ModelSerializer):
946973
class Meta:
@@ -1376,6 +1403,10 @@ class Meta:
13761403
"visibility_display",
13771404
)
13781405

1406+
def validate_document(self, document):
1407+
validate_file_type(document)
1408+
return document
1409+
13791410

13801411
class AppealTableauSerializer(serializers.ModelSerializer):
13811412
country = MiniCountrySerializer()
@@ -1559,8 +1590,8 @@ class AppealDocumentAppealSerializer(serializers.ModelSerializer):
15591590
class Meta:
15601591
model = Appeal
15611592
fields = (
1562-
'id',
1563-
'code',
1593+
"id",
1594+
"code",
15641595
)
15651596

15661597

@@ -1582,6 +1613,10 @@ class Meta:
15821613
"id",
15831614
)
15841615

1616+
def validate_document(self, document):
1617+
validate_file_type(document)
1618+
return document
1619+
15851620

15861621
class ProfileSerializer(ModelSerializer):
15871622
country = MiniCountrySerializer()
@@ -1666,7 +1701,7 @@ class Meta:
16661701

16671702

16681703
class UserCountryCountrySerializer(serializers.ModelSerializer):
1669-
region_details = MiniRegionSerialzier(source='region', read_only=True)
1704+
region_details = MiniRegionSerialzier(source="region", read_only=True)
16701705

16711706
class Meta:
16721707
model = Country
@@ -1680,12 +1715,12 @@ class Meta:
16801715

16811716
class UserCountrySerializer(serializers.ModelSerializer):
16821717
country_name = serializers.CharField(source="country.name", read_only=True)
1683-
region = serializers.IntegerField(source='country.region.name', read_only=True)
1684-
region_details = MiniRegionSerialzier(source='country.region', read_only=True)
1718+
region = serializers.IntegerField(source="country.region.name", read_only=True)
1719+
region_details = MiniRegionSerialzier(source="country.region", read_only=True)
16851720

16861721
class Meta:
16871722
model = UserCountry
1688-
exclude = ('id', 'user')
1723+
exclude = ("id", "user")
16891724

16901725

16911726
class UserMeSerializer(UserSerializer):
@@ -1737,9 +1772,9 @@ def get_lang_permissions(user) -> dict:
17371772
def get_is_dref_coordinator_for_regions(user) -> List[int]:
17381773
data = list(
17391774
Permission.objects.filter(
1740-
codename__startswith='dref_region_admin_',
1775+
codename__startswith="dref_region_admin_",
17411776
group__user=user
1742-
).values_list('codename', flat=True)
1777+
).values_list("codename", flat=True)
17431778
)
17441779
regions = []
17451780
for d in data:
@@ -1750,27 +1785,27 @@ def get_is_dref_coordinator_for_regions(user) -> List[int]:
17501785
@staticmethod
17511786
def get_is_per_admin_for_regions(user) -> List[int]:
17521787
permission_codenames = Permission.objects.filter(
1753-
codename__startswith='per_region_admin',
1788+
codename__startswith="per_region_admin",
17541789
group__user=user
1755-
).values_list('codename', flat=True)
1790+
).values_list("codename", flat=True)
17561791

1757-
regions = {int(code.split('_')[-1]) for code in permission_codenames}
1792+
regions = {int(code.split("_")[-1]) for code in permission_codenames}
17581793
return list(regions)
17591794

17601795
@staticmethod
17611796
def get_is_per_admin_for_countries(user) -> List[int]:
17621797
permission_codenames = Permission.objects.filter(
1763-
codename__startswith='per_country_admin',
1798+
codename__startswith="per_country_admin",
17641799
group__user=user
1765-
).values_list('codename', flat=True)
1800+
).values_list("codename", flat=True)
17661801

1767-
countries = {int(code.split('_')[-1]) for code in permission_codenames}
1802+
countries = {int(code.split("_")[-1]) for code in permission_codenames}
17681803
return list(countries)
17691804

17701805
@staticmethod
17711806
@extend_schema_field(UserCountrySerializer(many=True))
17721807
def get_user_countries_regions(user):
1773-
qs = UserCountry.objects.filter(user=user).distinct('country')
1808+
qs = UserCountry.objects.filter(user=user).distinct("country")
17741809
return UserCountrySerializer(qs, many=True).data
17751810

17761811

@@ -1818,7 +1853,7 @@ class Meta:
18181853

18191854
class FieldReportEnumDisplayMixin:
18201855
"""
1821-
Use for fields = '__all__'
1856+
Use for fields = "__all__"
18221857
"""
18231858

18241859
epi_figures_source_display = serializers.CharField(source="get_epi_figures_source_display", read_only=True)
@@ -1961,7 +1996,7 @@ def __init__(self, *args, **kwargs):
19611996
external_partners = ExternalPartnerSerializer(many=True)
19621997
supported_activities = SupportedActivitySerializer(many=True)
19631998
regions = RegionSerializer(many=True)
1964-
visibility_display = serializers.CharField(source='get_visibility_display', read_only=True)
1999+
visibility_display = serializers.CharField(source="get_visibility_display", read_only=True)
19652000

19662001
class Meta:
19672002
model = FieldReport
@@ -1972,11 +2007,11 @@ class FieldReportMiniUserSerializer(ModelSerializer):
19722007
class Meta:
19732008
model = User
19742009
fields = (
1975-
'id',
1976-
'username',
1977-
'email',
1978-
'first_name',
1979-
'last_name'
2010+
"id",
2011+
"username",
2012+
"email",
2013+
"first_name",
2014+
"last_name"
19802015
)
19812016

19822017

@@ -2015,7 +2050,7 @@ class FieldReportSerializer(
20152050
dtype_details = DisasterTypeSerializer(source="dtype", read_only=True)
20162051
external_partners_details = ExternalPartnerSerializer(source="external_partners", many=True, read_only=True)
20172052
supported_activities_details = SupportedActivitySerializer(source="supported_activities", many=True, read_only=True)
2018-
user_details = FieldReportMiniUserSerializer(source='user', read_only=True)
2053+
user_details = FieldReportMiniUserSerializer(source="user", read_only=True)
20192054

20202055
class Meta:
20212056
model = FieldReport
@@ -2037,7 +2072,7 @@ def create_event(self, report):
20372072
event.regions.add(*report.regions.all())
20382073
FieldReportSerializer.trigger_field_translation(event)
20392074
report.event = event
2040-
report.save(update_fields=['event'])
2075+
report.save(update_fields=["event"])
20412076

20422077
def validate(self, data):
20432078
# Set RecentAffected according to the sent _affected key – see (¤) in other code parts
@@ -2058,7 +2093,7 @@ def validate(self, data):
20582093
return data
20592094

20602095
def create(self, validated_data):
2061-
validated_data['user'] = self.context["request"].user
2096+
validated_data["user"] = self.context["request"].user
20622097
countries = validated_data["countries"]
20632098
field_report = super().create(validated_data)
20642099
# also add regions for the coutries selected
@@ -2068,7 +2103,7 @@ def create(self, validated_data):
20682103
return field_report
20692104

20702105
def update(self, instance, validated_data):
2071-
validated_data['user'] = self.context["request"].user
2106+
validated_data["user"] = self.context["request"].user
20722107
return super().update(instance, validated_data)
20732108

20742109

@@ -2339,7 +2374,7 @@ class HistoricalDisasterSerializer(serializers.Serializer):
23392374

23402375

23412376
class ExportSerializer(serializers.ModelSerializer):
2342-
status_display = serializers.CharField(source='get_status_display', read_only=True)
2377+
status_display = serializers.CharField(source="get_status_display", read_only=True)
23432378

23442379
class Meta:
23452380
model = Export
@@ -2354,10 +2389,14 @@ class Meta:
23542389
"url"
23552390
)
23562391

2392+
def validate_pdf_file(self, pdf_file):
2393+
validate_file_type(pdf_file)
2394+
return pdf_file
2395+
23572396
def create(self, validated_data):
2358-
export_id = validated_data.get('export_id')
2359-
export_type = validated_data.get('export_type')
2360-
country_id = validated_data.get('per_country')
2397+
export_id = validated_data.get("export_id")
2398+
export_type = validated_data.get("export_type")
2399+
country_id = validated_data.get("per_country")
23612400
if export_type == Export.ExportType.DREF:
23622401
title = Dref.objects.filter(
23632402
id=export_id

country_plan/serializers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
StrategicPriority,
66
MembershipCoordination,
77
)
8+
from utils.file_check import validate_file_type
89

910

1011
class StrategicPrioritySerializer(serializers.ModelSerializer):
@@ -67,3 +68,11 @@ def get_internal_plan_file(self, obj):
6768
return request.build_absolute_uri(
6869
serializers.FileField().to_representation(file)
6970
)
71+
72+
def validate_internal_plan_file(self, internal_plan_file):
73+
validate_file_type(internal_plan_file)
74+
return internal_plan_file
75+
76+
def validate_public_plan_file(self, public_plan_file):
77+
validate_file_type(public_plan_file)
78+
return public_plan_file

0 commit comments

Comments
 (0)