Skip to content

Commit

Permalink
Add Custom CSV serialier for Project
Browse files Browse the repository at this point in the history
- Update Factory models
    - Add prefix for all name attributes
    - Fix project secondary_sectors post_generation logic
- Add visibility_display to Project API
- Add test for snapshot test for Project CSV serializer
- Add condition to skip opencensus if Instrumentaion key is not defined
  (For local development)
  • Loading branch information
thenav56 committed Jun 3, 2021
1 parent 57251a5 commit 9e3e71d
Show file tree
Hide file tree
Showing 14 changed files with 256 additions and 188 deletions.
2 changes: 1 addition & 1 deletion .flake8
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[flake8]
ignore = C901, W504
max-line-length = 130
exclude = .git,__pycache__,old,build,dist,*migrations*
exclude = .git,__pycache__,old,build,dist,*migrations*,*snapshots*
max-complexity = 10
2 changes: 1 addition & 1 deletion TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ generate random values for each instance of `ExampleModel` created by

```
class ExampleFactory(factory.django.DjangoModelFactory):
name = fuzzy.FuzzyText(length=10)
name = fuzzy.FuzzyText(length=10, prefix='example-')
age = fuzzy.FuzzyInteger(0)
```

Expand Down
4 changes: 2 additions & 2 deletions api/factories/country.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ class CountryFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.Country

name = fuzzy.FuzzyText(length=100)
name = fuzzy.FuzzyText(length=50, prefix='country-')
record_type = fuzzy.FuzzyChoice(models.CountryType)
iso = fuzzy.FuzzyText(length=2)
iso3 = fuzzy.FuzzyText(length=3)
society_name = fuzzy.FuzzyText(length=500)
society_name = fuzzy.FuzzyText(length=50, prefix='society-name-')
society_url = fuzzy.FuzzyText(length=200)
url_ifrc = fuzzy.FuzzyText(length=200)
region = factory.SubFactory(region.RegionFactory)
Expand Down
2 changes: 1 addition & 1 deletion api/factories/disaster_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ class DisasterTypeFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.DisasterType

name = fuzzy.FuzzyText(length=100)
name = fuzzy.FuzzyText(length=50, prefix='disaster-type-')
summary = fuzzy.FuzzyText(length=500)
2 changes: 1 addition & 1 deletion api/factories/district.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class DistrictFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.District

name = fuzzy.FuzzyText(length=100)
name = fuzzy.FuzzyText(length=50, prefix='district-')
code = fuzzy.FuzzyText(length=10)
country = factory.SubFactory(country.CountryFactory)
is_enclave = fuzzy.FuzzyChoice([True, False])
Expand Down
4 changes: 2 additions & 2 deletions api/factories/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
import pytz

from .. import models
from . import country, disaster_type
from . import disaster_type


class EventFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.Event

name = fuzzy.FuzzyText(length=100)
name = fuzzy.FuzzyText(length=50, prefix='event-')
slug = fuzzy.FuzzyText(length=50)
dtype = factory.SubFactory(disaster_type.DisasterTypeFactory)

Expand Down
7 changes: 5 additions & 2 deletions api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ class Meta:

class DistrictSerializer(ModelSerializer):
country = MiniCountrySerializer()

class Meta:
model = District
fields = ('name', 'code', 'country', 'id', 'is_deprecated',)
Expand Down Expand Up @@ -180,7 +180,10 @@ def get_centroid(self, district):

class Meta:
model = District
fields = ('name', 'code', 'country_name','country_iso','country_iso3', 'id', 'is_enclave', 'bbox', 'centroid', 'is_deprecated',)
fields = (
'id', 'name', 'code', 'country_name', 'country_iso', 'country_iso3',
'is_enclave', 'bbox', 'centroid', 'is_deprecated',
)


class RegionKeyFigureSerializer(ModelSerializer):
Expand Down
8 changes: 7 additions & 1 deletion deployments/drf_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
PartnerDeploymentTableauSerializer,
RegionalProjectSerializer,
ProjectSerializer,
ProjectCsvSerializer,
)


