Skip to content

Commit 42c5648

Browse files
committed
Add status in geo area and retriggered when geo area is failed
Update migration
1 parent 1dd8a6c commit 42c5648

File tree

8 files changed

+111
-2
lines changed

8 files changed

+111
-2
lines changed

apps/geo/enums.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import graphene
2+
from geo.models import Region
3+
4+
from utils.graphene.enums import (
5+
convert_enum_to_graphene_enum,
6+
get_enum_name_from_django_field,
7+
)
28

39

410
class GeoAreaOrderingEnum(graphene.Enum):
@@ -8,3 +14,16 @@ class GeoAreaOrderingEnum(graphene.Enum):
814
# DESC
915
DESC_ID = f'-{ASC_ID}'
1016
DESC_ADMIN_LEVEL = f'-{ASC_ADMIN_LEVEL}'
17+
18+
19+
RegionStatusEnum = convert_enum_to_graphene_enum(
20+
Region.Status, name='RegionStatusEnum'
21+
)
22+
23+
24+
enum_map = {
25+
get_enum_name_from_django_field(field): enum
26+
for field, enum in (
27+
(Region.status, RegionStatusEnum),
28+
)
29+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 3.2.25 on 2024-12-05 04:25
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('geo', '0043_create-unaccent_extension'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='region',
15+
name='status',
16+
field=models.PositiveSmallIntegerField(choices=[(0, 'Initiated'), (1, 'Pending'), (2, 'Completed'), (3, 'Failed')], default=1),
17+
),
18+
]

apps/geo/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@
1414

1515

