@@ -277,6 +277,16 @@ def __str__(self):
277277
278278@reversion .register (follow = ("health" ,))
279279class LocalUnit (models .Model ):
280+ class Status (models .IntegerChoices ):
281+ VERIFIED = 1 , _ ("Verified" )
282+ UNVERIFIED = 2 , _ ("Unverified" )
283+
284+ class DeprecateReason (models .IntegerChoices ):
285+ NON_EXISTENT = 1 , _ ("Non-existent local unit" )
286+ INCORRECTLY_ADDED = 2 , _ ("Incorrectly added local unit" )
287+ SECURITY_CONCERNS = 3 , _ ("Security concerns" )
288+ OTHER = 4 , _ ("Other" )
289+
280290 # added to track health local unit data (Table B)
281291 health = models .ForeignKey (
282292 HealthData , on_delete = models .SET_NULL , verbose_name = _ ("Health Data" ), related_name = "health_data" , null = True , blank = True
@@ -340,12 +350,68 @@ class LocalUnit(models.Model):
340350 email = models .EmailField (max_length = 255 , blank = True , null = True , verbose_name = _ ("Email" ))
341351 link = models .URLField (max_length = 255 , blank = True , null = True , verbose_name = _ ("Social link" ))
342352 location = models .PointField (srid = 4326 , help_text = "Local Unit Location" )
353+ status = models .IntegerField (choices = Status .choices , verbose_name = _ ("status" ), default = Status .UNVERIFIED )
354+ is_deprecated = models .BooleanField (default = False , verbose_name = _ ("Is deprecated?" ))
355+ deprecated_reason = models .IntegerField (
356+ choices = DeprecateReason .choices , verbose_name = _ ("deprecated reason" ), blank = True , null = True
357+ )
358+ deprecated_reason_overview = models .TextField (
359+ verbose_name = _ ("Explain the reason why the local unit is being deleted" ), blank = True , null = True
360+ )
343361
344362 def __str__ (self ):
345363 branch_name = self .local_branch_name or self .english_branch_name
346364 return f"{ branch_name } ({ self .country .name } )"
347365
348366
367+ class LocalUnitChangeRequest (models .Model ):
368+
369+ class Status (models .IntegerChoices ):
370+ PENDING = 1 , _ ("Pending" )
371+ APPROVED = 2 , _ ("Approved" )
372+ REVERT = 3 , _ ("Revert" )
373+
374+ class Validator (models .IntegerChoices ):
375+ LOCAL = 1 , _ ("Local" )
376+ REGIONAL = 2 , _ ("Regional" )
377+ GLOBAL = 3 , _ ("Global" )
378+
379+ local_unit = models .ForeignKey (
380+ LocalUnit , on_delete = models .CASCADE , verbose_name = _ ("Local Unit" ), related_name = "local_unit_change_request"
381+ )
382+ previous_data = models .JSONField (verbose_name = _ ("Previous data" ), default = dict )
383+ status = models .IntegerField (choices = Status .choices , verbose_name = _ ("status" ), default = Status .PENDING )
384+ current_validator = models .IntegerField (
385+ choices = Validator .choices , verbose_name = _ ("Current validator" ), default = Validator .LOCAL
386+ )
387+
388+ # NOTE: triggered_by is the user who created the request
389+ triggered_by = models .ForeignKey (
390+ settings .AUTH_USER_MODEL ,
391+ verbose_name = _ ("triggered by" ),
392+ on_delete = models .SET_NULL ,
393+ null = True ,
394+ related_name = "tiggered_by_local_unit" ,
395+ )
396+ triggered_at = models .DateTimeField (verbose_name = _ ("Triggered at" ), auto_now_add = True )
397+
398+ # NOTE: updated_by is the user who approved/revert the request
399+ updated_by = models .ForeignKey (
400+ settings .AUTH_USER_MODEL ,
401+ verbose_name = _ ("updated by" ),
402+ on_delete = models .SET_NULL ,
403+ null = True ,
404+ related_name = "updated_by_local_unit" ,
405+ )
406+ updated_at = models .DateTimeField (verbose_name = _ ("Updated at" ), auto_now = True )
407+ rejected_data = models .JSONField (verbose_name = _ ("Rejected data" ), default = dict )
408+ rejected_reason = models .TextField (verbose_name = _ ("Rejected reason" ), blank = True , null = True )
409+
410+ def __str__ (self ):
411+ branch_name = self .local_branch_name or self .english_branch_name
412+ return f"{ branch_name } -Change Request-{ self .id } "
413+
414+
349415class DelegationOfficeType (models .Model ):
350416 code = models .IntegerField (verbose_name = _ ("Type Code" ), validators = [MaxValueValidator (10 ), MinValueValidator (0 )])
351417 name = models .CharField (max_length = 100 , verbose_name = _ ("Name" ))
0 commit comments