@@ -245,6 +245,7 @@ def level_updated_at(self, obj):
245245 "auto_generated_source" ,
246246 )
247247 list_filter = [IsFeaturedFilter , EventSourceFilter ]
248+ actions = ["create_field_reports" ]
248249 search_fields = (
249250 "name" ,
250251 "countries__name" ,
@@ -510,6 +511,72 @@ def changelist_view(self, request, extra_context=None):
510511
511512 return response
512513
514+ def create_field_reports (self , request , queryset ):
515+ created_count = 0
516+ skipped_existing = []
517+ skipped_missing_dtype = []
518+ skipped_missing_countries = []
519+
520+ for event in queryset :
521+ if getattr (event , "field_reports" ).exists ():
522+ skipped_existing .append (event )
523+ continue
524+ if event .dtype is None :
525+ skipped_missing_dtype .append (event )
526+ continue
527+ if not event .countries .exists ():
528+ skipped_missing_countries .append (event )
529+ continue
530+
531+ report = models .FieldReport .objects .create (
532+ event = event ,
533+ dtype = event .dtype ,
534+ title = event .name ,
535+ summary = event .name ,
536+ visibility = event .visibility ,
537+ )
538+ report .countries .set (event .countries .all ())
539+ if event .regions .exists ():
540+ report .regions .set (event .regions .all ())
541+ if event .districts .exists ():
542+ report .districts .set (event .districts .all ())
543+ created_count += 1
544+
545+ if created_count :
546+ report_label = "field report" if created_count == 1 else "field reports"
547+ self .message_user (
548+ request ,
549+ format_html (
550+ '{} <a href="/admin/api/fieldreport/">{}</a> created.' ,
551+ created_count ,
552+ report_label ,
553+ ),
554+ )
555+ if skipped_existing :
556+ self .message_user (
557+ request ,
558+ (
559+ "Action skipped because the event already has a field report."
560+ if len (skipped_existing ) == 1
561+ else f"Action skipped for { len (skipped_existing )} events because they already have field reports."
562+ ),
563+ level = messages .WARNING ,
564+ )
565+ if skipped_missing_dtype :
566+ self .message_user (
567+ request ,
568+ f"Action skipped for { len (skipped_missing_dtype )} event(s) because disaster type is missing." ,
569+ level = messages .WARNING ,
570+ )
571+ if skipped_missing_countries :
572+ self .message_user (
573+ request ,
574+ f"Action skipped for { len (skipped_missing_countries )} event(s) because no countries are set." ,
575+ level = messages .WARNING ,
576+ )
577+
578+ create_field_reports .short_description = "Create field reports from selected events"
579+
513580 class Media :
514581 js = ("js/event_severity_help.js" ,)
515582
0 commit comments