@@ -320,3 +320,97 @@ class NotificationGUID(models.Model):
320320 )
321321 email_type = models .CharField (max_length = 600 , null = True , blank = True )
322322 to_list = models .TextField (null = True , blank = True )
323+
324+
325+ class HazardType (models .Model ):
326+ """Model representing a hazard category."""
327+
328+ class Type (models .IntegerChoices ):
329+ EARTHQUAKE = 100 , _ ("Earthquake" )
330+ FLOOD = 200 , _ ("Flood" )
331+ CYCLONE = 300 , _ ("Cyclone" )
332+
333+ type = models .IntegerField (
334+ choices = Type .choices ,
335+ unique = True ,
336+ verbose_name = _ ("Hazard Type" ),
337+ )
338+
339+ class Meta :
340+ verbose_name = _ ("Hazard Type" )
341+ verbose_name_plural = _ ("Hazard Types" )
342+
343+ def __str__ (self ):
344+ return self .get_type_display ()
345+
346+
347+ class AlertSubscription (models .Model ):
348+ class AlertSource (models .IntegerChoices ):
349+ MONTANDON = 100 , _ ("Montandon" )
350+ """Alerts provided by the Montandon platform."""
351+
352+ class AlertPerDay (models .IntegerChoices ):
353+ """Enum representing the maximum number of alerts per day."""
354+
355+ FIVE = 100 , _ ("Five" )
356+ """Receive up to 5 alerts per day."""
357+
358+ TEN = 200 , _ ("Ten" )
359+ """Receive up to 10 alerts per day."""
360+
361+ TWENTY = 300 , _ ("Twenty" )
362+ """Receive up to 20 alerts per day."""
363+
364+ FIFTY = 400 , _ ("Fifty" )
365+ """Receive up to 50 alerts per day."""
366+
367+ UNLIMITED = 500 , _ ("Unlimited" )
368+ """No daily alert limit."""
369+
370+ user = models .ForeignKey (
371+ settings .AUTH_USER_MODEL ,
372+ verbose_name = _ ("User" ),
373+ on_delete = models .CASCADE ,
374+ related_name = "alert_subscriptions" ,
375+ )
376+ countries = models .ManyToManyField (
377+ Country ,
378+ related_name = "alert_subscriptions_by_country" ,
379+ verbose_name = _ ("Countries" ),
380+ )
381+ regions = models .ManyToManyField (
382+ Region ,
383+ related_name = "alert_subscriptions_by_region" ,
384+ blank = True ,
385+ verbose_name = _ ("Regions" ),
386+ )
387+ alert_source = models .IntegerField (
388+ choices = AlertSource .choices ,
389+ default = AlertSource .MONTANDON ,
390+ verbose_name = _ ("Alert source" ),
391+ )
392+
393+ hazard_types = models .ManyToManyField (
394+ HazardType ,
395+ related_name = "+" ,
396+ verbose_name = _ ("Hazard Types" ),
397+ help_text = _ ("Types of hazard the user is subscribed to." ),
398+ )
399+ alert_per_day = models .IntegerField (
400+ choices = AlertPerDay .choices ,
401+ default = AlertPerDay .FIVE ,
402+ verbose_name = _ ("Alerts Per Day" ),
403+ help_text = _ ("Maximum number of alerts sent to the user per day." ),
404+ )
405+ created_at = models .DateTimeField (auto_now_add = True , verbose_name = _ ("Created At" ))
406+ updated_at = models .DateTimeField (auto_now = True , verbose_name = _ ("Updated At" ))
407+ # Typing
408+ id = int
409+
410+ class Meta :
411+ ordering = ["-id" ]
412+ verbose_name = _ ("Alert Subscription" )
413+ verbose_name_plural = _ ("Alert Subscriptions" )
414+
415+ def __str__ (self ):
416+ return f"Alert subscription for { self .user } "
0 commit comments