Expand Down Expand Up @@ -183,11 +184,16 @@ class ProjectViewset(RevisionMixin, ReadOnlyVisibilityViewsetMixin, viewsets.Mod
queryset = Project.objects.prefetch_related(
'user', 'reporting_ns', 'project_districts', 'event', 'dtype', 'regional_project',
).all()
# TODO: May require different permission for UNSAFE_METHODS (Also Country Level)
filter_class = ProjectFilter
serializer_class = ProjectSerializer
ordering_fields = ('name',)

def get_serializer_class(self):
request_format_type = self.request.GET.get('format', 'json')
if request_format_type == 'csv':
return ProjectCsvSerializer
return super().get_serializer_class()

def get_permissions(self):
# Require authentication for unsafe methods only
if self.action in ['list', 'retrieve']:
Expand Down
6 changes: 2 additions & 4 deletions deployments/factories/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from factory import fuzzy
import datetime
import pytz
from random import randrange

from .. import models
from . import user, regional_project
Expand All @@ -29,7 +28,7 @@ def project_districts(self, create, extracted, **kwargs):

event = factory.SubFactory(event.EventFactory)
dtype = factory.SubFactory(disaster_type.DisasterTypeFactory)
name = fuzzy.FuzzyText(length=500)
name = fuzzy.FuzzyText(length=50, prefix='project-')
programme_type = fuzzy.FuzzyChoice(models.ProgrammeTypes)
primary_sector = fuzzy.FuzzyChoice(models.Sectors)

Expand All @@ -39,8 +38,7 @@ def secondary_sectors(self, create, extracted, **kwargs):
return

if extracted:
for secondary_sector in extracted:
self.secondary_sectors.add(secondary_sector)
self.secondary_sectors = extracted

operation_type = fuzzy.FuzzyChoice(models.OperationTypes)
start_date = factory.LazyFunction(
Expand Down
2 changes: 1 addition & 1 deletion deployments/factories/regional_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ class RegionalProjectFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.RegionalProject

name = fuzzy.FuzzyText(length=100)
name = fuzzy.FuzzyText(length=50, prefix='regional-project-')
created_at = fuzzy.FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc))
modified_at = fuzzy.FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc))
24 changes: 24 additions & 0 deletions deployments/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from rest_framework import serializers
from enumfields.drf.serializers import EnumSupportSerializerMixin

from main.utils import get_merged_items_by_fields
from lang.serializers import ModelSerializer
from api.serializers import (
DisasterTypeSerializer,
Expand Down Expand Up @@ -164,6 +165,7 @@ class ProjectSerializer(EnumSupportSerializerMixin, ModelSerializer):
programme_type_display = serializers.CharField(source='get_programme_type_display', read_only=True)
operation_type_display = serializers.CharField(source='get_operation_type_display', read_only=True)
status_display = serializers.CharField(source='get_status_display', read_only=True)
visibility_display = serializers.CharField(source='get_visibility_display', read_only=True)
secondary_sectors_display = serializers.ListField(source='get_secondary_sectors_display', read_only=True)

class Meta:
Expand Down Expand Up @@ -201,3 +203,25 @@ def create(self, validated_data):
project.user = self.context['request'].user
project.save()
return project


class ProjectCsvSerializer(ProjectSerializer):
secondary_sectors = serializers.SerializerMethodField()
secondary_sectors_display = serializers.SerializerMethodField()
project_districts_detail = serializers.SerializerMethodField()

class Meta:
model = Project
exclude = ['project_districts']

def get_secondary_sectors(self, obj):
return ', '.join([str(sector.value) for sector in obj.secondary_sectors])

def get_secondary_sectors_display(self, obj):
return ', '.join(obj.get_secondary_sectors_display())

def get_project_districts_detail(self, obj):
return get_merged_items_by_fields(
obj.project_districts.all(),
['name', 'code', 'id', 'is_enclave', 'is_deprecated']
)
Loading

0 comments on commit 9e3e71d

Please sign in to comment.