1616
class Region(UserResource):
17+
class Status(models.IntegerChoices):
18+
INITIATED = 0, 'Initiated'
19+
PENDING = 1, 'Pending'
20+
COMPLETED = 2, 'Completed'
21+
FAILED = 3, 'Failed'
1722
"""
1823
Region model
1924
@@ -35,6 +40,7 @@ class Region(UserResource):
3540
cache_index = models.SmallIntegerField(default=0) # Used to track cache update.
3641
centroid = models.PointField(blank=True, null=True) # Admin level 0 centroid
3742
geo_options = models.JSONField(default=None, blank=True, null=True)
43+
status = models.PositiveSmallIntegerField(choices=Status.choices, default=Status.PENDING)
3844

3945
def __init__(self, *args, **kwargs):
4046
self.id: Union[int, None]

apps/geo/mutations.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from geo.tasks import load_geo_areas
12
import graphene
23

34
from geo.models import Region, AdminLevel
@@ -134,10 +135,49 @@ def mutate(root, info, id):
134135
return PublishRegion(result=instance, errors=None, ok=True)
135136

136137

138+
class ReTriggeredFailedRegion(graphene.Mutation):
139+
class Arguments:
140+
region_id = graphene.ID(required=True)
141+
model = Region
142+
errors = graphene.List(graphene.NonNull(CustomErrorType))
143+
ok = graphene.Boolean()
144+
result = graphene.Field(RegionType)
145+
146+
@staticmethod
147+
def mutate(root, info, region_id):
148+
instance = Region.objects.filter(
149+
id=region_id
150+
).first()
151+
error_data = []
152+
if instance is None:
153+
error_data.append('Region does\'t exist')
154+
elif instance.status == Region.Status.COMPLETED:
155+
error_data.append('Geo Area already generated')
156+
elif instance.created_by != info.context.user:
157+
error_data.append('Authorized User only update region')
158+
elif instance.is_published:
159+
error_data.append("Published Region cannot be retiggered")
160+
161+
if error_data:
162+
return ReTriggeredFailedRegion(errors=[
163+
dict(
164+
field='nonFieldErrors',
165+
messages=error_data
166+
)
167+
], ok=False)
168+
load_geo_areas(region_id)
169+
return ReTriggeredFailedRegion(
170+
result=instance,
171+
error=None,
172+
ok=True
173+
)
174+
175+
137176
class Mutation():
138177
create_region = CreateRegion.Field()
139178
update_region = UpdateRegion.Field()
140179
create_admin_level = CreateAdminLevel.Field()
141180
publish_region = PublishRegion.Field()
142181
update_admin_level = UpdateAdminLevel.Field()
143182
delete_admin_level = DeleteAdminLevel.Field()
183+
retrigger_region = ReTriggeredFailedRegion.Field()

apps/geo/schema.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from geo.enums import RegionStatusEnum
12
import graphene
23
from graphene_django import DjangoObjectType
34
from graphene_django_extras import DjangoObjectField, PageGraphqlPagination
@@ -53,12 +54,14 @@ def get_custom_queryset(queryset, info, **kwargs):
5354

5455

5556
class RegionType(DjangoObjectType, ClientIdMixin):
57+
status = graphene.Field(RegionStatusEnum)
58+
5659
class Meta:
5760
model = Region
5861
only_fields = (
5962
'id', 'title', 'public', 'regional_groups',
6063
'key_figures', 'population_data', 'media_sources',
61-
'centroid', 'is_published',
64+
'centroid', 'is_published', 'status'
6265
)
6366

6467
@staticmethod

apps/geo/serializers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ def create(self, validated_data):
111111
admin_level.save()
112112

113113
region = admin_level.region
114+
region.status = Region.Status.INITIATED
114115
region.modified_by = self.context['request'].user
115116
region.save()
116117

apps/geo/tasks.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,13 +210,19 @@ def load_geo_areas(region_id):
210210
have_lock = lock.acquire(blocking=False)
211211
if not have_lock:
212212
return False
213-
213+
region = Region.objects.filter(id=region_id).first()
214+
if not region:
215+
logger.error("Region not found", exc_info=True)
216+
return False
214217
try:
215218
return_value = _load_geo_areas(region_id)
219+
region.status = Region.Status.COMPLETED
216220
except Exception:
217221
logger.error('Load Geo Areas', exc_info=True)
218222
return_value = False
223+
region.status = Region.Status.FAILED
219224

225+
region.save()
220226
lock.release()
221227
return return_value
222228

schema.graphql

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5124,6 +5124,7 @@ type Mutation {
51245124
publishRegion(id: ID!): PublishRegion
51255125
updateAdminLevel(data: AdminLevelInputType!, id: ID!): UpdateAdminLevel
51265126
deleteAdminLevel(adminLevelId: ID!): DeleteAdminLevel
5127+
retriggerRegion(regionId: ID!): ReTriggeredFailedRegion
51275128
organizationCreate(data: OrganizationInputType!): OrganizationCreate
51285129
createAssessmentRegSummaryIssue(data: AssessmentRegistrySummaryIssueCreateInputType!): AssessmentRegistryCreateIssue
51295130
fileUpload(data: FileUploadInputType!): UploadFile
@@ -5970,6 +5971,12 @@ type QuestionType {
59705971
subSectorDisplay: EnumDescription
59715972
}
59725973

5974+
type ReTriggeredFailedRegion {
5975+
errors: [GenericScalar!]
5976+
ok: Boolean
5977+
result: RegionType
5978+
}
5979+
59735980
type RecentActivityType {
59745981
id: ID!
59755982
createdAt: DateTime
@@ -6004,6 +6011,7 @@ type RegionDetailType {
60046011
mediaSources: GenericScalar
60056012
centroid: PointScalar
60066013
clientId: ID!
6014+
status: RegionStatusEnum
60076015
adminLevels: [AdminLevelType!]!
60086016
}
60096017

@@ -6043,6 +6051,13 @@ input RegionProjectFilterData {
60436051
isTest: Boolean
60446052
}
60456053

6054+
enum RegionStatusEnum {
6055+
INITIATED
6056+
PENDING
6057+
COMPLETED
6058+
FAILED
6059+
}
6060+
60466061
type RegionType {
60476062
id: ID!
60486063
title: String!
@@ -6053,6 +6068,7 @@ type RegionType {
60536068
populationData: GenericScalar
60546069
mediaSources: GenericScalar
60556070
centroid: PointScalar
6071+
status: RegionStatusEnum
60566072
clientId: ID!
60576073
}
60586074

0 commit comments

Comments
 (0)