-
Notifications
You must be signed in to change notification settings - Fork 5
Closed
Description
Problem Statement
The ' create region' features uses a Rest API.
Acceptance Criteria
The 'Region' feature works with a graphql mutation.
Additional Information
serializer
server/apps/geo/serializers.py
Lines 35 to 81 in 0c1dc33
| class RegionSerializer(RemoveNullFieldsMixin, | |
| DynamicFieldsMixin, UserResourceSerializer): | |
| """ | |
| Region Model Serializer | |
| """ | |
| admin_levels = SimpleAdminLevelSerializer( | |
| many=True, | |
| source='adminlevel_set', | |
| read_only=True, | |
| ) | |
| project = serializers.IntegerField( | |
| write_only=True, | |
| required=False, | |
| ) | |
| is_published = serializers.BooleanField(read_only=True) | |
| class Meta: | |
| model = Region | |
| exclude = ('geo_options',) | |
| def validate_project(self, project): | |
| try: | |
| project = Project.objects.get(id=project) | |
| except Project.DoesNotExist: | |
| raise serializers.ValidationError( | |
| 'Project matching query does not exist' | |
| ) | |
| if not project.can_modify(self.context['request'].user): | |
| raise serializers.ValidationError('Invalid project') | |
| return project.id | |
| def validate(self, data): | |
| if self.instance and self.instance.is_published: | |
| raise serializers.ValidationError('Published region can\'t be changed. Please contact Admin') | |
| return data | |
| def create(self, validated_data): | |
| project = validated_data.pop('project', None) | |
| region = super().create(validated_data) | |
| if project: | |
| project = Project.objects.get(id=project) | |
| project.regions.add(region) | |
| return region |
views
Lines 40 to 50 in 0c1dc33
| class RegionViewSet(viewsets.ModelViewSet): | |
| serializer_class = RegionSerializer | |
| permission_classes = [permissions.IsAuthenticated, ModifyPermission] | |
| filter_backends = (django_filters.rest_framework.DjangoFilterBackend, | |
| filters.SearchFilter, filters.OrderingFilter) | |
| filterset_class = RegionFilterSet | |
| search_fields = ('title', 'code') | |
| def get_queryset(self): | |
| return Region.get_for(self.request.user).defer('geo_options') | |
Rest Framework urls
method: POST
url: api/v1/regions/
request payload: {"title":"Nepal Region","code":"NPL","project":"3","public":false,"isPublished":false}
response: {
"count": int,
"next": null,
"previous": null,
"results":{
"id": ID,
"modifiedAt": Datetime,
"modifiedBy": ID,
"createdByName": str,
"modifiedByName": str,
"versionId": ID,
"adminLevels": [],
"isPublished": Boolean,
"createdAt": Datetime,
"code": str,
"title": Str,
"public": boolean,
"cacheIndex": int,
"createdBy": Id
}
}
Metadata
Metadata
Assignees
Labels
No labels