diff --git a/api/admin.py b/api/admin.py index a6db9f171..bbf448c3e 100644 --- a/api/admin.py +++ b/api/admin.py @@ -1,48 +1,50 @@ import csv import time -from django.contrib.gis import admin as geoadmin + +from django.conf import settings from django.contrib import admin, messages -from django.urls import reverse -from django.utils.translation import gettext_lazy as _ -from django.utils.html import format_html_join, format_html -from django.utils.safestring import mark_safe from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User +from django.contrib.gis import admin as geoadmin from django.http import HttpResponse, HttpResponseRedirect -from django.conf import settings +from django.urls import reverse +from django.utils.html import format_html, format_html_join +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ from django_admin_listfilter_dropdown.filters import RelatedDropdownFilter from rest_framework.authtoken.admin import TokenAdmin from rest_framework.authtoken.models import TokenProxy from reversion_compare.admin import CompareVersionAdmin -# from reversion.models import Revision -from api.event_sources import SOURCES -from api.admin_classes import RegionRestrictedAdmin import api.models as models -from lang.admin import TranslationAdmin, TranslationInlineModelAdmin +from api.admin_classes import RegionRestrictedAdmin +from api.event_sources import SOURCES from api.management.commands.index_and_notify import Command as Notify +from lang.admin import TranslationAdmin, TranslationInlineModelAdmin from notifications.models import RecordType, SubscriptionType from .forms import ActionForm +# from reversion.models import Revision + class ProfileInline(admin.StackedInline): model = models.Profile can_delete = False - verbose_name_plural = _('user profile') - fk_name = 'user' - readonly_fields = ('last_frontend_login',) + verbose_name_plural = _("user profile") + fk_name = "user" + readonly_fields = ("last_frontend_login",) class GoUserAdmin(UserAdmin): inlines = (ProfileInline,) list_filter = ( - ('profile__country__region', RelatedDropdownFilter), - ('profile__country', RelatedDropdownFilter), - ('groups', RelatedDropdownFilter), - 'is_staff', - 'is_superuser', - 'is_active', + ("profile__country__region", RelatedDropdownFilter), + ("profile__country", RelatedDropdownFilter), + ("groups", RelatedDropdownFilter), + "is_staff", + "is_superuser", + "is_active", ) def get_inline_instances(self, request, obj=None): @@ -56,35 +58,39 @@ def get_inline_instances(self, request, obj=None): class GoTokenAdmin(TokenAdmin): - search_fields = ('user__username', 'user__email',) + search_fields = ( + "user__username", + "user__email", + ) + admin.site.unregister(TokenProxy) admin.site.register(TokenProxy, GoTokenAdmin) class HasRelatedEventFilter(admin.SimpleListFilter): - title = _('related emergency') - parameter_name = 'related_emergency' + title = _("related emergency") + parameter_name = "related_emergency" def lookups(self, request, model_admin): return ( - ('yes', _('Exists')), - ('confirm', _('Needs confirmation')), - ('no', _('None')), + ("yes", _("Exists")), + ("confirm", _("Needs confirmation")), + ("no", _("None")), ) def queryset(self, request, queryset): - if self.value() == 'yes': + if self.value() == "yes": return queryset.filter(event__isnull=False).filter(needs_confirmation=False) - if self.value() == 'confirm': + if self.value() == "confirm": return queryset.filter(event__isnull=False).filter(needs_confirmation=True) - if self.value() == 'no': + if self.value() == "no": return queryset.filter(event__isnull=True) class MembershipFilter(admin.SimpleListFilter): - title = _('membership') - parameter_name = 'membership' + title = _("membership") + parameter_name = "membership" def lookups(self, request, model_admin): return models.VisibilityChoices.choices @@ -95,8 +101,8 @@ def queryset(self, request, queryset): class AppealTypeFilter(admin.SimpleListFilter): - title = _('appeal type') - parameter_name = 'appeal_type' + title = _("appeal type") + parameter_name = "appeal_type" def lookups(self, request, model_admin): return models.AppealType.choices @@ -107,56 +113,56 @@ def queryset(self, request, queryset): class IsFeaturedFilter(admin.SimpleListFilter): - title = _('featured') - parameter_name = 'featured' + title = _("featured") + parameter_name = "featured" def lookups(self, request, model_admin): return ( - ('featured', _('Featured')), - ('not', _('Not Featured')), + ("featured", _("Featured")), + ("not", _("Not Featured")), ) def queryset(self, request, queryset): - if self.value() == 'featured': + if self.value() == "featured": return queryset.filter(is_featured=True) - elif self.value() == 'not': + elif self.value() == "not": return queryset.filter(is_featured=False) class EventSourceFilter(admin.SimpleListFilter): - title = _('source') - parameter_name = 'event_source' + title = _("source") + parameter_name = "event_source" def lookups(self, request, model_admin): return ( - ('input', _('Manual input')), - ('gdacs', _('GDACs scraper')), - ('who', _('WHO scraper')), - ('report_ingest', _('Field report ingest')), - ('report_admin', _('Field report admin')), - ('appeal_admin', _('Appeals admin')), - ('unknown', _('Unknown automated')), + ("input", _("Manual input")), + ("gdacs", _("GDACs scraper")), + ("who", _("WHO scraper")), + ("report_ingest", _("Field report ingest")), + ("report_admin", _("Field report admin")), + ("appeal_admin", _("Appeals admin")), + ("unknown", _("Unknown automated")), ) def queryset(self, request, queryset): - if self.value() == 'input': + if self.value() == "input": return queryset.filter(auto_generated=False) - elif self.value() == 'gdacs': - return queryset.filter(auto_generated_source=SOURCES['gdacs']) - elif self.value() == 'who': - return queryset.filter(auto_generated_source__startswith='www.who.int') - elif self.value() == 'report_ingest': - return queryset.filter(auto_generated_source=SOURCES['report_ingest']) - elif self.value() == 'report_admin': - return queryset.filter(auto_generated_source=SOURCES['report_admin']) - elif self.value() == 'appeal_admin': - return queryset.filter(auto_generated_source=SOURCES['appeal_admin']) - elif self.value() == 'unknown': + elif self.value() == "gdacs": + return queryset.filter(auto_generated_source=SOURCES["gdacs"]) + elif self.value() == "who": + return queryset.filter(auto_generated_source__startswith="www.who.int") + elif self.value() == "report_ingest": + return queryset.filter(auto_generated_source=SOURCES["report_ingest"]) + elif self.value() == "report_admin": + return queryset.filter(auto_generated_source=SOURCES["report_admin"]) + elif self.value() == "appeal_admin": + return queryset.filter(auto_generated_source=SOURCES["appeal_admin"]) + elif self.value() == "unknown": return queryset.filter(auto_generated=True).filter(auto_generated_source__isnull=True) class DisasterTypeAdmin(CompareVersionAdmin, TranslationAdmin, admin.ModelAdmin): - search_fields = ('name',) + search_fields = ("name",) class KeyFigureInline(admin.TabularInline, TranslationInlineModelAdmin): @@ -184,27 +190,44 @@ class EventLinkInline(admin.TabularInline, TranslationInlineModelAdmin): class EventAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin): - country_in = 'countries__pk__in' - region_in = 'regions__pk__in' + country_in = "countries__pk__in" + region_in = "regions__pk__in" inlines = [ - KeyFigureInline, SnippetInline, EventContactInline, SituationReportInline, - EventFeaturedDocumentInline, EventLinkInline, + KeyFigureInline, + SnippetInline, + EventContactInline, + SituationReportInline, + EventFeaturedDocumentInline, + EventLinkInline, ] - list_display = ('name', 'ifrc_severity_level', 'glide', 'auto_generated', 'auto_generated_source',) + list_display = ( + "name", + "ifrc_severity_level", + "glide", + "auto_generated", + "auto_generated_source", + ) list_filter = [IsFeaturedFilter, EventSourceFilter] - search_fields = ('name', 'countries__name', 'dtype__name',) - autocomplete_fields = ('countries', 'districts', 'parent_event',) + search_fields = ( + "name", + "countries__name", + "dtype__name", + ) + autocomplete_fields = ( + "countries", + "districts", + "parent_event", + ) def appeals(self, instance): - if getattr(instance, 'appeals').exists(): + if getattr(instance, "appeals").exists(): return format_html_join( - mark_safe('
'), - '{} - {}', - ((appeal.code, appeal.name) for appeal in instance.appeals.all()) + mark_safe("
"), "{} - {}", ((appeal.code, appeal.name) for appeal in instance.appeals.all()) ) return mark_safe('No related appeals') - appeals.short_description = 'Appeals' + + appeals.short_description = "Appeals" # To add the 'Notify subscribers now' button # WikiJS links added @@ -214,9 +237,18 @@ def appeals(self, instance): # Overwriting readonly fields for Edit mode def changeform_view(self, request, *args, **kwargs): if not request.user.is_superuser: - self.readonly_fields = ('appeals', 'field_reports', 'auto_generated_source', 'parent_event',) + self.readonly_fields = ( + "appeals", + "field_reports", + "auto_generated_source", + "parent_event", + ) else: - self.readonly_fields = ('appeals', 'field_reports', 'auto_generated_source',) + self.readonly_fields = ( + "appeals", + "field_reports", + "auto_generated_source", + ) return super(EventAdmin, self).changeform_view(request, *args, **kwargs) @@ -235,20 +267,19 @@ def response_change(self, request, obj): return super().response_change(request, obj) def field_reports(self, instance): - if getattr(instance, 'field_reports').exists(): + if getattr(instance, "field_reports").exists(): return format_html_join( - mark_safe('
'), - '{} - {}', - ((report.pk, report.summary) for report in instance.field_reports.all()) + mark_safe("
"), "{} - {}", ((report.pk, report.summary) for report in instance.field_reports.all()) ) return mark_safe('No related field reports') - field_reports.short_description = 'Field Reports' + + field_reports.short_description = "Field Reports" class GdacsAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin): - country_in = 'countries__pk__in' + country_in = "countries__pk__in" region_in = None - search_fields = ('title',) + search_fields = ("title",) class ActionsTakenInline(admin.TabularInline, TranslationInlineModelAdmin): @@ -264,17 +295,34 @@ class FieldReportContactInline(admin.TabularInline): class FieldReportAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin): - country_in = 'countries__pk__in' - region_in = 'regions__pk__in' + country_in = "countries__pk__in" + region_in = "regions__pk__in" inlines = [ActionsTakenInline, SourceInline, FieldReportContactInline] - list_display = ('summary', 'event', 'visibility',) - list_select_related = ('event',) - search_fields = ('countries__name', 'regions__label', 'summary',) - autocomplete_fields = ('user', 'dtype', 'event', 'countries', 'districts',) - readonly_fields = ('report_date', 'created_at', 'updated_at') + list_display = ( + "summary", + "event", + "visibility", + ) + list_select_related = ("event",) + search_fields = ( + "countries__name", + "regions__label", + "summary", + ) + autocomplete_fields = ( + "user", + "dtype", + "event", + "countries", + "districts", + ) + readonly_fields = ("report_date", "created_at", "updated_at") list_filter = [MembershipFilter] - actions = ['create_events', 'export_field_reports', ] + actions = [ + "create_events", + "export_field_reports", + ] # WikiJS links added change_form_template = "admin/fieldreport_change_form.html" change_list_template = "admin/fieldreport_change_list.html" @@ -283,30 +331,30 @@ def create_events(self, request, queryset): for report in queryset: event = models.Event.objects.create( name=report.summary, - dtype=getattr(report, 'dtype'), - disaster_start_date=getattr(report, 'created_at'), + dtype=getattr(report, "dtype"), + disaster_start_date=getattr(report, "created_at"), auto_generated=True, - auto_generated_source=SOURCES['report_admin'], + auto_generated_source=SOURCES["report_admin"], ) - if getattr(report, 'countries').exists(): + if getattr(report, "countries").exists(): for country in report.countries.all(): event.countries.add(country) - if getattr(report, 'regions').exists(): + if getattr(report, "regions").exists(): for region in report.regions.all(): event.regions.add(region) report.event = event report.save() - self.message_user(request, '%s emergency object(s) created' % queryset.count()) - create_events.short_description = 'Create emergencies from selected reports' + self.message_user(request, "%s emergency object(s) created" % queryset.count()) + + create_events.short_description = "Create emergencies from selected reports" def export_field_reports(self, request, queryset): meta = self.model._meta field_names = [field.name for field in meta.fields] timestr = time.strftime("%Y%m%d-%H%M%S") - response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = 'attachment; filename=FieldReports_export_{}.csv'.format( - timestr) + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = "attachment; filename=FieldReports_export_{}.csv".format(timestr) writer = csv.writer(response) writer.writerow(field_names) @@ -314,12 +362,13 @@ def export_field_reports(self, request, queryset): for fr in queryset: writer.writerow([getattr(fr, field) for field in field_names]) return response - export_field_reports.short_description = 'Export selected Field Reports to CSV' + + export_field_reports.short_description = "Export selected Field Reports to CSV" def get_actions(self, request): actions = super(FieldReportAdmin, self).get_actions(request) if not request.user.is_superuser: - del actions['export_field_reports'] + del actions["export_field_reports"] return actions @@ -333,7 +382,12 @@ class SupportedActivityAdmin(CompareVersionAdmin, TranslationAdmin): class ActionAdmin(CompareVersionAdmin, TranslationAdmin): form = ActionForm - list_display = ('__str__', 'field_report_types', 'organizations', 'category',) + list_display = ( + "__str__", + "field_report_types", + "organizations", + "category", + ) class AppealDocumentInline(admin.TabularInline, TranslationInlineModelAdmin): @@ -345,16 +399,29 @@ class GeneralDocumentInline(admin.TabularInline, TranslationInlineModelAdmin): class AppealAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin): - country_in = 'country__pk__in' - region_in = 'region__pk__in' + country_in = "country__pk__in" + region_in = "region__pk__in" inlines = [AppealDocumentInline] - list_display = ('code', 'name', 'atype', 'needs_confirmation', 'event', 'start_date',) - list_select_related = ('event',) - search_fields = ('code', 'name',) - readonly_fields = ('region',) + list_display = ( + "code", + "name", + "atype", + "needs_confirmation", + "event", + "start_date", + ) + list_select_related = ("event",) + search_fields = ( + "code", + "name", + ) + readonly_fields = ("region",) list_filter = [HasRelatedEventFilter, AppealTypeFilter] - actions = ['create_events', 'confirm_events'] - autocomplete_fields = ('event', 'country',) + actions = ["create_events", "confirm_events"] + autocomplete_fields = ( + "event", + "country", + ) # WikiJS links added change_form_template = "admin/appeal_change_form.html" @@ -364,10 +431,10 @@ def create_events(self, request, queryset): for appeal in queryset: event = models.Event.objects.create( name=appeal.name, - dtype=getattr(appeal, 'dtype'), - disaster_start_date=getattr(appeal, 'start_date'), + dtype=getattr(appeal, "dtype"), + disaster_start_date=getattr(appeal, "start_date"), auto_generated=True, - auto_generated_source=SOURCES['appeal_admin'], + auto_generated_source=SOURCES["appeal_admin"], ) if appeal.country is not None: event.countries.add(appeal.country) @@ -375,8 +442,9 @@ def create_events(self, request, queryset): event.regions.add(appeal.region) appeal.event = event appeal.save() - self.message_user(request, '%s emergency object(s) created' % queryset.count()) - create_events.short_description = 'Create emergencies from selected appeals' + self.message_user(request, "%s emergency object(s) created" % queryset.count()) + + create_events.short_description = "Create emergencies from selected appeals" def confirm_events(self, request, queryset): errors = [] @@ -385,77 +453,85 @@ def confirm_events(self, request, queryset): errors.append(appeal.code) if len(errors): self.message_user( - request, '%s %s not have an unconfirmed event.' % (', '.join(errors), 'does' if len(errors) == 1 else 'do'), - level=messages.ERROR + request, + "%s %s not have an unconfirmed event." % (", ".join(errors), "does" if len(errors) == 1 else "do"), + level=messages.ERROR, ) else: for appeal in queryset: appeal.needs_confirmation = False appeal.save() - confirm_events.short_description = 'Confirm emergencies as correct' + + confirm_events.short_description = "Confirm emergencies as correct" def save_model(self, request, obj, form, change): - if (obj.country): + if obj.country: obj.region = obj.country.region super().save_model(request, obj, form, change) class AppealDocumentAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin): def appeal_document_label(self, obj): - return '%s - %s' % (obj.appeal, obj.name) + return "%s - %s" % (obj.appeal, obj.name) - country_in = 'appeal__country__in' - region_in = 'appeal__region__in' - list_display = ('appeal_document_label', 'description', 'iso', 'created_at') - search_fields = ('name', 'appeal__code', 'appeal__name', 'description', 'iso__name') + country_in = "appeal__country__in" + region_in = "appeal__region__in" + list_display = ("appeal_document_label", "description", "iso", "created_at") + search_fields = ("name", "appeal__code", "appeal__name", "description", "iso__name") def get_queryset(self, request): - return super().get_queryset(request).select_related('appeal') + return super().get_queryset(request).select_related("appeal") class AppealDocumentTypeAdmin(CompareVersionAdmin): model = models.AppealDocumentType - list_display = ('name', 'id', 'public_site_or_fednet') - readonly_fields = ('id',) - search_fields = ('name', 'id') + list_display = ("name", "id", "public_site_or_fednet") + readonly_fields = ("id",) + search_fields = ("name", "id") class AppealFilterAdmin(CompareVersionAdmin): - list_display = ('name', 'value') - search_fields = ('name', 'value') + list_display = ("name", "value") + search_fields = ("name", "value") class UserCountryAdmin(CompareVersionAdmin): - list_display = ('user', 'country') + list_display = ("user", "country") # search_fields = ('user','country') model = models.UserCountry - autocomplete_fields = ('user', 'country',) + autocomplete_fields = ( + "user", + "country", + ) class UserRegionAdmin(CompareVersionAdmin): - list_display = ['user', 'get_firstname', 'get_lastname', 'get_email', 'region'] + list_display = ["user", "get_firstname", "get_lastname", "get_email", "region"] def get_firstname(self, obj): return obj.user.first_name - get_firstname.short_description = 'First name' - get_firstname.admin_order_field = 'user__first_name' + + get_firstname.short_description = "First name" + get_firstname.admin_order_field = "user__first_name" def get_lastname(self, obj): return obj.user.last_name - get_lastname.short_description = 'Last name' - get_lastname.admin_order_field = 'user__last_name' + + get_lastname.short_description = "Last name" + get_lastname.admin_order_field = "user__last_name" def get_email(self, obj): return obj.user.email - get_email.short_description = 'Email' - get_email.admin_order_field = 'user__email' + + get_email.short_description = "Email" + get_email.admin_order_field = "user__email" # search_fields = ('user','country') model = models.UserRegion class GeneralDocumentAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin): - search_fields = ('name', 'document') + search_fields = ("name", "document") class CountryKeyFigureInline(admin.TabularInline, TranslationInlineModelAdmin): @@ -476,25 +552,25 @@ class CountrySnippetInline(admin.TabularInline, TranslationInlineModelAdmin): class RegionSnippetInline(admin.TabularInline, TranslationInlineModelAdmin): model = models.RegionSnippet - verbose_name_plural = 'Regional Snippets shown in Additional Tab' + verbose_name_plural = "Regional Snippets shown in Additional Tab" extra = 1 class RegionEmergencySnippetInline(admin.StackedInline, TranslationInlineModelAdmin): model = models.RegionEmergencySnippet - verbose_name_plural = 'Snippets shown in Operations / Emergencies Tab' + verbose_name_plural = "Snippets shown in Operations / Emergencies Tab" extra = 1 class RegionProfileSnippetInline(admin.StackedInline, TranslationInlineModelAdmin): model = models.RegionProfileSnippet - verbose_name_plural = 'Snippets shown in Regional Profile Tab' + verbose_name_plural = "Snippets shown in Regional Profile Tab" extra = 1 class RegionPreparednessSnippetInline(admin.StackedInline, TranslationInlineModelAdmin): model = models.RegionPreparednessSnippet - verbose_name_plural = 'Snippets shown in Preparedness Tab' + verbose_name_plural = "Snippets shown in Preparedness Tab" extra = 1 @@ -509,6 +585,7 @@ class RegionLinkInline(admin.TabularInline): class CountryContactInline(admin.TabularInline): model = models.CountryContact + class CountryKeyDocumentInline(admin.TabularInline): model = models.CountryKeyDocument @@ -522,11 +599,14 @@ class RegionContactInline(admin.TabularInline): class DistrictAdmin(geoadmin.OSMGeoAdmin, CompareVersionAdmin, RegionRestrictedAdmin): - country_in = 'country__pk__in' - region_in = 'country__region__in' - search_fields = ('name', 'country__name',) - list_display = ('__str__', 'code') - list_filter = ('is_deprecated', 'country') + country_in = "country__pk__in" + region_in = "country__region__in" + search_fields = ( + "name", + "country__name", + ) + list_display = ("__str__", "code") + list_filter = ("is_deprecated", "country") modifiable = True @@ -547,12 +627,12 @@ class CountrySupportingPartnerAdmin(admin.TabularInline): class CountryAdmin(geoadmin.OSMGeoAdmin, CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin): - country_in = 'pk__in' - list_filter = ('record_type', 'in_search', 'independent', 'disputed') - list_display = ('__str__', 'record_type', 'iso3') - region_in = 'region__pk__in' - list_editable = ('record_type',) - search_fields = ('name',) + country_in = "pk__in" + list_filter = ("record_type", "in_search", "independent", "disputed") + list_display = ("__str__", "record_type", "iso3") + region_in = "region__pk__in" + list_editable = ("record_type",) + search_fields = ("name",) modifiable = True inlines = [ CountryKeyFigureInline, @@ -567,12 +647,12 @@ class CountryAdmin(geoadmin.OSMGeoAdmin, CompareVersionAdmin, RegionRestrictedAd CountrySupportingPartnerAdmin, CountryICRCPresenceInline, ] - exclude = ('key_priorities',) + exclude = ("key_priorities",) class RegionAdmin(geoadmin.OSMGeoAdmin, CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin): country_in = None - region_in = 'pk__in' + region_in = "pk__in" inlines = [ RegionKeyFigureInline, RegionSnippetInline, @@ -580,28 +660,32 @@ class RegionAdmin(geoadmin.OSMGeoAdmin, CompareVersionAdmin, RegionRestrictedAdm RegionProfileSnippetInline, RegionPreparednessSnippetInline, RegionLinkInline, - RegionContactInline + RegionContactInline, ] - search_fields = ('name',) + search_fields = ("name",) modifiable = True class Admin2Admin(geoadmin.OSMGeoAdmin, CompareVersionAdmin, RegionRestrictedAdmin): - search_fields = ('name', 'admin1__country__name') + search_fields = ("name", "admin1__country__name") modifiable = True class UserProfileAdmin(CompareVersionAdmin): - search_fields = ('user__username', 'user__email', 'country__name',) + search_fields = ( + "user__username", + "user__email", + "country__name", + ) list_filter = ( - ('country__region', RelatedDropdownFilter), - ('country', RelatedDropdownFilter), + ("country__region", RelatedDropdownFilter), + ("country", RelatedDropdownFilter), ) - actions = ['export_selected_users'] - readonly_fields = ('last_frontend_login',) + actions = ["export_selected_users"] + readonly_fields = ("last_frontend_login",) def get_queryset(self, request): - return super().get_queryset(request).select_related('user') + return super().get_queryset(request).select_related("user") def export_selected_users(self, request, queryset): meta = self.model._meta @@ -609,163 +693,184 @@ def export_selected_users(self, request, queryset): user_field_names = [field.name for field in models.User._meta.fields if field.name != "password"] timestr = time.strftime("%Y%m%d-%H%M%S") - response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = 'attachment; filename=Users_export_{}.csv'.format( - timestr) + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = "attachment; filename=Users_export_{}.csv".format(timestr) writer = csv.writer(response) - writer.writerow(prof_field_names + user_field_names + ['groups']) + writer.writerow(prof_field_names + user_field_names + ["groups"]) for prof in queryset: user_model = models.User.objects.get(id=prof.user_id) - user_groups = list(user_model.groups.values_list('name', flat=True)) - user_groups_string = ', '.join(user_groups) if user_groups else '' + user_groups = list(user_model.groups.values_list("name", flat=True)) + user_groups_string = ", ".join(user_groups) if user_groups else "" writer.writerow( - [getattr(prof, field) for field in prof_field_names] + - [getattr(user_model, field) for field in user_field_names] + - [user_groups_string] + [getattr(prof, field) for field in prof_field_names] + + [getattr(user_model, field) for field in user_field_names] + + [user_groups_string] ) return response - export_selected_users.short_description = 'Export selected Users with their Profiles' + + export_selected_users.short_description = "Export selected Users with their Profiles" def get_actions(self, request): actions = super(UserProfileAdmin, self).get_actions(request) if not request.user.is_superuser: - del actions['export_selected_users'] + del actions["export_selected_users"] return actions class SituationReportAdmin(CompareVersionAdmin, RegionRestrictedAdmin): - search_fields = ('name', 'event__name',) - list_display = ('name', 'link_to_event', 'type', 'visibility',) - country_in = 'event__countries__in' - region_in = 'event__regions__in' - autocomplete_fields = ('event',) + search_fields = ( + "name", + "event__name", + ) + list_display = ( + "name", + "link_to_event", + "type", + "visibility", + ) + country_in = "event__countries__in" + region_in = "event__regions__in" + autocomplete_fields = ("event",) # WikiJS links added change_form_template = "admin/situationreport_change_form.html" change_list_template = "admin/situationreport_change_list.html" def get_queryset(self, request): - return super().get_queryset(request).select_related('type', 'event') + return super().get_queryset(request).select_related("type", "event") def link_to_event(self, obj): link = reverse("admin:api_event_change", args=[obj.event.id]) # model name has to be lowercase return format_html('{}', link, obj.event.name) + link_to_event.allow_tags = True class SituationReportTypeAdmin(CompareVersionAdmin): - search_fields = ('type',) + search_fields = ("type",) class CronJobAdmin(CompareVersionAdmin): - list_display = ('name', 'created_at', 'num_result', 'status') - search_fields = ('name', 'created_at',) - readonly_fields = ('created_at', 'message_display',) - list_filter = ('status', 'name') + list_display = ("name", "created_at", "num_result", "status") + search_fields = ( + "name", + "created_at", + ) + readonly_fields = ( + "created_at", + "message_display", + ) + list_filter = ("status", "name") def message_display(self, obj): style_class = { - models.CronJobStatus.WARNED: 'warning', - models.CronJobStatus.ERRONEOUS: 'error', - }.get(obj.status, 'success') + models.CronJobStatus.WARNED: "warning", + models.CronJobStatus.ERRONEOUS: "error", + }.get(obj.status, "success") if obj.message: return mark_safe( - f''' + f""" - ''' + """ ) class EmergencyOperationsBaseAdmin(CompareVersionAdmin): - search_fields = ('file_name', 'raw_file_name', 'appeal_number',) - list_display = ('file_name', 'raw_file_name', 'raw_file_url', 'appeal_number', 'is_validated',) - actions = ['export_all', 'export_selected'] + search_fields = ( + "file_name", + "raw_file_name", + "appeal_number", + ) + list_display = ( + "file_name", + "raw_file_name", + "raw_file_url", + "appeal_number", + "is_validated", + ) + actions = ["export_all", "export_selected"] document_type = None def get_readonly_fields(self, request, obj=None): - return [ - field.name for field in self.model._meta.get_fields() - if field.name.startswith('raw_') - ] + return [field.name for field in self.model._meta.get_fields() if field.name.startswith("raw_")] def get_fields(self, request, obj=None): readonly_fields = self.get_readonly_fields(request, obj) - return ( - ['is_validated', 'raw_file_url'] + - [(f[4:], f) for f in readonly_fields if f != 'raw_file_url'] - ) + return ["is_validated", "raw_file_url"] + [(f[4:], f) for f in readonly_fields if f != "raw_file_url"] def export_selected(self, request, queryset): meta = self.model._meta - field_names = [field.name for field in meta.fields if field.name.startswith('raw_')] + field_names = [field.name for field in meta.fields if field.name.startswith("raw_")] field_names_without_raw = [name[4:] for name in field_names] timestr = time.strftime("%Y%m%d-%H%M%S") - response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = f'attachment; filename={self.document_type}_selected_list_{timestr}.csv' + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = f"attachment; filename={self.document_type}_selected_list_{timestr}.csv" writer = csv.writer(response) - first_row = [''] + first_row = [""] first_row.extend(field_names_without_raw) writer.writerow(first_row) counter = 0 for fr in queryset: new_row = [counter] - new_row.extend([getattr(fr, field) for field in field_names if field != '']) + new_row.extend([getattr(fr, field) for field in field_names if field != ""]) writer.writerow(new_row) counter += 1 return response - export_selected.short_description = 'Export selected document(s) to CSV' + + export_selected.short_description = "Export selected document(s) to CSV" def export_all(self, request, queryset): qset = self.model.objects.all() - field_names = [field.name for field in qset.model._meta.fields if field.name.startswith('raw_')] + field_names = [field.name for field in qset.model._meta.fields if field.name.startswith("raw_")] field_names_without_raw = [name[4:] for name in field_names] - response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = f'attachment; filename={self.document_type}.csv' + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = f"attachment; filename={self.document_type}.csv" writer = csv.writer(response) - first_row = [''] + first_row = [""] first_row.extend(field_names_without_raw) writer.writerow(first_row) counter = 0 for fr in qset: new_row = [counter] - new_row.extend([getattr(fr, field) for field in field_names if field != '']) + new_row.extend([getattr(fr, field) for field in field_names if field != ""]) writer.writerow(new_row) counter += 1 return response - export_all.short_description = 'Export all documents to CSV (select one before for it to work)' + + export_all.short_description = "Export all documents to CSV (select one before for it to work)" class EmergencyOperationsDatasetAdmin(EmergencyOperationsBaseAdmin): - document_type = 'epoa' + document_type = "epoa" class EmergencyOperationsPeopleReachedAdmin(EmergencyOperationsBaseAdmin): - document_type = 'ou' + document_type = "ou" class EmergencyOperationsFRAdmin(EmergencyOperationsBaseAdmin): - document_type = 'fr' + document_type = "fr" class EmergencyOperationsEAAdmin(EmergencyOperationsBaseAdmin): - document_type = 'ea' + document_type = "ea" class MainContactAdmin(CompareVersionAdmin): - list_display = ('extent', 'name', 'email') - search_fields = ('name', 'email') + list_display = ("extent", "name", "email") + search_fields = ("name", "email") # Global view of Revisions, not that informational, maybe needed in the future @@ -777,9 +882,9 @@ class MainContactAdmin(CompareVersionAdmin): class AuthLogAdmin(admin.ModelAdmin): - list_display = ['created_at', 'action', 'username'] - list_filter = ['action'] - search_fields = ['action', 'username'] + list_display = ["created_at", "action", "username"] + list_filter = ["action"] + search_fields = ["action", "username"] list_display_links = None def has_add_permission(self, request, obj=None): @@ -787,16 +892,15 @@ def has_add_permission(self, request, obj=None): def get_actions(self, request): actions = super().get_actions(request) - if 'delete_selected' in actions: - del actions['delete_selected'] + if "delete_selected" in actions: + del actions["delete_selected"] return actions class ReversionDifferenceLogAdmin(admin.ModelAdmin): - list_display = ('created_at', 'username', 'action', 'object_type', 'object_name', 'object_id', - 'changed_from', 'changed_to') - list_filter = ('action', 'object_type') - search_fields = ('username', 'object_name', 'object_type', 'changed_from', 'changed_to') + list_display = ("created_at", "username", "action", "object_type", "object_name", "object_id", "changed_from", "changed_to") + list_filter = ("action", "object_type") + search_fields = ("username", "object_name", "object_type", "changed_from", "changed_to") list_display_links = None def has_add_permission(self, request, obj=None): @@ -804,13 +908,13 @@ def has_add_permission(self, request, obj=None): def get_actions(self, request): actions = super().get_actions(request) - if 'delete_selected' in actions: - del actions['delete_selected'] + if "delete_selected" in actions: + del actions["delete_selected"] return actions class CountryOfFieldReportToReviewAdmin(admin.ModelAdmin): - list_display = ('country',) + list_display = ("country",) @classmethod def has_delete_permission(cls, request, obj=None): @@ -866,5 +970,5 @@ class ExportTokenAdmin(admin.ModelAdmin): admin.site.register(models.CountryOfFieldReportToReview, CountryOfFieldReportToReviewAdmin) # admin.site.register(Revision, RevisionAdmin) -admin.site.site_url = 'https://' + settings.FRONTEND_URL -admin.widgets.RelatedFieldWidgetWrapper.template_name = 'related_widget_wrapper.html' +admin.site.site_url = "https://" + settings.FRONTEND_URL +admin.widgets.RelatedFieldWidgetWrapper.template_name = "related_widget_wrapper.html" diff --git a/api/admin_classes.py b/api/admin_classes.py index c5fbf3e64..10e82adee 100644 --- a/api/admin_classes.py +++ b/api/admin_classes.py @@ -1,30 +1,30 @@ from django.contrib import admin from django.db.models import Q - # Extend the model admin with methods for determining whether a user has # country- and region-specific permissions. # If the user does not have specific permissions for any country or region, # the result is an empty queryset. + class RegionRestrictedAdmin(admin.ModelAdmin): def get_request_user_regions(self, request): permissions = request.user.get_all_permissions() regions = [] countries = [] for permission_name in permissions: - if 'api.country_admin_' in permission_name: + if "api.country_admin_" in permission_name: country_id = permission_name[18:] if country_id.isdigit(): countries.append(country_id) - elif 'api.region_admin_' in permission_name: + elif "api.region_admin_" in permission_name: region_id = permission_name[17:] if region_id.isdigit(): regions.append(region_id) return countries, regions def get_filtered_queryset(self, request, queryset): - if request.user.is_superuser or request.user.has_perm('api.ifrc_admin'): + if request.user.is_superuser or request.user.has_perm("api.ifrc_admin"): return queryset countries, regions = self.get_request_user_regions(request) @@ -34,8 +34,8 @@ def get_filtered_queryset(self, request, queryset): return queryset.none() # Create an OR filter for records relating to this country or region - country_in = getattr(self, 'country_in', None) - region_in = getattr(self, 'region_in', None) + country_in = getattr(self, "country_in", None) + region_in = getattr(self, "region_in", None) query = Q() has_valid_query = False if len(countries) and country_in is not None: diff --git a/api/apps.py b/api/apps.py index 1b914ab73..bca27f0ff 100644 --- a/api/apps.py +++ b/api/apps.py @@ -1,7 +1,7 @@ -from django.utils.translation import gettext_lazy as _ from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class ApiConfig(AppConfig): - name = 'api' - verbose_name = _('api') + name = "api" + verbose_name = _("api") diff --git a/api/authentication_backend.py b/api/authentication_backend.py index e31374f81..4d409697e 100644 --- a/api/authentication_backend.py +++ b/api/authentication_backend.py @@ -6,15 +6,15 @@ class EmailBackend(ModelBackend): """ - To allow to authenticate with email too without needing - to implement a custom User model at this point + To allow to authenticate with email too without needing + to implement a custom User model at this point """ def authenticate(self, request, username=None, password=None, **kwargs): - ''' - Overriding: https://github.com/django/django/blob/master/django/contrib/auth/backends.py#L36 - most of it is working the same, only added a few more checks needed for the email auth - ''' + """ + Overriding: https://github.com/django/django/blob/master/django/contrib/auth/backends.py#L36 + most of it is working the same, only added a few more checks needed for the email auth + """ # To make 'finally' work becase we have 'MultipleObjectsReturned' exception # which could still result in a valid login @@ -29,12 +29,9 @@ def authenticate(self, request, username=None, password=None, **kwargs): # difference between an existing and a nonexistent user (#20760). UserModel().set_password(password) except MultipleObjectsReturned: - user = User.objects.filter(Q(username__iexact=username) | Q(email__iexact=username)).order_by('-is_active').first() + user = User.objects.filter(Q(username__iexact=username) | Q(email__iexact=username)).order_by("-is_active").first() - if shouldcheck and \ - user and \ - user.check_password(password) and \ - self.user_can_authenticate(user): + if shouldcheck and user and user.check_password(password) and self.user_can_authenticate(user): return user def get_user(self, user_id): diff --git a/api/create_cron.py b/api/create_cron.py index b7b7c1125..a42db498d 100644 --- a/api/create_cron.py +++ b/api/create_cron.py @@ -2,10 +2,5 @@ def create_cron_record(name, msg, status, num_result=0): - cron_obj = { - 'name': name, - 'message': msg, - 'num_result': num_result, - 'status': status - } + cron_obj = {"name": name, "message": msg, "num_result": num_result, "status": status} CronJob.sync_cron(cron_obj) diff --git a/api/drf_views.py b/api/drf_views.py index f6a590cd9..541566c84 100644 --- a/api/drf_views.py +++ b/api/drf_views.py @@ -1,163 +1,154 @@ from datetime import timedelta -from rest_framework.views import APIView -from rest_framework.response import Response -from rest_framework.authentication import TokenAuthentication -from rest_framework.permissions import IsAuthenticated -from rest_framework import viewsets, mixins, serializers -from rest_framework.decorators import action -from django_filters import rest_framework as rest_filters -from rest_framework import filters - -from django.http import Http404 from django.contrib.auth.models import User from django.db import models from django.db.models import ( - Prefetch, + Avg, + Case, Count, - Q, + ExpressionWrapper, + F, OuterRef, - Case, + Prefetch, + Q, + Subquery, Sum, - F, When, - Subquery, - Avg, - ExpressionWrapper ) -from django.db.models.functions import TruncMonth, Coalesce from django.db.models.fields import IntegerField +from django.db.models.functions import Coalesce, TruncMonth +from django.http import Http404 +from django.shortcuts import get_object_or_404 from django.utils import timezone +from django_filters import rest_framework as rest_filters from drf_spectacular.utils import extend_schema, extend_schema_view -from django.shortcuts import get_object_or_404 +from rest_framework import filters, mixins, serializers, viewsets +from rest_framework.authentication import TokenAuthentication +from rest_framework.decorators import action +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.views import APIView -from main.utils import is_tableau -from main.enums import GlobalEnumSerializer, get_enum_values -from deployments.models import Personnel +from api.filter_set import ( + Admin2Filter, + AppealDocumentFilter, + AppealHistoryFilter, + CountryFilter, + CountryFilterRMD, + CountryKeyDocumentFilter, + CountryKeyFigureFilter, + CountrySnippetFilter, + CountrySupportingPartnerFilter, + DistrictFilter, + DistrictRMDFilter, + EventFilter, + EventSnippetFilter, + FieldReportFilter, + GoHistoricalFilter, + RegionKeyFigureFilter, + RegionSnippetFilter, + SituationReportFilter, + UserFilterSet, +) +from api.visibility_class import ReadOnlyVisibilityViewsetMixin +from country_plan.models import CountryPlan from databank.serializers import CountryOverviewSerializer +from deployments.models import Personnel +from main.enums import GlobalEnumSerializer, get_enum_values from main.filters import NullsLastOrderingFilter +from main.utils import is_tableau +from per.models import Overview +from per.serializers import CountryLatestOverviewSerializer -from .utils import is_user_ifrc from .exceptions import BadRequest -from .visibility_class import ReadOnlyVisibilityViewset - from .models import ( + Action, + Admin2, + Appeal, + AppealDocument, AppealHistory, - DisasterType, - ExternalPartner, - SupportedActivity, - Region, - RegionKeyFigure, - RegionSnippet, + AppealType, Country, + CountryKeyDocument, CountryKeyFigure, + CountryOfFieldReportToReview, CountrySnippet, + CountrySupportingPartner, + DisasterType, District, - Admin2, Event, - Snippet, - SituationReport, - SituationReportType, - Appeal, - AppealDocument, - Profile, + Export, + ExternalPartner, FieldReport, - Action, - VisibilityChoices, MainContact, + Profile, + Region, + RegionKeyFigure, + RegionSnippet, + SituationReport, + SituationReportType, + Snippet, + SupportedActivity, UserCountry, - CountryOfFieldReportToReview, - Export, - CountryKeyDocument, - AppealType, - CountrySupportingPartner + VisibilityChoices, ) - -from country_plan.models import CountryPlan - -from .serializers import ( +from .serializers import ( # AppealSerializer,; Tableau Serializers; AppealTableauSerializer,; Go Historical ActionSerializer, - DisasterTypeSerializer, - ExternalPartnerSerializer, - SupportedActivitySerializer, - RegionGeoSerializer, - RegionKeyFigureSerializer, - RegionSnippetSerializer, - RegionRelationSerializer, + Admin2Serializer, + AppealDocumentSerializer, + AppealDocumentTableauSerializer, + AppealHistorySerializer, + AppealHistoryTableauSerializer, + CountryDisasterTypeCountSerializer, + CountryDisasterTypeMonthlySerializer, CountryGeoSerializer, - MiniCountrySerializer, + CountryKeyDocumentSerializer, + CountryKeyFigureInputSerializer, CountryKeyFigureSerializer, - CountrySnippetSerializer, + CountryOfFieldReportToReviewSerializer, CountryRelationSerializer, CountrySerializerRMD, + CountrySnippetSerializer, + CountrySnippetTableauSerializer, + CountrySupportingPartnerSerializer, + CountryTableauSerializer, + DeploymentsByEventSerializer, + DetailEventSerializer, + DisasterTypeSerializer, DistrictSerializer, - MiniDistrictGeoSerializer, DistrictSerializerRMD, - Admin2Serializer, - SnippetSerializer, - ListMiniEventSerializer, - ListEventSerializer, + ExportSerializer, + ExternalPartnerSerializer, + FieldReportSerializer, + GoHistoricalSerializer, + HistoricalDisasterSerializer, ListEventCsvSerializer, ListEventDeploymentsSerializer, - DeploymentsByEventSerializer, - DetailEventSerializer, - SituationReportSerializer, - SituationReportTypeSerializer, - # AppealSerializer, - AppealHistorySerializer, - AppealDocumentSerializer, - UserSerializer, - UserMeSerializer, - ProfileSerializer, + ListEventSerializer, + ListEventTableauSerializer, ListFieldReportCsvSerializer, - FieldReportSerializer, + ListFieldReportTableauSerializer, + ListMiniEventSerializer, MainContactSerializer, + MiniCountrySerializer, + MiniDistrictGeoSerializer, NsSerializer, - # Tableau Serializers - AppealDocumentTableauSerializer, - # AppealTableauSerializer, - AppealHistoryTableauSerializer, - CountryTableauSerializer, - CountrySnippetTableauSerializer, - ListEventTableauSerializer, - ListFieldReportTableauSerializer, + ProfileSerializer, + RegionGeoSerializer, + RegionKeyFigureSerializer, + RegionRelationSerializer, + RegionSnippetSerializer, RegionSnippetTableauSerializer, + SituationReportSerializer, SituationReportTableauSerializer, - # Go Historical - GoHistoricalSerializer, - CountryOfFieldReportToReviewSerializer, - ExportSerializer, - CountryKeyDocumentSerializer, - CountryKeyFigureInputSerializer, - CountryDisasterTypeCountSerializer, - CountryDisasterTypeMonthlySerializer, - CountrySupportingPartnerSerializer, - HistoricalDisasterSerializer -) -from api.filter_set import ( - UserFilterSet, - CountryFilter, - CountryFilterRMD, - DistrictRMDFilter, - RegionKeyFigureFilter, - CountryKeyFigureFilter, - RegionSnippetFilter, - CountrySnippetFilter, - DistrictFilter, - Admin2Filter, - EventFilter, - EventSnippetFilter, - SituationReportFilter, - AppealHistoryFilter, - AppealDocumentFilter, - FieldReportFilter, - GoHistoricalFilter, - CountryKeyDocumentFilter, - CountrySupportingPartnerFilter + SituationReportTypeSerializer, + SnippetSerializer, + SupportedActivitySerializer, + UserMeSerializer, + UserSerializer, ) -from api.visibility_class import ReadOnlyVisibilityViewsetMixin -from per.models import Overview -from per.serializers import CountryLatestOverviewSerializer +from .utils import is_user_ifrc +from .visibility_class import ReadOnlyVisibilityViewset class DeploymentsByEventViewset(viewsets.ReadOnlyModelViewSet): @@ -223,7 +214,7 @@ class CountryViewset(viewsets.ReadOnlyModelViewSet): has_country_plan=models.Exists(CountryPlan.objects.filter(country=OuterRef("pk"), is_publish=True)) ) filterset_class = CountryFilter - ordering_fields = '__all__' + ordering_fields = "__all__" search_fields = ("name",) # for /docs def get_object(self): @@ -251,7 +242,7 @@ def get_serializer_class(self): url_path="databank", # Only for Documentation serializer_class=CountryOverviewSerializer, - pagination_class=None + pagination_class=None, ) def get_databank(self, request, pk): country = self.get_object() @@ -275,16 +266,12 @@ def get_country_figure(self, request, pk): start_date = end_date + timedelta(days=-2 * 365) start_date = request.GET.get("start_date", start_date) end_date = request.GET.get("end_date", end_date) - appeal_conditions = ( - (Q(atype=AppealType.APPEAL)) - ) + appeal_conditions = Q(atype=AppealType.APPEAL) all_appealhistory = AppealHistory.objects.select_related("appeal").filter(appeal__code__isnull=False) all_appealhistory = all_appealhistory.filter(country=country) if start_date and end_date: - all_appealhistory = all_appealhistory.filter( - start_date__lte=end_date, end_date__gte=start_date - ) + all_appealhistory = all_appealhistory.filter(start_date__lte=end_date, end_date__gte=start_date) appeals_aggregated = all_appealhistory.annotate( appeal_with_dref=Count( Case( @@ -311,7 +298,7 @@ def get_country_figure(self, request, pk): output_field=IntegerField(), ) ), - emergencies_count=Count(F("appeal__event_id"), distinct=True) + emergencies_count=Count(F("appeal__event_id"), distinct=True), ).aggregate( active_drefs=Sum("appeal_with_dref"), active_appeals=Sum("appeal_without_dref"), @@ -320,11 +307,7 @@ def get_country_figure(self, request, pk): total_amount_funded=Sum("amount_funded_all"), emergencies=Sum("emergencies_count"), ) - return Response( - CountryKeyFigureSerializer( - appeals_aggregated - ).data - ) + return Response(CountryKeyFigureSerializer(appeals_aggregated).data) @extend_schema( request=None, @@ -332,11 +315,7 @@ def get_country_figure(self, request, pk): methods=["GET"], responses=CountryDisasterTypeCountSerializer(many=True), ) - @action( - detail=True, - url_path="disaster-count", - pagination_class=None - ) + @action(detail=True, url_path="disaster-count", pagination_class=None) def get_country_disaster_count(self, request, pk): country = self.get_object() end_date = timezone.now() @@ -344,96 +323,85 @@ def get_country_disaster_count(self, request, pk): start_date = request.GET.get("start_date", start_date) end_date = request.GET.get("end_date", end_date) - queryset = Event.objects.filter( - countries__in=[country.id], - dtype__isnull=False, - ).values( - 'countries', - 'dtype__name' - ).annotate( - count=Count('id'), - disaster_name=F('dtype__name'), - disaster_id=F('dtype__id'), - ).order_by('countries', 'dtype__name') - - if start_date and end_date: - queryset = queryset.filter( - disaster_start_date__gte=start_date, - disaster_start_date__lte=end_date + queryset = ( + Event.objects.filter( + countries__in=[country.id], + dtype__isnull=False, + ) + .values("countries", "dtype__name") + .annotate( + count=Count("id"), + disaster_name=F("dtype__name"), + disaster_id=F("dtype__id"), ) - return Response( - CountryDisasterTypeCountSerializer( - queryset, many=True - ).data + .order_by("countries", "dtype__name") ) + if start_date and end_date: + queryset = queryset.filter(disaster_start_date__gte=start_date, disaster_start_date__lte=end_date) + return Response(CountryDisasterTypeCountSerializer(queryset, many=True).data) + @extend_schema( request=None, parameters=[CountryKeyFigureInputSerializer], responses=CountryDisasterTypeMonthlySerializer(many=True), ) - @action( - detail=True, - url_path="disaster-monthly-count", - pagination_class=None - ) + @action(detail=True, url_path="disaster-monthly-count", pagination_class=None) def get_country_disaster_monthly_count(self, request, pk): country = self.get_object() end_date = timezone.now() start_date = end_date + timedelta(days=-2 * 365) start_date = request.GET.get("start_date", start_date) end_date = request.GET.get("end_date", end_date) - queryset = Event.objects.filter( - countries__in=[country.id], - dtype__isnull=False, - ).annotate( - date=TruncMonth('created_at') - ).values('date', 'countries', 'dtype').annotate( - appeal_targeted_population=Coalesce(Avg( - 'appeals__num_beneficiaries', - filter=models.Q(appeals__num_beneficiaries__isnull=False), - output_field=models.IntegerField(), - ), 0), - latest_field_report_affected=Coalesce(Subquery( - FieldReport.objects.filter( - event=OuterRef("pk") - ).order_by().values('event') - .annotate(c=models.F('num_affected')).values('c')[:1], - output_field=models.IntegerField(), - ), 0), - disaster_name=F('dtype__name'), - disaster_id=F('dtype__id'), - ).annotate( - targeted_population=ExpressionWrapper( - ( - F('appeal_targeted_population') + - F("latest_field_report_affected") - ), output_field=models.IntegerField() + queryset = ( + Event.objects.filter( + countries__in=[country.id], + dtype__isnull=False, + ) + .annotate(date=TruncMonth("created_at")) + .values("date", "countries", "dtype") + .annotate( + appeal_targeted_population=Coalesce( + Avg( + "appeals__num_beneficiaries", + filter=models.Q(appeals__num_beneficiaries__isnull=False), + output_field=models.IntegerField(), + ), + 0, + ), + latest_field_report_affected=Coalesce( + Subquery( + FieldReport.objects.filter(event=OuterRef("pk")) + .order_by() + .values("event") + .annotate(c=models.F("num_affected")) + .values("c")[:1], + output_field=models.IntegerField(), + ), + 0, + ), + disaster_name=F("dtype__name"), + disaster_id=F("dtype__id"), + ) + .annotate( + targeted_population=ExpressionWrapper( + (F("appeal_targeted_population") + F("latest_field_report_affected")), output_field=models.IntegerField() + ) ) - ).order_by('date', 'countries', 'dtype__name') + .order_by("date", "countries", "dtype__name") + ) if start_date and end_date: - queryset = queryset.filter( - disaster_start_date__gte=start_date, - disaster_start_date__lte=end_date - ) + queryset = queryset.filter(disaster_start_date__gte=start_date, disaster_start_date__lte=end_date) - return Response( - CountryDisasterTypeMonthlySerializer( - queryset, many=True - ).data - ) + return Response(CountryDisasterTypeMonthlySerializer(queryset, many=True).data) @extend_schema( request=None, parameters=[CountryKeyFigureInputSerializer], responses=HistoricalDisasterSerializer(many=True), ) - @action( - detail=True, - url_path="historical-disaster", - pagination_class=None - ) + @action(detail=True, url_path="historical-disaster", pagination_class=None) def get_country_historical_disaster(self, request, pk): country = self.get_object() end_date = timezone.now() @@ -442,73 +410,65 @@ def get_country_historical_disaster(self, request, pk): end_date = request.GET.get("end_date", end_date) dtype = request.GET.get("dtype", None) - queryset = Event.objects.filter( - countries__in=[country.id], - dtype__isnull=False, - ).annotate( - date=TruncMonth('created_at') - ).values('date', 'dtype', 'countries').annotate( - appeal_targeted_population=Coalesce(Avg( - 'appeals__num_beneficiaries', - filter=models.Q(appeals__num_beneficiaries__isnull=False), - output_field=models.IntegerField(), - ), 0), - latest_field_report_affected=Coalesce(Subquery( - FieldReport.objects.filter( - event=OuterRef("pk") - ).order_by().values('event') - .annotate(c=models.F('num_affected')).values('c')[:1], - output_field=models.IntegerField(), - ), 0), - disaster_name=F('dtype__name'), - disaster_id=F('dtype__id'), - amount_funded=F('appeals__amount_funded'), - amount_requested=F('appeals__amount_requested'), - ).annotate( - targeted_population=ExpressionWrapper( - ( - F('appeal_targeted_population') + - F("latest_field_report_affected") - ), output_field=models.IntegerField() + queryset = ( + Event.objects.filter( + countries__in=[country.id], + dtype__isnull=False, + ) + .annotate(date=TruncMonth("created_at")) + .values("date", "dtype", "countries") + .annotate( + appeal_targeted_population=Coalesce( + Avg( + "appeals__num_beneficiaries", + filter=models.Q(appeals__num_beneficiaries__isnull=False), + output_field=models.IntegerField(), + ), + 0, + ), + latest_field_report_affected=Coalesce( + Subquery( + FieldReport.objects.filter(event=OuterRef("pk")) + .order_by() + .values("event") + .annotate(c=models.F("num_affected")) + .values("c")[:1], + output_field=models.IntegerField(), + ), + 0, + ), + disaster_name=F("dtype__name"), + disaster_id=F("dtype__id"), + amount_funded=F("appeals__amount_funded"), + amount_requested=F("appeals__amount_requested"), + ) + .annotate( + targeted_population=ExpressionWrapper( + (F("appeal_targeted_population") + F("latest_field_report_affected")), output_field=models.IntegerField() + ) ) - ).order_by('date', 'countries', 'dtype__name') + .order_by("date", "countries", "dtype__name") + ) if start_date and end_date: - queryset = queryset.filter( - disaster_start_date__gte=start_date, - disaster_start_date__lte=end_date - ) + queryset = queryset.filter(disaster_start_date__gte=start_date, disaster_start_date__lte=end_date) if dtype: - queryset = queryset.filter( - dtype=dtype - ) + queryset = queryset.filter(dtype=dtype) - return Response( - HistoricalDisasterSerializer( - queryset, many=True - ).data - ) + return Response(HistoricalDisasterSerializer(queryset, many=True).data) - @extend_schema( - request=None, - responses=CountryLatestOverviewSerializer - ) - @action( - detail=True, - url_path="latest-per-overview", - serializer_class=CountryLatestOverviewSerializer, - pagination_class=None - ) + @extend_schema(request=None, responses=CountryLatestOverviewSerializer) + @action(detail=True, url_path="latest-per-overview", serializer_class=CountryLatestOverviewSerializer, pagination_class=None) def get_latest_per_overview(self, request, pk): country = self.get_object() - queryset = Overview.objects.filter(country_id=country.id).select_related( - "country", - "type_of_assessment" - ).order_by("-created_at").first() - return Response( - CountryLatestOverviewSerializer(queryset).data + queryset = ( + Overview.objects.filter(country_id=country.id) + .select_related("country", "type_of_assessment") + .order_by("-created_at") + .first() ) + return Response(CountryLatestOverviewSerializer(queryset).data) class CountryRMDViewset(viewsets.ReadOnlyModelViewSet): @@ -519,10 +479,13 @@ class CountryRMDViewset(viewsets.ReadOnlyModelViewSet): class CountryKeyDocumentViewSet(viewsets.ReadOnlyModelViewSet): - queryset = CountryKeyDocument.objects.select_related('country') + queryset = CountryKeyDocument.objects.select_related("country") serializer_class = CountryKeyDocumentSerializer search_fields = ("name",) - ordering_fields = ("year", "end_year",) + ordering_fields = ( + "year", + "end_year", + ) # permission_classes = (IsAuthenticated,) filterset_class = CountryKeyDocumentFilter filter_backends = (NullsLastOrderingFilter, rest_filters.DjangoFilterBackend, filters.SearchFilter) @@ -747,7 +710,7 @@ class EventSnippetViewset(ReadOnlyVisibilityViewset): serializer_class = SnippetSerializer filterset_class = EventSnippetFilter visibility_model_class = Snippet - ordering_fields = '__all__' + ordering_fields = "__all__" class SituationReportTypeViewset(viewsets.ReadOnlyModelViewSet): @@ -788,7 +751,7 @@ class AppealViewset(mixins.ListModelMixin, viewsets.GenericViewSet): ) # serializer_class = AppealSerializer serializer_class = AppealHistorySerializer - ordering_fields = '__all__' + ordering_fields = "__all__" # filterset_class = AppealFilter filterset_class = AppealHistoryFilter search_fields = ( @@ -875,7 +838,7 @@ def get_authenticated_user_info(self, request, *args, **kwargs): @action( detail=True, - methods=['post'], + methods=["post"], url_path="accepted_license_terms", ) def accepted_license_terms(self, request, *args, **kwargs): @@ -886,16 +849,9 @@ def accepted_license_terms(self, request, *args, **kwargs): user.profile.save(update_fields=["accepted_montandon_license_terms"]) return Response(self.get_serializer_class()(user).data) -@extend_schema_view( - retrieve=extend_schema( - request=None, - responses=FieldReportSerializer - ) -) -class FieldReportViewset( - ReadOnlyVisibilityViewsetMixin, - viewsets.ModelViewSet -): + +@extend_schema_view(retrieve=extend_schema(request=None, responses=FieldReportSerializer)) +class FieldReportViewset(ReadOnlyVisibilityViewsetMixin, viewsets.ModelViewSet): search_fields = ( "countries__name", "regions__label", @@ -904,14 +860,8 @@ class FieldReportViewset( ordering_fields = ("summary", "event", "dtype", "created_at", "updated_at") filterset_class = FieldReportFilter authentication_class = [IsAuthenticated] - queryset = FieldReport.objects.select_related( - "dtype", "event" - ).prefetch_related( - "actions_taken", - "actions_taken__actions", - "countries", - "districts", - "regions" + queryset = FieldReport.objects.select_related("dtype", "event").prefetch_related( + "actions_taken", "actions_taken__actions", "countries", "districts", "regions" ) def get_serializer_class(self): @@ -1336,4 +1286,4 @@ class CountrySupportingPartnerViewSet(viewsets.ModelViewSet): filterset_class = CountrySupportingPartnerFilter def get_queryset(self): - return CountrySupportingPartner.objects.select_related('country') + return CountrySupportingPartner.objects.select_related("country") diff --git a/api/enums.py b/api/enums.py index fdde6eef6..83e81850e 100644 --- a/api/enums.py +++ b/api/enums.py @@ -1,23 +1,23 @@ from . import models enum_register = { - 'region_name': models.RegionName, - 'country_type': models.CountryType, - 'visibility_choices': models.VisibilityChoices, - 'visibility_char_choices': models.VisibilityCharChoices, - 'position_type': models.PositionType, - 'tab_number': models.TabNumber, - 'alert_level': models.AlertLevel, - 'appeal_type': models.AppealType, - 'appeal_status': models.AppealStatus, - 'request_choices': models.RequestChoices, - 'episource_choices': models.EPISourceChoices, - 'field_report_status': models.FieldReport.Status, - 'field_report_recent_affected': models.FieldReport.RecentAffected, - 'field_report_bulletin': models.RequestChoices, - 'action_org': models.ActionOrg, - 'action_type': models.ActionType, - 'action_category': models.ActionCategory, - 'profile_org_types': models.Profile.OrgTypes, - 'supporting_type': models.CountrySupportingPartner.SupportingPartnerType, + "region_name": models.RegionName, + "country_type": models.CountryType, + "visibility_choices": models.VisibilityChoices, + "visibility_char_choices": models.VisibilityCharChoices, + "position_type": models.PositionType, + "tab_number": models.TabNumber, + "alert_level": models.AlertLevel, + "appeal_type": models.AppealType, + "appeal_status": models.AppealStatus, + "request_choices": models.RequestChoices, + "episource_choices": models.EPISourceChoices, + "field_report_status": models.FieldReport.Status, + "field_report_recent_affected": models.FieldReport.RecentAffected, + "field_report_bulletin": models.RequestChoices, + "action_org": models.ActionOrg, + "action_type": models.ActionType, + "action_category": models.ActionCategory, + "profile_org_types": models.Profile.OrgTypes, + "supporting_type": models.CountrySupportingPartner.SupportingPartnerType, } diff --git a/api/esconnection.py b/api/esconnection.py index c6d6c01ec..255f68083 100644 --- a/api/esconnection.py +++ b/api/esconnection.py @@ -1,8 +1,8 @@ -from elasticsearch import Elasticsearch from django.conf import settings +from elasticsearch import Elasticsearch if settings.ELASTIC_SEARCH_HOST is not None: ES_CLIENT = Elasticsearch([settings.ELASTIC_SEARCH_HOST], timeout=2, max_retries=3, retry_on_timeout=True) else: - print('Warning: No elasticsearch host found, will not index elasticsearch') + print("Warning: No elasticsearch host found, will not index elasticsearch") ES_CLIENT = None diff --git a/api/event_sources.py b/api/event_sources.py index 2f9308984..e1da03505 100644 --- a/api/event_sources.py +++ b/api/event_sources.py @@ -1,8 +1,8 @@ SOURCES = { - 'gdacs': 'GDACs scraper', - 'who': 'WHO scraper', - 'report_ingest': 'Field report DMIS ingest', - 'report_admin': 'Field report admin', - 'appeal_admin': 'Appeal admin', - 'new_report': 'New field report', + "gdacs": "GDACs scraper", + "who": "WHO scraper", + "report_ingest": "Field report DMIS ingest", + "report_admin": "Field report admin", + "appeal_admin": "Appeal admin", + "new_report": "New field report", } diff --git a/api/exceptions.py b/api/exceptions.py index 15956408a..aac4d8c6b 100644 --- a/api/exceptions.py +++ b/api/exceptions.py @@ -1,10 +1,10 @@ -from rest_framework.status import HTTP_400_BAD_REQUEST from rest_framework.exceptions import APIException +from rest_framework.status import HTTP_400_BAD_REQUEST class BadRequest(APIException): status_code = HTTP_400_BAD_REQUEST - default_code = 'Bad request' + default_code = "Bad request" def __init__(self, detail): self.detail = detail diff --git a/api/factories/country.py b/api/factories/country.py index aadfb87c7..582654d14 100644 --- a/api/factories/country.py +++ b/api/factories/country.py @@ -1,6 +1,6 @@ import factory -from factory import fuzzy from django.core.files.base import ContentFile +from factory import fuzzy from .. import models from . import region @@ -10,11 +10,11 @@ class CountryFactory(factory.django.DjangoModelFactory): class Meta: model = models.Country - name = fuzzy.FuzzyText(length=50, prefix='country-') + name = fuzzy.FuzzyText(length=50, prefix="country-") record_type = fuzzy.FuzzyChoice(models.CountryType) iso = fuzzy.FuzzyText(length=2) iso3 = fuzzy.FuzzyText(length=3) - society_name = fuzzy.FuzzyText(length=50, prefix='society-name-') + society_name = fuzzy.FuzzyText(length=50, prefix="society-name-") society_url = fuzzy.FuzzyText(length=200) url_ifrc = fuzzy.FuzzyText(length=200) region = factory.SubFactory(region.RegionFactory) diff --git a/api/factories/disaster_type.py b/api/factories/disaster_type.py index 8ba316210..f1854f664 100644 --- a/api/factories/disaster_type.py +++ b/api/factories/disaster_type.py @@ -8,5 +8,5 @@ class DisasterTypeFactory(factory.django.DjangoModelFactory): class Meta: model = models.DisasterType - name = fuzzy.FuzzyText(length=50, prefix='disaster-type-') + name = fuzzy.FuzzyText(length=50, prefix="disaster-type-") summary = fuzzy.FuzzyText(length=500) diff --git a/api/factories/district.py b/api/factories/district.py index 58b97efee..6266d9052 100644 --- a/api/factories/district.py +++ b/api/factories/district.py @@ -9,7 +9,7 @@ class DistrictFactory(factory.django.DjangoModelFactory): class Meta: model = models.District - name = fuzzy.FuzzyText(length=50, prefix='district-') + name = fuzzy.FuzzyText(length=50, prefix="district-") code = fuzzy.FuzzyText(length=10) country = factory.SubFactory(country.CountryFactory) is_enclave = fuzzy.FuzzyChoice([True, False]) diff --git a/api/factories/event.py b/api/factories/event.py index 764f3e4e6..855c9ccd2 100644 --- a/api/factories/event.py +++ b/api/factories/event.py @@ -1,26 +1,28 @@ -import factory -from factory import fuzzy import datetime + +import factory import pytz +from factory import fuzzy + +from api.factories.country import CountryFactory from ..models import ( AlertLevel, + Appeal, + AppealHistory, AppealType, Event, EventFeaturedDocument, EventLink, - Appeal, - AppealHistory, ) from .disaster_type import DisasterTypeFactory -from api.factories.country import CountryFactory class EventFactory(factory.django.DjangoModelFactory): class Meta: model = Event - name = fuzzy.FuzzyText(length=50, prefix='event-') + name = fuzzy.FuzzyText(length=50, prefix="event-") slug = fuzzy.FuzzyText(length=50) dtype = factory.SubFactory(DisasterTypeFactory) @@ -51,9 +53,7 @@ def regions(self, create, extracted, **kwargs): for region in extracted: self.regions.add(region) - parent_event = factory.SubFactory( - "api.factories.event.EventFactory", parent_event=None - ) + parent_event = factory.SubFactory("api.factories.event.EventFactory", parent_event=None) summary = fuzzy.FuzzyText(length=500) @@ -66,14 +66,10 @@ def regions(self, create, extracted, **kwargs): ifrc_severity_level = fuzzy.FuzzyChoice(AlertLevel) glide = fuzzy.FuzzyText(length=18) - disaster_start_date = fuzzy.FuzzyDateTime( - datetime.datetime(2008, 1, 1, tzinfo=pytz.utc) - ) + disaster_start_date = fuzzy.FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc)) created_at = fuzzy.FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc)) updated_at = fuzzy.FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc)) - previous_update = fuzzy.FuzzyDateTime( - datetime.datetime(2008, 1, 1, tzinfo=pytz.utc) - ) + previous_update = fuzzy.FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc)) auto_generated = fuzzy.FuzzyChoice([True, False]) auto_generated_source = fuzzy.FuzzyText(length=50) @@ -95,8 +91,8 @@ class Meta: model = EventFeaturedDocument event = factory.SubFactory(Event) - title = fuzzy.FuzzyText(length=50, prefix='event-featured-document-title-') - description = fuzzy.FuzzyText(length=100, prefix='event-featured-document-description-') + title = fuzzy.FuzzyText(length=50, prefix="event-featured-document-title-") + description = fuzzy.FuzzyText(length=100, prefix="event-featured-document-description-") class EventLinkFactory(factory.django.DjangoModelFactory): @@ -104,12 +100,12 @@ class Meta: model = EventLink event = factory.SubFactory(Event) - title = fuzzy.FuzzyText(length=50, prefix='event-link-title-') - description = fuzzy.FuzzyText(length=100, prefix='event-link-description-') + title = fuzzy.FuzzyText(length=50, prefix="event-link-title-") + description = fuzzy.FuzzyText(length=100, prefix="event-link-description-") class AppealFactory(factory.django.DjangoModelFactory): - name = fuzzy.FuzzyText(length=50, prefix='event-') + name = fuzzy.FuzzyText(length=50, prefix="event-") dtype = factory.SubFactory(DisasterTypeFactory) num_beneficiaries = fuzzy.FuzzyInteger(0) amount_requested = fuzzy.FuzzyInteger(0) diff --git a/api/factories/field_report.py b/api/factories/field_report.py index b41f30af8..5ad5a6544 100644 --- a/api/factories/field_report.py +++ b/api/factories/field_report.py @@ -1,7 +1,8 @@ -import factory -from factory import fuzzy import datetime + +import factory import pytz +from factory import fuzzy from .. import models from . import disaster_type, event @@ -147,6 +148,7 @@ class Meta: notes_ns = fuzzy.FuzzyText(length=50) notes_socioeco = fuzzy.FuzzyText(length=50) + # If we use the below ones, double save will occur – breaks tests. # See https://github.com/FactoryBoy/factory_boy/issues/316 # diff --git a/api/filehandler.py b/api/filehandler.py index eaffafbdb..a11ce69de 100644 --- a/api/filehandler.py +++ b/api/filehandler.py @@ -5,6 +5,6 @@ class MakeFileHandler(logging.FileHandler): """https://stackoverflow.com/questions/20666764/python-logging-how-to-ensure-logfile-directory-is-created""" - def __init__(self, filename, mode='a', encoding=None, delay=0): + def __init__(self, filename, mode="a", encoding=None, delay=0): os.makedirs(os.path.dirname(filename), exist_ok=True) logging.FileHandler.__init__(self, filename, mode, encoding, delay) diff --git a/api/filter_set.py b/api/filter_set.py index 43b666fa4..81f5d70f9 100644 --- a/api/filter_set.py +++ b/api/filter_set.py @@ -1,35 +1,33 @@ import django_filters as filters - from django.contrib.auth.models import User from django.db import models +from api.event_sources import SOURCES from api.models import ( + Admin2, + Appeal, + AppealDocument, + AppealHistory, Country, + CountryKeyDocument, + CountryKeyFigure, + CountrySnippet, + CountrySupportingPartner, District, + Event, + FieldReport, Region, RegionKeyFigure, - CountryKeyFigure, RegionSnippet, - CountrySnippet, - Admin2, - Event, - Snippet, SituationReport, - Appeal, - AppealHistory, - AppealDocument, - FieldReport, - CountryKeyDocument, - CountrySupportingPartner - + Snippet, ) from api.view_filters import ListFilter -from api.event_sources import SOURCES class UserFilterSet(filters.FilterSet): - name = filters.CharFilter(field_name='username', lookup_expr='icontains') - email = filters.CharFilter(field_name='email', lookup_expr='icontains') + name = filters.CharFilter(field_name="username", lookup_expr="icontains") + email = filters.CharFilter(field_name="email", lookup_expr="icontains") class Meta: model = User @@ -39,20 +37,9 @@ class Meta: class CountryFilter(filters.FilterSet): region = filters.NumberFilter(field_name="region", lookup_expr="exact") record_type = filters.NumberFilter(field_name="record_type", lookup_expr="exact") - is_independent = filters.BooleanFilter( - field_name="independent", - label="is_independent", - lookup_expr="exact" - ) - is_deprecated = filters.BooleanFilter( - field_name="is_deprecated", - label="is_deprecated", - lookup_expr="exact" - ) - is_nationalsociety = filters.BooleanFilter( - label="is_nationalsociety", - method="filter_national_society" - ) + is_independent = filters.BooleanFilter(field_name="independent", label="is_independent", lookup_expr="exact") + is_deprecated = filters.BooleanFilter(field_name="is_deprecated", label="is_deprecated", lookup_expr="exact") + is_nationalsociety = filters.BooleanFilter(label="is_nationalsociety", method="filter_national_society") class Meta: model = Country @@ -66,13 +53,8 @@ def filter_national_society(self, qs, name, value): if not value: return qs return qs.filter( - ( - models.Q(independent=True) & - models.Q(society_name__isnull=False) - ) | - ( - (models.Q(name__icontains="RC")) | models.Q(iso="BX") - ) + (models.Q(independent=True) & models.Q(society_name__isnull=False)) + | ((models.Q(name__icontains="RC")) | models.Q(iso="BX")) ) @@ -96,7 +78,7 @@ class CountryKeyDocumentFilter(filters.FilterSet): class Meta: model = CountryKeyDocument - fields= () + fields = () class DistrictRMDFilter(filters.FilterSet): @@ -178,10 +160,7 @@ class EventFilter(filters.FilterSet): label="Auto generated source choices", choices=[(v, v) for v in SOURCES.values()], ) - is_subscribed = filters.BooleanFilter( - label="is_subscribed", - method='get_is_subcribed_event' - ) + is_subscribed = filters.BooleanFilter(label="is_subscribed", method="get_is_subcribed_event") class Meta: model = Event @@ -237,27 +216,18 @@ class Meta: class AppealHistoryFilter(filters.FilterSet): atype = filters.NumberFilter(field_name="atype", lookup_expr="exact") dtype = filters.NumberFilter(field_name="dtype", lookup_expr="exact") - country = filters.ModelMultipleChoiceFilter( - field_name='country', - queryset=Country.objects.all() - ) - region = filters.ModelMultipleChoiceFilter( - field_name='region', - queryset=Region.objects.all() - ) + country = filters.ModelMultipleChoiceFilter(field_name="country", queryset=Country.objects.all()) + region = filters.ModelMultipleChoiceFilter(field_name="region", queryset=Region.objects.all()) code = filters.CharFilter(field_name="code", lookup_expr="exact") status = filters.NumberFilter(field_name="status", lookup_expr="exact") # Do not use, misleading: id = filters.NumberFilter(field_name='id', lookup_expr='exact') appeal_id = filters.NumberFilter( field_name="appeal_id", lookup_expr="exact", help_text="Use this (or code) for appeal identification." ) - district = filters.ModelMultipleChoiceFilter ( - field_name="country__district", - queryset=District.objects.all(), - label="district", - method="get_country_district" + district = filters.ModelMultipleChoiceFilter( + field_name="country__district", queryset=District.objects.all(), label="district", method="get_country_district" ) - admin2 = filters.ModelMultipleChoiceFilter( + admin2 = filters.ModelMultipleChoiceFilter( field_name="country__district__admin2", queryset=Admin2.objects.all(), label="admin2", @@ -285,9 +255,10 @@ def get_country_admin2(self, qs, name, value): return qs.filter(country__district__admin2=value).distinct() return qs + class AppealDocumentFilter(filters.FilterSet): appeal = filters.ModelMultipleChoiceFilter( - method='get_appeal_filter', + method="get_appeal_filter", widget=filters.widgets.CSVWidget, queryset=Appeal.objects.all(), ) diff --git a/api/fixtures/fixturize.py b/api/fixtures/fixturize.py index 80e4e9c14..f6aa4f291 100755 --- a/api/fixtures/fixturize.py +++ b/api/fixtures/fixturize.py @@ -12,15 +12,15 @@ key is the column name in the CSV file value is the field name in the Django model """ -import os -import sys +import argparse import csv import json -import argparse +import os +import sys def csv_to_json(input): - reader = csv.reader(input, delimiter=',', quotechar='"') + reader = csv.reader(input, delimiter=",", quotechar='"') records = [] for i, row in enumerate(reader): if i == 0: @@ -39,30 +39,30 @@ def main(filename, model, fields, pk=None): key = i if pk is None else record[pk] flds = {} for f in fields: - parts = f.split('=') + parts = f.split("=") if len(parts) == 1: flds.update({f: record[f]}) elif len(parts) == 2: flds.update({parts[1]: record[parts[0]]}) new_records.append({"model": model, "pk": key, "fields": flds}) - fout = os.path.splitext(filename)[0] + '.json' - with open(fout, 'w') as f: + fout = os.path.splitext(filename)[0] + ".json" + with open(fout, "w") as f: f.write(json.dumps(new_records)) def parse_args(args): - """ Parse command line arguments """ + """Parse command line arguments""" dhf = argparse.ArgumentDefaultsHelpFormatter - parser = argparse.ArgumentParser(description='IFRC fixturize CSV data', formatter_class=dhf) - parser.add_argument('filename', help='CSV filename') - parser.add_argument('model', help='Model name (e.g., api.Country)') - parser.add_argument('fields', nargs='*', help='Fields to keep') - parser.add_argument('--pk', help='Primary key (auto-increment from 0 if None)', default=None) + parser = argparse.ArgumentParser(description="IFRC fixturize CSV data", formatter_class=dhf) + parser.add_argument("filename", help="CSV filename") + parser.add_argument("model", help="Model name (e.g., api.Country)") + parser.add_argument("fields", nargs="*", help="Fields to keep") + parser.add_argument("--pk", help="Primary key (auto-increment from 0 if None)", default=None) return vars(parser.parse_args(args)) def cli(): - """ Run a CLI, parsing args from command line """ + """Run a CLI, parsing args from command line""" args = parse_args(sys.argv[1:]) main(**args) diff --git a/api/fixtures/update-disaster-names.py b/api/fixtures/update-disaster-names.py index 11d4aa846..e54c144f8 100755 --- a/api/fixtures/update-disaster-names.py +++ b/api/fixtures/update-disaster-names.py @@ -5,9 +5,10 @@ what comes out of DMIS, to what's being used now. """ -import sys -import json import argparse +import json +import sys + from dtype_map import DISASTER_TYPE_MAPPING @@ -20,37 +21,37 @@ def main(input, output): # also keep track of what old primary keys map with new pk_map = {} for fixture in records: - key = fixture['fields']['name'] + key = fixture["fields"]["name"] if key in DISASTER_TYPE_MAPPING: - fixture['fields']['name'] = DISASTER_TYPE_MAPPING[key] + fixture["fields"]["name"] = DISASTER_TYPE_MAPPING[key] - exists = [f for f in new_records if f['fields']['name'] == fixture['fields']['name']] - old_pk = str(fixture['pk']) + exists = [f for f in new_records if f["fields"]["name"] == fixture["fields"]["name"]] + old_pk = str(fixture["pk"]) if len(exists): - pk_map[old_pk] = exists[0]['pk'] + pk_map[old_pk] = exists[0]["pk"] else: new_records.append(fixture) pk_map[old_pk] = old_pk - with open('%s.json' % output, 'w') as o: + with open("%s.json" % output, "w") as o: o.write(json.dumps(new_records, indent=2)) - with open('%s-pks.json' % output, 'w') as o: + with open("%s-pks.json" % output, "w") as o: o.write(json.dumps(pk_map, indent=2)) def parse_args(args): - """ Parse command line arguments """ + """Parse command line arguments""" dhf = argparse.ArgumentDefaultsHelpFormatter - parser = argparse.ArgumentParser(description='Convert disaster type fixture', formatter_class=dhf) - parser.add_argument('input', help='DisasterType input filename (json)') - parser.add_argument('output', help='Reformatted DisasterType output filename') + parser = argparse.ArgumentParser(description="Convert disaster type fixture", formatter_class=dhf) + parser.add_argument("input", help="DisasterType input filename (json)") + parser.add_argument("output", help="Reformatted DisasterType output filename") return vars(parser.parse_args(args)) def cli(): - """ Run a CLI, parsing args from command line """ + """Run a CLI, parsing args from command line""" args = parse_args(sys.argv[1:]) main(**args) diff --git a/api/forms.py b/api/forms.py index c8ad64752..8394cc003 100644 --- a/api/forms.py +++ b/api/forms.py @@ -5,9 +5,9 @@ class ActionForm(forms.ModelForm): - organizations = forms.MultipleChoiceField(label=_('organizations'), choices=ActionOrg.choices) - field_report_types = forms.MultipleChoiceField(label=_('field report types'), choices=ActionType.choices) + organizations = forms.MultipleChoiceField(label=_("organizations"), choices=ActionOrg.choices) + field_report_types = forms.MultipleChoiceField(label=_("field report types"), choices=ActionType.choices) class Meta: model = Action - fields = '__all__' + fields = "__all__" diff --git a/api/indexes.py b/api/indexes.py index a3b2c2009..990a18c1c 100644 --- a/api/indexes.py +++ b/api/indexes.py @@ -1,57 +1,30 @@ GenericMapping = { - 'properties': { - 'id': {'type': 'keyword'}, - 'event_id': {'type': 'keyword'}, - 'type': {'type': 'keyword'}, - 'name': {'type': 'text'}, - 'keyword': { - 'type': 'keyword', - 'normalizer': 'lowercase' - }, - 'visibility': {'type': 'text'}, - 'ns': {'type': 'text'}, - 'body': { - 'type': 'text', - 'analyzer': 'autocomplete' - }, - 'date': {'type': 'date'}, + "properties": { + "id": {"type": "keyword"}, + "event_id": {"type": "keyword"}, + "type": {"type": "keyword"}, + "name": {"type": "text"}, + "keyword": {"type": "keyword", "normalizer": "lowercase"}, + "visibility": {"type": "text"}, + "ns": {"type": "text"}, + "body": {"type": "text", "analyzer": "autocomplete"}, + "date": {"type": "date"}, } } GenericSetting = { - 'settings': { - 'number_of_shards': 1, - 'analysis': { - 'filter': { - 'autocomplete_filter': { - 'type': 'edge_ngram', - 'min_gram': 3, - 'max_gram': 10, - 'token_chars': [ - 'letter', - 'digit' - ] - } + "settings": { + "number_of_shards": 1, + "analysis": { + "filter": { + "autocomplete_filter": {"type": "edge_ngram", "min_gram": 3, "max_gram": 10, "token_chars": ["letter", "digit"]} }, - 'analyzer': { - 'autocomplete': { - 'type': 'custom', - 'tokenizer': 'standard', - 'filter': [ - 'lowercase', - 'autocomplete_filter' - ] - } + "analyzer": { + "autocomplete": {"type": "custom", "tokenizer": "standard", "filter": ["lowercase", "autocomplete_filter"]} }, - 'normalizer': { - 'lowercase': { - 'type': 'custom', - 'char_filter': [], - 'filter': ['lowercase'] - } - } - } + "normalizer": {"lowercase": {"type": "custom", "char_filter": [], "filter": ["lowercase"]}}, + }, } } -ES_PAGE_NAME = 'page_all' +ES_PAGE_NAME = "page_all" diff --git a/api/logger.py b/api/logger.py index 242cefcc1..60760fe33 100644 --- a/api/logger.py +++ b/api/logger.py @@ -1,36 +1,31 @@ import logging import sys +from azure_storage_logging.handlers import ( + BlobStorageTimedRotatingFileHandler as storage, +) from django.conf import settings -from azure_storage_logging.handlers import BlobStorageTimedRotatingFileHandler as storage - -formatter = logging.Formatter( - fmt='%(asctime)s %(levelname)-8s %(message)s', - datefmt='%Y-%m-%d %H:%M:%S' -) +formatter = logging.Formatter(fmt="%(asctime)s %(levelname)-8s %(message)s", datefmt="%Y-%m-%d %H:%M:%S") screen_handler = logging.StreamHandler(stream=sys.stdout) screen_handler.setFormatter(formatter) -logger = logging.getLogger('api') -logger.setLevel('DEBUG') +logger = logging.getLogger("api") +logger.setLevel("DEBUG") logger.addHandler(screen_handler) -if ( - settings.AZURE_STORAGE_ACCOUNT is not None and - settings.AZURE_STORAGE_KEY is not None -): +if settings.AZURE_STORAGE_ACCOUNT is not None and settings.AZURE_STORAGE_KEY is not None: handler = storage( account_name=settings.AZURE_STORAGE_ACCOUNT, account_key=settings.AZURE_STORAGE_KEY, - filename='go.log', - when='M', + filename="go.log", + when="M", interval=90, - container='logs', - encoding='utf-8' + container="logs", + encoding="utf-8", ) handler.setFormatter(formatter) logger.addHandler(handler) else: - logger.warning('No Azure credentials found, falling back to local logs.') + logger.warning("No Azure credentials found, falling back to local logs.") diff --git a/api/management/commands/add_action_tooltips.py b/api/management/commands/add_action_tooltips.py index 8f826e359..1d2726f05 100644 --- a/api/management/commands/add_action_tooltips.py +++ b/api/management/commands/add_action_tooltips.py @@ -1,8 +1,9 @@ from django.core.management.base import BaseCommand -from api.models import Action from django.db import transaction from django.db.models import Q + from api.logger import logger +from api.models import Action class Command(BaseCommand): diff --git a/api/management/commands/add_main_contacts.py b/api/management/commands/add_main_contacts.py index 3acc89aca..eca92aa28 100644 --- a/api/management/commands/add_main_contacts.py +++ b/api/management/commands/add_main_contacts.py @@ -1,7 +1,8 @@ from django.core.management.base import BaseCommand -from api.models import MainContact from django.db import transaction + from api.logger import logger +from api.models import MainContact class Command(BaseCommand): diff --git a/api/management/commands/add_partner_dropdownitems.py b/api/management/commands/add_partner_dropdownitems.py index fac877ee3..a40cce484 100644 --- a/api/management/commands/add_partner_dropdownitems.py +++ b/api/management/commands/add_partner_dropdownitems.py @@ -1,7 +1,8 @@ from django.core.management.base import BaseCommand -from api.models import ExternalPartner, SupportedActivity from django.db import transaction + from api.logger import logger +from api.models import ExternalPartner, SupportedActivity class Command(BaseCommand): diff --git a/api/management/commands/create_events.py b/api/management/commands/create_events.py index eb351a5eb..7078b772f 100644 --- a/api/management/commands/create_events.py +++ b/api/management/commands/create_events.py @@ -1,6 +1,7 @@ from django.core.management.base import BaseCommand -from api.models import Appeal, Event + from api.event_sources import SOURCES +from api.models import Appeal, Event class Command(BaseCommand): diff --git a/api/management/commands/cron_job_monitor.py b/api/management/commands/cron_job_monitor.py index 8bdfcfbaf..0a11d97a0 100644 --- a/api/management/commands/cron_job_monitor.py +++ b/api/management/commands/cron_job_monitor.py @@ -1,66 +1,64 @@ -import requests import logging - from urllib.parse import urlparse -from django.core.management.base import BaseCommand + +import requests from django.conf import settings +from django.core.management.base import BaseCommand -from main.settings import SENTRY_DSN from main.sentry import SentryMonitor +from main.settings import SENTRY_DSN logger = logging.getLogger(__name__) class Command(BaseCommand): - help = 'This command is used to create a cron job monitor for sentry' + help = "This command is used to create a cron job monitor for sentry" def add_arguments(self, parser): parser.add_argument( - '--validate-only', - dest='validate_only', - action='store_true', + "--validate-only", + dest="validate_only", + action="store_true", ) def handle(self, *args, **options): SentryMonitor.validate_config() if not SENTRY_DSN: - logger.error('SENTRY_DSN is not set in the environment variables. Exiting...') + logger.error("SENTRY_DSN is not set in the environment variables. Exiting...") return - if options.get('validate_only'): + if options.get("validate_only"): return parsed_url = urlparse(SENTRY_DSN) - project_id = parsed_url.path.strip('/') + project_id = parsed_url.path.strip("/") api_key = parsed_url.username - SENTRY_INGEST = f'https://{parsed_url.hostname}' + SENTRY_INGEST = f"https://{parsed_url.hostname}" for cronjob in SentryMonitor.choices: job, schedule = cronjob - SENTRY_CRONS = f'{SENTRY_INGEST}/api/{project_id}/cron/{job}/{api_key}/' + SENTRY_CRONS = f"{SENTRY_INGEST}/api/{project_id}/cron/{job}/{api_key}/" payload = { - 'monitor_config': { - 'schedule': { - 'type': 'crontab', - 'value': str(schedule), + "monitor_config": { + "schedule": { + "type": "crontab", + "value": str(schedule), }, }, - 'environment': settings.GO_ENVIRONMENT, - 'status': 'ok', + "environment": settings.GO_ENVIRONMENT, + "status": "ok", } - response = requests.post(SENTRY_CRONS, json=payload, headers={'Content-Type': 'application/json'}) + response = requests.post(SENTRY_CRONS, json=payload, headers={"Content-Type": "application/json"}) if response.status_code == 202: - self.stdout.write( - self.style.SUCCESS(f'Successfully created cron job for {job}') - ) + self.stdout.write(self.style.SUCCESS(f"Successfully created cron job for {job}")) else: self.stdout.write( self.style.ERROR( - f'Failed to create cron job for {job} with status code {response.status_code}: {response.content}' + f"Failed to create cron job for {job} with status code {response.status_code}: {response.content}" ) ) diff --git a/api/management/commands/generate-admin2-shp.py b/api/management/commands/generate-admin2-shp.py index 1113df2d1..402c01ced 100644 --- a/api/management/commands/generate-admin2-shp.py +++ b/api/management/commands/generate-admin2-shp.py @@ -1,6 +1,6 @@ +import geopandas as gpd from django.core.management.base import BaseCommand, CommandError from django.db import transaction -import geopandas as gpd class Command(BaseCommand): diff --git a/api/management/commands/import-admin0-data.py b/api/management/commands/import-admin0-data.py index 7fa1b02d4..d025a3e6b 100644 --- a/api/management/commands/import-admin0-data.py +++ b/api/management/commands/import-admin0-data.py @@ -1,17 +1,16 @@ -import sys -import os -import json import csv -from django.core.management.base import BaseCommand, CommandError -from django.contrib.gis.utils import LayerMapping +import json +import os +import sys + from django.contrib.gis.gdal import DataSource -from django.contrib.gis.geos import GEOSGeometry -from django.contrib.gis.geos import MultiPolygon, Point -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned +from django.contrib.gis.geos import GEOSGeometry, MultiPolygon, Point +from django.contrib.gis.utils import LayerMapping +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist +from django.core.management.base import BaseCommand, CommandError from django.db import transaction -from api.models import Country -from api.models import Region -from api.models import CountryGeoms + +from api.models import Country, CountryGeoms, Region class Command(BaseCommand): diff --git a/api/management/commands/import-admin1-data.py b/api/management/commands/import-admin1-data.py index 289c31b8d..74fa51ef4 100644 --- a/api/management/commands/import-admin1-data.py +++ b/api/management/commands/import-admin1-data.py @@ -1,16 +1,15 @@ -import sys -import os import csv -from django.core.management.base import BaseCommand, CommandError -from django.contrib.gis.utils import LayerMapping +import os +import sys + from django.contrib.gis.gdal import DataSource -from django.contrib.gis.geos import GEOSGeometry -from django.contrib.gis.geos import MultiPolygon +from django.contrib.gis.geos import GEOSGeometry, MultiPolygon +from django.contrib.gis.utils import LayerMapping from django.core.exceptions import ObjectDoesNotExist +from django.core.management.base import BaseCommand, CommandError from django.db import transaction -from api.models import Country -from api.models import District -from api.models import DistrictGeoms + +from api.models import Country, District, DistrictGeoms class Command(BaseCommand): diff --git a/api/management/commands/import-admin2-data.py b/api/management/commands/import-admin2-data.py index 28e2d6005..c2f1d8b22 100644 --- a/api/management/commands/import-admin2-data.py +++ b/api/management/commands/import-admin2-data.py @@ -1,17 +1,12 @@ import csv -from django.core.management.base import BaseCommand, CommandError from django.contrib.gis.gdal import DataSource from django.contrib.gis.geos import GEOSGeometry from django.core.exceptions import ObjectDoesNotExist -from django.db import IntegrityError -from django.db import transaction - -from api.models import Country -from api.models import District -from api.models import DistrictGeoms -from api.models import Admin2 -from api.models import Admin2Geoms +from django.core.management.base import BaseCommand, CommandError +from django.db import IntegrityError, transaction + +from api.models import Admin2, Admin2Geoms, Country, District, DistrictGeoms class Command(BaseCommand): diff --git a/api/management/commands/import-fdrs.py b/api/management/commands/import-fdrs.py index 7120d6125..e1ee3a6e8 100644 --- a/api/management/commands/import-fdrs.py +++ b/api/management/commands/import-fdrs.py @@ -1,8 +1,10 @@ import csv + +from django.core.exceptions import ObjectDoesNotExist from django.core.management.base import BaseCommand, CommandError -from api.models import Country from django.db import transaction -from django.core.exceptions import ObjectDoesNotExist + +from api.models import Country class Command(BaseCommand): diff --git a/api/management/commands/import-gec-code.py b/api/management/commands/import-gec-code.py index c833edd27..bcd5fb23f 100644 --- a/api/management/commands/import-gec-code.py +++ b/api/management/commands/import-gec-code.py @@ -1,12 +1,16 @@ import csv + +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.management.base import BaseCommand, CommandError -from api.models import Country, GECCode from django.db import transaction -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned + +from api.models import Country, GECCode class Command(BaseCommand): - help = "import a CSV file with GEC and country iso code to the GECCode model. To run, python manage.py import-gec-code codes.csv" + help = ( + "import a CSV file with GEC and country iso code to the GECCode model. To run, python manage.py import-gec-code codes.csv" + ) missing_args_message = "Filename is missing. A valid CSV file is required." def add_arguments(self, parser): diff --git a/api/management/commands/import-translated-strings.py b/api/management/commands/import-translated-strings.py index 5cc08c6c1..1062bed0d 100644 --- a/api/management/commands/import-translated-strings.py +++ b/api/management/commands/import-translated-strings.py @@ -1,9 +1,11 @@ -import os import csv +import os + from django.core.management.base import BaseCommand from django.db import transaction -from api.models import Action, Country, DisasterType, SituationReportType + from api.logger import logger +from api.models import Action, Country, DisasterType, SituationReportType class Command(BaseCommand): diff --git a/api/management/commands/import_admin2s_csv.py b/api/management/commands/import_admin2s_csv.py index e0ca18780..f76aff914 100644 --- a/api/management/commands/import_admin2s_csv.py +++ b/api/management/commands/import_admin2s_csv.py @@ -3,7 +3,7 @@ from django.core.management.base import BaseCommand from django.db import transaction -from api.models import District, Admin2 +from api.models import Admin2, District class Command(BaseCommand): diff --git a/api/management/commands/import_countries_csv.py b/api/management/commands/import_countries_csv.py index a9900a88b..eebf7aa6c 100644 --- a/api/management/commands/import_countries_csv.py +++ b/api/management/commands/import_countries_csv.py @@ -1,7 +1,9 @@ -import os -from django.db import transaction import csv +import os + from django.core.management.base import BaseCommand, CommandError +from django.db import transaction + from api.models import Country diff --git a/api/management/commands/import_districts_csv.py b/api/management/commands/import_districts_csv.py index 69f2575c7..57b77b346 100644 --- a/api/management/commands/import_districts_csv.py +++ b/api/management/commands/import_districts_csv.py @@ -1,6 +1,8 @@ -from django.db import transaction import csv + from django.core.management.base import BaseCommand, CommandError +from django.db import transaction + from api.models import Country, District diff --git a/api/management/commands/import_ns_organizational_capacity.py b/api/management/commands/import_ns_organizational_capacity.py index f949b4e8a..d28df12c2 100644 --- a/api/management/commands/import_ns_organizational_capacity.py +++ b/api/management/commands/import_ns_organizational_capacity.py @@ -1,6 +1,6 @@ import csv -import pandas as pd +import pandas as pd from django.core.management.base import BaseCommand, CommandError from api.models import Country, CountryOrganizationalCapacity @@ -18,9 +18,7 @@ def update_or_create_capacity(self, sheet_name, field_mapping, filename): for data in CAP.itertuples(index=False): country_name = data.Country.strip() - country = CountryOrganizationalCapacity.objects.filter( - country__name__icontains=country_name - ).first() + country = CountryOrganizationalCapacity.objects.filter(country__name__icontains=country_name).first() if country: for excel_field, model_field in field_mapping.items(): @@ -29,11 +27,10 @@ def update_or_create_capacity(self, sheet_name, field_mapping, filename): else: country_id = Country.objects.filter(name__icontains=country_name).first() if country_id: - fields_to_create = {model_field: data._asdict()[excel_field] for excel_field, model_field in field_mapping.items()} - CountryOrganizationalCapacity.objects.create( - country=country_id, - **fields_to_create - ) + fields_to_create = { + model_field: data._asdict()[excel_field] for excel_field, model_field in field_mapping.items() + } + CountryOrganizationalCapacity.objects.create(country=country_id, **fields_to_create) def handle(self, *args, **options): leadership_mapping = {"LD_CAP": "leadership_capacity"} @@ -45,4 +42,3 @@ def handle(self, *args, **options): self.update_or_create_capacity("Youth_CAP", youth_mapping, options["filename"][0]) self.update_or_create_capacity("FD_CAP", fd_mapping, options["filename"][0]) self.update_or_create_capacity("Volunteer_CAP", volunteer_mapping, options["filename"][0]) - diff --git a/api/management/commands/index_and_notify.py b/api/management/commands/index_and_notify.py index ba7c20d71..ee4af2583 100644 --- a/api/management/commands/index_and_notify.py +++ b/api/management/commands/index_and_notify.py @@ -1,24 +1,33 @@ import html -from datetime import datetime, timezone, timedelta -from main.sentry import SentryMonitor -from sentry_sdk.crons import monitor -from django.db.models import Q, F, ExpressionWrapper, DurationField, Sum -from django.db.models.query import QuerySet -from django.core.management.base import BaseCommand -from django.contrib.auth.models import User +from datetime import datetime, timedelta, timezone + from django.conf import settings +from django.contrib.auth.models import User +from django.core.management.base import BaseCommand +from django.db.models import DurationField, ExpressionWrapper, F, Q, Sum +from django.db.models.query import QuerySet from django.template.loader import render_to_string from django.utils.html import strip_tags - from elasticsearch.helpers import bulk -from utils.elasticsearch import construct_es_data +from sentry_sdk.crons import monitor + from api.esconnection import ES_CLIENT -from api.models import Country, Appeal, Event, FieldReport, ActionsTaken, CronJob, CronJobStatus from api.logger import logger -from notifications.models import RecordType, SubscriptionType, Subscription, SurgeAlert +from api.models import ( + ActionsTaken, + Appeal, + Country, + CronJob, + CronJobStatus, + Event, + FieldReport, +) +from deployments.models import ERU, Personnel, PersonnelDeployment +from main.sentry import SentryMonitor from notifications.hello import get_hello +from notifications.models import RecordType, Subscription, SubscriptionType, SurgeAlert from notifications.notification import send_notification -from deployments.models import PersonnelDeployment, ERU, Personnel +from utils.elasticsearch import construct_es_data time_5_minutes = timedelta(minutes=5) time_1_day = timedelta(days=1) @@ -57,6 +66,7 @@ 14: "General Announcement", } + @monitor(monitor_slug=SentryMonitor.INDEX_AND_NOTIFY) class Command(BaseCommand): help = "Index and send notifications about new/changed records" @@ -288,15 +298,11 @@ def get_weekly_digest_data(self, field): percent = float(round(amount_fund / amount_req, 3) * 100) if amount_req != 0 else 0 return percent elif field == "budget": - amount = ( - Appeal.objects.filter(end_date__gt=today).aggregate(Sum("amount_requested"))["amount_requested__sum"] or 0 - ) + amount = Appeal.objects.filter(end_date__gt=today).aggregate(Sum("amount_requested"))["amount_requested__sum"] or 0 rounded_amount = round(amount / 1000000, 2) return rounded_amount elif field == "pop": - people = ( - Appeal.objects.filter(end_date__gt=today).aggregate(Sum("num_beneficiaries"))["num_beneficiaries__sum"] or 0 - ) + people = Appeal.objects.filter(end_date__gt=today).aggregate(Sum("num_beneficiaries"))["num_beneficiaries__sum"] or 0 rounded_people = round(people / 1000000, 2) return rounded_people @@ -343,11 +349,7 @@ def get_weekly_digest_latest_deployments(self): personnel_list = Personnel.objects.filter(start_date__gte=dig_time).order_by("start_date") for pers in personnel_list: deployment = PersonnelDeployment.objects.get(id=pers.deployment_id) - event = ( - Event.objects.get(id=deployment.event_deployed_to_id) - if deployment.event_deployed_to_id is not None - else None - ) + event = Event.objects.get(id=deployment.event_deployed_to_id) if deployment.event_deployed_to_id is not None else None country_from = Country.objects.get(id=pers.country_from_id) if pers.country_from_id is not None else None dep_to_add = { "operation": event.name if event else "", @@ -372,9 +374,7 @@ def get_weekly_digest_highlights(self): amount_requested = ( Appeal.objects.filter(event_id=ev.id).aggregate(Sum("amount_requested"))["amount_requested__sum"] or "--" ) - amount_funded = ( - Appeal.objects.filter(event_id=ev.id).aggregate(Sum("amount_funded"))["amount_funded__sum"] or "--" - ) + amount_funded = Appeal.objects.filter(event_id=ev.id).aggregate(Sum("amount_funded"))["amount_funded__sum"] or "--" coverage = "--" if amount_funded != "--" and amount_requested != "--": @@ -385,8 +385,7 @@ def get_weekly_digest_highlights(self): "hl_name": ev.name, "hl_last_update": ev.updated_at, "hl_people": ( - Appeal.objects.filter(event_id=ev.id).aggregate(Sum("num_beneficiaries"))["num_beneficiaries__sum"] - or "--" + Appeal.objects.filter(event_id=ev.id).aggregate(Sum("num_beneficiaries"))["num_beneficiaries__sum"] or "--" ), "hl_funding": amount_requested, "hl_deployed_eru": ERU.objects.filter(event_id=ev.id).aggregate(Sum("units"))["units__sum"] or "--", @@ -456,9 +455,7 @@ def construct_template_record(self, rtype, record): shortened = self.get_record_content(record, rtype) if len(shortened) > max_length: shortened = strip_tags(shortened) - shortened = ( - shortened[:max_length] + shortened[max_length:].split(" ", 1)[0] + "..." - ) # look for the first space + shortened = shortened[:max_length] + shortened[max_length:].split(" ", 1)[0] + "..." # look for the first space if rtype == RecordType.FIELD_REPORT: rec_obj = { @@ -514,9 +511,9 @@ def construct_template_record(self, rtype, record): "dref_amount": record.dref_amount, "epi_cases_since_last_fr": record.epi_cases_since_last_fr, "epi_deaths_since_last_fr": record.epi_deaths_since_last_fr, - "epi_notes_since_last_fr": record.epi_notes_since_last_fr.split("\n") - if record.epi_notes_since_last_fr - else None, + "epi_notes_since_last_fr": ( + record.epi_notes_since_last_fr.split("\n") if record.epi_notes_since_last_fr else None + ), "eru_base_camp": record.get_eru_base_camp_display(), "eru_base_camp_units": record.eru_base_camp_units, "eru_basic_health_care": record.get_eru_basic_health_care_display(), @@ -592,9 +589,7 @@ def construct_template_record(self, rtype, record): } # If you augment these lists ^, do not forget about api/models.py - AppealType local_staff = volunteers = delegates = None - field_reports = ( - list(FieldReport.objects.filter(event_id=record.event_id)) if record.event_id is not None else None - ) + field_reports = list(FieldReport.objects.filter(event_id=record.event_id)) if record.event_id is not None else None if field_reports: local_staff = volunteers = delegates = 0 for f in field_reports: @@ -613,9 +608,7 @@ def construct_template_record(self, rtype, record): "admin_uri": self.get_admin_uri(record, rtype), "title": self.get_record_title(record, rtype), "situation_overview": ( - Event.objects.values_list("summary", flat=True).get(id=record.event_id) - if record.event_id is not None - else "" + Event.objects.values_list("summary", flat=True).get(id=record.event_id) if record.event_id is not None else "" ), "key_figures": { "people_targeted": float(record.num_beneficiaries), @@ -822,12 +815,8 @@ def notify(self, records, rtype, stype, uid=None): # record_type has its possible plural thanks to get_record_display() plural = "" if len(emails) == 1 else "s" - logger.info( - "Notifying %s subscriber%s about %s %s %s" % (len(emails), plural, record_count, adj, record_type) - ) - send_notification( - subject, ifrc_recipients, ifrc_html, RTYPE_NAMES[rtype] + " notification (ifrc) - " + subject - ) + logger.info("Notifying %s subscriber%s about %s %s %s" % (len(emails), plural, record_count, adj, record_type)) + send_notification(subject, ifrc_recipients, ifrc_html, RTYPE_NAMES[rtype] + " notification (ifrc) - " + subject) else: if record_count == 1: # On purpose after rendering – the subject changes only, not email body @@ -844,12 +833,8 @@ def notify(self, records, rtype, stype, uid=None): if email_list_to_add: events_sent_to[i] = list(filter(None, email_list_to_add)) # filter to skip empty elements - plural = ( - "" if len(emails) == 1 else "s" - ) # record_type has its possible plural thanks to get_record_display() - logger.info( - "Notifying %s subscriber%s about %s %s %s" % (len(emails), plural, record_count, adj, record_type) - ) + plural = "" if len(emails) == 1 else "s" # record_type has its possible plural thanks to get_record_display() + logger.info("Notifying %s subscriber%s about %s %s %s" % (len(emails), plural, record_count, adj, record_type)) send_notification(subject, recipients, html, RTYPE_NAMES[rtype] + " notification - " + subject) else: if len(recipients): @@ -872,8 +857,7 @@ def notify(self, records, rtype, stype, uid=None): send_notification(subject, recipients, html, RTYPE_NAMES[rtype] + " notification - " + subject) else: logger.info( - "Silent about a one-by-one subscribed %s – user already notified via generic subscription" - % (record_type) + "Silent about a one-by-one subscribed %s – user already notified via generic subscription" % (record_type) ) def index_records(self, records, to_create=True): @@ -988,9 +972,7 @@ def handle(self, *args, **options): # Followed Events if self.is_daily_checkup_time(): condU = Q(updated_at__gte=time_diff_1_day) - cond2 = Q( - previous_update__gte=time_diff_1_day - ) # not negated, we collect those, who had 2 changes in the last 1 day + cond2 = Q(previous_update__gte=time_diff_1_day) # not negated, we collect those, who had 2 changes in the last 1 day fe_subs = Subscription.objects.filter(event_id__isnull=False) # subscriptions of FEs subscribers = fe_subs.values_list("user_id", flat=True).distinct() diff --git a/api/management/commands/index_elasticsearch.py b/api/management/commands/index_elasticsearch.py index 6f61994b9..061e70d8b 100644 --- a/api/management/commands/index_elasticsearch.py +++ b/api/management/commands/index_elasticsearch.py @@ -1,14 +1,13 @@ from django.core.management.base import BaseCommand - +from elasticsearch import Elasticsearch from elasticsearch.client import IndicesClient from elasticsearch.helpers import bulk -from elasticsearch import Elasticsearch -from utils.elasticsearch import construct_es_data from api.esconnection import ES_CLIENT -from api.indexes import GenericMapping, GenericSetting, ES_PAGE_NAME -from api.models import Region, Country, Event, Appeal, FieldReport +from api.indexes import ES_PAGE_NAME, GenericMapping, GenericSetting from api.logger import logger +from api.models import Appeal, Country, Event, FieldReport, Region +from utils.elasticsearch import construct_es_data class Command(BaseCommand): diff --git a/api/management/commands/ingest_admin1_population.py b/api/management/commands/ingest_admin1_population.py index 2831550e3..7e1e53015 100644 --- a/api/management/commands/ingest_admin1_population.py +++ b/api/management/commands/ingest_admin1_population.py @@ -1,9 +1,8 @@ import pandas as pd - from django.core.management.base import BaseCommand -from api.models import Country, District from api.logger import logger +from api.models import Country, District class Command(BaseCommand): @@ -15,14 +14,14 @@ def add_arguments(self, parser): def handle(self, *args, **kwargs): logger.info("Updating population data for District") filename = kwargs["filename"][0] - district_df = pd.read_excel(filename, usecols=['GO Names', 'ISO3', '2016']) - district_df = district_df.rename(columns={'GO Names': 'District'}) + district_df = pd.read_excel(filename, usecols=["GO Names", "ISO3", "2016"]) + district_df = district_df.rename(columns={"GO Names": "District"}) count = 0 for index, row in district_df.iterrows(): - district = District.objects.filter(name=row['District'].strip(), country__iso3=row['ISO3']).first() + district = District.objects.filter(name=row["District"].strip(), country__iso3=row["ISO3"]).first() if district: count += 1 - district.wb_population = row['2016'] - district.wb_year = '2016' # Get this from excel file - district.save(update_fields=['wb_population', 'wb_year']) - logger.info(f'Updated population data for {count} district') + district.wb_population = row["2016"] + district.wb_year = "2016" # Get this from excel file + district.save(update_fields=["wb_population", "wb_year"]) + logger.info(f"Updated population data for {count} district") diff --git a/api/management/commands/ingest_appeal_docs.py b/api/management/commands/ingest_appeal_docs.py index 84537bc2f..1fcb97c37 100644 --- a/api/management/commands/ingest_appeal_docs.py +++ b/api/management/commands/ingest_appeal_docs.py @@ -1,13 +1,15 @@ +from collections import defaultdict from datetime import datetime, timezone -from dateutil.relativedelta import relativedelta -from urllib3 import PoolManager + +import brotli from bs4 import BeautifulSoup -from django.core.management.base import BaseCommand +from dateutil.relativedelta import relativedelta from django.core.exceptions import ObjectDoesNotExist -from api.models import Appeal, AppealDocument, CronJob, CronJobStatus +from django.core.management.base import BaseCommand +from urllib3 import PoolManager + from api.logger import logger -from collections import defaultdict -import brotli +from api.models import Appeal, AppealDocument, CronJob, CronJobStatus class Command(BaseCommand): @@ -52,11 +54,15 @@ def handle(self, *args, **options): # v smoke test baseurl = "https://www.ifrc.org/appeals/" # no more ...en/publications-and-reports... - http = ( - PoolManager() - ) # stackoverflow.com/questions/36516183/what-should-i-use-to-open-a-url-instead-of-urlopen-in-urllib3 - smoke_response = http.request("GET", baseurl, - headers={'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8'}) + http = PoolManager() # stackoverflow.com/questions/36516183/what-should-i-use-to-open-a-url-instead-of-urlopen-in-urllib3 + smoke_response = http.request( + "GET", + baseurl, + headers={ + "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", + }, + ) joy_to_the_world = False if smoke_response.status == 200: joy_to_the_world = True # We log the success later, when we know the numeric results. @@ -94,8 +100,14 @@ def handle(self, *args, **options): docs_url = f"{baseurl}?appeal_code={code}" # no more ac={code}&at=0&c=&co=&dt=1&f=&re=&t=&ti=&zo= try: http = PoolManager() - response = http.request("GET", docs_url, - headers={'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8'}) + response = http.request( + "GET", + docs_url, + headers={ + "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", + }, + ) except Exception: # if we get an error fetching page for an appeal, we ignore it page_not_found.append(code) continue diff --git a/api/management/commands/ingest_appealdocs.py b/api/management/commands/ingest_appealdocs.py index a932bf64d..70bb43224 100644 --- a/api/management/commands/ingest_appealdocs.py +++ b/api/management/commands/ingest_appealdocs.py @@ -1,12 +1,16 @@ -import requests from datetime import datetime, timezone + +import requests from django.conf import settings from django.core.management.base import BaseCommand -from api.models import AppealDocumentType, AppealDocument, Appeal + from api.logger import logger +from api.models import Appeal, AppealDocument, AppealDocumentType CRON_NAME = "ingest_appealdocs" -APPEAL_DOCUMENT_TYPES = AppealDocumentType.objects.all() # used only for read in appealdocument locations from api. You can check them via go-api.ifrc.org/Api/PublicSiteTypes +APPEAL_DOCUMENT_TYPES = ( + AppealDocumentType.objects.all() +) # used only for read in appealdocument locations from api. You can check them via go-api.ifrc.org/Api/PublicSiteTypes PUBLIC_SOURCE = "https://go-api.ifrc.org/api/publicsiteappeals?Hidden=false&AppealsTypeID=" FEDNET_SOURCE = "https://go-api.ifrc.org/Api/FedNetAppeals?Hidden=false&AppealsTypeId=" diff --git a/api/management/commands/ingest_appeals.py b/api/management/commands/ingest_appeals.py index 1ea5cfd58..aeea03bb9 100644 --- a/api/management/commands/ingest_appeals.py +++ b/api/management/commands/ingest_appeals.py @@ -1,25 +1,38 @@ -import os import json -from sentry_sdk.crons import monitor -from requests import Session, exceptions as reqexc -from requests.adapters import HTTPAdapter -from datetime import datetime, timezone, timedelta +import os +from datetime import datetime, timedelta, timezone + from django.conf import settings from django.core.management.base import BaseCommand from django.utils import timezone as tz -from api.models import AppealType, Appeal, AppealFilter, Region, Country, DisasterType, Event, CronJobStatus, GECCode +from requests import Session +from requests import exceptions as reqexc +from requests.adapters import HTTPAdapter +from sentry_sdk.crons import monitor + +from api.create_cron import create_cron_record from api.fixtures.dtype_map import DISASTER_TYPE_MAPPING from api.logger import logger -from api.create_cron import create_cron_record +from api.models import ( + Appeal, + AppealFilter, + AppealType, + Country, + CronJobStatus, + DisasterType, + Event, + GECCode, + Region, +) from main.sentry import SentryMonitor - CRON_NAME = "ingest_appeals" # DANGER! It should be changed when disaster type changes in database: DTYPE_KEYS = [a.lower() for a in DISASTER_TYPE_MAPPING.keys()] DTYPE_VALS = [a.lower() for a in DISASTER_TYPE_MAPPING.values()] GEC_CODES = GECCode.objects.select_related("country").all() + @monitor(monitor_slug=SentryMonitor.INGEST_APPEALS) class Command(BaseCommand): help = "Add new entries from Access database file" @@ -50,9 +63,7 @@ def get_new_or_modified_appeals(self): codes = Appeal.objects.values_list("code", flat=True) if AppealFilter.objects.values_list("value", flat=True).filter(name="ingestAppealFilter").count() > 0: - codes_skip = ( - AppealFilter.objects.values_list("value", flat=True).filter(name="ingestAppealFilter")[0].split(",") - ) + codes_skip = AppealFilter.objects.values_list("value", flat=True).filter(name="ingestAppealFilter")[0].split(",") else: codes_skip = [] @@ -142,9 +153,7 @@ def get_new_or_modified_appeals(self): codes = Appeal.objects.values_list("code", flat=True) if AppealFilter.objects.values_list("value", flat=True).filter(name="ingestAppealFilter").count() > 0: - codes_skip = ( - AppealFilter.objects.values_list("value", flat=True).filter(name="ingestAppealFilter")[0].split(",") - ) + codes_skip = AppealFilter.objects.values_list("value", flat=True).filter(name="ingestAppealFilter")[0].split(",") else: codes_skip = [] diff --git a/api/management/commands/ingest_deployments.py b/api/management/commands/ingest_deployments.py index c0ceccedb..44dc07e1c 100644 --- a/api/management/commands/ingest_deployments.py +++ b/api/management/commands/ingest_deployments.py @@ -1,10 +1,12 @@ -import requests from datetime import datetime, timezone -from django.core.management.base import BaseCommand + +import requests from django.core.exceptions import ObjectDoesNotExist -from api.models import Appeal, AppealDocument -from deployments.models import ERU, PersonnelDeployment, Personnel, DeployedPerson +from django.core.management.base import BaseCommand + from api.logger import logger +from api.models import Appeal, AppealDocument +from deployments.models import ERU, DeployedPerson, Personnel, PersonnelDeployment class Command(BaseCommand): diff --git a/api/management/commands/ingest_disaster_law.py b/api/management/commands/ingest_disaster_law.py index 50414a2b4..c45fbb98c 100644 --- a/api/management/commands/ingest_disaster_law.py +++ b/api/management/commands/ingest_disaster_law.py @@ -1,87 +1,62 @@ -import requests import datetime as dt -import xmltodict -import pandas as pd -from dateutil.parser import parse -from bs4 import BeautifulSoup import json +import pandas as pd +import requests +import xmltodict +from bs4 import BeautifulSoup +from dateutil.parser import parse from django.core.management.base import BaseCommand -from api.models import ( - Country, - CronJob, - CronJobStatus, - CountryICRCPresence -) from api.logger import logger +from api.models import Country, CountryICRCPresence, CronJob, CronJobStatus class Command(BaseCommand): - help = 'Add ICRC data' + help = "Add ICRC data" def handle(self, *args, **kwargs): logger.info("Starting Disaster Law data") home_url = "https://disasterlaw.ifrc.org/" - region_names = [ - "africa", - "americas", - "asia-and-pacific", - "middle-east-north-africa", - "europe-central-asia" - ] + region_names = ["africa", "americas", "asia-and-pacific", "middle-east-north-africa", "europe-central-asia"] country_list = [] for region in region_names: - response = requests.get(f'{home_url}{region}') - soup = BeautifulSoup(response.content, 'html.parser') + response = requests.get(f"{home_url}{region}") + soup = BeautifulSoup(response.content, "html.parser") try: - country_options = soup.find("select", {"data-drupal-selector": "edit-country"})\ - .find_all("option") + country_options = soup.find("select", {"data-drupal-selector": "edit-country"}).find_all("option") except Exception as err: continue # Loop through countries and get information - duplicated_countries = (('Republic of the Congo', '921'),) + duplicated_countries = (("Republic of the Congo", "921"),) for option in country_options[1:]: country_name = option.text country_id = option["value"] if (country_name.strip(), str(country_id)) in duplicated_countries: continue - country_url = f'https://disasterlaw.ifrc.org/node/{country_id}' + country_url = f"https://disasterlaw.ifrc.org/node/{country_id}" logger.info(f"Importing for country {country_name}") # Get the description from the country page description = None try: country_page = requests.get(country_url) - country_soup = BeautifulSoup(country_page.content, 'html.parser') - description = country_soup.find("div", {"class": "field--name-field-paragraphs"})\ - .find_all("p") + country_soup = BeautifulSoup(country_page.content, "html.parser") + description = country_soup.find("div", {"class": "field--name-field-paragraphs"}).find_all("p") description = "\n".join([para.text for para in description]) except Exception as err: pass # Add all information to the country list - country_list.append( - { - "Country": country_name, - "ID": country_id, - "URL": country_url, - "Description": description - } - ) + country_list.append({"Country": country_name, "ID": country_id, "URL": country_url, "Description": description}) added = 0 for data in country_list: - country = Country.objects.filter(name__exact=data['Country']).first() + country = Country.objects.filter(name__exact=data["Country"]).first() if country: - country.disaster_law_url = data['URL'] if 'URL' in data else None - country.save(update_fields=['disaster_law_url']) + country.disaster_law_url = data["URL"] if "URL" in data else None + country.save(update_fields=["disaster_law_url"]) added += 1 text_to_log = "%s Disaster Law" % added logger.info(text_to_log) - body = { - "name": "ingest_disaster_law", - "message": text_to_log, - "num_result": added, - "status": CronJobStatus.SUCCESSFUL - } - CronJob.sync_cron(body) \ No newline at end of file + body = {"name": "ingest_disaster_law", "message": text_to_log, "num_result": added, "status": CronJobStatus.SUCCESSFUL} + CronJob.sync_cron(body) diff --git a/api/management/commands/ingest_gdacs.py b/api/management/commands/ingest_gdacs.py index a1c803254..c2a359146 100644 --- a/api/management/commands/ingest_gdacs.py +++ b/api/management/commands/ingest_gdacs.py @@ -1,11 +1,13 @@ -import requests import datetime as dt + +import requests import xmltodict from dateutil.parser import parse from django.core.management.base import BaseCommand -from api.models import Country, Event, GDACSEvent, CronJob, CronJobStatus, DisasterType + from api.event_sources import SOURCES from api.logger import logger +from api.models import Country, CronJob, CronJobStatus, DisasterType, Event, GDACSEvent class Command(BaseCommand): @@ -17,7 +19,7 @@ def get_disaster_type(self, event_type): "TC": DisasterType.objects.get(name="Cyclone"), "FL": DisasterType.objects.get(name="Flood"), "DR": DisasterType.objects.get(name="Drought"), - "WF": DisasterType.objects.get(name="Fire") + "WF": DisasterType.objects.get(name="Fire"), } return event_type_map.get(event_type) @@ -67,7 +69,7 @@ def handle(self, *args, **options): "population_value": alert[nspace + "population"]["@value"], "vulnerability": alert[nspace + "vulnerability"]["@value"], "country_text": alert.pop(nspace + "country"), - "disaster_type": self.get_disaster_type(alert.pop(nspace + "eventtype")) + "disaster_type": self.get_disaster_type(alert.pop(nspace + "eventtype")), } for key in [ diff --git a/api/management/commands/ingest_icrc.py b/api/management/commands/ingest_icrc.py index 176c265f0..96561ad1d 100644 --- a/api/management/commands/ingest_icrc.py +++ b/api/management/commands/ingest_icrc.py @@ -1,31 +1,23 @@ -import requests import datetime as dt -import xmltodict -import pandas as pd -from dateutil.parser import parse -from bs4 import BeautifulSoup import json +import pandas as pd +import requests +import xmltodict +from bs4 import BeautifulSoup +from dateutil.parser import parse from django.core.management.base import BaseCommand -from api.models import ( - Country, - CronJob, - CronJobStatus, - CountryICRCPresence -) from api.logger import logger +from api.models import Country, CountryICRCPresence, CronJob, CronJobStatus class Command(BaseCommand): - help = 'Add ICRC data' + help = "Add ICRC data" def handle(self, *args, **kwargs): logger.info("Strating ICRC data ingest") - response = requests.get( - url='https://www.icrc.org/en/where-we-work', - headers={'User-Agent': ''} - ) + response = requests.get(url="https://www.icrc.org/en/where-we-work", headers={"User-Agent": ""}) if response.status_code != 200: text_to_log = "Error querying ICRC feed at " + url logger.error(text_to_log) @@ -39,11 +31,10 @@ def handle(self, *args, **kwargs): raise Exception("Error querying ICRC") response.raise_for_status() - soup = BeautifulSoup(response.content, 'html.parser') + soup = BeautifulSoup(response.content, "html.parser") # Get the countries information from the "Where we work" page - regions_list = soup.find("div", {"id": "blockRegionalList"})\ - .find_all("ul", {"class": "list"}) + regions_list = soup.find("div", {"id": "blockRegionalList"}).find_all("ul", {"class": "list"}) country_list = [] for region in regions_list: for country in region.find_all("li", {"class": "item"}): @@ -56,9 +47,9 @@ def handle(self, *args, **kwargs): description = None if url: try: - country_page = requests.get(url=url, headers={'User-Agent': ''}) + country_page = requests.get(url=url, headers={"User-Agent": ""}) country_page.raise_for_status() - country_soup = BeautifulSoup(country_page.content, 'html.parser') + country_soup = BeautifulSoup(country_page.content, "html.parser") description = country_soup.find("div", {"class": "block-introduction"}).find_all()[2].text.strip() except Exception as err: pass @@ -69,29 +60,24 @@ def handle(self, *args, **kwargs): "ICRC presence": presence, "URL": url, "Key operation": key_operation, - "Description": description + "Description": description, } ) added = 0 for data in country_list: - country = Country.objects.filter(name__exact=data['Country']) + country = Country.objects.filter(name__exact=data["Country"]) if country.exists(): dict_data = { "country": country.first(), - "icrc_presence": data['ICRC presence'], + "icrc_presence": data["ICRC presence"], "url": data["URL"], - "key_operation": data['Key operation'], - "description": data["Description"] + "key_operation": data["Key operation"], + "description": data["Description"], } added += 1 CountryICRCPresence.objects.create(**dict_data) text_to_log = "%s ICRC added" % added logger.info(text_to_log) - body = { - "name": "ingest_icrc", - "message": text_to_log, - "num_result": added, - "status": CronJobStatus.SUCCESSFUL - } - CronJob.sync_cron(body) \ No newline at end of file + body = {"name": "ingest_icrc", "message": text_to_log, "num_result": added, "status": CronJobStatus.SUCCESSFUL} + CronJob.sync_cron(body) diff --git a/api/management/commands/ingest_mdb.py b/api/management/commands/ingest_mdb.py index 59b2ffd72..c153ef882 100644 --- a/api/management/commands/ingest_mdb.py +++ b/api/management/commands/ingest_mdb.py @@ -1,32 +1,32 @@ -import os import csv +import os import subprocess -import pytz from datetime import datetime, timedelta -from glob import glob from ftplib import FTP +from glob import glob from zipfile import ZipFile -from django.utils import timezone -from django.core.management.base import BaseCommand +import pytz +from django.conf import settings from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist -from django.conf import settings +from django.core.management.base import BaseCommand +from django.utils import timezone +from api.event_sources import SOURCES +from api.fixtures.dtype_map import PK_MAP +from api.logger import logger from api.models import ( - DisasterType, - Country, - FieldReport, Action, ActionsTaken, + Country, + DisasterType, + Event, + FieldReport, FieldReportContact, - SourceType, Source, - Event, + SourceType, ) -from api.fixtures.dtype_map import PK_MAP -from api.event_sources import SOURCES -from api.logger import logger REPORT_DATE_FORMAT = "%m/%d/%y %H:%M:%S" diff --git a/api/management/commands/ingest_ns_capacity.py b/api/management/commands/ingest_ns_capacity.py index ad5061a45..aaaca8379 100644 --- a/api/management/commands/ingest_ns_capacity.py +++ b/api/management/commands/ingest_ns_capacity.py @@ -1,25 +1,20 @@ -import requests -from requests.auth import HTTPBasicAuth -import xmltodict import json -from django.core.management.base import BaseCommand +import requests +import xmltodict from django.conf import settings +from django.core.management.base import BaseCommand +from requests.auth import HTTPBasicAuth from api.logger import logger -from api.models import ( - Country, - CronJob, - CronJobStatus, - CountryCapacityStrengthening -) +from api.models import Country, CountryCapacityStrengthening, CronJob, CronJobStatus class Command(BaseCommand): help = "Add ns contact details" def handle(self, *args, **kwargs): - logger.info('Starting NS Contacts') + logger.info("Starting NS Contacts") # OCAC Assessment OCAC_DATA_API = f"https://data-api.ifrc.org/api/ocacpublic?apiKey={settings.FDRS_APIKEY}" @@ -42,12 +37,12 @@ def handle(self, *args, **kwargs): for item in resp_ocac_data: ocaa_count += 1 data = { - 'assessment_code': item['AssementCode'], - 'year': item['YearOfAssesment'], - 'submission_date': item['SubmissionDate'], - 'url': item['URL'], - 'country': Country.objects.filter(fdrs=item['NsId']).first(), - 'assessment_type': CountryCapacityStrengthening.AssessmentType.OCAC + "assessment_code": item["AssementCode"], + "year": item["YearOfAssesment"], + "submission_date": item["SubmissionDate"], + "url": item["URL"], + "country": Country.objects.filter(fdrs=item["NsId"]).first(), + "assessment_type": CountryCapacityStrengthening.AssessmentType.OCAC, } CountryCapacityStrengthening.objects.create(**data) @@ -57,7 +52,7 @@ def handle(self, *args, **kwargs): "name": "ingest_ns_capaciity", "message": text_to_log, "num_result": ocaa_count, - "status": CronJobStatus.SUCCESSFUL + "status": CronJobStatus.SUCCESSFUL, } CronJob.sync_cron(body) @@ -66,15 +61,15 @@ def handle(self, *args, **kwargs): resp_boca = requests.get(BOCA_DATA_API) resp_boca_data = resp_boca.json() for item in resp_boca_data: - country = Country.objects.filter(fdrs=item['NsId']).first() - if country and 'BranchName' in item: + country = Country.objects.filter(fdrs=item["NsId"]).first() + if country and "BranchName" in item: data = { - 'assessment_code': item['AssementCode'], - 'year': item['YearOfAssesment'], - 'submission_date': item['SubmissionDate'], - 'url': item['URL'], - 'country': Country.objects.filter(fdrs=item['NsId']).first(), - 'assessment_type': CountryCapacityStrengthening.AssessmentType.BOCA, - 'branch_name': item['BranchName'] + "assessment_code": item["AssementCode"], + "year": item["YearOfAssesment"], + "submission_date": item["SubmissionDate"], + "url": item["URL"], + "country": Country.objects.filter(fdrs=item["NsId"]).first(), + "assessment_type": CountryCapacityStrengthening.AssessmentType.BOCA, + "branch_name": item["BranchName"], } CountryCapacityStrengthening.objects.create(**data) diff --git a/api/management/commands/ingest_ns_contact.py b/api/management/commands/ingest_ns_contact.py index 5c0016390..8b22668b3 100644 --- a/api/management/commands/ingest_ns_contact.py +++ b/api/management/commands/ingest_ns_contact.py @@ -1,30 +1,27 @@ -import requests -from requests.auth import HTTPBasicAuth -import xmltodict -from datetime import datetime import re +from datetime import datetime -from django.core.management.base import BaseCommand +import requests +import xmltodict from django.conf import settings +from django.core.management.base import BaseCommand +from requests.auth import HTTPBasicAuth + from api.logger import logger -from api.models import ( - Country, - CronJob, - CronJobStatus -) +from api.models import Country, CronJob, CronJobStatus class Command(BaseCommand): help = "Add ns contact details" def handle(self, *args, **kwargs): - logger.info('Starting NS Contacts') + logger.info("Starting NS Contacts") url = "https://go-api.ifrc.org/" - headers = {'accept': 'application/xml;q=0.9, */*;q=0.8'} + headers = {"accept": "application/xml;q=0.9, */*;q=0.8"} response = requests.get( "https://go-api.ifrc.org/api/NationalSocieties", auth=HTTPBasicAuth(settings.NS_CONTACT_USERNAME, settings.NS_CONTACT_PASSWORD), - headers=headers + headers=headers, ) if response.status_code != 200: text_to_log = "Error querying NationalSocieties xml feed at " + url @@ -40,22 +37,22 @@ def handle(self, *args, **kwargs): added = 0 dict_data = xmltodict.parse(response.content) - for data in dict_data['ArrayOfNationalSocietiesMain']['NationalSocietiesMain']: - address_1 = data['ADD_address1'] if type(data['ADD_address1']) == str else None - address_2 = data['ADD_address2'] if type(data['ADD_address2']) == str else None - city_code = data['ADD_city_code'] if type(data['ADD_city_code']) == str else None - phone = data['ADD_phone'] if type(data['ADD_phone']) == str else None - website = data['ADD_webSite'] if type(data['ADD_webSite']) == str else None - emails = data['ADD_email'] if type(data['ADD_email']) == str and data['ADD_email'] != None else None - founded_date = data['ADD_orgCreation'] if type(data['ADD_orgCreation']) == str else None - iso = data['ADD_country_code'] + for data in dict_data["ArrayOfNationalSocietiesMain"]["NationalSocietiesMain"]: + address_1 = data["ADD_address1"] if type(data["ADD_address1"]) == str else None + address_2 = data["ADD_address2"] if type(data["ADD_address2"]) == str else None + city_code = data["ADD_city_code"] if type(data["ADD_city_code"]) == str else None + phone = data["ADD_phone"] if type(data["ADD_phone"]) == str else None + website = data["ADD_webSite"] if type(data["ADD_webSite"]) == str else None + emails = data["ADD_email"] if type(data["ADD_email"]) == str and data["ADD_email"] != None else None + founded_date = data["ADD_orgCreation"] if type(data["ADD_orgCreation"]) == str else None + iso = data["ADD_country_code"] # # get the country and try to update the data for those country country = Country.objects.filter(iso=iso.upper()).first() email_splitted = None if emails: # NOTE: Split the email # eg; secretariatgeneral@creuroja.ad;secretariatadmin@@creuroja.ad - email_splitted = re.split('[,; ]+', emails) + email_splitted = re.split("[,; ]+", emails) if country: added += 1 country.address_1 = address_1 @@ -68,26 +65,16 @@ def handle(self, *args, **kwargs): try: country.founded_date = datetime.strptime(founded_date, "%d.%m.%Y").date() except ValueError: - date = founded_date.split(' ')[0] + date = founded_date.split(" ")[0] try: country.founded_date = datetime.strptime(date, "%d.%m.%Y").date() except ValueError: try: - date = founded_date.split(' ')[-1] + date = founded_date.split(" ")[-1] country.founded_date = datetime.strptime(date, "%d.%m.%Y").date() except ValueError: pass - country.save( - update_fields=[ - 'address_1', - 'address_2', - 'city_code', - 'phone', - 'website', - 'emails', - 'founded_date' - ] - ) + country.save(update_fields=["address_1", "address_2", "city_code", "phone", "website", "emails", "founded_date"]) text_to_log = "%s Ns contact added" % added logger.info(text_to_log) body = {"name": "ingest_ns_contact", "message": text_to_log, "num_result": added, "status": CronJobStatus.SUCCESSFUL} diff --git a/api/management/commands/ingest_ns_directory.py b/api/management/commands/ingest_ns_directory.py index a5bdc759b..c5d404f72 100644 --- a/api/management/commands/ingest_ns_directory.py +++ b/api/management/commands/ingest_ns_directory.py @@ -1,30 +1,26 @@ -import requests -from requests.auth import HTTPBasicAuth -import xmltodict import json -from django.core.management.base import BaseCommand +import requests +import xmltodict from django.conf import settings +from django.core.management.base import BaseCommand +from requests.auth import HTTPBasicAuth + from api.logger import logger -from api.models import ( - Country, - CountryDirectory, - CronJob, - CronJobStatus, -) +from api.models import Country, CountryDirectory, CronJob, CronJobStatus class Command(BaseCommand): help = "Add ns contact details" def handle(self, *args, **kwargs): - logger.info('Starting NS Contacts') + logger.info("Starting NS Contacts") url = "https://go-api.ifrc.org/" - headers = {'accept': 'application/xml;q=0.9, */*;q=0.8'} + headers = {"accept": "application/xml;q=0.9, */*;q=0.8"} response = requests.get( "https://go-api.ifrc.org/api/NationalSocietiesContacts/", auth=HTTPBasicAuth(settings.NS_CONTACT_USERNAME, settings.NS_CONTACT_PASSWORD), - headers=headers + headers=headers, ) if response.status_code != 200: text_to_log = "Error querying NationalSocietiesContacts xml feed at " + url @@ -40,17 +36,23 @@ def handle(self, *args, **kwargs): added = 0 dict_data = xmltodict.parse(response.content) - for data in dict_data['ArrayOfNationalSocietiesContacts']['NationalSocietiesContacts']: - country_name = data['CON_country'] if type(data['CON_country']) == str else None + for data in dict_data["ArrayOfNationalSocietiesContacts"]["NationalSocietiesContacts"]: + country_name = data["CON_country"] if type(data["CON_country"]) == str else None if country_name is not None: country = Country.objects.filter(name__icontains=country_name).first() if country: added += 1 data = { - 'first_name': data['CON_firstName'] if type(data['CON_firstName']) == str and data['CON_firstName'] != None else None, - 'last_name': data['CON_lastName'] if type(data['CON_lastName']) == str and data['CON_lastName'] != None else None, - 'position': data['CON_title'], - 'country': country, + "first_name": ( + data["CON_firstName"] + if type(data["CON_firstName"]) == str and data["CON_firstName"] != None + else None + ), + "last_name": ( + data["CON_lastName"] if type(data["CON_lastName"]) == str and data["CON_lastName"] != None else None + ), + "position": data["CON_title"], + "country": country, } CountryDirectory.objects.create(**data) text_to_log = "%s Ns Directory added" % added diff --git a/api/management/commands/ingest_ns_document.py b/api/management/commands/ingest_ns_document.py index 6c40eccb8..7a525cd8a 100644 --- a/api/management/commands/ingest_ns_document.py +++ b/api/management/commands/ingest_ns_document.py @@ -1,23 +1,30 @@ -import requests import json -import pandas as pd -import numpy as np -from django.core.management.base import BaseCommand +import numpy as np +import pandas as pd +import requests from django.conf import settings +from django.core.management.base import BaseCommand from api.logger import logger -from api.models import Country, CountryDirectory, CronJob, CronJobStatus, CountryKeyDocument +from api.models import ( + Country, + CountryDirectory, + CountryKeyDocument, + CronJob, + CronJobStatus, +) + class Command(BaseCommand): help = "Add ns documents" def handle(self, *args, **kwargs): - logger.info('Starting NS Key Documents') + logger.info("Starting NS Key Documents") # Fetch country codes country_code_url = "https://go-api.ifrc.org/api/NationalSocietiesContacts/" - headers = {'Authorization': f'Basic {settings.NS_INITIATIVES_API_TOKEN}'} + headers = {"Authorization": f"Basic {settings.NS_INITIATIVES_API_TOKEN}"} country_code_response = requests.get(url=country_code_url, headers=headers) if country_code_response.status_code != 200: @@ -52,30 +59,32 @@ def handle_error(self, response): def extract_country_data(self, data): country_list = [] for country_data in data: - country_code = [country_data['Don_Code'].strip(), country_data['CON_country']] + country_code = [country_data["Don_Code"].strip(), country_data["CON_country"]] country_list.append(country_code) - country_table = pd.DataFrame(country_list, columns=['Country Code', 'Country']).drop_duplicates(subset=['Country Code'], keep='last') - country_table = country_table.replace(to_replace='None', value=np.nan).dropna() + country_table = pd.DataFrame(country_list, columns=["Country Code", "Country"]).drop_duplicates( + subset=["Country Code"], keep="last" + ) + country_table = country_table.replace(to_replace="None", value=np.nan).dropna() return country_table def fetch_country_documents(self, api_key, country_ns_code): - url = f'https://data-api.ifrc.org/api/documents?apiKey={api_key}&ns={country_ns_code}' + url = f"https://data-api.ifrc.org/api/documents?apiKey={api_key}&ns={country_ns_code}" response = requests.get(url) data = json.loads(response.text) if not data: return None documents = [] - for item in data['documents']: + for item in data["documents"]: document_info = { - 'name': item['name'], - 'url': item['url'], - 'thumbnail': item['thumbnail'], - 'year': str(item['year']) + '-01-01', - 'end_year': str(item['EndYear']) + '-01-01' if 'EndYear' in item else None, - 'year_text': item['YearText'], - 'document_type': item['document_type'], - 'country_code': country_ns_code + "name": item["name"], + "url": item["url"], + "thumbnail": item["thumbnail"], + "year": str(item["year"]) + "-01-01", + "end_year": str(item["EndYear"]) + "-01-01" if "EndYear" in item else None, + "year_text": item["YearText"], + "document_type": item["document_type"], + "country_code": country_ns_code, } documents.append(document_info) return documents @@ -93,27 +102,22 @@ def fetch_all_country_documents(self, api_key, country_table): def save_documents_to_database(self, result): added = 0 for document in result: - country = Country.objects.filter(fdrs=document['country_code']).first() + country = Country.objects.filter(fdrs=document["country_code"]).first() if country: added += 1 data = { - 'country': country, - 'name': document['name'], - 'url': document['url'], - 'thumbnail': document['thumbnail'], - 'document_type': document['document_type'], - 'year': document['year'], - 'end_year': document['end_year'], - 'year_text': document['year_text'] + "country": country, + "name": document["name"], + "url": document["url"], + "thumbnail": document["thumbnail"], + "document_type": document["document_type"], + "year": document["year"], + "end_year": document["end_year"], + "year_text": document["year_text"], } CountryKeyDocument.objects.create(**data) return added def sync_cron_success(self, text_to_log, added): - body = { - "name": "ingest_ns_document", - "message": text_to_log, - "num_result": added, - "status": CronJobStatus.SUCCESSFUL - } + body = {"name": "ingest_ns_document", "message": text_to_log, "num_result": added, "status": CronJobStatus.SUCCESSFUL} CronJob.sync_cron(body) diff --git a/api/management/commands/ingest_ns_initiatives.py b/api/management/commands/ingest_ns_initiatives.py index a444bf674..d86212a75 100644 --- a/api/management/commands/ingest_ns_initiatives.py +++ b/api/management/commands/ingest_ns_initiatives.py @@ -1,29 +1,24 @@ -import requests import json -import pandas as pd -import numpy as np -from django.core.management.base import BaseCommand +import numpy as np +import pandas as pd +import requests from django.conf import settings +from django.core.management.base import BaseCommand from api.logger import logger -from api.models import ( - Country, - CronJob, - CronJobStatus, - NSDInitiatives, -) +from api.models import Country, CronJob, CronJobStatus, NSDInitiatives class Command(BaseCommand): help = "Add ns initiatives" def handle(self, *args, **kwargs): - logger.info('Starting NS Inititatives') + logger.info("Starting NS Inititatives") api_key = settings.NS_INITIATIVES_API_KEY - esf_url = requests.get(f'https://data-api.ifrc.org/api/esf?apikey={api_key}') - nsia_url = requests.get(f'https://data-api.ifrc.org/api/nsia?apikey={api_key}') - cbf_url = requests.get(f'https://data-api.ifrc.org/api/cbf?apikey={api_key}') + esf_url = requests.get(f"https://data-api.ifrc.org/api/esf?apikey={api_key}") + nsia_url = requests.get(f"https://data-api.ifrc.org/api/nsia?apikey={api_key}") + cbf_url = requests.get(f"https://data-api.ifrc.org/api/cbf?apikey={api_key}") # resposne for individual request esf_response = esf_url.json() @@ -32,46 +27,37 @@ def handle(self, *args, **kwargs): added = 0 - all_fund_data=[ - esf_response, - nsia_response, - cbf_response - ] + all_fund_data = [esf_response, nsia_response, cbf_response] flatList = [element for innerList in all_fund_data for element in innerList] funding_data = pd.DataFrame( flatList, columns=[ - 'NationalSociety', - 'Year', - 'Fund', - 'InitiativeTitle', - 'Categories', - 'AllocationInCHF', - 'FundingPeriodInMonths' - ] + "NationalSociety", + "Year", + "Fund", + "InitiativeTitle", + "Categories", + "AllocationInCHF", + "FundingPeriodInMonths", + ], ) funding_data = funding_data.replace({np.nan: None}) for data in funding_data.values.tolist(): # TODO: Filter not by society name - country = Country.objects.filter(society_name__iexact=data[0]).first() + country = Country.objects.filter(society_name__iexact=data[0]).first() if country: dict_data = { - 'country': country, - 'title': data[3], - 'fund_type': data[2], - 'allocation': data[5], - 'year': data[1], - 'funding_period': data[6], - 'categories': data[4], + "country": country, + "title": data[3], + "fund_type": data[2], + "allocation": data[5], + "year": data[1], + "funding_period": data[6], + "categories": data[4], } added += 1 NSDInitiatives.objects.create(**dict_data) text_to_log = "%s Ns initiatives added" % added logger.info(text_to_log) - body = { - "name": "ingest_ns_initiatives", - "message": text_to_log, - "num_result": added, - "status": CronJobStatus.SUCCESSFUL - } - CronJob.sync_cron(body) \ No newline at end of file + body = {"name": "ingest_ns_initiatives", "message": text_to_log, "num_result": added, "status": CronJobStatus.SUCCESSFUL} + CronJob.sync_cron(body) diff --git a/api/management/commands/ingest_who.py b/api/management/commands/ingest_who.py index 89c068b46..c90e2a581 100644 --- a/api/management/commands/ingest_who.py +++ b/api/management/commands/ingest_who.py @@ -1,11 +1,13 @@ -import requests import datetime as dt + +import requests import xmltodict from dateutil.parser import parse from django.core.management.base import BaseCommand -from api.models import Country, Region, Event, CronJob, CronJobStatus + from api.event_sources import SOURCES from api.logger import logger +from api.models import Country, CronJob, CronJobStatus, Event, Region class Command(BaseCommand): diff --git a/api/management/commands/make_per_missions.py b/api/management/commands/make_per_missions.py index cdaabfbbf..f00b53a49 100644 --- a/api/management/commands/make_per_missions.py +++ b/api/management/commands/make_per_missions.py @@ -1,6 +1,7 @@ -from django.core.management.base import BaseCommand from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType +from django.core.management.base import BaseCommand + from api.models import Country, Region @@ -25,9 +26,7 @@ def handle(self, *args, **options): for region in regions: codename = "per_region_admin_%s" % region.id name = "PER Admin for %s" % region.name - permission, created = Permission.objects.get_or_create( - codename=codename, name=name, content_type=region_content_type - ) + permission, created = Permission.objects.get_or_create(codename=codename, name=name, content_type=region_content_type) # If it's a new permission, create a group for it group, created = Group.objects.get_or_create(name="%s Regional PER Admins" % region.name) group.permissions.add(permission) diff --git a/api/management/commands/make_permissions.py b/api/management/commands/make_permissions.py index 08626362e..42db65c9d 100644 --- a/api/management/commands/make_permissions.py +++ b/api/management/commands/make_permissions.py @@ -1,10 +1,10 @@ from collections import defaultdict -from django.contrib.contenttypes.models import ContentType +from django.conf import settings from django.contrib.auth import get_permission_codename -from django.core.management.base import BaseCommand from django.contrib.auth.models import Group, Permission -from django.conf import settings +from django.contrib.contenttypes.models import ContentType +from django.core.management.base import BaseCommand from api.models import Country, Region from lang.models import String diff --git a/api/management/commands/map-districts.py b/api/management/commands/map-districts.py index 2a1906c0f..b6f3cc9da 100644 --- a/api/management/commands/map-districts.py +++ b/api/management/commands/map-districts.py @@ -1,8 +1,10 @@ import csv + +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.management.base import BaseCommand -from api.models import Country, District from django.db import transaction -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned + +from api.models import Country, District class Command(BaseCommand): diff --git a/api/management/commands/per_import_old_data.py b/api/management/commands/per_import_old_data.py index 63bbf2a14..f3ae842bd 100644 --- a/api/management/commands/per_import_old_data.py +++ b/api/management/commands/per_import_old_data.py @@ -1,7 +1,9 @@ import csv -from django.db import transaction + from django.core.management.base import BaseCommand -from per.models import AssessmentType, FormArea, FormComponent, FormQuestion, FormAnswer +from django.db import transaction + +from per.models import AssessmentType, FormAnswer, FormArea, FormComponent, FormQuestion class Command(BaseCommand): @@ -130,9 +132,7 @@ def handle(self, *args, **kwargs): elif question_num <= 17: comp = FormComponent.objects.filter(title__iexact="PROCUREMENT").first() elif question_num <= 28: - comp = FormComponent.objects.filter( - title__iexact="FLEET AND TRANSPORTATION MANAGEMENT" - ).first() + comp = FormComponent.objects.filter(title__iexact="FLEET AND TRANSPORTATION MANAGEMENT").first() else: comp = FormComponent.objects.filter(title__iexact="WAREHOUSE AND STOCK MANAGEMENT").first() diff --git a/api/management/commands/revoke_staff_status.py b/api/management/commands/revoke_staff_status.py index 522072ef0..b2ebb0533 100644 --- a/api/management/commands/revoke_staff_status.py +++ b/api/management/commands/revoke_staff_status.py @@ -1,12 +1,14 @@ import requests -from sentry_sdk.crons import monitor +from django.contrib.auth.models import Group, User from django.core.management.base import BaseCommand -from django.contrib.auth.models import User, Group +from sentry_sdk.crons import monitor + from api.logger import logger from main.sentry import SentryMonitor # from registrations.views import is_valid_domain + @monitor(monitor_slug=SentryMonitor.REVOKE_STAFF_STATUS) class Command(BaseCommand): help = 'Update staff status in auth_user table according to "Read only" group' diff --git a/api/management/commands/run_celery_dev.py b/api/management/commands/run_celery_dev.py index 32b690b14..a65a04a51 100644 --- a/api/management/commands/run_celery_dev.py +++ b/api/management/commands/run_celery_dev.py @@ -6,7 +6,6 @@ from main.celery import Queues - all_queues = ",".join([q for q in Queues.DEV_QUEUES]) CMD = f"celery -A main worker -Q {all_queues} --concurrency=2 -l info" diff --git a/api/management/commands/run_celery_prod.py b/api/management/commands/run_celery_prod.py index 4609e8b82..c8f38ed5e 100644 --- a/api/management/commands/run_celery_prod.py +++ b/api/management/commands/run_celery_prod.py @@ -1,13 +1,12 @@ -import typing +import argparse import shlex import subprocess -import argparse +import typing from django.core.management.base import BaseCommand from main.celery import Queues - all_queues = ",".join([q for q in Queues.DEV_QUEUES]) @@ -26,21 +25,21 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument( - '--queues', + "--queues", type=str, default=all_queues, - help=f'Name of the queues seperated by comma: Default is {all_queues}', + help=f"Name of the queues seperated by comma: Default is {all_queues}", ) parser.add_argument( - '--celery-args', - help='All the argument after this are passed to celery', + "--celery-args", + help="All the argument after this are passed to celery", nargs=argparse.REMAINDER, default=None, ) def handle(self, *_, **options): - queues = options['queues'] - celery_args = options['celery_args'] + queues = options["queues"] + celery_args = options["celery_args"] cmd = get_celery_cmd(queues, celery_args) self.stdout.write(f"Starting celery worker... {cmd}") subprocess.call(shlex.split(cmd)) diff --git a/api/management/commands/scrape_pdfs.py b/api/management/commands/scrape_pdfs.py index 7c11bd74e..21da3b850 100644 --- a/api/management/commands/scrape_pdfs.py +++ b/api/management/commands/scrape_pdfs.py @@ -1,30 +1,30 @@ # Officially a work of Navin (toggle-corp/ifrc), modified some parts for Django Admin usage import re +from io import BytesIO + +import requests import urllib3 import xmltodict -import requests -import api.scrapers.cleaners as cleaners -from io import BytesIO from bs4 import BeautifulSoup as bsoup +from django.core.management.base import BaseCommand from pdfminer.converter import HTMLConverter -from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.layout import LAParams +from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager from pdfminer.pdfpage import PDFPage from tidylib import tidy_document +import api.scrapers.cleaners as cleaners +from api.logger import logger from api.models import ( + CronJob, + CronJobStatus, EmergencyOperationsDataset, - EmergencyOperationsPeopleReached, EmergencyOperationsEA, EmergencyOperationsFR, - CronJob, - CronJobStatus, + EmergencyOperationsPeopleReached, ) -from api.logger import logger -from django.core.management.base import BaseCommand -from api.scrapers.extractor import MetaFieldExtractor, SectorFieldExtractor from api.scrapers.config import _mfd, _s, _sfd - +from api.scrapers.extractor import MetaFieldExtractor, SectorFieldExtractor SECTORS = [ _s.health, @@ -222,9 +222,7 @@ def clean_data_and_save(self, scraped_data): raw_livelihoods_and_basic_needs_female=data["sector"] .get(_s.livelihoods_and_basic_needs, {}) .get(_sfd.female), - raw_livelihoods_and_basic_needs_male=data["sector"] - .get(_s.livelihoods_and_basic_needs, {}) - .get(_sfd.male), + raw_livelihoods_and_basic_needs_male=data["sector"].get(_s.livelihoods_and_basic_needs, {}).get(_sfd.male), raw_livelihoods_and_basic_needs_people_reached=data["sector"] .get(_s.livelihoods_and_basic_needs, {}) .get(_sfd.people_reached), @@ -259,9 +257,7 @@ def clean_data_and_save(self, scraped_data): raw_shelter_people_reached=data["sector"].get(_s.shelter, {}).get(_sfd.people_reached), raw_shelter_people_targeted=data["sector"].get(_s.shelter, {}).get(_sfd.people_targeted), raw_shelter_requirements=data["sector"].get(_s.shelter, {}).get(_sfd.requirements), - raw_water_sanitation_and_hygiene_female=data["sector"] - .get(_s.Water_sanitation_hygiene, {}) - .get(_sfd.female), + raw_water_sanitation_and_hygiene_female=data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.female), raw_water_sanitation_and_hygiene_male=data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.male), raw_water_sanitation_and_hygiene_people_reached=data["sector"] .get(_s.Water_sanitation_hygiene, {}) @@ -281,9 +277,9 @@ def clean_data_and_save(self, scraped_data): file_name=data["filename"][:200] if data["filename"] else None, appeal_launch_date=cleaners.clean_date(data["meta"].get(_mfd.appeal_launch_date)), appeal_number=cleaners.clean_appeal_code(data["meta"].get(_mfd.appeal_number)), - category_allocated=data["meta"].get(_mfd.category_allocated)[:100] - if data["meta"].get(_mfd.category_allocated) - else None, + category_allocated=( + data["meta"].get(_mfd.category_allocated)[:100] if data["meta"].get(_mfd.category_allocated) else None + ), date_of_issue=cleaners.clean_date(data["meta"].get(_mfd.date_of_issue)), dref_allocated=cleaners.clean_number(data["meta"].get(_mfd.dref_allocated)), expected_end_date=cleaners.clean_date(data["meta"].get(_mfd.expected_end_date)), @@ -309,9 +305,7 @@ def clean_data_and_save(self, scraped_data): health_female=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.female)), health_male=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.male)), health_people_reached=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.people_reached)), - health_people_targeted=cleaners.clean_number( - data["sector"].get(_s.health, {}).get(_sfd.people_targeted) - ), + health_people_targeted=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.people_targeted)), health_requirements=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.requirements)), livelihoods_and_basic_needs_female=cleaners.clean_number( data["sector"].get(_s.livelihoods_and_basic_needs, {}).get(_sfd.female) @@ -330,15 +324,11 @@ def clean_data_and_save(self, scraped_data): ), migration_female=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.female)), migration_male=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.male)), - migration_people_reached=cleaners.clean_number( - data["sector"].get(_s.migration, {}).get(_sfd.people_reached) - ), + migration_people_reached=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.people_reached)), migration_people_targeted=cleaners.clean_number( data["sector"].get(_s.migration, {}).get(_sfd.people_targeted) ), - migration_requirements=cleaners.clean_number( - data["sector"].get(_s.migration, {}).get(_sfd.requirements) - ), + migration_requirements=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.requirements)), protection_gender_and_inclusion_female=cleaners.clean_number( data["sector"].get(_s.protection_gender_inclusion, {}).get(_sfd.female) ), @@ -356,12 +346,8 @@ def clean_data_and_save(self, scraped_data): ), shelter_female=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.female)), shelter_male=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.male)), - shelter_people_reached=cleaners.clean_number( - data["sector"].get(_s.shelter, {}).get(_sfd.people_reached) - ), - shelter_people_targeted=cleaners.clean_number( - data["sector"].get(_s.shelter, {}).get(_sfd.people_targeted) - ), + shelter_people_reached=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.people_reached)), + shelter_people_targeted=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.people_targeted)), shelter_requirements=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.requirements)), water_sanitation_and_hygiene_female=cleaners.clean_number( data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.female) @@ -380,9 +366,7 @@ def clean_data_and_save(self, scraped_data): ), education_female=cleaners.clean_number(data["sector"].get("education", {}).get(_sfd.female)), education_male=cleaners.clean_number(data["sector"].get("education", {}).get(_sfd.male)), - education_people_reached=cleaners.clean_number( - data["sector"].get("education", {}).get(_sfd.people_reached) - ), + education_people_reached=cleaners.clean_number(data["sector"].get("education", {}).get(_sfd.people_reached)), education_people_targeted=cleaners.clean_number( data["sector"].get("education", {}).get(_sfd.people_targeted) ), @@ -415,9 +399,7 @@ def clean_data_and_save(self, scraped_data): raw_livelihoods_and_basic_needs_female=data["sector"] .get(_s.livelihoods_and_basic_needs, {}) .get(_sfd.female), - raw_livelihoods_and_basic_needs_male=data["sector"] - .get(_s.livelihoods_and_basic_needs, {}) - .get(_sfd.male), + raw_livelihoods_and_basic_needs_male=data["sector"].get(_s.livelihoods_and_basic_needs, {}).get(_sfd.male), raw_livelihoods_and_basic_needs_people_reached=data["sector"] .get(_s.livelihoods_and_basic_needs, {}) .get(_sfd.people_reached), @@ -444,9 +426,7 @@ def clean_data_and_save(self, scraped_data): raw_shelter_male=data["sector"].get(_s.shelter, {}).get(_sfd.male), raw_shelter_people_reached=data["sector"].get(_s.shelter, {}).get(_sfd.people_reached), raw_shelter_requirements=data["sector"].get(_s.shelter, {}).get(_sfd.requirements), - raw_water_sanitation_and_hygiene_female=data["sector"] - .get(_s.Water_sanitation_hygiene, {}) - .get(_sfd.female), + raw_water_sanitation_and_hygiene_female=data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.female), raw_water_sanitation_and_hygiene_male=data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.male), raw_water_sanitation_and_hygiene_people_reached=data["sector"] .get(_s.Water_sanitation_hygiene, {}) @@ -461,12 +441,14 @@ def clean_data_and_save(self, scraped_data): epoa_update_num=cleaners.clean_number(data["meta"].get(_mfd.epoa_update_num)), glide_number=data["meta"].get(_mfd.glide_number)[:18] if data["meta"].get(_mfd.glide_number) else None, operation_start_date=cleaners.clean_date(data["meta"].get(_mfd.operation_start_date)), - operation_timeframe=data["meta"].get(_mfd.operation_timeframe)[:200] - if data["meta"].get(_mfd.operation_timeframe) - else None, - time_frame_covered_by_update=data["meta"].get(_mfd.time_frame_covered_by_update)[:200] - if data["meta"].get(_mfd.time_frame_covered_by_update) - else None, + operation_timeframe=( + data["meta"].get(_mfd.operation_timeframe)[:200] if data["meta"].get(_mfd.operation_timeframe) else None + ), + time_frame_covered_by_update=( + data["meta"].get(_mfd.time_frame_covered_by_update)[:200] + if data["meta"].get(_mfd.time_frame_covered_by_update) + else None + ), disaster_risk_reduction_female=cleaners.clean_number( data["sector"].get(_s.disaster_Risk_reduction, {}).get(_sfd.female) ), @@ -497,12 +479,8 @@ def clean_data_and_save(self, scraped_data): ), migration_female=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.female)), migration_male=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.male)), - migration_people_reached=cleaners.clean_number( - data["sector"].get(_s.migration, {}).get(_sfd.people_reached) - ), - migration_requirements=cleaners.clean_number( - data["sector"].get(_s.migration, {}).get(_sfd.requirements) - ), + migration_people_reached=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.people_reached)), + migration_requirements=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.requirements)), protection_gender_and_inclusion_female=cleaners.clean_number( data["sector"].get(_s.protection_gender_inclusion, {}).get(_sfd.female) ), @@ -517,9 +495,7 @@ def clean_data_and_save(self, scraped_data): ), shelter_female=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.female)), shelter_male=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.male)), - shelter_people_reached=cleaners.clean_number( - data["sector"].get(_s.shelter, {}).get(_sfd.people_reached) - ), + shelter_people_reached=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.people_reached)), shelter_requirements=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.requirements)), water_sanitation_and_hygiene_female=cleaners.clean_number( data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.female) @@ -566,9 +542,7 @@ def clean_data_and_save(self, scraped_data): raw_livelihoods_and_basic_needs_female=data["sector"] .get(_s.livelihoods_and_basic_needs, {}) .get(_sfd.female), - raw_livelihoods_and_basic_needs_male=data["sector"] - .get(_s.livelihoods_and_basic_needs, {}) - .get(_sfd.male), + raw_livelihoods_and_basic_needs_male=data["sector"].get(_s.livelihoods_and_basic_needs, {}).get(_sfd.male), raw_livelihoods_and_basic_needs_people_reached=data["sector"] .get(_s.livelihoods_and_basic_needs, {}) .get(_sfd.people_reached), @@ -599,9 +573,7 @@ def clean_data_and_save(self, scraped_data): raw_shelter_people_reached=data["sector"].get(_s.shelter, {}).get(_sfd.people_reached), # raw_shelter_people_targeted=data['sector'].get(_s.shelter, {}).get(_sfd.people_targeted), raw_shelter_requirements=data["sector"].get(_s.shelter, {}).get(_sfd.requirements), - raw_water_sanitation_and_hygiene_female=data["sector"] - .get(_s.Water_sanitation_hygiene, {}) - .get(_sfd.female), + raw_water_sanitation_and_hygiene_female=data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.female), raw_water_sanitation_and_hygiene_male=data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.male), raw_water_sanitation_and_hygiene_people_reached=data["sector"] .get(_s.Water_sanitation_hygiene, {}) @@ -655,13 +627,9 @@ def clean_data_and_save(self, scraped_data): ), migration_female=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.female)), migration_male=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.male)), - migration_people_reached=cleaners.clean_number( - data["sector"].get(_s.migration, {}).get(_sfd.people_reached) - ), + migration_people_reached=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.people_reached)), # migration_people_targeted=cleaners.clean_number(data['sector'].get(_s.migration, {}).get(_sfd.people_targeted)), - migration_requirements=cleaners.clean_number( - data["sector"].get(_s.migration, {}).get(_sfd.requirements) - ), + migration_requirements=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.requirements)), protection_gender_and_inclusion_female=cleaners.clean_number( data["sector"].get(_s.protection_gender_inclusion, {}).get(_sfd.female) ), @@ -677,9 +645,7 @@ def clean_data_and_save(self, scraped_data): ), shelter_female=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.female)), shelter_male=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.male)), - shelter_people_reached=cleaners.clean_number( - data["sector"].get(_s.shelter, {}).get(_sfd.people_reached) - ), + shelter_people_reached=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.people_reached)), # shelter_people_targeted=cleaners.clean_number(data['sector'].get(_s.shelter, {}).get(_sfd.people_targeted)), shelter_requirements=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.requirements)), water_sanitation_and_hygiene_female=cleaners.clean_number( @@ -727,9 +693,7 @@ def clean_data_and_save(self, scraped_data): raw_livelihoods_and_basic_needs_female=data["sector"] .get(_s.livelihoods_and_basic_needs, {}) .get(_sfd.female), - raw_livelihoods_and_basic_needs_male=data["sector"] - .get(_s.livelihoods_and_basic_needs, {}) - .get(_sfd.male), + raw_livelihoods_and_basic_needs_male=data["sector"].get(_s.livelihoods_and_basic_needs, {}).get(_sfd.male), raw_livelihoods_and_basic_needs_people_reached=data["sector"] .get(_s.livelihoods_and_basic_needs, {}) .get(_sfd.people_reached), @@ -764,9 +728,7 @@ def clean_data_and_save(self, scraped_data): raw_shelter_people_reached=data["sector"].get(_s.shelter, {}).get(_sfd.people_reached), raw_shelter_people_targeted=data["sector"].get(_s.shelter, {}).get(_sfd.people_targeted), raw_shelter_requirements=data["sector"].get(_s.shelter, {}).get(_sfd.requirements), - raw_water_sanitation_and_hygiene_female=data["sector"] - .get(_s.Water_sanitation_hygiene, {}) - .get(_sfd.female), + raw_water_sanitation_and_hygiene_female=data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.female), raw_water_sanitation_and_hygiene_male=data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.male), raw_water_sanitation_and_hygiene_people_reached=data["sector"] .get(_s.Water_sanitation_hygiene, {}) @@ -784,9 +746,9 @@ def clean_data_and_save(self, scraped_data): appeal_number=cleaners.clean_appeal_code(data["meta"].get(_mfd.appeal_number)), current_operation_budget=cleaners.clean_number(data["meta"].get(_mfd.current_operation_budget)), dref_allocated=cleaners.clean_number(data["meta"].get(_mfd.dref_allocated)), - glide_number=data["meta"].get(_mfd.glide_number)[:18] - if data["meta"].get(_mfd.glide_number) != None - else None, + glide_number=( + data["meta"].get(_mfd.glide_number)[:18] if data["meta"].get(_mfd.glide_number) != None else None + ), num_of_people_to_be_assisted=cleaners.clean_number(data["meta"].get(_mfd.num_of_people_to_be_assisted)), disaster_risk_reduction_female=cleaners.clean_number( data["sector"].get(_s.disaster_Risk_reduction, {}).get(_sfd.female) @@ -806,9 +768,7 @@ def clean_data_and_save(self, scraped_data): health_female=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.female)), health_male=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.male)), health_people_reached=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.people_reached)), - health_people_targeted=cleaners.clean_number( - data["sector"].get(_s.health, {}).get(_sfd.people_targeted) - ), + health_people_targeted=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.people_targeted)), health_requirements=cleaners.clean_number(data["sector"].get(_s.health, {}).get(_sfd.requirements)), livelihoods_and_basic_needs_female=cleaners.clean_number( data["sector"].get(_s.livelihoods_and_basic_needs, {}).get(_sfd.female) @@ -827,15 +787,11 @@ def clean_data_and_save(self, scraped_data): ), migration_female=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.female)), migration_male=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.male)), - migration_people_reached=cleaners.clean_number( - data["sector"].get(_s.migration, {}).get(_sfd.people_reached) - ), + migration_people_reached=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.people_reached)), migration_people_targeted=cleaners.clean_number( data["sector"].get(_s.migration, {}).get(_sfd.people_targeted) ), - migration_requirements=cleaners.clean_number( - data["sector"].get(_s.migration, {}).get(_sfd.requirements) - ), + migration_requirements=cleaners.clean_number(data["sector"].get(_s.migration, {}).get(_sfd.requirements)), protection_gender_and_inclusion_female=cleaners.clean_number( data["sector"].get(_s.protection_gender_inclusion, {}).get(_sfd.female) ), @@ -853,12 +809,8 @@ def clean_data_and_save(self, scraped_data): ), shelter_female=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.female)), shelter_male=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.male)), - shelter_people_reached=cleaners.clean_number( - data["sector"].get(_s.shelter, {}).get(_sfd.people_reached) - ), - shelter_people_targeted=cleaners.clean_number( - data["sector"].get(_s.shelter, {}).get(_sfd.people_targeted) - ), + shelter_people_reached=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.people_reached)), + shelter_people_targeted=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.people_targeted)), shelter_requirements=cleaners.clean_number(data["sector"].get(_s.shelter, {}).get(_sfd.requirements)), water_sanitation_and_hygiene_female=cleaners.clean_number( data["sector"].get(_s.Water_sanitation_hygiene, {}).get(_sfd.female) diff --git a/api/management/commands/set_in_search_init.py b/api/management/commands/set_in_search_init.py index 1a15b6ef5..fa8e0532b 100644 --- a/api/management/commands/set_in_search_init.py +++ b/api/management/commands/set_in_search_init.py @@ -1,8 +1,9 @@ from django.core.management.base import BaseCommand -from api.models import Country from django.db import transaction from django.db.models import Q + from api.logger import logger +from api.models import Country class Command(BaseCommand): diff --git a/api/management/commands/set_num_affected.py b/api/management/commands/set_num_affected.py index 891f5c0a9..9c1f355f1 100644 --- a/api/management/commands/set_num_affected.py +++ b/api/management/commands/set_num_affected.py @@ -1,4 +1,5 @@ from django.core.management.base import BaseCommand + from api.models import Appeal, Event diff --git a/api/management/commands/set_situationreporttypes_is_primary.py b/api/management/commands/set_situationreporttypes_is_primary.py index 5185be01b..ac217a93f 100644 --- a/api/management/commands/set_situationreporttypes_is_primary.py +++ b/api/management/commands/set_situationreporttypes_is_primary.py @@ -1,9 +1,12 @@ from django.core.management.base import BaseCommand + from api.models import SituationReportType class Command(BaseCommand): - help = "Sets the default situation report types as primary. For more info read https://github.com/IFRCGo/go-frontend/issues/1008" + help = ( + "Sets the default situation report types as primary. For more info read https://github.com/IFRCGo/go-frontend/issues/1008" + ) def handle(self, *args, **options): id_list = [1, 2, 3, 5, 6, 7] diff --git a/api/management/commands/sync_appealdocs.py b/api/management/commands/sync_appealdocs.py index 6c9062701..99505f99d 100644 --- a/api/management/commands/sync_appealdocs.py +++ b/api/management/commands/sync_appealdocs.py @@ -1,17 +1,20 @@ -import requests from datetime import datetime, timezone + +import requests from dateutil.relativedelta import relativedelta -from main.sentry import SentryMonitor -from sentry_sdk.crons import monitor +from django.conf import settings from django.core.management.base import BaseCommand -from api.models import Appeal, AppealDocument, AppealDocumentType, CronJob, CronJobStatus +from sentry_sdk.crons import monitor + from api.logger import logger -from django.conf import settings +from api.models import Appeal, AppealDocument, CronJob, CronJobStatus +from main.sentry import SentryMonitor CRON_NAME = "sync_appealdocs" PUBLIC_SOURCE = "https://go-api.ifrc.org/api/publicsiteappeals?Hidden=false&BaseAppealnumber=" FEDNET_SOURCE = "https://go-api.ifrc.org/Api/FedNetAppeals?Hidden=false&BaseAppealnumber=" + @monitor(monitor_slug=SentryMonitor.SYNC_APPEALDOCS) class Command(BaseCommand): help = "Ingest existing appeal documents" @@ -92,7 +95,7 @@ def handle(self, *args, **options): description=result["AppealOrigType"], type_id=appealtype_id, iso_id=iso, - created_at=created_at + created_at=created_at, ) created.append(document_url) except Exception: diff --git a/api/management/commands/sync_molnix.py b/api/management/commands/sync_molnix.py index 8d2ff8adb..fd4c4d2ed 100644 --- a/api/management/commands/sync_molnix.py +++ b/api/management/commands/sync_molnix.py @@ -1,16 +1,18 @@ -from dateutil import parser as date_parser import json -from sentry_sdk.crons import monitor -from django.db import transaction -from django.core.management.base import BaseCommand, CommandError + +from dateutil import parser as date_parser from django.conf import settings -from api.molnix_utils import MolnixApi +from django.core.management.base import BaseCommand, CommandError +from django.db import transaction +from sentry_sdk.crons import monitor + +from api.create_cron import create_cron_record from api.logger import logger -from deployments.models import MolnixTag, MolnixTagGroup, PersonnelDeployment, Personnel +from api.models import Country, CronJobStatus, Event +from api.molnix_utils import MolnixApi +from deployments.models import MolnixTag, MolnixTagGroup, Personnel, PersonnelDeployment from main.sentry import SentryMonitor -from notifications.models import SurgeAlert, SurgeAlertType, SurgeAlertCategory -from api.models import Event, Country, CronJobStatus -from api.create_cron import create_cron_record +from notifications.models import SurgeAlert, SurgeAlertCategory, SurgeAlertType CRON_NAME = "sync_molnix" @@ -41,7 +43,7 @@ } -def prt(message_text, molnix_id, position_or_event_id=0, organization=''): +def prt(message_text, molnix_id, position_or_event_id=0, organization=""): warning_type = 0 if message_text == "Position does not have a valid Emergency tag": warning_type = 1 @@ -62,7 +64,7 @@ def prt(message_text, molnix_id, position_or_event_id=0, organization=''): # named tag has no description # tag is not a valid OP- tag - logger.warning('*** ' + str(warning_type) + '|' + str(molnix_id) + '|' + str(position_or_event_id) + '|' + organization) + logger.warning("*** " + str(warning_type) + "|" + str(molnix_id) + "|" + str(position_or_event_id) + "|" + organization) def get_unique_tags(deployments, open_positions): @@ -141,19 +143,23 @@ def add_tags(molnix_tags, api): tag.tag_category = ( "molnix_language" if n.startswith("L-") - else "molnix_operation" - if n.startswith("OP-") - else "molnix_modality" - if n in modality - else "molnix_region" - if n in region - else "molnix_scope" - if n in scope - else "molnix_sector" - if n in sector - else "molnix_status" - if n in status - else "molnix_role_profile" + else ( + "molnix_operation" + if n.startswith("OP-") + else ( + "molnix_modality" + if n in modality + else ( + "molnix_region" + if n in region + else ( + "molnix_scope" + if n in scope + else "molnix_sector" if n in sector else "molnix_status" if n in status else "molnix_role_profile" + ) + ) + ) + ) ) tag.save() @@ -163,7 +169,7 @@ def skip_this(tags): Skip the No GO tagged positions or deployments """ for tag in tags: - if tag["name"] == 'No GO': + if tag["name"] == "No GO": return True return False @@ -312,9 +318,7 @@ def sync_deployments(molnix_deployments, molnix_api, countries): if md["position_id"]: surge_alert = SurgeAlert.objects.get(molnix_id=md["position_id"]) except: - logger.warning( - "%d deployment did not find SurgeAlert with Molnix position_id %d." % (md["id"], md["position_id"]) - ) + logger.warning("%d deployment did not find SurgeAlert with Molnix position_id %d." % (md["id"], md["position_id"])) prt("Deployment did not find SurgeAlert", md["id"], md["position_id"]) continue @@ -441,7 +445,7 @@ def sync_open_positions(molnix_positions, molnix_api, countries): successful_updates = 0 for position in molnix_positions: - logger.warning('× ' + str(position["id"])) + logger.warning("× " + str(position["id"])) if skip_this(position["tags"]): warning = "Position id %d skipped due to No-GO" % position["id"] logger.warning(warning) @@ -498,10 +502,10 @@ def sync_open_positions(molnix_positions, molnix_api, countries): warnings.append("Position id %d not found in Molnix API" % alert.molnix_id) if position and position["status"] == "unfilled": alert.molnix_status = position["status"] - if position and position['closes']: + if position and position["closes"]: alert.closes = get_datetime(position["closes"]) - if position and position['status'] == 'archived': - alert.molnix_status = position['status'] + if position and position["status"] == "archived": + alert.molnix_status = position["status"] alert.is_active = False else: alert.is_active = False @@ -516,6 +520,7 @@ def sync_open_positions(molnix_positions, molnix_api, countries): ] return messages, warnings, successful_creates + @monitor(monitor_slug=SentryMonitor.SYNC_MOLNIX) class Command(BaseCommand): help = "Sync data from Molnix API to GO db" @@ -523,9 +528,7 @@ class Command(BaseCommand): @transaction.atomic def handle(self, *args, **options): logger.info("Starting Sync Molnix job") - molnix = MolnixApi( - url=settings.MOLNIX_API_BASE, username=settings.MOLNIX_USERNAME, password=settings.MOLNIX_PASSWORD - ) + molnix = MolnixApi(url=settings.MOLNIX_API_BASE, username=settings.MOLNIX_USERNAME, password=settings.MOLNIX_PASSWORD) try: molnix.login() logger.info("Logged into Molnix") @@ -553,13 +556,9 @@ def handle(self, *args, **options): used_tags = get_unique_tags(deployments, open_positions) add_tags(used_tags, molnix) # FIXME 2nd arg: a workaround to be able to get the group details inside. logger.info("Processed tags, syncing positions") - positions_messages, positions_warnings, positions_created = sync_open_positions( - open_positions, molnix, countries - ) + positions_messages, positions_warnings, positions_created = sync_open_positions(open_positions, molnix, countries) logger.info("Synced positions, syncing deployments") - deployments_messages, deployments_warnings, deployments_created = sync_deployments( - deployments, molnix, countries - ) + deployments_messages, deployments_warnings, deployments_created = sync_deployments(deployments, molnix, countries) logger.info("Synced deployments)") except Exception as ex: msg = "Unknown Error occurred: %s" % str(ex) diff --git a/api/management/commands/triggers_to_db.py b/api/management/commands/triggers_to_db.py index 3345858ed..15bce0e61 100644 --- a/api/management/commands/triggers_to_db.py +++ b/api/management/commands/triggers_to_db.py @@ -1,6 +1,7 @@ -from django.db import connection -from django.core.management.base import BaseCommand from django.conf import settings +from django.core.management.base import BaseCommand +from django.db import connection + from api.logger import logger diff --git a/api/management/commands/update-admin0-with-id.py b/api/management/commands/update-admin0-with-id.py index fb57e1105..8c1181ac3 100644 --- a/api/management/commands/update-admin0-with-id.py +++ b/api/management/commands/update-admin0-with-id.py @@ -1,11 +1,10 @@ -from django.core.management.base import BaseCommand, CommandError from django.contrib.gis.gdal import DataSource -from django.contrib.gis.geos import GEOSGeometry -from django.contrib.gis.geos import MultiPolygon -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned +from django.contrib.gis.geos import GEOSGeometry, MultiPolygon +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist +from django.core.management.base import BaseCommand, CommandError from django.db import transaction -from api.models import Country -from api.models import CountryGeoms + +from api.models import Country, CountryGeoms class Command(BaseCommand): diff --git a/api/management/commands/update-mapbox-tilesets.py b/api/management/commands/update-mapbox-tilesets.py index 36a359b90..0c9efe4e7 100644 --- a/api/management/commands/update-mapbox-tilesets.py +++ b/api/management/commands/update-mapbox-tilesets.py @@ -1,8 +1,9 @@ +import os import subprocess -from django.core.management.base import BaseCommand, CommandError -from django.conf import settings import time -import os + +from django.conf import settings +from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): @@ -24,9 +25,7 @@ def add_arguments(self, parser): DB_USER = db["USER"] DB_PASSWORD = db["PASSWORD"] DB_PORT = 5432 - connection_string = "PG:host={} dbname={} user={} password={} port={}".format( - DB_HOST, DB_NAME, DB_USER, DB_PASSWORD, DB_PORT - ) + connection_string = "PG:host={} dbname={} user={} password={} port={}".format(DB_HOST, DB_NAME, DB_USER, DB_PASSWORD, DB_PORT) def handle(self, *args, **options): try: diff --git a/api/management/commands/update-region-bbox.py b/api/management/commands/update-region-bbox.py index d41216b2a..a3bacdcd6 100644 --- a/api/management/commands/update-region-bbox.py +++ b/api/management/commands/update-region-bbox.py @@ -1,6 +1,7 @@ -from django.core.management.base import BaseCommand from django.contrib.gis.geos import Polygon +from django.core.management.base import BaseCommand from django.db import transaction + from api.models import Region diff --git a/api/management/commands/update-sovereign-and-disputed.py b/api/management/commands/update-sovereign-and-disputed.py index 2bf9c585d..5a039e3dd 100644 --- a/api/management/commands/update-sovereign-and-disputed.py +++ b/api/management/commands/update-sovereign-and-disputed.py @@ -1,7 +1,9 @@ import csv + +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.management.base import BaseCommand, CommandError -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.db import transaction + from api.models import Country diff --git a/api/management/commands/user_registration_reminder.py b/api/management/commands/user_registration_reminder.py index e1d8d298e..6bcfb7dc7 100644 --- a/api/management/commands/user_registration_reminder.py +++ b/api/management/commands/user_registration_reminder.py @@ -1,11 +1,14 @@ -from datetime import datetime, timezone, timedelta +from datetime import datetime, timedelta, timezone + from django.core.management.base import BaseCommand from django.template.loader import render_to_string from sentry_sdk.crons import monitor -from api.models import UserRegion, Region + +from api.models import Region, UserRegion from main.sentry import SentryMonitor -from registrations.models import Pending from notifications.notification import send_notification +from registrations.models import Pending + @monitor(monitor_slug=SentryMonitor.USER_REGISTRATION_REMINDER) class Command(BaseCommand): diff --git a/api/migrations/0001_initial.py b/api/migrations/0001_initial.py index 67f942d70..876a7c93b 100644 --- a/api/migrations/0001_initial.py +++ b/api/migrations/0001_initial.py @@ -2,10 +2,11 @@ # Generated by Django 1.11.8 on 2018-02-07 21:09 from __future__ import unicode_literals -import api.models +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion + +import api.models class Migration(migrations.Migration): @@ -13,340 +14,385 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('auth', '0008_alter_user_username_max_length'), + ("auth", "0008_alter_user_username_max_length"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( - name='Action', + name="Action", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=100)), ], ), migrations.CreateModel( - name='ActionsTaken', + name="ActionsTaken", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('organization', models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'Foreign Society'), ('FDRN', 'Federation')], max_length=4)), - ('summary', models.TextField(blank=True)), - ('actions', models.ManyToManyField(to='api.Action')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "organization", + models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "Foreign Society"), ("FDRN", "Federation")], max_length=4 + ), + ), + ("summary", models.TextField(blank=True)), + ("actions", models.ManyToManyField(to="api.Action")), ], ), migrations.CreateModel( - name='Appeal', + name="Appeal", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('aid', models.CharField(max_length=20)), - ('name', models.CharField(max_length=100)), - ('atype', models.IntegerField(default=0, choices=api.models.AppealType.choices)), - ('status', models.IntegerField(default=0, choices=api.models.AppealStatus.choices)), - ('code', models.CharField(max_length=20, null=True)), - ('sector', models.CharField(blank=True, max_length=100)), - ('num_beneficiaries', models.IntegerField(default=0)), - ('amount_requested', models.DecimalField(decimal_places=2, default=0.0, max_digits=12)), - ('amount_funded', models.DecimalField(decimal_places=2, default=0.0, max_digits=12)), - ('start_date', models.DateTimeField(null=True)), - ('end_date', models.DateTimeField(null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("aid", models.CharField(max_length=20)), + ("name", models.CharField(max_length=100)), + ("atype", models.IntegerField(default=0, choices=api.models.AppealType.choices)), + ("status", models.IntegerField(default=0, choices=api.models.AppealStatus.choices)), + ("code", models.CharField(max_length=20, null=True)), + ("sector", models.CharField(blank=True, max_length=100)), + ("num_beneficiaries", models.IntegerField(default=0)), + ("amount_requested", models.DecimalField(decimal_places=2, default=0.0, max_digits=12)), + ("amount_funded", models.DecimalField(decimal_places=2, default=0.0, max_digits=12)), + ("start_date", models.DateTimeField(null=True)), + ("end_date", models.DateTimeField(null=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("modified_at", models.DateTimeField(auto_now=True)), ], options={ - 'ordering': ('-end_date', '-start_date'), + "ordering": ("-end_date", "-start_date"), }, ), migrations.CreateModel( - name='AppealDocument', + name="AppealDocument", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField()), - ('name', models.CharField(max_length=100)), - ('document', models.FileField(blank=True, null=True, upload_to=api.models.appeal_document_path)), - ('document_url', models.URLField(blank=True)), - ('appeal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Appeal')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField()), + ("name", models.CharField(max_length=100)), + ("document", models.FileField(blank=True, null=True, upload_to=api.models.appeal_document_path)), + ("document_url", models.URLField(blank=True)), + ("appeal", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Appeal")), ], ), migrations.CreateModel( - name='Country', + name="Country", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ('iso', models.CharField(max_length=2, null=True)), - ('society_name', models.TextField(blank=True)), - ('society_url', models.URLField(blank=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=100)), + ("iso", models.CharField(max_length=2, null=True)), + ("society_name", models.TextField(blank=True)), + ("society_url", models.URLField(blank=True)), ], options={ - 'verbose_name_plural': 'Countries', - 'ordering': ('name',), + "verbose_name_plural": "Countries", + "ordering": ("name",), }, ), migrations.CreateModel( - name='DisasterType', + name="DisasterType", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ('summary', models.TextField()), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=100)), + ("summary", models.TextField()), ], options={ - 'ordering': ('name',), + "ordering": ("name",), }, ), migrations.CreateModel( - name='Event', + name="Event", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ('summary', models.TextField(blank=True)), - ('num_affected', models.IntegerField(blank=True, null=True)), - ('alert_level', models.IntegerField(default=0, choices=api.models.AlertLevel.choices)), - ('glide', models.CharField(blank=True, max_length=18)), - ('disaster_start_date', models.DateTimeField()), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('auto_generated', models.BooleanField(default=False)), - ('countries', models.ManyToManyField(to='api.Country')), - ('dtype', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=100)), + ("summary", models.TextField(blank=True)), + ("num_affected", models.IntegerField(blank=True, null=True)), + ("alert_level", models.IntegerField(default=0, choices=api.models.AlertLevel.choices)), + ("glide", models.CharField(blank=True, max_length=18)), + ("disaster_start_date", models.DateTimeField()), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("auto_generated", models.BooleanField(default=False)), + ("countries", models.ManyToManyField(to="api.Country")), + ("dtype", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.DisasterType")), ], options={ - 'verbose_name': 'Emergency', - 'verbose_name_plural': 'Emergencies', - 'ordering': ('-disaster_start_date',), + "verbose_name": "Emergency", + "verbose_name_plural": "Emergencies", + "ordering": ("-disaster_start_date",), }, ), migrations.CreateModel( - name='EventContact', + name="EventContact", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('ctype', models.CharField(blank=True, max_length=100)), - ('name', models.CharField(max_length=100)), - ('title', models.CharField(max_length=300)), - ('email', models.CharField(max_length=300)), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Event')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("ctype", models.CharField(blank=True, max_length=100)), + ("name", models.CharField(max_length=100)), + ("title", models.CharField(max_length=300)), + ("email", models.CharField(max_length=300)), + ("event", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Event")), ], ), migrations.CreateModel( - name='FieldReport', + name="FieldReport", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('rid', models.CharField(blank=True, editable=False, max_length=100, null=True)), - ('summary', models.TextField(blank=True)), - ('description', models.TextField(blank=True, default='')), - ('status', models.IntegerField(default=0)), - ('request_assistance', models.BooleanField(default=False)), - ('num_injured', models.IntegerField(blank=True, null=True)), - ('num_dead', models.IntegerField(blank=True, null=True)), - ('num_missing', models.IntegerField(blank=True, null=True)), - ('num_affected', models.IntegerField(blank=True, null=True)), - ('num_displaced', models.IntegerField(blank=True, null=True)), - ('num_assisted', models.IntegerField(blank=True, null=True)), - ('num_localstaff', models.IntegerField(blank=True, null=True)), - ('num_volunteers', models.IntegerField(blank=True, null=True)), - ('num_expats_delegates', models.IntegerField(blank=True, null=True)), - ('gov_num_injured', models.IntegerField(blank=True, null=True)), - ('gov_num_dead', models.IntegerField(blank=True, null=True)), - ('gov_num_missing', models.IntegerField(blank=True, null=True)), - ('gov_num_affected', models.IntegerField(blank=True, null=True)), - ('gov_num_displaced', models.IntegerField(blank=True, null=True)), - ('gov_num_assisted', models.IntegerField(blank=True, null=True)), - ('actions_others', models.TextField(blank=True, null=True)), - ('visibility', models.IntegerField(default=1, choices=api.models.VisibilityChoices.choices)), - ('bulletin', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('dref', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('dref_amount', models.IntegerField(blank=True, null=True)), - ('appeal', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('appeal_amount', models.IntegerField(blank=True, null=True)), - ('rdrt', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('num_rdrt', models.IntegerField(blank=True, null=True)), - ('fact', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('num_fact', models.IntegerField(blank=True, null=True)), - ('ifrc_staff', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('num_ifrc_staff', models.IntegerField(blank=True, null=True)), - ('eru_base_camp', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_base_camp_units', models.IntegerField(blank=True, null=True)), - ('eru_basic_health_care', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_basic_health_care_units', models.IntegerField(blank=True, null=True)), - ('eru_it_telecom', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_it_telecom_units', models.IntegerField(blank=True, null=True)), - ('eru_logistics', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_logistics_units', models.IntegerField(blank=True, null=True)), - ('eru_deployment_hospital', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_deployment_hospital_units', models.IntegerField(blank=True, null=True)), - ('eru_referral_hospital', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_referral_hospital_units', models.IntegerField(blank=True, null=True)), - ('eru_relief', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_relief_units', models.IntegerField(blank=True, null=True)), - ('eru_water_sanitation_15', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_water_sanitation_15_units', models.IntegerField(blank=True, null=True)), - ('eru_water_sanitation_40', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_water_sanitation_40_units', models.IntegerField(blank=True, null=True)), - ('eru_water_sanitation_20', models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), - ('eru_water_sanitation_20_units', models.IntegerField(blank=True, null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('countries', models.ManyToManyField(to='api.Country')), - ('dtype', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.DisasterType')), - ('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='field_reports', to='api.Event')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("rid", models.CharField(blank=True, editable=False, max_length=100, null=True)), + ("summary", models.TextField(blank=True)), + ("description", models.TextField(blank=True, default="")), + ("status", models.IntegerField(default=0)), + ("request_assistance", models.BooleanField(default=False)), + ("num_injured", models.IntegerField(blank=True, null=True)), + ("num_dead", models.IntegerField(blank=True, null=True)), + ("num_missing", models.IntegerField(blank=True, null=True)), + ("num_affected", models.IntegerField(blank=True, null=True)), + ("num_displaced", models.IntegerField(blank=True, null=True)), + ("num_assisted", models.IntegerField(blank=True, null=True)), + ("num_localstaff", models.IntegerField(blank=True, null=True)), + ("num_volunteers", models.IntegerField(blank=True, null=True)), + ("num_expats_delegates", models.IntegerField(blank=True, null=True)), + ("gov_num_injured", models.IntegerField(blank=True, null=True)), + ("gov_num_dead", models.IntegerField(blank=True, null=True)), + ("gov_num_missing", models.IntegerField(blank=True, null=True)), + ("gov_num_affected", models.IntegerField(blank=True, null=True)), + ("gov_num_displaced", models.IntegerField(blank=True, null=True)), + ("gov_num_assisted", models.IntegerField(blank=True, null=True)), + ("actions_others", models.TextField(blank=True, null=True)), + ("visibility", models.IntegerField(default=1, choices=api.models.VisibilityChoices.choices)), + ("bulletin", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("dref", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("dref_amount", models.IntegerField(blank=True, null=True)), + ("appeal", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("appeal_amount", models.IntegerField(blank=True, null=True)), + ("rdrt", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("num_rdrt", models.IntegerField(blank=True, null=True)), + ("fact", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("num_fact", models.IntegerField(blank=True, null=True)), + ("ifrc_staff", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("num_ifrc_staff", models.IntegerField(blank=True, null=True)), + ("eru_base_camp", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_base_camp_units", models.IntegerField(blank=True, null=True)), + ("eru_basic_health_care", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_basic_health_care_units", models.IntegerField(blank=True, null=True)), + ("eru_it_telecom", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_it_telecom_units", models.IntegerField(blank=True, null=True)), + ("eru_logistics", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_logistics_units", models.IntegerField(blank=True, null=True)), + ("eru_deployment_hospital", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_deployment_hospital_units", models.IntegerField(blank=True, null=True)), + ("eru_referral_hospital", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_referral_hospital_units", models.IntegerField(blank=True, null=True)), + ("eru_relief", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_relief_units", models.IntegerField(blank=True, null=True)), + ("eru_water_sanitation_15", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_water_sanitation_15_units", models.IntegerField(blank=True, null=True)), + ("eru_water_sanitation_40", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_water_sanitation_40_units", models.IntegerField(blank=True, null=True)), + ("eru_water_sanitation_20", models.IntegerField(default=0, choices=api.models.RequestChoices.choices)), + ("eru_water_sanitation_20_units", models.IntegerField(blank=True, null=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ("countries", models.ManyToManyField(to="api.Country")), + ("dtype", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="api.DisasterType")), + ( + "event", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="field_reports", + to="api.Event", + ), + ), ], options={ - 'ordering': ('-created_at', '-updated_at'), + "ordering": ("-created_at", "-updated_at"), }, ), migrations.CreateModel( - name='FieldReportContact', + name="FieldReportContact", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('ctype', models.CharField(blank=True, max_length=100)), - ('name', models.CharField(max_length=100)), - ('title', models.CharField(max_length=300)), - ('email', models.CharField(max_length=300)), - ('field_report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.FieldReport')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("ctype", models.CharField(blank=True, max_length=100)), + ("name", models.CharField(max_length=100)), + ("title", models.CharField(max_length=300)), + ("email", models.CharField(max_length=300)), + ("field_report", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.FieldReport")), ], ), migrations.CreateModel( - name='GDACSEvent', + name="GDACSEvent", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('eventid', models.CharField(max_length=12)), - ('title', models.TextField()), - ('description', models.TextField()), - ('image', models.URLField(null=True)), - ('report', models.URLField(null=True)), - ('publication_date', models.DateTimeField()), - ('year', models.IntegerField()), - ('lat', models.FloatField()), - ('lon', models.FloatField()), - ('event_type', models.CharField(max_length=16)), - ('alert_level', models.IntegerField(default=0, choices=api.models.AlertLevel.choices)), - ('alert_score', models.CharField(max_length=16, null=True)), - ('severity', models.TextField()), - ('severity_unit', models.CharField(max_length=16)), - ('severity_value', models.CharField(max_length=16)), - ('population_unit', models.CharField(max_length=16)), - ('population_value', models.CharField(max_length=16)), - ('vulnerability', models.IntegerField()), - ('country_text', models.TextField()), - ('countries', models.ManyToManyField(to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("eventid", models.CharField(max_length=12)), + ("title", models.TextField()), + ("description", models.TextField()), + ("image", models.URLField(null=True)), + ("report", models.URLField(null=True)), + ("publication_date", models.DateTimeField()), + ("year", models.IntegerField()), + ("lat", models.FloatField()), + ("lon", models.FloatField()), + ("event_type", models.CharField(max_length=16)), + ("alert_level", models.IntegerField(default=0, choices=api.models.AlertLevel.choices)), + ("alert_score", models.CharField(max_length=16, null=True)), + ("severity", models.TextField()), + ("severity_unit", models.CharField(max_length=16)), + ("severity_value", models.CharField(max_length=16)), + ("population_unit", models.CharField(max_length=16)), + ("population_value", models.CharField(max_length=16)), + ("vulnerability", models.IntegerField()), + ("country_text", models.TextField()), + ("countries", models.ManyToManyField(to="api.Country")), ], ), migrations.CreateModel( - name='KeyFigure', + name="KeyFigure", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('number', models.IntegerField()), - ('deck', models.CharField(max_length=50)), - ('source', models.CharField(max_length=256)), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Event')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("number", models.IntegerField()), + ("deck", models.CharField(max_length=50)), + ("source", models.CharField(max_length=256)), + ("event", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Event")), ], ), migrations.CreateModel( - name='Profile', + name="Profile", fields=[ - ('user', models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='profile', serialize=False, to=settings.AUTH_USER_MODEL)), - ('org', models.CharField(blank=True, max_length=100)), - ('org_type', models.CharField(blank=True, choices=[('NTLS', 'National Society'), ('DLGN', 'Delegation'), ('SCRT', 'Secretariat'), ('ICRC', 'ICRC'), ('OTHR', 'Other')], max_length=4)), - ('city', models.CharField(blank=True, max_length=100, null=True)), - ('department', models.CharField(blank=True, max_length=100, null=True)), - ('position', models.CharField(blank=True, max_length=100, null=True)), - ('phone_number', models.CharField(blank=True, max_length=100, null=True)), - ('country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country')), + ( + "user", + models.OneToOneField( + editable=False, + on_delete=django.db.models.deletion.CASCADE, + primary_key=True, + related_name="profile", + serialize=False, + to=settings.AUTH_USER_MODEL, + ), + ), + ("org", models.CharField(blank=True, max_length=100)), + ( + "org_type", + models.CharField( + blank=True, + choices=[ + ("NTLS", "National Society"), + ("DLGN", "Delegation"), + ("SCRT", "Secretariat"), + ("ICRC", "ICRC"), + ("OTHR", "Other"), + ], + max_length=4, + ), + ), + ("city", models.CharField(blank=True, max_length=100, null=True)), + ("department", models.CharField(blank=True, max_length=100, null=True)), + ("position", models.CharField(blank=True, max_length=100, null=True)), + ("phone_number", models.CharField(blank=True, max_length=100, null=True)), + ("country", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country")), ], options={ - 'verbose_name': 'User profile', - 'verbose_name_plural': 'User profiles', + "verbose_name": "User profile", + "verbose_name_plural": "User profiles", }, ), migrations.CreateModel( - name='Region', + name="Region", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.IntegerField(choices=api.models.RegionName.choices, default=0)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.IntegerField(choices=api.models.RegionName.choices, default=0)), ], options={ - 'ordering': ('name',), + "ordering": ("name",), }, ), migrations.CreateModel( - name='SituationReport', + name="SituationReport", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('name', models.CharField(max_length=100)), - ('document', models.FileField(blank=True, null=True, upload_to=api.models.sitrep_document_path)), - ('document_url', models.URLField(blank=True)), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Event')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("name", models.CharField(max_length=100)), + ("document", models.FileField(blank=True, null=True, upload_to=api.models.sitrep_document_path)), + ("document_url", models.URLField(blank=True)), + ("event", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Event")), ], ), migrations.CreateModel( - name='Snippet', + name="Snippet", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('snippet', models.CharField(max_length=300)), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Event')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("snippet", models.CharField(max_length=300)), + ("event", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Event")), ], ), migrations.CreateModel( - name='Source', + name="Source", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('spec', models.TextField(blank=True)), - ('field_report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.FieldReport')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("spec", models.TextField(blank=True)), + ("field_report", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.FieldReport")), ], ), migrations.CreateModel( - name='SourceType', + name="SourceType", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=40)), ], ), migrations.AddField( - model_name='source', - name='stype', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.SourceType'), + model_name="source", + name="stype", + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="api.SourceType"), ), migrations.AddField( - model_name='fieldreport', - name='regions', - field=models.ManyToManyField(blank=True, to='api.Region'), + model_name="fieldreport", + name="regions", + field=models.ManyToManyField(blank=True, to="api.Region"), ), migrations.AddField( - model_name='fieldreport', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user', to=settings.AUTH_USER_MODEL), + model_name="fieldreport", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="user", + to=settings.AUTH_USER_MODEL, + ), ), migrations.AddField( - model_name='event', - name='regions', - field=models.ManyToManyField(to='api.Region'), + model_name="event", + name="regions", + field=models.ManyToManyField(to="api.Region"), ), migrations.AddField( - model_name='country', - name='region', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Region'), + model_name="country", + name="region", + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Region"), ), migrations.AddField( - model_name='appeal', - name='country', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country'), + model_name="appeal", + name="country", + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), ), migrations.AddField( - model_name='appeal', - name='dtype', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType'), + model_name="appeal", + name="dtype", + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.DisasterType"), ), migrations.AddField( - model_name='appeal', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='appeals', to='api.Event'), + model_name="appeal", + name="event", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="appeals", to="api.Event" + ), ), migrations.AddField( - model_name='appeal', - name='region', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Region'), + model_name="appeal", + name="region", + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Region"), ), migrations.AddField( - model_name='actionstaken', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.FieldReport'), + model_name="actionstaken", + name="field_report", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.FieldReport"), ), ] diff --git a/api/migrations/0002_auto_20180410_1445.py b/api/migrations/0002_auto_20180410_1445.py index afa1226c4..3e9a66413 100644 --- a/api/migrations/0002_auto_20180410_1445.py +++ b/api/migrations/0002_auto_20180410_1445.py @@ -8,13 +8,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0001_initial'), + ("api", "0001_initial"), ] operations = [ migrations.AlterField( - model_name='snippet', - name='snippet', + model_name="snippet", + name="snippet", field=models.TextField(), ), ] diff --git a/api/migrations/0003_auto_20180607_1822.py b/api/migrations/0003_auto_20180607_1822.py index 1f7f99925..ae1df8cf2 100644 --- a/api/migrations/0003_auto_20180607_1822.py +++ b/api/migrations/0003_auto_20180607_1822.py @@ -1,44 +1,46 @@ # Generated by Django 2.0.5 on 2018-06-07 18:22 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0002_auto_20180410_1445'), + ("api", "0002_auto_20180410_1445"), ] operations = [ migrations.AlterField( - model_name='actionstaken', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions_taken', to='api.FieldReport'), + model_name="actionstaken", + name="field_report", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="actions_taken", to="api.FieldReport" + ), ), migrations.AlterField( - model_name='eventcontact', - name='event', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='api.Event'), + model_name="eventcontact", + name="event", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="contacts", to="api.Event"), ), migrations.AlterField( - model_name='fieldreportcontact', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='api.FieldReport'), + model_name="fieldreportcontact", + name="field_report", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="contacts", to="api.FieldReport"), ), migrations.AlterField( - model_name='keyfigure', - name='event', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='key_figures', to='api.Event'), + model_name="keyfigure", + name="event", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="key_figures", to="api.Event"), ), migrations.AlterField( - model_name='snippet', - name='event', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='snippets', to='api.Event'), + model_name="snippet", + name="event", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="snippets", to="api.Event"), ), migrations.AlterField( - model_name='source', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sources', to='api.FieldReport'), + model_name="source", + name="field_report", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="sources", to="api.FieldReport"), ), ] diff --git a/api/migrations/0004_auto_20180610_1803.py b/api/migrations/0004_auto_20180610_1803.py index 3fd630c4a..43e2e6252 100644 --- a/api/migrations/0004_auto_20180610_1803.py +++ b/api/migrations/0004_auto_20180610_1803.py @@ -1,134 +1,216 @@ # Generated by Django 2.0.5 on 2018-06-10 18:03 -import api.models -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + +import api.models class Migration(migrations.Migration): dependencies = [ - ('api', '0003_auto_20180607_1822'), + ("api", "0003_auto_20180607_1822"), ] operations = [ migrations.CreateModel( - name='AdminContact', + name="AdminContact", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('ctype', models.CharField(blank=True, max_length=100)), - ('name', models.CharField(max_length=100)), - ('title', models.CharField(max_length=300)), - ('email', models.CharField(max_length=300)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("ctype", models.CharField(blank=True, max_length=100)), + ("name", models.CharField(max_length=100)), + ("title", models.CharField(max_length=300)), + ("email", models.CharField(max_length=300)), ], ), migrations.CreateModel( - name='AdminKeyFigure', + name="AdminKeyFigure", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('figure', models.CharField(max_length=100)), - ('deck', models.CharField(max_length=50)), - ('source', models.CharField(max_length=256)), - ('visibility', models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("figure", models.CharField(max_length=100)), + ("deck", models.CharField(max_length=50)), + ("source", models.CharField(max_length=256)), + ("visibility", models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices)), ], options={ - 'ordering': ('source',), + "ordering": ("source",), }, ), migrations.CreateModel( - name='AdminLink', + name="AdminLink", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=100)), - ('url', models.URLField(max_length=300)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=100)), + ("url", models.URLField(max_length=300)), ], ), migrations.CreateModel( - name='CountrySnippet', + name="CountrySnippet", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('snippet', models.TextField(blank=True, null=True)), - ('image', models.ImageField(blank=True, null=True, upload_to='countries/%Y/%m/%d/')), - ('visibility', models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices)), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='snippets', to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("snippet", models.TextField(blank=True, null=True)), + ("image", models.ImageField(blank=True, null=True, upload_to="countries/%Y/%m/%d/")), + ("visibility", models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices)), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="snippets", to="api.Country"), + ), ], ), migrations.CreateModel( - name='RegionSnippet', + name="RegionSnippet", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('snippet', models.TextField(blank=True, null=True)), - ('image', models.ImageField(blank=True, null=True, upload_to='regions/%Y/%m/%d/')), - ('visibility', models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices)), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='snippets', to='api.Region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("snippet", models.TextField(blank=True, null=True)), + ("image", models.ImageField(blank=True, null=True, upload_to="regions/%Y/%m/%d/")), + ("visibility", models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices)), + ( + "region", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="snippets", to="api.Region"), + ), ], ), migrations.AddField( - model_name='snippet', - name='image', + model_name="snippet", + name="image", field=models.ImageField(blank=True, null=True, upload_to=api.models.snippet_image_path), ), migrations.AddField( - model_name='snippet', - name='visibility', + model_name="snippet", + name="visibility", field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices), ), migrations.AlterField( - model_name='keyfigure', - name='number', + model_name="keyfigure", + name="number", field=models.CharField(max_length=100), ), migrations.AlterField( - model_name='snippet', - name='snippet', + model_name="snippet", + name="snippet", field=models.TextField(blank=True, null=True), ), migrations.CreateModel( - name='CountryContact', + name="CountryContact", fields=[ - ('admincontact_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='api.AdminContact')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='api.Country')), + ( + "admincontact_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="api.AdminContact", + ), + ), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="contacts", to="api.Country"), + ), ], - bases=('api.admincontact',), + bases=("api.admincontact",), ), migrations.CreateModel( - name='CountryKeyFigure', + name="CountryKeyFigure", fields=[ - ('adminkeyfigure_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='api.AdminKeyFigure')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='key_figures', to='api.Country')), + ( + "adminkeyfigure_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="api.AdminKeyFigure", + ), + ), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="key_figures", to="api.Country"), + ), ], - bases=('api.adminkeyfigure',), + bases=("api.adminkeyfigure",), ), migrations.CreateModel( - name='CountryLink', + name="CountryLink", fields=[ - ('adminlink_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='api.AdminLink')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='links', to='api.Country')), + ( + "adminlink_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="api.AdminLink", + ), + ), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="links", to="api.Country"), + ), ], - bases=('api.adminlink',), + bases=("api.adminlink",), ), migrations.CreateModel( - name='RegionContact', + name="RegionContact", fields=[ - ('admincontact_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='api.AdminContact')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='api.Region')), + ( + "admincontact_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="api.AdminContact", + ), + ), + ( + "region", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="contacts", to="api.Region"), + ), ], - bases=('api.admincontact',), + bases=("api.admincontact",), ), migrations.CreateModel( - name='RegionKeyFigure', + name="RegionKeyFigure", fields=[ - ('adminkeyfigure_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='api.AdminKeyFigure')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='key_figures', to='api.Region')), + ( + "adminkeyfigure_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="api.AdminKeyFigure", + ), + ), + ( + "region", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="key_figures", to="api.Region"), + ), ], - bases=('api.adminkeyfigure',), + bases=("api.adminkeyfigure",), ), migrations.CreateModel( - name='RegionLink', + name="RegionLink", fields=[ - ('adminlink_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='api.AdminLink')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='links', to='api.Region')), + ( + "adminlink_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="api.AdminLink", + ), + ), + ("region", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="links", to="api.Region")), ], - bases=('api.adminlink',), + bases=("api.adminlink",), ), ] diff --git a/api/migrations/0005_auto_20180614_2206.py b/api/migrations/0005_auto_20180614_2206.py index 0bd59f177..2e83b7711 100644 --- a/api/migrations/0005_auto_20180614_2206.py +++ b/api/migrations/0005_auto_20180614_2206.py @@ -1,67 +1,67 @@ # Generated by Django 2.0.5 on 2018-06-14 22:06 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0004_auto_20180610_1803'), + ("api", "0004_auto_20180610_1803"), ] operations = [ migrations.CreateModel( - name='District', + name="District", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ('code', models.CharField(max_length=10)), - ('country_iso', models.CharField(max_length=3, null=True)), - ('country_name', models.CharField(max_length=100)), - ('country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=100)), + ("code", models.CharField(max_length=10)), + ("country_iso", models.CharField(max_length=3, null=True)), + ("country_name", models.CharField(max_length=100)), + ("country", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country")), ], options={ - 'ordering': ('code',), + "ordering": ("code",), }, ), migrations.AlterModelOptions( - name='appeal', - options={'ordering': ('-start_date', '-end_date')}, + name="appeal", + options={"ordering": ("-start_date", "-end_date")}, ), migrations.AddField( - model_name='appeal', - name='needs_confirmation', + model_name="appeal", + name="needs_confirmation", field=models.BooleanField(default=False), ), migrations.AddField( - model_name='event', - name='auto_generated_source', + model_name="event", + name="auto_generated_source", field=models.CharField(blank=True, editable=False, max_length=50, null=True), ), migrations.AddField( - model_name='event', - name='is_featured', + model_name="event", + name="is_featured", field=models.BooleanField(default=False), ), migrations.AlterField( - model_name='appeal', - name='code', + model_name="appeal", + name="code", field=models.CharField(max_length=20, null=True, unique=True), ), migrations.AlterField( - model_name='event', - name='auto_generated', + model_name="event", + name="auto_generated", field=models.BooleanField(default=False, editable=False), ), migrations.AddField( - model_name='event', - name='districts', - field=models.ManyToManyField(blank=True, to='api.District'), + model_name="event", + name="districts", + field=models.ManyToManyField(blank=True, to="api.District"), ), migrations.AddField( - model_name='fieldreport', - name='districts', - field=models.ManyToManyField(blank=True, to='api.District'), + model_name="fieldreport", + name="districts", + field=models.ManyToManyField(blank=True, to="api.District"), ), ] diff --git a/api/migrations/0006_fieldreport_report_date.py b/api/migrations/0006_fieldreport_report_date.py index 1689b29f2..a5b0fdff1 100644 --- a/api/migrations/0006_fieldreport_report_date.py +++ b/api/migrations/0006_fieldreport_report_date.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0005_auto_20180614_2206'), + ("api", "0005_auto_20180614_2206"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='report_date', + model_name="fieldreport", + name="report_date", field=models.DateTimeField(editable=False, null=True), ), ] diff --git a/api/migrations/0007_event_updated_at.py b/api/migrations/0007_event_updated_at.py index 29e4ff25a..29662c01f 100644 --- a/api/migrations/0007_event_updated_at.py +++ b/api/migrations/0007_event_updated_at.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0006_fieldreport_report_date'), + ("api", "0006_fieldreport_report_date"), ] operations = [ migrations.AddField( - model_name='event', - name='updated_at', + model_name="event", + name="updated_at", field=models.DateTimeField(auto_now=True), ), ] diff --git a/api/migrations/0008_auto_20180704_1700.py b/api/migrations/0008_auto_20180704_1700.py index 9e4e7c8e1..cbcd2bf8f 100644 --- a/api/migrations/0008_auto_20180704_1700.py +++ b/api/migrations/0008_auto_20180704_1700.py @@ -1,32 +1,38 @@ # Generated by Django 2.0.5 on 2018-07-04 17:00 -import api.models -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + +import api.models class Migration(migrations.Migration): dependencies = [ - ('api', '0007_event_updated_at'), + ("api", "0007_event_updated_at"), ] operations = [ migrations.CreateModel( - name='SituationReportType', + name="SituationReportType", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('type', models.CharField(max_length=50)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("type", models.CharField(max_length=50)), ], ), migrations.AddField( - model_name='situationreport', - name='visibility', + model_name="situationreport", + name="visibility", field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices), ), migrations.AddField( - model_name='situationreport', - name='type', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='situation_reports', to='api.SituationReportType'), + model_name="situationreport", + name="type", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="situation_reports", + to="api.SituationReportType", + ), ), ] diff --git a/api/migrations/0009_auto_20180712_1922.py b/api/migrations/0009_auto_20180712_1922.py index 44edd4433..1d3deb8bd 100644 --- a/api/migrations/0009_auto_20180712_1922.py +++ b/api/migrations/0009_auto_20180712_1922.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0008_auto_20180704_1700'), + ("api", "0008_auto_20180704_1700"), ] operations = [ migrations.AddField( - model_name='country', - name='inform_score', + model_name="country", + name="inform_score", field=models.DecimalField(blank=True, decimal_places=2, max_digits=3, null=True), ), migrations.AddField( - model_name='country', - name='key_priorities', + model_name="country", + name="key_priorities", field=models.TextField(blank=True, null=True), ), migrations.AddField( - model_name='country', - name='overview', + model_name="country", + name="overview", field=models.TextField(blank=True, null=True), ), ] diff --git a/api/migrations/0010_auto_20181008_0950.py b/api/migrations/0010_auto_20181008_0950.py index 0424a1670..0238c1be6 100644 --- a/api/migrations/0010_auto_20181008_0950.py +++ b/api/migrations/0010_auto_20181008_0950.py @@ -1,19 +1,19 @@ # Generated by Django 2.0.5 on 2018-10-08 09:50 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0009_auto_20180712_1922'), + ("api", "0009_auto_20180712_1922"), ] operations = [ migrations.AlterField( - model_name='country', - name='region', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Region'), + model_name="country", + name="region", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Region"), ), ] diff --git a/api/migrations/0011_auto_20181015_0934.py b/api/migrations/0011_auto_20181015_0934.py index 44e5429d2..195554dd2 100644 --- a/api/migrations/0011_auto_20181015_0934.py +++ b/api/migrations/0011_auto_20181015_0934.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0010_auto_20181008_0950'), + ("api", "0010_auto_20181008_0950"), ] operations = [ migrations.AlterField( - model_name='gdacsevent', - name='vulnerability', + model_name="gdacsevent", + name="vulnerability", field=models.FloatField(), ), ] diff --git a/api/migrations/0012_auto_20181016_0730.py b/api/migrations/0012_auto_20181016_0730.py index 28108bfbe..9ba5df73b 100644 --- a/api/migrations/0012_auto_20181016_0730.py +++ b/api/migrations/0012_auto_20181016_0730.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0011_auto_20181015_0934'), + ("api", "0011_auto_20181015_0934"), ] operations = [ migrations.AddField( - model_name='event', - name='hide_attached_field_reports', + model_name="event", + name="hide_attached_field_reports", field=models.BooleanField(default=False), ), ] diff --git a/api/migrations/0013_auto_20181120_1038.py b/api/migrations/0013_auto_20181120_1038.py index 22a358ea3..b01602387 100644 --- a/api/migrations/0013_auto_20181120_1038.py +++ b/api/migrations/0013_auto_20181120_1038.py @@ -1,19 +1,20 @@ # Generated by Django 2.0.8 on 2018-11-20 10:38 +from django.db import migrations, models + import api.models -from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ - ('api', '0012_auto_20181016_0730'), + ("api", "0012_auto_20181016_0730"), ] operations = [ migrations.AlterField( - model_name='situationreport', - name='visibility', + model_name="situationreport", + name="visibility", field=models.IntegerField(default=1, choices=api.models.VisibilityChoices.choices), ), ] diff --git a/api/migrations/0014_snippet_position.py b/api/migrations/0014_snippet_position.py index 0adf12d4a..aee14b2f9 100644 --- a/api/migrations/0014_snippet_position.py +++ b/api/migrations/0014_snippet_position.py @@ -1,40 +1,42 @@ # Generated by Django 2.0.12 on 2019-02-25 17:07 +from django.db import migrations, models + import api.models -from django.db import models, migrations + class Migration(migrations.Migration): dependencies = [ - ('api', '0013_auto_20181120_1038'), + ("api", "0013_auto_20181120_1038"), ] operations = [ migrations.AlterModelOptions( - name='snippet', - options={'ordering': ('position', 'id')}, + name="snippet", + options={"ordering": ("position", "id")}, ), migrations.AlterModelOptions( - name='countrysnippet', - options={'ordering': ('position', 'id')}, + name="countrysnippet", + options={"ordering": ("position", "id")}, ), migrations.AlterModelOptions( - name='regionsnippet', - options={'ordering': ('position', 'id')}, + name="regionsnippet", + options={"ordering": ("position", "id")}, ), migrations.AddField( - model_name='snippet', - name='position', + model_name="snippet", + name="position", field=models.IntegerField(default=3, choices=api.models.PositionType.choices), ), migrations.AddField( - model_name='countrysnippet', - name='position', + model_name="countrysnippet", + name="position", field=models.IntegerField(default=3, choices=api.models.PositionType.choices), ), migrations.AddField( - model_name='regionsnippet', - name='position', + model_name="regionsnippet", + name="position", field=models.IntegerField(default=3, choices=api.models.PositionType.choices), ), ] diff --git a/api/migrations/0015_auto_20190409_1540.py b/api/migrations/0015_auto_20190409_1540.py index d5e76446b..dabd86552 100644 --- a/api/migrations/0015_auto_20190409_1540.py +++ b/api/migrations/0015_auto_20190409_1540.py @@ -1,24 +1,24 @@ # Generated by Django 2.0.12 on 2019-04-09 15:40 -from django.db import models, migrations import tinymce.models +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0014_snippet_position'), + ("api", "0014_snippet_position"), ] operations = [ migrations.AlterField( - model_name='event', - name='summary', - field=tinymce.models.HTMLField(blank=True, default=''), + model_name="event", + name="summary", + field=tinymce.models.HTMLField(blank=True, default=""), ), migrations.AlterField( - model_name='fieldreport', - name='description', - field=tinymce.models.HTMLField(blank=True, default=''), + model_name="fieldreport", + name="description", + field=tinymce.models.HTMLField(blank=True, default=""), ), ] diff --git a/api/migrations/0016_auto_20190424_1224.py b/api/migrations/0016_auto_20190424_1224.py index 78cc4b865..33092110b 100644 --- a/api/migrations/0016_auto_20190424_1224.py +++ b/api/migrations/0016_auto_20190424_1224.py @@ -6,33 +6,33 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0015_auto_20190409_1540'), + ("api", "0015_auto_20190409_1540"), ] operations = [ migrations.AddField( - model_name='event', - name='num_dead', + model_name="event", + name="num_dead", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='event', - name='num_displaced', + model_name="event", + name="num_displaced", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='event', - name='num_injured', + model_name="event", + name="num_injured", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='event', - name='num_missing', + model_name="event", + name="num_missing", field=models.IntegerField(blank=True, null=True), ), migrations.RenameField( - model_name='event', - old_name='alert_level', - new_name='ifrc_severity_level', + model_name="event", + old_name="alert_level", + new_name="ifrc_severity_level", ), ] diff --git a/api/migrations/0017_auto_20190424_1508.py b/api/migrations/0017_auto_20190424_1508.py index 5293de46c..78cac3c69 100644 --- a/api/migrations/0017_auto_20190424_1508.py +++ b/api/migrations/0017_auto_20190424_1508.py @@ -1,19 +1,20 @@ # Generated by Django 2.0.12 on 2019-04-24 15:08 +from django.db import migrations, models + import api.models -from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ - ('api', '0016_auto_20190424_1224'), + ("api", "0016_auto_20190424_1224"), ] operations = [ migrations.AlterField( - model_name='event', - name='ifrc_severity_level', - field=models.IntegerField(default=0, choices=api.models.AlertLevel.choices, verbose_name='IFRC Severity level'), + model_name="event", + name="ifrc_severity_level", + field=models.IntegerField(default=0, choices=api.models.AlertLevel.choices, verbose_name="IFRC Severity level"), ), ] diff --git a/api/migrations/0018_country_logo.py b/api/migrations/0018_country_logo.py index f1859cdbd..67b1d87c9 100644 --- a/api/migrations/0018_country_logo.py +++ b/api/migrations/0018_country_logo.py @@ -1,18 +1,20 @@ # Generated by Django 2.0.12 on 2019-06-24 15:36 from django.db import migrations, models + import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0017_auto_20190424_1508'), + ("api", "0017_auto_20190424_1508"), ] operations = [ migrations.AddField( - model_name='country', - name='logo', - field=models.FileField(blank=True, null=True, upload_to=api.models.logo_document_path) + model_name="country", + name="logo", + field=models.FileField(blank=True, null=True, upload_to=api.models.logo_document_path), ), ] diff --git a/api/migrations/0019_auto_20190626_1420.py b/api/migrations/0019_auto_20190626_1420.py index 78152a3a6..715f5cb8c 100644 --- a/api/migrations/0019_auto_20190626_1420.py +++ b/api/migrations/0019_auto_20190626_1420.py @@ -1,20 +1,26 @@ # Generated by Django 2.0.12 on 2019-06-26 14:20 -import api.models import django.core.validators from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0018_country_logo'), + ("api", "0018_country_logo"), ] operations = [ migrations.AlterField( - model_name='country', - name='logo', - field=models.FileField(blank=True, null=True, upload_to=api.models.logo_document_path, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'jpg', 'gif'])]), + model_name="country", + name="logo", + field=models.FileField( + blank=True, + null=True, + upload_to=api.models.logo_document_path, + validators=[django.core.validators.FileExtensionValidator(allowed_extensions=["png", "jpg", "gif"])], + ), ), ] diff --git a/api/migrations/0020_auto_20190703_0614.py b/api/migrations/0020_auto_20190703_0614.py index 981a6697c..50ceaa39d 100644 --- a/api/migrations/0020_auto_20190703_0614.py +++ b/api/migrations/0020_auto_20190703_0614.py @@ -1,24 +1,25 @@ # Generated by Django 2.0.12 on 2019-07-03 06:14 -import api.models from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0019_auto_20190626_1420'), + ("api", "0019_auto_20190626_1420"), ] operations = [ migrations.AddField( - model_name='country', - name='record_type', - field=models.IntegerField(default=1, choices=api.models.CountryType.choices, help_text='Type of entity'), + model_name="country", + name="record_type", + field=models.IntegerField(default=1, choices=api.models.CountryType.choices, help_text="Type of entity"), ), migrations.AddField( - model_name='district', - name='is_enclave', - field=models.BooleanField(default=False, help_text='Is it an enclave away from parent country?'), + model_name="district", + name="is_enclave", + field=models.BooleanField(default=False, help_text="Is it an enclave away from parent country?"), ), ] diff --git a/api/migrations/0021_auto_20190718_1414.py b/api/migrations/0021_auto_20190718_1414.py index 65dd9867e..a2b7df769 100644 --- a/api/migrations/0021_auto_20190718_1414.py +++ b/api/migrations/0021_auto_20190718_1414.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0020_auto_20190703_0614'), + ("api", "0020_auto_20190703_0614"), ] operations = [ migrations.AddField( - model_name='appeal', - name='previous_update', + model_name="appeal", + name="previous_update", field=models.DateTimeField(blank=True, null=True), ), migrations.AddField( - model_name='event', - name='previous_update', + model_name="event", + name="previous_update", field=models.DateTimeField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='previous_update', + model_name="fieldreport", + name="previous_update", field=models.DateTimeField(blank=True, null=True), ), ] diff --git a/api/migrations/0022_appeal_real_data_update.py b/api/migrations/0022_appeal_real_data_update.py index 4c3a65183..18883f902 100644 --- a/api/migrations/0022_appeal_real_data_update.py +++ b/api/migrations/0022_appeal_real_data_update.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0021_auto_20190718_1414'), + ("api", "0021_auto_20190718_1414"), ] operations = [ migrations.AddField( - model_name='appeal', - name='real_data_update', + model_name="appeal", + name="real_data_update", field=models.DateTimeField(blank=True, null=True), ), ] diff --git a/api/migrations/0023_auto_20190724_0841.py b/api/migrations/0023_auto_20190724_0841.py index e88eefb68..614417d13 100644 --- a/api/migrations/0023_auto_20190724_0841.py +++ b/api/migrations/0023_auto_20190724_0841.py @@ -6,43 +6,43 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0022_appeal_real_data_update'), + ("api", "0022_appeal_real_data_update"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='other_num_affected', + model_name="fieldreport", + name="other_num_affected", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_num_assisted', + model_name="fieldreport", + name="other_num_assisted", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_num_dead', + model_name="fieldreport", + name="other_num_dead", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_num_displaced', + model_name="fieldreport", + name="other_num_displaced", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_num_injured', + model_name="fieldreport", + name="other_num_injured", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_num_missing', + model_name="fieldreport", + name="other_num_missing", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='start_date', + model_name="fieldreport", + name="start_date", field=models.DateTimeField(blank=True, null=True), ), ] diff --git a/api/migrations/0024_eventcontact_phone.py b/api/migrations/0024_eventcontact_phone.py index 005facc22..1d95767d2 100644 --- a/api/migrations/0024_eventcontact_phone.py +++ b/api/migrations/0024_eventcontact_phone.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0023_auto_20190724_0841'), + ("api", "0023_auto_20190724_0841"), ] operations = [ migrations.AddField( - model_name='eventcontact', - name='phone', + model_name="eventcontact", + name="phone", field=models.CharField(blank=True, max_length=100, null=True), ), ] diff --git a/api/migrations/0025_fieldreportcontact_phone.py b/api/migrations/0025_fieldreportcontact_phone.py index 82aa99b56..848fdda6a 100644 --- a/api/migrations/0025_fieldreportcontact_phone.py +++ b/api/migrations/0025_fieldreportcontact_phone.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0024_eventcontact_phone'), + ("api", "0024_eventcontact_phone"), ] operations = [ migrations.AddField( - model_name='fieldreportcontact', - name='phone', + model_name="fieldreportcontact", + name="phone", field=models.CharField(blank=True, max_length=50), ), ] diff --git a/api/migrations/0026_auto_20191120_1026.py b/api/migrations/0026_auto_20191120_1026.py index 89cd1456b..6d4930ead 100644 --- a/api/migrations/0026_auto_20191120_1026.py +++ b/api/migrations/0026_auto_20191120_1026.py @@ -7,18 +7,25 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0025_fieldreportcontact_phone'), + ("api", "0025_fieldreportcontact_phone"), ] operations = [ migrations.AddField( - model_name='action', - name='field_report_type', - field=models.CharField(blank=True, choices=[('EVT', 'Event'), ('EW', 'Early Warning')], max_length=4), + model_name="action", + name="field_report_type", + field=models.CharField(blank=True, choices=[("EVT", "Event"), ("EW", "Early Warning")], max_length=4), ), migrations.AddField( - model_name='action', - name='organizations', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'Foreign Society'), ('FDRN', 'Federation')], max_length=4), blank=True, default=list, size=None), + model_name="action", + name="organizations", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "Foreign Society"), ("FDRN", "Federation")], max_length=4 + ), + blank=True, + default=list, + size=None, + ), ), ] diff --git a/api/migrations/0027_auto_20191120_1223.py b/api/migrations/0027_auto_20191120_1223.py index 0ff8b0341..9dfd6f2ca 100644 --- a/api/migrations/0027_auto_20191120_1223.py +++ b/api/migrations/0027_auto_20191120_1223.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0026_auto_20191120_1026'), + ("api", "0026_auto_20191120_1026"), ] operations = [ migrations.AlterField( - model_name='action', - name='field_report_type', - field=models.CharField(blank=True, choices=[('EVT', 'Event'), ('EW', 'Early Warning')], default='EVT', max_length=4), + model_name="action", + name="field_report_type", + field=models.CharField(blank=True, choices=[("EVT", "Event"), ("EW", "Early Warning")], default="EVT", max_length=4), ), ] diff --git a/api/migrations/0027_auto_20191125_0939.py b/api/migrations/0027_auto_20191125_0939.py index 588b680a2..85482671a 100644 --- a/api/migrations/0027_auto_20191125_0939.py +++ b/api/migrations/0027_auto_20191125_0939.py @@ -6,53 +6,53 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0026_auto_20191120_1026'), + ("api", "0026_auto_20191120_1026"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='affected_pop_centres', + model_name="fieldreport", + name="affected_pop_centres", field=models.CharField(blank=True, max_length=512, null=True), ), migrations.AddField( - model_name='fieldreport', - name='gov_affected_pop_centres', + model_name="fieldreport", + name="gov_affected_pop_centres", field=models.CharField(blank=True, max_length=512, null=True), ), migrations.AddField( - model_name='fieldreport', - name='gov_num_highest_risk', + model_name="fieldreport", + name="gov_num_highest_risk", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='gov_potentially_affected', + model_name="fieldreport", + name="gov_potentially_affected", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='num_highest_risk', + model_name="fieldreport", + name="num_highest_risk", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='num_potentially_affected', + model_name="fieldreport", + name="num_potentially_affected", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_affected_pop_centres', + model_name="fieldreport", + name="other_affected_pop_centres", field=models.CharField(blank=True, max_length=512, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_num_highest_risk', + model_name="fieldreport", + name="other_num_highest_risk", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_potentially_affected', + model_name="fieldreport", + name="other_potentially_affected", field=models.IntegerField(blank=True, null=True), ), ] diff --git a/api/migrations/0028_event_is_featured_region.py b/api/migrations/0028_event_is_featured_region.py index f33cb1464..a708899d0 100644 --- a/api/migrations/0028_event_is_featured_region.py +++ b/api/migrations/0028_event_is_featured_region.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0027_auto_20191120_1223'), + ("api", "0027_auto_20191120_1223"), ] operations = [ migrations.AddField( - model_name='event', - name='is_featured_region', + model_name="event", + name="is_featured_region", field=models.BooleanField(default=False), ), ] diff --git a/api/migrations/0028_merge_20191125_0949.py b/api/migrations/0028_merge_20191125_0949.py index f58d71893..5a9c8383e 100644 --- a/api/migrations/0028_merge_20191125_0949.py +++ b/api/migrations/0028_merge_20191125_0949.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0027_auto_20191125_0939'), - ('api', '0027_auto_20191120_1223'), + ("api", "0027_auto_20191125_0939"), + ("api", "0027_auto_20191120_1223"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0029_auto_20191125_0949.py b/api/migrations/0029_auto_20191125_0949.py index 386924879..9028371d3 100644 --- a/api/migrations/0029_auto_20191125_0949.py +++ b/api/migrations/0029_auto_20191125_0949.py @@ -1,34 +1,35 @@ # Generated by Django 2.0.12 on 2019-11-25 09:49 -import api.models from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0028_merge_20191125_0949'), + ("api", "0028_merge_20191125_0949"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='forecast_based_action', + model_name="fieldreport", + name="forecast_based_action", field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices), ), migrations.AddField( - model_name='fieldreport', - name='forecast_based_action_amount', + model_name="fieldreport", + name="forecast_based_action_amount", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='imminent_dref', + model_name="fieldreport", + name="imminent_dref", field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices), ), migrations.AddField( - model_name='fieldreport', - name='imminent_dref_amount', + model_name="fieldreport", + name="imminent_dref_amount", field=models.IntegerField(blank=True, null=True), ), ] diff --git a/api/migrations/0030_fieldreport_other_sources.py b/api/migrations/0030_fieldreport_other_sources.py index 0009ce5e9..f8dd269be 100644 --- a/api/migrations/0030_fieldreport_other_sources.py +++ b/api/migrations/0030_fieldreport_other_sources.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0029_auto_20191125_0949'), + ("api", "0029_auto_20191125_0949"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='other_sources', - field=models.TextField(blank=True, default=''), + model_name="fieldreport", + name="other_sources", + field=models.TextField(blank=True, default=""), ), ] diff --git a/api/migrations/0031_merge_20191127_0832.py b/api/migrations/0031_merge_20191127_0832.py index 5fa7eca95..f7d10b737 100644 --- a/api/migrations/0031_merge_20191127_0832.py +++ b/api/migrations/0031_merge_20191127_0832.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0028_event_is_featured_region'), - ('api', '0030_fieldreport_other_sources'), + ("api", "0028_event_is_featured_region"), + ("api", "0030_fieldreport_other_sources"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0032_auto_20191127_0847.py b/api/migrations/0032_auto_20191127_0847.py index 9518a02eb..4efe63465 100644 --- a/api/migrations/0032_auto_20191127_0847.py +++ b/api/migrations/0032_auto_20191127_0847.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0031_merge_20191127_0832'), + ("api", "0031_merge_20191127_0832"), ] operations = [ migrations.AlterField( - model_name='event', - name='is_featured', - field=models.BooleanField(default=False, verbose_name='Is Featured on Home Page'), + model_name="event", + name="is_featured", + field=models.BooleanField(default=False, verbose_name="Is Featured on Home Page"), ), migrations.AlterField( - model_name='event', - name='is_featured_region', - field=models.BooleanField(default=False, verbose_name='Is Featured on Region Page'), + model_name="event", + name="is_featured_region", + field=models.BooleanField(default=False, verbose_name="Is Featured on Region Page"), ), ] diff --git a/api/migrations/0033_auto_20191127_0850.py b/api/migrations/0033_auto_20191127_0850.py index 9f8b4adf4..f0fb40777 100644 --- a/api/migrations/0033_auto_20191127_0850.py +++ b/api/migrations/0033_auto_20191127_0850.py @@ -7,17 +7,21 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0032_auto_20191127_0847'), + ("api", "0032_auto_20191127_0847"), ] operations = [ migrations.RemoveField( - model_name='action', - name='field_report_type', + model_name="action", + name="field_report_type", ), migrations.AddField( - model_name='action', - name='field_report_types', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('EVT', 'Event'), ('EW', 'Early Warning')], max_length=4), default=['EVT'], size=None), + model_name="action", + name="field_report_types", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(choices=[("EVT", "Event"), ("EW", "Early Warning")], max_length=4), + default=["EVT"], + size=None, + ), ), ] diff --git a/api/migrations/0034_auto_20191128_0846.py b/api/migrations/0034_auto_20191128_0846.py index fc339da13..0b2a8df30 100644 --- a/api/migrations/0034_auto_20191128_0846.py +++ b/api/migrations/0034_auto_20191128_0846.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0033_auto_20191127_0850'), + ("api", "0033_auto_20191127_0850"), ] operations = [ migrations.RenameField( - model_name='fieldreport', - old_name='gov_potentially_affected', - new_name='gov_num_potentially_affected', + model_name="fieldreport", + old_name="gov_potentially_affected", + new_name="gov_num_potentially_affected", ), migrations.RenameField( - model_name='fieldreport', - old_name='other_potentially_affected', - new_name='other_num_potentially_affected', + model_name="fieldreport", + old_name="other_potentially_affected", + new_name="other_num_potentially_affected", ), ] diff --git a/api/migrations/0035_fieldreport_ns_request_assistance.py b/api/migrations/0035_fieldreport_ns_request_assistance.py index 9f9c69f14..ec4ccf53a 100644 --- a/api/migrations/0035_fieldreport_ns_request_assistance.py +++ b/api/migrations/0035_fieldreport_ns_request_assistance.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0034_auto_20191128_0846'), + ("api", "0034_auto_20191128_0846"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='ns_request_assistance', + model_name="fieldreport", + name="ns_request_assistance", field=models.BooleanField(default=False), ), ] diff --git a/api/migrations/0036_auto_20191215_0615.py b/api/migrations/0036_auto_20191215_0615.py index c3829f98d..5832f71ac 100644 --- a/api/migrations/0036_auto_20191215_0615.py +++ b/api/migrations/0036_auto_20191215_0615.py @@ -6,33 +6,33 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0035_fieldreport_ns_request_assistance'), + ("api", "0035_fieldreport_ns_request_assistance"), ] operations = [ migrations.AddField( - model_name='country', - name='iso3', + model_name="country", + name="iso3", field=models.CharField(max_length=3, null=True), ), migrations.AddField( - model_name='country', - name='wb_population', - field=models.PositiveIntegerField(blank=True, help_text='Population data from WB API', null=True), + model_name="country", + name="wb_population", + field=models.PositiveIntegerField(blank=True, help_text="Population data from WB API", null=True), ), migrations.AddField( - model_name='country', - name='wb_year', - field=models.CharField(blank=True, help_text='Population data year from WB API', max_length=4, null=True), + model_name="country", + name="wb_year", + field=models.CharField(blank=True, help_text="Population data year from WB API", max_length=4, null=True), ), migrations.AddField( - model_name='district', - name='wb_population', - field=models.PositiveIntegerField(blank=True, help_text='Population data from WB API', null=True), + model_name="district", + name="wb_population", + field=models.PositiveIntegerField(blank=True, help_text="Population data from WB API", null=True), ), migrations.AddField( - model_name='district', - name='wb_year', - field=models.CharField(blank=True, help_text='Population data year from WB API', max_length=4, null=True), + model_name="district", + name="wb_year", + field=models.CharField(blank=True, help_text="Population data year from WB API", max_length=4, null=True), ), ] diff --git a/api/migrations/0036_emergencyoperationsdataset.py b/api/migrations/0036_emergencyoperationsdataset.py index 5992f2b59..45722e985 100644 --- a/api/migrations/0036_emergencyoperationsdataset.py +++ b/api/migrations/0036_emergencyoperationsdataset.py @@ -6,120 +6,120 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0036_auto_20191215_0615'), + ("api", "0036_auto_20191215_0615"), ] operations = [ migrations.CreateModel( - name='EmergencyOperationsDataset', + name="EmergencyOperationsDataset", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_validated', models.BooleanField(default=False, help_text='Did anyone check the editable data?')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('raw_file_name', models.TextField(blank=True, null=True)), - ('raw_file_url', models.TextField(blank=True, null=True)), - ('raw_appeal_launch_date', models.TextField(blank=True, null=True)), - ('raw_appeal_number', models.TextField(blank=True, null=True)), - ('raw_category_allocated', models.TextField(blank=True, null=True)), - ('raw_date_of_issue', models.TextField(blank=True, null=True)), - ('raw_dref_allocated', models.TextField(blank=True, null=True)), - ('raw_expected_end_date', models.TextField(blank=True, null=True)), - ('raw_expected_time_frame', models.TextField(blank=True, null=True)), - ('raw_glide_number', models.TextField(blank=True, null=True)), - ('raw_num_of_people_affected', models.TextField(blank=True, null=True)), - ('raw_num_of_people_to_be_assisted', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_female', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_male', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_people_reached', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_people_targeted', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_requirements', models.TextField(blank=True, null=True)), - ('raw_health_female', models.TextField(blank=True, null=True)), - ('raw_health_male', models.TextField(blank=True, null=True)), - ('raw_health_people_reached', models.TextField(blank=True, null=True)), - ('raw_health_people_targeted', models.TextField(blank=True, null=True)), - ('raw_health_requirements', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_female', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_male', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_people_reached', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_people_targeted', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_requirements', models.TextField(blank=True, null=True)), - ('raw_migration_female', models.TextField(blank=True, null=True)), - ('raw_migration_male', models.TextField(blank=True, null=True)), - ('raw_migration_people_reached', models.TextField(blank=True, null=True)), - ('raw_migration_people_targeted', models.TextField(blank=True, null=True)), - ('raw_migration_requirements', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_female', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_male', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_people_reached', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_people_targeted', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_requirements', models.TextField(blank=True, null=True)), - ('raw_shelter_female', models.TextField(blank=True, null=True)), - ('raw_shelter_male', models.TextField(blank=True, null=True)), - ('raw_shelter_people_reached', models.TextField(blank=True, null=True)), - ('raw_shelter_people_targeted', models.TextField(blank=True, null=True)), - ('raw_shelter_requirements', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_female', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_male', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_people_reached', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_people_targeted', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_requirements', models.TextField(blank=True, null=True)), - ('raw_education_female', models.TextField(blank=True, null=True)), - ('raw_education_male', models.TextField(blank=True, null=True)), - ('raw_education_people_reached', models.TextField(blank=True, null=True)), - ('raw_education_people_targeted', models.TextField(blank=True, null=True)), - ('raw_education_requirements', models.TextField(blank=True, null=True)), - ('file_name', models.TextField(blank=True, null=True)), - ('appeal_launch_date', models.DateField(blank=True, null=True)), - ('appeal_number', models.CharField(blank=True, max_length=20, null=True)), - ('category_allocated', models.TextField(blank=True, null=True)), - ('date_of_issue', models.DateField(blank=True, null=True)), - ('dref_allocated', models.TextField(blank=True, null=True)), - ('expected_end_date', models.DateField(blank=True, null=True)), - ('expected_time_frame', models.TextField(blank=True, null=True)), - ('glide_number', models.CharField(blank=True, max_length=18, null=True)), - ('num_of_people_affected', models.IntegerField(blank=True, null=True)), - ('num_of_people_to_be_assisted', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_female', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_male', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_people_reached', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_people_targeted', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_requirements', models.IntegerField(blank=True, null=True)), - ('health_female', models.IntegerField(blank=True, null=True)), - ('health_male', models.IntegerField(blank=True, null=True)), - ('health_people_reached', models.IntegerField(blank=True, null=True)), - ('health_people_targeted', models.IntegerField(blank=True, null=True)), - ('health_requirements', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_female', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_male', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_people_reached', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_people_targeted', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_requirements', models.IntegerField(blank=True, null=True)), - ('migration_female', models.IntegerField(blank=True, null=True)), - ('migration_male', models.IntegerField(blank=True, null=True)), - ('migration_people_reached', models.IntegerField(blank=True, null=True)), - ('migration_people_targeted', models.IntegerField(blank=True, null=True)), - ('migration_requirements', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_female', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_male', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_people_reached', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_people_targeted', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_requirements', models.IntegerField(blank=True, null=True)), - ('shelter_female', models.IntegerField(blank=True, null=True)), - ('shelter_male', models.IntegerField(blank=True, null=True)), - ('shelter_people_reached', models.IntegerField(blank=True, null=True)), - ('shelter_people_targeted', models.IntegerField(blank=True, null=True)), - ('shelter_requirements', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_female', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_male', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_people_reached', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_people_targeted', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_requirements', models.IntegerField(blank=True, null=True)), - ('education_female', models.IntegerField(blank=True, null=True)), - ('education_male', models.IntegerField(blank=True, null=True)), - ('education_people_reached', models.IntegerField(blank=True, null=True)), - ('education_people_targeted', models.IntegerField(blank=True, null=True)), - ('education_requirements', models.IntegerField(blank=True, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("is_validated", models.BooleanField(default=False, help_text="Did anyone check the editable data?")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("modified_at", models.DateTimeField(auto_now=True)), + ("raw_file_name", models.TextField(blank=True, null=True)), + ("raw_file_url", models.TextField(blank=True, null=True)), + ("raw_appeal_launch_date", models.TextField(blank=True, null=True)), + ("raw_appeal_number", models.TextField(blank=True, null=True)), + ("raw_category_allocated", models.TextField(blank=True, null=True)), + ("raw_date_of_issue", models.TextField(blank=True, null=True)), + ("raw_dref_allocated", models.TextField(blank=True, null=True)), + ("raw_expected_end_date", models.TextField(blank=True, null=True)), + ("raw_expected_time_frame", models.TextField(blank=True, null=True)), + ("raw_glide_number", models.TextField(blank=True, null=True)), + ("raw_num_of_people_affected", models.TextField(blank=True, null=True)), + ("raw_num_of_people_to_be_assisted", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_female", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_male", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_people_reached", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_people_targeted", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_requirements", models.TextField(blank=True, null=True)), + ("raw_health_female", models.TextField(blank=True, null=True)), + ("raw_health_male", models.TextField(blank=True, null=True)), + ("raw_health_people_reached", models.TextField(blank=True, null=True)), + ("raw_health_people_targeted", models.TextField(blank=True, null=True)), + ("raw_health_requirements", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_female", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_male", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_people_reached", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_people_targeted", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_requirements", models.TextField(blank=True, null=True)), + ("raw_migration_female", models.TextField(blank=True, null=True)), + ("raw_migration_male", models.TextField(blank=True, null=True)), + ("raw_migration_people_reached", models.TextField(blank=True, null=True)), + ("raw_migration_people_targeted", models.TextField(blank=True, null=True)), + ("raw_migration_requirements", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_female", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_male", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_people_reached", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_people_targeted", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_requirements", models.TextField(blank=True, null=True)), + ("raw_shelter_female", models.TextField(blank=True, null=True)), + ("raw_shelter_male", models.TextField(blank=True, null=True)), + ("raw_shelter_people_reached", models.TextField(blank=True, null=True)), + ("raw_shelter_people_targeted", models.TextField(blank=True, null=True)), + ("raw_shelter_requirements", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_female", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_male", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_people_reached", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_people_targeted", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_requirements", models.TextField(blank=True, null=True)), + ("raw_education_female", models.TextField(blank=True, null=True)), + ("raw_education_male", models.TextField(blank=True, null=True)), + ("raw_education_people_reached", models.TextField(blank=True, null=True)), + ("raw_education_people_targeted", models.TextField(blank=True, null=True)), + ("raw_education_requirements", models.TextField(blank=True, null=True)), + ("file_name", models.TextField(blank=True, null=True)), + ("appeal_launch_date", models.DateField(blank=True, null=True)), + ("appeal_number", models.CharField(blank=True, max_length=20, null=True)), + ("category_allocated", models.TextField(blank=True, null=True)), + ("date_of_issue", models.DateField(blank=True, null=True)), + ("dref_allocated", models.TextField(blank=True, null=True)), + ("expected_end_date", models.DateField(blank=True, null=True)), + ("expected_time_frame", models.TextField(blank=True, null=True)), + ("glide_number", models.CharField(blank=True, max_length=18, null=True)), + ("num_of_people_affected", models.IntegerField(blank=True, null=True)), + ("num_of_people_to_be_assisted", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_female", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_male", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_people_reached", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_people_targeted", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_requirements", models.IntegerField(blank=True, null=True)), + ("health_female", models.IntegerField(blank=True, null=True)), + ("health_male", models.IntegerField(blank=True, null=True)), + ("health_people_reached", models.IntegerField(blank=True, null=True)), + ("health_people_targeted", models.IntegerField(blank=True, null=True)), + ("health_requirements", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_female", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_male", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_people_reached", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_people_targeted", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_requirements", models.IntegerField(blank=True, null=True)), + ("migration_female", models.IntegerField(blank=True, null=True)), + ("migration_male", models.IntegerField(blank=True, null=True)), + ("migration_people_reached", models.IntegerField(blank=True, null=True)), + ("migration_people_targeted", models.IntegerField(blank=True, null=True)), + ("migration_requirements", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_female", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_male", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_people_reached", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_people_targeted", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_requirements", models.IntegerField(blank=True, null=True)), + ("shelter_female", models.IntegerField(blank=True, null=True)), + ("shelter_male", models.IntegerField(blank=True, null=True)), + ("shelter_people_reached", models.IntegerField(blank=True, null=True)), + ("shelter_people_targeted", models.IntegerField(blank=True, null=True)), + ("shelter_requirements", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_female", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_male", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_people_reached", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_people_targeted", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_requirements", models.IntegerField(blank=True, null=True)), + ("education_female", models.IntegerField(blank=True, null=True)), + ("education_male", models.IntegerField(blank=True, null=True)), + ("education_people_reached", models.IntegerField(blank=True, null=True)), + ("education_people_targeted", models.IntegerField(blank=True, null=True)), + ("education_requirements", models.IntegerField(blank=True, null=True)), ], ), ] diff --git a/api/migrations/0037_auto_20200109_0902.py b/api/migrations/0037_auto_20200109_0902.py index 5c51b2276..5e7d04102 100644 --- a/api/migrations/0037_auto_20200109_0902.py +++ b/api/migrations/0037_auto_20200109_0902.py @@ -6,304 +6,304 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0036_emergencyoperationsdataset'), + ("api", "0036_emergencyoperationsdataset"), ] operations = [ migrations.CreateModel( - name='EmergencyOperationsEA', + name="EmergencyOperationsEA", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_validated', models.BooleanField(default=False, help_text='Did anyone check the editable data?')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('raw_file_name', models.TextField(blank=True, null=True)), - ('raw_file_url', models.TextField(blank=True, null=True)), - ('raw_appeal_ends', models.TextField(blank=True, null=True)), - ('raw_appeal_launch_date', models.TextField(blank=True, null=True)), - ('raw_appeal_number', models.TextField(blank=True, null=True)), - ('raw_current_operation_budget', models.TextField(blank=True, null=True)), - ('raw_dref_allocated', models.TextField(blank=True, null=True)), - ('raw_glide_number', models.TextField(blank=True, null=True)), - ('raw_num_of_people_to_be_assisted', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_female', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_male', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_people_reached', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_people_targeted', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_requirements', models.TextField(blank=True, null=True)), - ('raw_health_female', models.TextField(blank=True, null=True)), - ('raw_health_male', models.TextField(blank=True, null=True)), - ('raw_health_people_reached', models.TextField(blank=True, null=True)), - ('raw_health_people_targeted', models.TextField(blank=True, null=True)), - ('raw_health_requirements', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_female', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_male', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_people_reached', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_people_targeted', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_requirements', models.TextField(blank=True, null=True)), - ('raw_migration_female', models.TextField(blank=True, null=True)), - ('raw_migration_male', models.TextField(blank=True, null=True)), - ('raw_migration_people_reached', models.TextField(blank=True, null=True)), - ('raw_migration_people_targeted', models.TextField(blank=True, null=True)), - ('raw_migration_requirements', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_female', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_male', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_people_reached', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_people_targeted', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_requirements', models.TextField(blank=True, null=True)), - ('raw_shelter_female', models.TextField(blank=True, null=True)), - ('raw_shelter_male', models.TextField(blank=True, null=True)), - ('raw_shelter_people_reached', models.TextField(blank=True, null=True)), - ('raw_shelter_people_targeted', models.TextField(blank=True, null=True)), - ('raw_shelter_requirements', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_female', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_male', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_people_reached', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_people_targeted', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_requirements', models.TextField(blank=True, null=True)), - ('file_name', models.TextField(blank=True, null=True)), - ('appeal_ends', models.DateField(blank=True, null=True)), - ('appeal_launch_date', models.DateField(blank=True, null=True)), - ('appeal_number', models.CharField(blank=True, max_length=20, null=True)), - ('current_operation_budget', models.IntegerField(blank=True, null=True)), - ('dref_allocated', models.IntegerField(blank=True, null=True)), - ('glide_number', models.CharField(blank=True, max_length=18, null=True)), - ('num_of_people_to_be_assisted', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_female', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_male', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_people_reached', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_people_targeted', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_requirements', models.IntegerField(blank=True, null=True)), - ('health_female', models.IntegerField(blank=True, null=True)), - ('health_male', models.IntegerField(blank=True, null=True)), - ('health_people_reached', models.IntegerField(blank=True, null=True)), - ('health_people_targeted', models.IntegerField(blank=True, null=True)), - ('health_requirements', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_female', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_male', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_people_reached', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_people_targeted', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_requirements', models.IntegerField(blank=True, null=True)), - ('migration_female', models.IntegerField(blank=True, null=True)), - ('migration_male', models.IntegerField(blank=True, null=True)), - ('migration_people_reached', models.IntegerField(blank=True, null=True)), - ('migration_people_targeted', models.IntegerField(blank=True, null=True)), - ('migration_requirements', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_female', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_male', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_people_reached', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_people_targeted', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_requirements', models.IntegerField(blank=True, null=True)), - ('shelter_female', models.IntegerField(blank=True, null=True)), - ('shelter_male', models.IntegerField(blank=True, null=True)), - ('shelter_people_reached', models.IntegerField(blank=True, null=True)), - ('shelter_people_targeted', models.IntegerField(blank=True, null=True)), - ('shelter_requirements', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_female', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_male', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_people_reached', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_people_targeted', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_requirements', models.IntegerField(blank=True, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("is_validated", models.BooleanField(default=False, help_text="Did anyone check the editable data?")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("modified_at", models.DateTimeField(auto_now=True)), + ("raw_file_name", models.TextField(blank=True, null=True)), + ("raw_file_url", models.TextField(blank=True, null=True)), + ("raw_appeal_ends", models.TextField(blank=True, null=True)), + ("raw_appeal_launch_date", models.TextField(blank=True, null=True)), + ("raw_appeal_number", models.TextField(blank=True, null=True)), + ("raw_current_operation_budget", models.TextField(blank=True, null=True)), + ("raw_dref_allocated", models.TextField(blank=True, null=True)), + ("raw_glide_number", models.TextField(blank=True, null=True)), + ("raw_num_of_people_to_be_assisted", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_female", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_male", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_people_reached", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_people_targeted", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_requirements", models.TextField(blank=True, null=True)), + ("raw_health_female", models.TextField(blank=True, null=True)), + ("raw_health_male", models.TextField(blank=True, null=True)), + ("raw_health_people_reached", models.TextField(blank=True, null=True)), + ("raw_health_people_targeted", models.TextField(blank=True, null=True)), + ("raw_health_requirements", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_female", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_male", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_people_reached", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_people_targeted", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_requirements", models.TextField(blank=True, null=True)), + ("raw_migration_female", models.TextField(blank=True, null=True)), + ("raw_migration_male", models.TextField(blank=True, null=True)), + ("raw_migration_people_reached", models.TextField(blank=True, null=True)), + ("raw_migration_people_targeted", models.TextField(blank=True, null=True)), + ("raw_migration_requirements", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_female", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_male", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_people_reached", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_people_targeted", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_requirements", models.TextField(blank=True, null=True)), + ("raw_shelter_female", models.TextField(blank=True, null=True)), + ("raw_shelter_male", models.TextField(blank=True, null=True)), + ("raw_shelter_people_reached", models.TextField(blank=True, null=True)), + ("raw_shelter_people_targeted", models.TextField(blank=True, null=True)), + ("raw_shelter_requirements", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_female", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_male", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_people_reached", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_people_targeted", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_requirements", models.TextField(blank=True, null=True)), + ("file_name", models.TextField(blank=True, null=True)), + ("appeal_ends", models.DateField(blank=True, null=True)), + ("appeal_launch_date", models.DateField(blank=True, null=True)), + ("appeal_number", models.CharField(blank=True, max_length=20, null=True)), + ("current_operation_budget", models.IntegerField(blank=True, null=True)), + ("dref_allocated", models.IntegerField(blank=True, null=True)), + ("glide_number", models.CharField(blank=True, max_length=18, null=True)), + ("num_of_people_to_be_assisted", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_female", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_male", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_people_reached", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_people_targeted", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_requirements", models.IntegerField(blank=True, null=True)), + ("health_female", models.IntegerField(blank=True, null=True)), + ("health_male", models.IntegerField(blank=True, null=True)), + ("health_people_reached", models.IntegerField(blank=True, null=True)), + ("health_people_targeted", models.IntegerField(blank=True, null=True)), + ("health_requirements", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_female", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_male", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_people_reached", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_people_targeted", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_requirements", models.IntegerField(blank=True, null=True)), + ("migration_female", models.IntegerField(blank=True, null=True)), + ("migration_male", models.IntegerField(blank=True, null=True)), + ("migration_people_reached", models.IntegerField(blank=True, null=True)), + ("migration_people_targeted", models.IntegerField(blank=True, null=True)), + ("migration_requirements", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_female", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_male", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_people_reached", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_people_targeted", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_requirements", models.IntegerField(blank=True, null=True)), + ("shelter_female", models.IntegerField(blank=True, null=True)), + ("shelter_male", models.IntegerField(blank=True, null=True)), + ("shelter_people_reached", models.IntegerField(blank=True, null=True)), + ("shelter_people_targeted", models.IntegerField(blank=True, null=True)), + ("shelter_requirements", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_female", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_male", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_people_reached", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_people_targeted", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_requirements", models.IntegerField(blank=True, null=True)), ], options={ - 'verbose_name': 'Emergency Operations Emergency Appeal', - 'verbose_name_plural': 'Emergency Operations Emergency Appeals', + "verbose_name": "Emergency Operations Emergency Appeal", + "verbose_name_plural": "Emergency Operations Emergency Appeals", }, ), migrations.CreateModel( - name='EmergencyOperationsFR', + name="EmergencyOperationsFR", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_validated', models.BooleanField(default=False, help_text='Did anyone check the editable data?')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('raw_file_name', models.TextField(blank=True, null=True)), - ('raw_file_url', models.TextField(blank=True, null=True)), - ('raw_appeal_number', models.TextField(blank=True, null=True)), - ('raw_date_of_disaster', models.TextField(blank=True, null=True)), - ('raw_date_of_issue', models.TextField(blank=True, null=True)), - ('raw_glide_number', models.TextField(blank=True, null=True)), - ('raw_num_of_other_partner_involved', models.TextField(blank=True, null=True)), - ('raw_num_of_partner_ns_involved', models.TextField(blank=True, null=True)), - ('raw_num_of_people_affected', models.TextField(blank=True, null=True)), - ('raw_num_of_people_to_be_assisted', models.TextField(blank=True, null=True)), - ('raw_operation_end_date', models.TextField(blank=True, null=True)), - ('raw_operation_start_date', models.TextField(blank=True, null=True)), - ('raw_overall_operation_budget', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_female', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_male', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_people_reached', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_people_targeted', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_requirements', models.TextField(blank=True, null=True)), - ('raw_health_female', models.TextField(blank=True, null=True)), - ('raw_health_male', models.TextField(blank=True, null=True)), - ('raw_health_people_reached', models.TextField(blank=True, null=True)), - ('raw_health_people_targeted', models.TextField(blank=True, null=True)), - ('raw_health_requirements', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_female', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_male', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_people_reached', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_people_targeted', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_requirements', models.TextField(blank=True, null=True)), - ('raw_migration_female', models.TextField(blank=True, null=True)), - ('raw_migration_male', models.TextField(blank=True, null=True)), - ('raw_migration_people_reached', models.TextField(blank=True, null=True)), - ('raw_migration_people_targeted', models.TextField(blank=True, null=True)), - ('raw_migration_requirements', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_female', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_male', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_people_reached', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_people_targeted', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_requirements', models.TextField(blank=True, null=True)), - ('raw_shelter_female', models.TextField(blank=True, null=True)), - ('raw_shelter_male', models.TextField(blank=True, null=True)), - ('raw_shelter_people_reached', models.TextField(blank=True, null=True)), - ('raw_shelter_people_targeted', models.TextField(blank=True, null=True)), - ('raw_shelter_requirements', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_female', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_male', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_people_reached', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_people_targeted', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_requirements', models.TextField(blank=True, null=True)), - ('file_name', models.TextField(blank=True, null=True)), - ('appeal_number', models.CharField(blank=True, max_length=20, null=True)), - ('date_of_disaster', models.DateField(blank=True, null=True)), - ('date_of_issue', models.DateField(blank=True, null=True)), - ('glide_number', models.CharField(blank=True, max_length=18, null=True)), - ('num_of_other_partner_involved', models.TextField(blank=True, null=True)), - ('num_of_partner_ns_involved', models.TextField(blank=True, null=True)), - ('num_of_people_affected', models.IntegerField(blank=True, null=True)), - ('num_of_people_to_be_assisted', models.IntegerField(blank=True, null=True)), - ('operation_end_date', models.DateField(blank=True, null=True)), - ('operation_start_date', models.DateField(blank=True, null=True)), - ('overall_operation_budget', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_female', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_male', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_people_reached', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_people_targeted', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_requirements', models.IntegerField(blank=True, null=True)), - ('health_female', models.IntegerField(blank=True, null=True)), - ('health_male', models.IntegerField(blank=True, null=True)), - ('health_people_reached', models.IntegerField(blank=True, null=True)), - ('health_people_targeted', models.IntegerField(blank=True, null=True)), - ('health_requirements', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_female', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_male', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_people_reached', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_people_targeted', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_requirements', models.IntegerField(blank=True, null=True)), - ('migration_female', models.IntegerField(blank=True, null=True)), - ('migration_male', models.IntegerField(blank=True, null=True)), - ('migration_people_reached', models.IntegerField(blank=True, null=True)), - ('migration_people_targeted', models.IntegerField(blank=True, null=True)), - ('migration_requirements', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_female', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_male', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_people_reached', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_people_targeted', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_requirements', models.IntegerField(blank=True, null=True)), - ('shelter_female', models.IntegerField(blank=True, null=True)), - ('shelter_male', models.IntegerField(blank=True, null=True)), - ('shelter_people_reached', models.IntegerField(blank=True, null=True)), - ('shelter_people_targeted', models.IntegerField(blank=True, null=True)), - ('shelter_requirements', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_female', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_male', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_people_reached', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_people_targeted', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_requirements', models.IntegerField(blank=True, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("is_validated", models.BooleanField(default=False, help_text="Did anyone check the editable data?")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("modified_at", models.DateTimeField(auto_now=True)), + ("raw_file_name", models.TextField(blank=True, null=True)), + ("raw_file_url", models.TextField(blank=True, null=True)), + ("raw_appeal_number", models.TextField(blank=True, null=True)), + ("raw_date_of_disaster", models.TextField(blank=True, null=True)), + ("raw_date_of_issue", models.TextField(blank=True, null=True)), + ("raw_glide_number", models.TextField(blank=True, null=True)), + ("raw_num_of_other_partner_involved", models.TextField(blank=True, null=True)), + ("raw_num_of_partner_ns_involved", models.TextField(blank=True, null=True)), + ("raw_num_of_people_affected", models.TextField(blank=True, null=True)), + ("raw_num_of_people_to_be_assisted", models.TextField(blank=True, null=True)), + ("raw_operation_end_date", models.TextField(blank=True, null=True)), + ("raw_operation_start_date", models.TextField(blank=True, null=True)), + ("raw_overall_operation_budget", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_female", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_male", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_people_reached", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_people_targeted", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_requirements", models.TextField(blank=True, null=True)), + ("raw_health_female", models.TextField(blank=True, null=True)), + ("raw_health_male", models.TextField(blank=True, null=True)), + ("raw_health_people_reached", models.TextField(blank=True, null=True)), + ("raw_health_people_targeted", models.TextField(blank=True, null=True)), + ("raw_health_requirements", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_female", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_male", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_people_reached", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_people_targeted", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_requirements", models.TextField(blank=True, null=True)), + ("raw_migration_female", models.TextField(blank=True, null=True)), + ("raw_migration_male", models.TextField(blank=True, null=True)), + ("raw_migration_people_reached", models.TextField(blank=True, null=True)), + ("raw_migration_people_targeted", models.TextField(blank=True, null=True)), + ("raw_migration_requirements", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_female", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_male", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_people_reached", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_people_targeted", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_requirements", models.TextField(blank=True, null=True)), + ("raw_shelter_female", models.TextField(blank=True, null=True)), + ("raw_shelter_male", models.TextField(blank=True, null=True)), + ("raw_shelter_people_reached", models.TextField(blank=True, null=True)), + ("raw_shelter_people_targeted", models.TextField(blank=True, null=True)), + ("raw_shelter_requirements", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_female", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_male", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_people_reached", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_people_targeted", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_requirements", models.TextField(blank=True, null=True)), + ("file_name", models.TextField(blank=True, null=True)), + ("appeal_number", models.CharField(blank=True, max_length=20, null=True)), + ("date_of_disaster", models.DateField(blank=True, null=True)), + ("date_of_issue", models.DateField(blank=True, null=True)), + ("glide_number", models.CharField(blank=True, max_length=18, null=True)), + ("num_of_other_partner_involved", models.TextField(blank=True, null=True)), + ("num_of_partner_ns_involved", models.TextField(blank=True, null=True)), + ("num_of_people_affected", models.IntegerField(blank=True, null=True)), + ("num_of_people_to_be_assisted", models.IntegerField(blank=True, null=True)), + ("operation_end_date", models.DateField(blank=True, null=True)), + ("operation_start_date", models.DateField(blank=True, null=True)), + ("overall_operation_budget", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_female", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_male", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_people_reached", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_people_targeted", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_requirements", models.IntegerField(blank=True, null=True)), + ("health_female", models.IntegerField(blank=True, null=True)), + ("health_male", models.IntegerField(blank=True, null=True)), + ("health_people_reached", models.IntegerField(blank=True, null=True)), + ("health_people_targeted", models.IntegerField(blank=True, null=True)), + ("health_requirements", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_female", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_male", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_people_reached", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_people_targeted", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_requirements", models.IntegerField(blank=True, null=True)), + ("migration_female", models.IntegerField(blank=True, null=True)), + ("migration_male", models.IntegerField(blank=True, null=True)), + ("migration_people_reached", models.IntegerField(blank=True, null=True)), + ("migration_people_targeted", models.IntegerField(blank=True, null=True)), + ("migration_requirements", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_female", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_male", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_people_reached", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_people_targeted", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_requirements", models.IntegerField(blank=True, null=True)), + ("shelter_female", models.IntegerField(blank=True, null=True)), + ("shelter_male", models.IntegerField(blank=True, null=True)), + ("shelter_people_reached", models.IntegerField(blank=True, null=True)), + ("shelter_people_targeted", models.IntegerField(blank=True, null=True)), + ("shelter_requirements", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_female", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_male", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_people_reached", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_people_targeted", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_requirements", models.IntegerField(blank=True, null=True)), ], options={ - 'verbose_name': 'Emergency Operations Final Report', - 'verbose_name_plural': 'Emergency Operations Final Reports', + "verbose_name": "Emergency Operations Final Report", + "verbose_name_plural": "Emergency Operations Final Reports", }, ), migrations.CreateModel( - name='EmergencyOperationsPeopleReached', + name="EmergencyOperationsPeopleReached", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_validated', models.BooleanField(default=False, help_text='Did anyone check the editable data?')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('raw_file_name', models.TextField(blank=True, null=True)), - ('raw_file_url', models.TextField(blank=True, null=True)), - ('raw_appeal_number', models.TextField(blank=True, null=True)), - ('raw_date_of_issue', models.TextField(blank=True, null=True)), - ('raw_epoa_update_num', models.TextField(blank=True, null=True)), - ('raw_glide_number', models.TextField(blank=True, null=True)), - ('raw_operation_start_date', models.TextField(blank=True, null=True)), - ('raw_operation_timeframe', models.TextField(blank=True, null=True)), - ('raw_time_frame_covered_by_update', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_female', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_male', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_people_targeted', models.TextField(blank=True, null=True)), - ('raw_disaster_risk_reduction_requirements', models.TextField(blank=True, null=True)), - ('raw_health_female', models.TextField(blank=True, null=True)), - ('raw_health_male', models.TextField(blank=True, null=True)), - ('raw_health_people_targeted', models.TextField(blank=True, null=True)), - ('raw_health_requirements', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_female', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_male', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_people_targeted', models.TextField(blank=True, null=True)), - ('raw_livelihoods_and_basic_needs_requirements', models.TextField(blank=True, null=True)), - ('raw_migration_female', models.TextField(blank=True, null=True)), - ('raw_migration_male', models.TextField(blank=True, null=True)), - ('raw_migration_people_targeted', models.TextField(blank=True, null=True)), - ('raw_migration_requirements', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_female', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_male', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_people_targeted', models.TextField(blank=True, null=True)), - ('raw_protection_gender_and_inclusion_requirements', models.TextField(blank=True, null=True)), - ('raw_shelter_female', models.TextField(blank=True, null=True)), - ('raw_shelter_male', models.TextField(blank=True, null=True)), - ('raw_shelter_people_targeted', models.TextField(blank=True, null=True)), - ('raw_shelter_requirements', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_female', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_male', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_people_targeted', models.TextField(blank=True, null=True)), - ('raw_water_sanitation_and_hygiene_requirements', models.TextField(blank=True, null=True)), - ('file_name', models.TextField(blank=True, null=True)), - ('appeal_number', models.CharField(blank=True, max_length=20, null=True)), - ('date_of_issue', models.DateField(blank=True, null=True)), - ('dref_allocated', models.IntegerField(blank=True, null=True)), - ('epoa_update_num', models.IntegerField(blank=True, null=True)), - ('glide_number', models.CharField(blank=True, max_length=18, null=True)), - ('operation_start_date', models.DateField(blank=True, null=True)), - ('operation_timeframe', models.TextField(blank=True, null=True)), - ('time_frame_covered_by_update', models.TextField(blank=True, null=True)), - ('disaster_risk_reduction_female', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_male', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_people_targeted', models.IntegerField(blank=True, null=True)), - ('disaster_risk_reduction_requirements', models.IntegerField(blank=True, null=True)), - ('health_female', models.IntegerField(blank=True, null=True)), - ('health_male', models.IntegerField(blank=True, null=True)), - ('health_people_targeted', models.IntegerField(blank=True, null=True)), - ('health_requirements', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_female', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_male', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_people_targeted', models.IntegerField(blank=True, null=True)), - ('livelihoods_and_basic_needs_requirements', models.IntegerField(blank=True, null=True)), - ('migration_female', models.IntegerField(blank=True, null=True)), - ('migration_male', models.IntegerField(blank=True, null=True)), - ('migration_people_targeted', models.IntegerField(blank=True, null=True)), - ('migration_requirements', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_female', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_male', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_people_targeted', models.IntegerField(blank=True, null=True)), - ('protection_gender_and_inclusion_requirements', models.IntegerField(blank=True, null=True)), - ('shelter_female', models.IntegerField(blank=True, null=True)), - ('shelter_male', models.IntegerField(blank=True, null=True)), - ('shelter_people_targeted', models.IntegerField(blank=True, null=True)), - ('shelter_requirements', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_female', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_male', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_people_targeted', models.IntegerField(blank=True, null=True)), - ('water_sanitation_and_hygiene_requirements', models.IntegerField(blank=True, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("is_validated", models.BooleanField(default=False, help_text="Did anyone check the editable data?")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("modified_at", models.DateTimeField(auto_now=True)), + ("raw_file_name", models.TextField(blank=True, null=True)), + ("raw_file_url", models.TextField(blank=True, null=True)), + ("raw_appeal_number", models.TextField(blank=True, null=True)), + ("raw_date_of_issue", models.TextField(blank=True, null=True)), + ("raw_epoa_update_num", models.TextField(blank=True, null=True)), + ("raw_glide_number", models.TextField(blank=True, null=True)), + ("raw_operation_start_date", models.TextField(blank=True, null=True)), + ("raw_operation_timeframe", models.TextField(blank=True, null=True)), + ("raw_time_frame_covered_by_update", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_female", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_male", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_people_targeted", models.TextField(blank=True, null=True)), + ("raw_disaster_risk_reduction_requirements", models.TextField(blank=True, null=True)), + ("raw_health_female", models.TextField(blank=True, null=True)), + ("raw_health_male", models.TextField(blank=True, null=True)), + ("raw_health_people_targeted", models.TextField(blank=True, null=True)), + ("raw_health_requirements", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_female", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_male", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_people_targeted", models.TextField(blank=True, null=True)), + ("raw_livelihoods_and_basic_needs_requirements", models.TextField(blank=True, null=True)), + ("raw_migration_female", models.TextField(blank=True, null=True)), + ("raw_migration_male", models.TextField(blank=True, null=True)), + ("raw_migration_people_targeted", models.TextField(blank=True, null=True)), + ("raw_migration_requirements", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_female", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_male", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_people_targeted", models.TextField(blank=True, null=True)), + ("raw_protection_gender_and_inclusion_requirements", models.TextField(blank=True, null=True)), + ("raw_shelter_female", models.TextField(blank=True, null=True)), + ("raw_shelter_male", models.TextField(blank=True, null=True)), + ("raw_shelter_people_targeted", models.TextField(blank=True, null=True)), + ("raw_shelter_requirements", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_female", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_male", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_people_targeted", models.TextField(blank=True, null=True)), + ("raw_water_sanitation_and_hygiene_requirements", models.TextField(blank=True, null=True)), + ("file_name", models.TextField(blank=True, null=True)), + ("appeal_number", models.CharField(blank=True, max_length=20, null=True)), + ("date_of_issue", models.DateField(blank=True, null=True)), + ("dref_allocated", models.IntegerField(blank=True, null=True)), + ("epoa_update_num", models.IntegerField(blank=True, null=True)), + ("glide_number", models.CharField(blank=True, max_length=18, null=True)), + ("operation_start_date", models.DateField(blank=True, null=True)), + ("operation_timeframe", models.TextField(blank=True, null=True)), + ("time_frame_covered_by_update", models.TextField(blank=True, null=True)), + ("disaster_risk_reduction_female", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_male", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_people_targeted", models.IntegerField(blank=True, null=True)), + ("disaster_risk_reduction_requirements", models.IntegerField(blank=True, null=True)), + ("health_female", models.IntegerField(blank=True, null=True)), + ("health_male", models.IntegerField(blank=True, null=True)), + ("health_people_targeted", models.IntegerField(blank=True, null=True)), + ("health_requirements", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_female", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_male", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_people_targeted", models.IntegerField(blank=True, null=True)), + ("livelihoods_and_basic_needs_requirements", models.IntegerField(blank=True, null=True)), + ("migration_female", models.IntegerField(blank=True, null=True)), + ("migration_male", models.IntegerField(blank=True, null=True)), + ("migration_people_targeted", models.IntegerField(blank=True, null=True)), + ("migration_requirements", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_female", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_male", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_people_targeted", models.IntegerField(blank=True, null=True)), + ("protection_gender_and_inclusion_requirements", models.IntegerField(blank=True, null=True)), + ("shelter_female", models.IntegerField(blank=True, null=True)), + ("shelter_male", models.IntegerField(blank=True, null=True)), + ("shelter_people_targeted", models.IntegerField(blank=True, null=True)), + ("shelter_requirements", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_female", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_male", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_people_targeted", models.IntegerField(blank=True, null=True)), + ("water_sanitation_and_hygiene_requirements", models.IntegerField(blank=True, null=True)), ], ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='dref_allocated', + model_name="emergencyoperationsdataset", + name="dref_allocated", field=models.IntegerField(blank=True, null=True), ), ] diff --git a/api/migrations/0038_auto_20200110_1333.py b/api/migrations/0038_auto_20200110_1333.py index 3e0abbccd..9c75dcf41 100644 --- a/api/migrations/0038_auto_20200110_1333.py +++ b/api/migrations/0038_auto_20200110_1333.py @@ -6,142 +6,145 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0037_auto_20200109_0902'), + ("api", "0037_auto_20200109_0902"), ] operations = [ migrations.AlterModelOptions( - name='emergencyoperationsdataset', - options={'verbose_name': 'Emergency Operations Dataset', 'verbose_name_plural': 'Emergency Operations Datasets'}, + name="emergencyoperationsdataset", + options={"verbose_name": "Emergency Operations Dataset", "verbose_name_plural": "Emergency Operations Datasets"}, ), migrations.AlterModelOptions( - name='emergencyoperationspeoplereached', - options={'verbose_name': 'Emergency Operations People Reached', 'verbose_name_plural': 'Emergency Operations People Reached'}, + name="emergencyoperationspeoplereached", + options={ + "verbose_name": "Emergency Operations People Reached", + "verbose_name_plural": "Emergency Operations People Reached", + }, ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='disaster_risk_reduction_people_targeted', - new_name='disaster_risk_reduction_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="disaster_risk_reduction_people_targeted", + new_name="disaster_risk_reduction_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='health_people_targeted', - new_name='health_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="health_people_targeted", + new_name="health_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='livelihoods_and_basic_needs_people_targeted', - new_name='livelihoods_and_basic_needs_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="livelihoods_and_basic_needs_people_targeted", + new_name="livelihoods_and_basic_needs_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='migration_people_targeted', - new_name='migration_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="migration_people_targeted", + new_name="migration_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='protection_gender_and_inclusion_people_targeted', - new_name='protection_gender_and_inclusion_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="protection_gender_and_inclusion_people_targeted", + new_name="protection_gender_and_inclusion_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='raw_disaster_risk_reduction_people_targeted', - new_name='raw_disaster_risk_reduction_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="raw_disaster_risk_reduction_people_targeted", + new_name="raw_disaster_risk_reduction_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='raw_health_people_targeted', - new_name='raw_health_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="raw_health_people_targeted", + new_name="raw_health_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='raw_livelihoods_and_basic_needs_people_targeted', - new_name='raw_livelihoods_and_basic_needs_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="raw_livelihoods_and_basic_needs_people_targeted", + new_name="raw_livelihoods_and_basic_needs_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='raw_migration_people_targeted', - new_name='raw_migration_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="raw_migration_people_targeted", + new_name="raw_migration_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='raw_protection_gender_and_inclusion_people_targeted', - new_name='raw_protection_gender_and_inclusion_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="raw_protection_gender_and_inclusion_people_targeted", + new_name="raw_protection_gender_and_inclusion_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='raw_shelter_people_targeted', - new_name='raw_shelter_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="raw_shelter_people_targeted", + new_name="raw_shelter_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='raw_water_sanitation_and_hygiene_people_targeted', - new_name='raw_water_sanitation_and_hygiene_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="raw_water_sanitation_and_hygiene_people_targeted", + new_name="raw_water_sanitation_and_hygiene_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='shelter_people_targeted', - new_name='shelter_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="shelter_people_targeted", + new_name="shelter_people_reached", ), migrations.RenameField( - model_name='emergencyoperationspeoplereached', - old_name='water_sanitation_and_hygiene_people_targeted', - new_name='water_sanitation_and_hygiene_people_reached', + model_name="emergencyoperationspeoplereached", + old_name="water_sanitation_and_hygiene_people_targeted", + new_name="water_sanitation_and_hygiene_people_reached", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='disaster_risk_reduction_people_targeted', + model_name="emergencyoperationsfr", + name="disaster_risk_reduction_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='health_people_targeted', + model_name="emergencyoperationsfr", + name="health_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='livelihoods_and_basic_needs_people_targeted', + model_name="emergencyoperationsfr", + name="livelihoods_and_basic_needs_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='migration_people_targeted', + model_name="emergencyoperationsfr", + name="migration_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='protection_gender_and_inclusion_people_targeted', + model_name="emergencyoperationsfr", + name="protection_gender_and_inclusion_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='raw_disaster_risk_reduction_people_targeted', + model_name="emergencyoperationsfr", + name="raw_disaster_risk_reduction_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='raw_health_people_targeted', + model_name="emergencyoperationsfr", + name="raw_health_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='raw_livelihoods_and_basic_needs_people_targeted', + model_name="emergencyoperationsfr", + name="raw_livelihoods_and_basic_needs_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='raw_migration_people_targeted', + model_name="emergencyoperationsfr", + name="raw_migration_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='raw_protection_gender_and_inclusion_people_targeted', + model_name="emergencyoperationsfr", + name="raw_protection_gender_and_inclusion_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='raw_shelter_people_targeted', + model_name="emergencyoperationsfr", + name="raw_shelter_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='raw_water_sanitation_and_hygiene_people_targeted', + model_name="emergencyoperationsfr", + name="raw_water_sanitation_and_hygiene_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='shelter_people_targeted', + model_name="emergencyoperationsfr", + name="shelter_people_targeted", ), migrations.RemoveField( - model_name='emergencyoperationsfr', - name='water_sanitation_and_hygiene_people_targeted', + model_name="emergencyoperationsfr", + name="water_sanitation_and_hygiene_people_targeted", ), ] diff --git a/api/migrations/0039_auto_20200110_1546.py b/api/migrations/0039_auto_20200110_1546.py index ee7869498..33e822add 100644 --- a/api/migrations/0039_auto_20200110_1546.py +++ b/api/migrations/0039_auto_20200110_1546.py @@ -6,48 +6,48 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0038_auto_20200110_1333'), + ("api", "0038_auto_20200110_1333"), ] operations = [ migrations.AlterField( - model_name='emergencyoperationsdataset', - name='category_allocated', + model_name="emergencyoperationsdataset", + name="category_allocated", field=models.CharField(blank=True, max_length=100, null=True), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='expected_time_frame', + model_name="emergencyoperationsdataset", + name="expected_time_frame", field=models.IntegerField(blank=True, null=True), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='file_name', + model_name="emergencyoperationsdataset", + name="file_name", field=models.CharField(blank=True, max_length=200, null=True), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='file_name', + model_name="emergencyoperationsea", + name="file_name", field=models.CharField(blank=True, max_length=200, null=True), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='file_name', + model_name="emergencyoperationsfr", + name="file_name", field=models.CharField(blank=True, max_length=200, null=True), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='file_name', + model_name="emergencyoperationspeoplereached", + name="file_name", field=models.CharField(blank=True, max_length=200, null=True), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='operation_timeframe', + model_name="emergencyoperationspeoplereached", + name="operation_timeframe", field=models.CharField(blank=True, max_length=200, null=True), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='time_frame_covered_by_update', + model_name="emergencyoperationspeoplereached", + name="time_frame_covered_by_update", field=models.CharField(blank=True, max_length=200, null=True), ), ] diff --git a/api/migrations/0040_auto_20200121_1609.py b/api/migrations/0040_auto_20200121_1609.py index 80816e01d..9fb9f9e05 100644 --- a/api/migrations/0040_auto_20200121_1609.py +++ b/api/migrations/0040_auto_20200121_1609.py @@ -7,13 +7,17 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0039_auto_20200110_1546'), + ("api", "0039_auto_20200110_1546"), ] operations = [ migrations.AlterField( - model_name='action', - name='field_report_types', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('EVT', 'Event'), ('EW', 'Early Warning')], max_length=4), default=list, size=None), + model_name="action", + name="field_report_types", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(choices=[("EVT", "Event"), ("EW", "Early Warning")], max_length=4), + default=list, + size=None, + ), ), ] diff --git a/api/migrations/0041_cronjob.py b/api/migrations/0041_cronjob.py index 5419a85d7..2cd4dd829 100644 --- a/api/migrations/0041_cronjob.py +++ b/api/migrations/0041_cronjob.py @@ -1,28 +1,29 @@ # Generated by Django 2.2.9 on 2020-01-24 13:16 -import api.models from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0040_auto_20200121_1609'), + ("api", "0040_auto_20200121_1609"), ] operations = [ migrations.CreateModel( - name='CronJob', + name="CronJob", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(default='', max_length=100)), - ('status', models.IntegerField(default=-1, choices=api.models.CronJobStatus.choices)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('message', models.TextField(blank=True, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(default="", max_length=100)), + ("status", models.IntegerField(default=-1, choices=api.models.CronJobStatus.choices)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("message", models.TextField(blank=True, null=True)), ], options={ - 'verbose_name': 'Cronjob log record', - 'verbose_name_plural': 'Cronjob log records', + "verbose_name": "Cronjob log record", + "verbose_name_plural": "Cronjob log records", }, ), ] diff --git a/api/migrations/0042_auto_20200128_1045.py b/api/migrations/0042_auto_20200128_1045.py index 6f57e7882..d760aab1e 100644 --- a/api/migrations/0042_auto_20200128_1045.py +++ b/api/migrations/0042_auto_20200128_1045.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0041_cronjob'), + ("api", "0041_cronjob"), ] operations = [ migrations.AddField( - model_name='cronjob', - name='backend_side', + model_name="cronjob", + name="backend_side", field=models.BooleanField(default=True), ), migrations.AddField( - model_name='cronjob', - name='num_result', + model_name="cronjob", + name="num_result", field=models.IntegerField(default=0), ), migrations.AddField( - model_name='cronjob', - name='storing_days', + model_name="cronjob", + name="storing_days", field=models.IntegerField(default=3), ), ] diff --git a/api/migrations/0043_authlog.py b/api/migrations/0043_authlog.py index 548d8310f..aa7b3f0d7 100644 --- a/api/migrations/0043_authlog.py +++ b/api/migrations/0043_authlog.py @@ -6,17 +6,17 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0042_auto_20200128_1045'), + ("api", "0042_auto_20200128_1045"), ] operations = [ migrations.CreateModel( - name='AuthLog', + name="AuthLog", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('action', models.CharField(max_length=64)), - ('username', models.CharField(max_length=256, null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("action", models.CharField(max_length=64)), + ("username", models.CharField(max_length=256, null=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), ], ), ] diff --git a/api/migrations/0043_event_slug.py b/api/migrations/0043_event_slug.py index 047b556f2..24b50e3ff 100644 --- a/api/migrations/0043_event_slug.py +++ b/api/migrations/0043_event_slug.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0042_auto_20200128_1045'), + ("api", "0042_auto_20200128_1045"), ] operations = [ migrations.AddField( - model_name='event', - name='slug', + model_name="event", + name="slug", field=models.CharField(default=None, max_length=50, unique=True, null=True), ), ] diff --git a/api/migrations/0044_auto_20200318_0643.py b/api/migrations/0044_auto_20200318_0643.py index 650c3917f..4e6329be9 100644 --- a/api/migrations/0044_auto_20200318_0643.py +++ b/api/migrations/0044_auto_20200318_0643.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0043_event_slug'), + ("api", "0043_event_slug"), ] operations = [ migrations.AlterField( - model_name='event', - name='slug', + model_name="event", + name="slug", field=models.CharField(blank=True, default=None, max_length=50, null=True, unique=True), ), ] diff --git a/api/migrations/0044_reversiondifferencelog.py b/api/migrations/0044_reversiondifferencelog.py index 4a91f369f..31db1d676 100644 --- a/api/migrations/0044_reversiondifferencelog.py +++ b/api/migrations/0044_reversiondifferencelog.py @@ -7,21 +7,31 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0043_authlog'), + ("api", "0043_authlog"), ] operations = [ migrations.CreateModel( - name='ReversionDifferenceLog', + name="ReversionDifferenceLog", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('action', models.CharField(max_length=64)), - ('username', models.CharField(max_length=256, null=True)), - ('object_id', models.CharField(blank=True, max_length=191)), - ('object_type', models.CharField(blank=True, max_length=191)), - ('changed_from', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), blank=True, default=list, null=True, size=None)), - ('changed_to', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), blank=True, default=list, null=True, size=None)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("action", models.CharField(max_length=64)), + ("username", models.CharField(max_length=256, null=True)), + ("object_id", models.CharField(blank=True, max_length=191)), + ("object_type", models.CharField(blank=True, max_length=191)), + ( + "changed_from", + django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(blank=True, null=True), blank=True, default=list, null=True, size=None + ), + ), + ( + "changed_to", + django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(blank=True, null=True), blank=True, default=list, null=True, size=None + ), + ), ], ), ] diff --git a/api/migrations/0045_auto_20200212_1354.py b/api/migrations/0045_auto_20200212_1354.py index b12792963..9f69f90e1 100644 --- a/api/migrations/0045_auto_20200212_1354.py +++ b/api/migrations/0045_auto_20200212_1354.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0044_reversiondifferencelog'), + ("api", "0044_reversiondifferencelog"), ] operations = [ migrations.AddField( - model_name='reversiondifferencelog', - name='object_name', + model_name="reversiondifferencelog", + name="object_name", field=models.CharField(blank=True, max_length=200, null=True), ), migrations.AlterField( - model_name='reversiondifferencelog', - name='object_type', + model_name="reversiondifferencelog", + name="object_type", field=models.CharField(blank=True, max_length=50), ), ] diff --git a/api/migrations/0045_auto_20200320_1121.py b/api/migrations/0045_auto_20200320_1121.py index 756a47fee..aa9e9ac7e 100644 --- a/api/migrations/0045_auto_20200320_1121.py +++ b/api/migrations/0045_auto_20200320_1121.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0044_auto_20200318_0643'), + ("api", "0044_auto_20200318_0643"), ] operations = [ migrations.AddField( - model_name='situationreport', - name='is_pinned', - field=models.BooleanField(default=False, help_text='Pin this report at the top'), + model_name="situationreport", + name="is_pinned", + field=models.BooleanField(default=False, help_text="Pin this report at the top"), ), migrations.AddField( - model_name='situationreporttype', - name='is_primary', - field=models.BooleanField(default=True, help_text='Ensure this type gets precedence over others that are empty'), + model_name="situationreporttype", + name="is_primary", + field=models.BooleanField(default=True, help_text="Ensure this type gets precedence over others that are empty"), ), ] diff --git a/api/migrations/0045_auto_20200325_0905.py b/api/migrations/0045_auto_20200325_0905.py index bc7aa22a0..df058d18d 100644 --- a/api/migrations/0045_auto_20200325_0905.py +++ b/api/migrations/0045_auto_20200325_0905.py @@ -1,26 +1,43 @@ # Generated by Django 2.2.9 on 2020-03-25 09:05 -import api.utils +import re + import django.core.validators from django.db import migrations, models -import re + +import api.utils class Migration(migrations.Migration): dependencies = [ - ('api', '0044_auto_20200318_0643'), + ("api", "0044_auto_20200318_0643"), ] operations = [ migrations.AddField( - model_name='country', - name='url_ifrc', + model_name="country", + name="url_ifrc", field=models.URLField(blank=True), ), migrations.AlterField( - model_name='event', - name='slug', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number]), + model_name="event", + name="slug", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + ), ), ] diff --git a/api/migrations/0045_auto_20200326_0912.py b/api/migrations/0045_auto_20200326_0912.py index 39e77ff50..89cd72168 100644 --- a/api/migrations/0045_auto_20200326_0912.py +++ b/api/migrations/0045_auto_20200326_0912.py @@ -1,22 +1,30 @@ # Generated by Django 2.2.9 on 2020-03-26 09:12 -import api.utils +import re + import django.core.validators -from django.db import migrations, models import django.db.models.deletion -import re +from django.db import migrations, models + +import api.utils class Migration(migrations.Migration): dependencies = [ - ('api', '0044_auto_20200318_0643'), + ("api", "0044_auto_20200318_0643"), ] operations = [ migrations.AddField( - model_name='event', - name='parent_event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event', verbose_name='Parent Emergency'), + model_name="event", + name="parent_event", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Event", + verbose_name="Parent Emergency", + ), ), ] diff --git a/api/migrations/0046_auto_20200406_0953.py b/api/migrations/0046_auto_20200406_0953.py index 2dfc60ed3..235fe08e3 100644 --- a/api/migrations/0046_auto_20200406_0953.py +++ b/api/migrations/0046_auto_20200406_0953.py @@ -6,13 +6,15 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0045_auto_20200320_1121'), + ("api", "0045_auto_20200320_1121"), ] operations = [ migrations.AlterField( - model_name='situationreporttype', - name='is_primary', - field=models.BooleanField(default=False, editable=False, help_text='Ensure this type gets precedence over others that are empty'), + model_name="situationreporttype", + name="is_primary", + field=models.BooleanField( + default=False, editable=False, help_text="Ensure this type gets precedence over others that are empty" + ), ), ] diff --git a/api/migrations/0046_merge_20200325_1016.py b/api/migrations/0046_merge_20200325_1016.py index 73623e3aa..aba851159 100644 --- a/api/migrations/0046_merge_20200325_1016.py +++ b/api/migrations/0046_merge_20200325_1016.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0045_auto_20200325_0905'), - ('api', '0045_auto_20200320_1121'), + ("api", "0045_auto_20200325_0905"), + ("api", "0045_auto_20200320_1121"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0047_auto_20200331_1153.py b/api/migrations/0047_auto_20200331_1153.py index 88be5199e..91d1c7ea5 100644 --- a/api/migrations/0047_auto_20200331_1153.py +++ b/api/migrations/0047_auto_20200331_1153.py @@ -1,44 +1,45 @@ # Generated by Django 2.2.10 on 2020-03-31 11:53 -import api.models from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0046_merge_20200325_1016'), + ("api", "0046_merge_20200325_1016"), ] operations = [ migrations.AddField( - model_name='event', - name='tab_one_title', - field=models.CharField(default='Additional Information', max_length=50), + model_name="event", + name="tab_one_title", + field=models.CharField(default="Additional Information", max_length=50), ), migrations.AddField( - model_name='event', - name='tab_three_title', + model_name="event", + name="tab_three_title", field=models.CharField(max_length=50, null=True), ), migrations.AddField( - model_name='event', - name='tab_two_title', + model_name="event", + name="tab_two_title", field=models.CharField(max_length=50, null=True), ), migrations.AddField( - model_name='snippet', - name='tab', + model_name="snippet", + name="tab", field=models.IntegerField(default=1, choices=api.models.TabNumber.choices), ), migrations.AlterField( - model_name='country', - name='society_url', - field=models.URLField(blank=True, verbose_name='URL - Society'), + model_name="country", + name="society_url", + field=models.URLField(blank=True, verbose_name="URL - Society"), ), migrations.AlterField( - model_name='country', - name='url_ifrc', - field=models.URLField(blank=True, verbose_name='URL - IFRC'), + model_name="country", + name="url_ifrc", + field=models.URLField(blank=True, verbose_name="URL - IFRC"), ), ] diff --git a/api/migrations/0047_merge_20200327_1005.py b/api/migrations/0047_merge_20200327_1005.py index ef2e26cd0..f334cbc8e 100644 --- a/api/migrations/0047_merge_20200327_1005.py +++ b/api/migrations/0047_merge_20200327_1005.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0046_merge_20200325_1016'), - ('api', '0045_auto_20200212_1354'), + ("api", "0046_merge_20200325_1016"), + ("api", "0045_auto_20200212_1354"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0048_auto_20200401_1249.py b/api/migrations/0048_auto_20200401_1249.py index 820553426..027cce4d3 100644 --- a/api/migrations/0048_auto_20200401_1249.py +++ b/api/migrations/0048_auto_20200401_1249.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0047_auto_20200331_1153'), + ("api", "0047_auto_20200331_1153"), ] operations = [ migrations.AlterField( - model_name='event', - name='tab_one_title', - field=models.CharField(blank=True, default='Additional Information', max_length=50), + model_name="event", + name="tab_one_title", + field=models.CharField(blank=True, default="Additional Information", max_length=50), ), migrations.AlterField( - model_name='event', - name='tab_three_title', + model_name="event", + name="tab_three_title", field=models.CharField(blank=True, max_length=50, null=True), ), migrations.AlterField( - model_name='event', - name='tab_two_title', + model_name="event", + name="tab_two_title", field=models.CharField(blank=True, max_length=50, null=True), ), ] diff --git a/api/migrations/0048_merge_20200401_1310.py b/api/migrations/0048_merge_20200401_1310.py index a0542242c..1b665e5f2 100644 --- a/api/migrations/0048_merge_20200401_1310.py +++ b/api/migrations/0048_merge_20200401_1310.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0047_merge_20200327_1005'), - ('api', '0045_auto_20200326_0912'), + ("api", "0047_merge_20200327_1005"), + ("api", "0045_auto_20200326_0912"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0049_auto_20200403_0857.py b/api/migrations/0049_auto_20200403_0857.py index ee8a2cc4c..941d29aa2 100644 --- a/api/migrations/0049_auto_20200403_0857.py +++ b/api/migrations/0049_auto_20200403_0857.py @@ -6,48 +6,48 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0048_merge_20200401_1310'), + ("api", "0048_merge_20200401_1310"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='cases', + model_name="fieldreport", + name="cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='confirmed_cases', + model_name="fieldreport", + name="confirmed_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='health_min_num_assisted', + model_name="fieldreport", + name="health_min_num_assisted", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='probable_cases', + model_name="fieldreport", + name="probable_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='suspected_cases', + model_name="fieldreport", + name="suspected_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='who_num_assisted', + model_name="fieldreport", + name="who_num_assisted", field=models.IntegerField(blank=True, null=True), ), migrations.AlterField( - model_name='country', - name='society_url', - field=models.URLField(blank=True, verbose_name='URL - Society'), + model_name="country", + name="society_url", + field=models.URLField(blank=True, verbose_name="URL - Society"), ), migrations.AlterField( - model_name='country', - name='url_ifrc', - field=models.URLField(blank=True, verbose_name='URL - IFRC'), + model_name="country", + name="url_ifrc", + field=models.URLField(blank=True, verbose_name="URL - IFRC"), ), ] diff --git a/api/migrations/0049_merge_20200403_1508.py b/api/migrations/0049_merge_20200403_1508.py index 0a6266b8d..665026e01 100644 --- a/api/migrations/0049_merge_20200403_1508.py +++ b/api/migrations/0049_merge_20200403_1508.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0048_auto_20200401_1249'), - ('api', '0048_merge_20200401_1310'), + ("api", "0048_auto_20200401_1249"), + ("api", "0048_merge_20200401_1310"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0049_merge_20200406_1026.py b/api/migrations/0049_merge_20200406_1026.py index cc14c9389..7dcfb7765 100644 --- a/api/migrations/0049_merge_20200406_1026.py +++ b/api/migrations/0049_merge_20200406_1026.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0046_auto_20200406_0953'), - ('api', '0048_merge_20200401_1310'), + ("api", "0046_auto_20200406_0953"), + ("api", "0048_merge_20200401_1310"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0050_auto_20200406_0614.py b/api/migrations/0050_auto_20200406_0614.py index ac20443b2..8fc474bdf 100644 --- a/api/migrations/0050_auto_20200406_0614.py +++ b/api/migrations/0050_auto_20200406_0614.py @@ -6,78 +6,78 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0049_auto_20200403_0857'), + ("api", "0049_auto_20200403_0857"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='health_min_cases', + model_name="fieldreport", + name="health_min_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='health_min_confirmed_cases', + model_name="fieldreport", + name="health_min_confirmed_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='health_min_num_dead', + model_name="fieldreport", + name="health_min_num_dead", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='health_min_probable_cases', + model_name="fieldreport", + name="health_min_probable_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='health_min_suspected_cases', + model_name="fieldreport", + name="health_min_suspected_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_cases', + model_name="fieldreport", + name="other_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_confirmed_cases', + model_name="fieldreport", + name="other_confirmed_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_probable_cases', + model_name="fieldreport", + name="other_probable_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='other_suspected_cases', + model_name="fieldreport", + name="other_suspected_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='who_cases', + model_name="fieldreport", + name="who_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='who_confirmed_cases', + model_name="fieldreport", + name="who_confirmed_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='who_num_dead', + model_name="fieldreport", + name="who_num_dead", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='who_probable_cases', + model_name="fieldreport", + name="who_probable_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='who_suspected_cases', + model_name="fieldreport", + name="who_suspected_cases", field=models.IntegerField(blank=True, null=True), ), ] diff --git a/api/migrations/0051_fieldreport_sit_fields_date.py b/api/migrations/0051_fieldreport_sit_fields_date.py index f257de741..ee74bb0d1 100644 --- a/api/migrations/0051_fieldreport_sit_fields_date.py +++ b/api/migrations/0051_fieldreport_sit_fields_date.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0050_auto_20200406_0614'), + ("api", "0050_auto_20200406_0614"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='sit_fields_date', + model_name="fieldreport", + name="sit_fields_date", field=models.DateField(blank=True, null=True), ), ] diff --git a/api/migrations/0052_auto_20200406_0623.py b/api/migrations/0052_auto_20200406_0623.py index d7be400bf..d17035506 100644 --- a/api/migrations/0052_auto_20200406_0623.py +++ b/api/migrations/0052_auto_20200406_0623.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0051_fieldreport_sit_fields_date'), + ("api", "0051_fieldreport_sit_fields_date"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='sit_fields_date', + model_name="fieldreport", + name="sit_fields_date", field=models.DateTimeField(blank=True, null=True), ), ] diff --git a/api/migrations/0053_merge_20200406_1343.py b/api/migrations/0053_merge_20200406_1343.py index db371676b..3cdde5f44 100644 --- a/api/migrations/0053_merge_20200406_1343.py +++ b/api/migrations/0053_merge_20200406_1343.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0049_merge_20200406_1026'), - ('api', '0052_auto_20200406_0623'), + ("api", "0049_merge_20200406_1026"), + ("api", "0052_auto_20200406_0623"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0054_auto_20200407_0939.py b/api/migrations/0054_auto_20200407_0939.py index 6f32fcf94..33765e4d0 100644 --- a/api/migrations/0054_auto_20200407_0939.py +++ b/api/migrations/0054_auto_20200407_0939.py @@ -7,18 +7,24 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0053_merge_20200406_1343'), + ("api", "0053_merge_20200406_1343"), ] operations = [ migrations.AddField( - model_name='action', - name='category', - field=models.CharField(choices=[('General', 'General'), ('Health', 'Health')], default='General', max_length=12), + model_name="action", + name="category", + field=models.CharField(choices=[("General", "General"), ("Health", "Health")], default="General", max_length=12), ), migrations.AlterField( - model_name='action', - name='field_report_types', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('EVT', 'Event'), ('EW', 'Early Warning'), ('EPI', 'Epidemic')], max_length=4), default=list, size=None), + model_name="action", + name="field_report_types", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[("EVT", "Event"), ("EW", "Early Warning"), ("EPI", "Epidemic")], max_length=4 + ), + default=list, + size=None, + ), ), ] diff --git a/api/migrations/0054_merge_20200407_1212.py b/api/migrations/0054_merge_20200407_1212.py index 7f3ae5e4e..136787be0 100644 --- a/api/migrations/0054_merge_20200407_1212.py +++ b/api/migrations/0054_merge_20200407_1212.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0053_merge_20200406_1343'), - ('api', '0049_merge_20200403_1508'), + ("api", "0053_merge_20200406_1343"), + ("api", "0049_merge_20200403_1508"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0055_merge_20200407_1236.py b/api/migrations/0055_merge_20200407_1236.py index dbc40adf3..4c8ce0cd6 100644 --- a/api/migrations/0055_merge_20200407_1236.py +++ b/api/migrations/0055_merge_20200407_1236.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0054_auto_20200407_0939'), - ('api', '0054_merge_20200407_1212'), + ("api", "0054_auto_20200407_0939"), + ("api", "0054_merge_20200407_1212"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0056_auto_20200413_1010.py b/api/migrations/0056_auto_20200413_1010.py index 94efa0ca8..e98e6a73a 100644 --- a/api/migrations/0056_auto_20200413_1010.py +++ b/api/migrations/0056_auto_20200413_1010.py @@ -1,19 +1,26 @@ # Generated by Django 2.2.10 on 2020-04-13 10:10 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0055_merge_20200407_1236'), + ("api", "0055_merge_20200407_1236"), ] operations = [ migrations.AlterField( - model_name='event', - name='parent_event', - field=models.ForeignKey(blank=True, help_text="If needed, you have to change the connected Appeals', Field Reports', etc to point to the parent Emergency manually.", null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event', verbose_name='Parent Emergency'), + model_name="event", + name="parent_event", + field=models.ForeignKey( + blank=True, + help_text="If needed, you have to change the connected Appeals', Field Reports', etc to point to the parent Emergency manually.", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Event", + verbose_name="Parent Emergency", + ), ), ] diff --git a/api/migrations/0057_auto_20200414_1021.py b/api/migrations/0057_auto_20200414_1021.py index 811682d9a..99e486d6b 100644 --- a/api/migrations/0057_auto_20200414_1021.py +++ b/api/migrations/0057_auto_20200414_1021.py @@ -1,21 +1,39 @@ # Generated by Django 2.2.10 on 2020-04-14 10:21 -import api.utils +import re + import django.core.validators from django.db import migrations, models -import re + +import api.utils class Migration(migrations.Migration): dependencies = [ - ('api', '0056_auto_20200413_1010'), + ("api", "0056_auto_20200413_1010"), ] operations = [ migrations.AlterField( - model_name='event', - name='slug', - field=models.CharField(blank=True, default=None, editable=False, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number]), + model_name="event", + name="slug", + field=models.CharField( + blank=True, + default=None, + editable=False, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + ), ), ] diff --git a/api/migrations/0058_auto_20200415_1606.py b/api/migrations/0058_auto_20200415_1606.py index 43976238d..275c899f1 100644 --- a/api/migrations/0058_auto_20200415_1606.py +++ b/api/migrations/0058_auto_20200415_1606.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0057_auto_20200414_1021'), + ("api", "0057_auto_20200414_1021"), ] operations = [ migrations.AlterField( - model_name='reversiondifferencelog', - name='object_name', + model_name="reversiondifferencelog", + name="object_name", field=models.CharField(blank=True, max_length=2000, null=True), ), ] diff --git a/api/migrations/0059_auto_20200430_0801.py b/api/migrations/0059_auto_20200430_0801.py index c59ec7331..89d01d750 100644 --- a/api/migrations/0059_auto_20200430_0801.py +++ b/api/migrations/0059_auto_20200430_0801.py @@ -6,18 +6,27 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0058_auto_20200415_1606'), + ("api", "0058_auto_20200415_1606"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='is_covid_report', - field=models.BooleanField(default=False, help_text='Is this a Field Report specific to the COVID-19 emergency?'), + model_name="fieldreport", + name="is_covid_report", + field=models.BooleanField(default=False, help_text="Is this a Field Report specific to the COVID-19 emergency?"), ), migrations.AlterField( - model_name='action', - name='category', - field=models.CharField(choices=[('General', 'General'), ('Health', 'Health'), ('NS Institutional Strengthening', 'NS Institutional Strengthening'), ('Socio-economic Impacts', 'Socio-economic Impacts')], default='General', max_length=12), + model_name="action", + name="category", + field=models.CharField( + choices=[ + ("General", "General"), + ("Health", "Health"), + ("NS Institutional Strengthening", "NS Institutional Strengthening"), + ("Socio-economic Impacts", "Socio-economic Impacts"), + ], + default="General", + max_length=12, + ), ), ] diff --git a/api/migrations/0059_auto_20200430_0852.py b/api/migrations/0059_auto_20200430_0852.py index 8a12b112b..5bae9d268 100644 --- a/api/migrations/0059_auto_20200430_0852.py +++ b/api/migrations/0059_auto_20200430_0852.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0058_auto_20200415_1606'), + ("api", "0058_auto_20200415_1606"), ] operations = [ migrations.AlterField( - model_name='reversiondifferencelog', - name='object_name', + model_name="reversiondifferencelog", + name="object_name", field=models.TextField(blank=True, null=True), ), ] diff --git a/api/migrations/0060_merge_20200501_1230.py b/api/migrations/0060_merge_20200501_1230.py index 04a8830e1..46159e205 100644 --- a/api/migrations/0060_merge_20200501_1230.py +++ b/api/migrations/0060_merge_20200501_1230.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0059_auto_20200430_0852'), - ('api', '0059_auto_20200430_0801'), + ("api", "0059_auto_20200430_0852"), + ("api", "0059_auto_20200430_0801"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0061_action_is_disabled.py b/api/migrations/0061_action_is_disabled.py index 3e33e1a4b..bcd92fed0 100644 --- a/api/migrations/0061_action_is_disabled.py +++ b/api/migrations/0061_action_is_disabled.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0060_merge_20200501_1230'), + ("api", "0060_merge_20200501_1230"), ] operations = [ migrations.AddField( - model_name='action', - name='is_disabled', - field=models.BooleanField(default=False, help_text='Disable in form'), + model_name="action", + name="is_disabled", + field=models.BooleanField(default=False, help_text="Disable in form"), ), ] diff --git a/api/migrations/0062_auto_20200501_1335.py b/api/migrations/0062_auto_20200501_1335.py index eaa6bdbec..0592b7bf6 100644 --- a/api/migrations/0062_auto_20200501_1335.py +++ b/api/migrations/0062_auto_20200501_1335.py @@ -7,13 +7,19 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0061_action_is_disabled'), + ("api", "0061_action_is_disabled"), ] operations = [ migrations.AlterField( - model_name='action', - name='field_report_types', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('EVT', 'Event'), ('EW', 'Early Warning'), ('EPI', 'Epidemic'), ('COVID', 'COVID-19')], max_length=4), default=list, size=None), + model_name="action", + name="field_report_types", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[("EVT", "Event"), ("EW", "Early Warning"), ("EPI", "Epidemic"), ("COVID", "COVID-19")], max_length=4 + ), + default=list, + size=None, + ), ), ] diff --git a/api/migrations/0063_auto_20200501_1348.py b/api/migrations/0063_auto_20200501_1348.py index c083b351d..3a3f6bb3f 100644 --- a/api/migrations/0063_auto_20200501_1348.py +++ b/api/migrations/0063_auto_20200501_1348.py @@ -7,23 +7,40 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0062_auto_20200501_1335'), + ("api", "0062_auto_20200501_1335"), ] operations = [ migrations.AlterField( - model_name='action', - name='category', - field=models.CharField(choices=[('General', 'General'), ('Health', 'Health'), ('NS Institutional Strengthening', 'NS Institutional Strengthening'), ('Socio-economic Impacts', 'Socio-economic Impacts')], default='General', max_length=255), + model_name="action", + name="category", + field=models.CharField( + choices=[ + ("General", "General"), + ("Health", "Health"), + ("NS Institutional Strengthening", "NS Institutional Strengthening"), + ("Socio-economic Impacts", "Socio-economic Impacts"), + ], + default="General", + max_length=255, + ), ), migrations.AlterField( - model_name='action', - name='field_report_types', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('EVT', 'Event'), ('EW', 'Early Warning'), ('EPI', 'Epidemic'), ('COVID', 'COVID-19')], max_length=16), default=list, size=None), + model_name="action", + name="field_report_types", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[("EVT", "Event"), ("EW", "Early Warning"), ("EPI", "Epidemic"), ("COVID", "COVID-19")], max_length=16 + ), + default=list, + size=None, + ), ), migrations.AlterField( - model_name='actionstaken', - name='organization', - field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'Foreign Society'), ('FDRN', 'Federation')], max_length=16), + model_name="actionstaken", + name="organization", + field=models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "Foreign Society"), ("FDRN", "Federation")], max_length=16 + ), ), ] diff --git a/api/migrations/0064_auto_20200504_0917.py b/api/migrations/0064_auto_20200504_0917.py index 9c6e6f200..29e65c24c 100644 --- a/api/migrations/0064_auto_20200504_0917.py +++ b/api/migrations/0064_auto_20200504_0917.py @@ -6,33 +6,33 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0063_auto_20200501_1348'), + ("api", "0063_auto_20200501_1348"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='epi_cases', + model_name="fieldreport", + name="epi_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='epi_confirmed_cases', + model_name="fieldreport", + name="epi_confirmed_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='epi_num_dead', + model_name="fieldreport", + name="epi_num_dead", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='epi_probable_cases', + model_name="fieldreport", + name="epi_probable_cases", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='fieldreport', - name='epi_suspected_cases', + model_name="fieldreport", + name="epi_suspected_cases", field=models.IntegerField(blank=True, null=True), ), ] diff --git a/api/migrations/0064_auto_20200504_1438.py b/api/migrations/0064_auto_20200504_1438.py index 43df86a64..2eae5f7af 100644 --- a/api/migrations/0064_auto_20200504_1438.py +++ b/api/migrations/0064_auto_20200504_1438.py @@ -6,13 +6,22 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0063_auto_20200501_1348'), + ("api", "0063_auto_20200501_1348"), ] operations = [ migrations.AlterField( - model_name='action', - name='category', - field=models.CharField(choices=[('General', 'General'), ('Health', 'Health'), ('NS Institutional Strengthening', 'NS Institutional Strengthening'), ('Socioeconomic Interventions', 'Socioeconomic Interventions')], default='General', max_length=255), + model_name="action", + name="category", + field=models.CharField( + choices=[ + ("General", "General"), + ("Health", "Health"), + ("NS Institutional Strengthening", "NS Institutional Strengthening"), + ("Socioeconomic Interventions", "Socioeconomic Interventions"), + ], + default="General", + max_length=255, + ), ), ] diff --git a/api/migrations/0065_fieldreport_epi_figures_source.py b/api/migrations/0065_fieldreport_epi_figures_source.py index 980a2b726..1d32f13e2 100644 --- a/api/migrations/0065_fieldreport_epi_figures_source.py +++ b/api/migrations/0065_fieldreport_epi_figures_source.py @@ -1,19 +1,20 @@ # Generated by Django 2.2.10 on 2020-05-04 13:15 +from django.db import migrations, models + import api.models -from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ - ('api', '0064_auto_20200504_0917'), + ("api", "0064_auto_20200504_0917"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='epi_figures_source', + model_name="fieldreport", + name="epi_figures_source", field=models.IntegerField(blank=True, choices=api.models.EPISourceChoices.choices, default=0, null=True), ), ] diff --git a/api/migrations/0066_merge_20200508_1241.py b/api/migrations/0066_merge_20200508_1241.py index 729bf7fc2..0432144d0 100644 --- a/api/migrations/0066_merge_20200508_1241.py +++ b/api/migrations/0066_merge_20200508_1241.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0064_auto_20200504_1438'), - ('api', '0065_fieldreport_epi_figures_source'), + ("api", "0064_auto_20200504_1438"), + ("api", "0065_fieldreport_epi_figures_source"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0067_auto_20200528_0840.py b/api/migrations/0067_auto_20200528_0840.py index 970429916..ce01e4da6 100644 --- a/api/migrations/0067_auto_20200528_0840.py +++ b/api/migrations/0067_auto_20200528_0840.py @@ -1,34 +1,34 @@ # Generated by Django 2.2.10 on 2020-05-28 08:40 -from django.db import migrations, models import tinymce.models +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0066_merge_20200508_1241'), + ("api", "0066_merge_20200508_1241"), ] operations = [ migrations.AlterField( - model_name='actionstaken', - name='actions', - field=models.ManyToManyField(blank=True, to='api.Action'), + model_name="actionstaken", + name="actions", + field=models.ManyToManyField(blank=True, to="api.Action"), ), migrations.AlterField( - model_name='countrysnippet', - name='snippet', + model_name="countrysnippet", + name="snippet", field=tinymce.models.HTMLField(blank=True, null=True), ), migrations.AlterField( - model_name='regionsnippet', - name='snippet', + model_name="regionsnippet", + name="snippet", field=tinymce.models.HTMLField(blank=True, null=True), ), migrations.AlterField( - model_name='snippet', - name='snippet', + model_name="snippet", + name="snippet", field=tinymce.models.HTMLField(blank=True, null=True), ), ] diff --git a/api/migrations/0068_notificationguid.py b/api/migrations/0068_notificationguid.py index 55958c9f3..1c9d78795 100644 --- a/api/migrations/0068_notificationguid.py +++ b/api/migrations/0068_notificationguid.py @@ -6,18 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0067_auto_20200528_0840'), + ("api", "0067_auto_20200528_0840"), ] operations = [ migrations.CreateModel( - name='NotificationGUID', + name="NotificationGUID", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('api_guid', models.CharField(editable=False, help_text='Can be used to do a GET request to check on the email sender API side.', max_length=200)), - ('email_type', models.CharField(blank=True, editable=False, max_length=50, null=True)), - ('to_list', models.TextField(blank=True, editable=False, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ( + "api_guid", + models.CharField( + editable=False, + help_text="Can be used to do a GET request to check on the email sender API side.", + max_length=200, + ), + ), + ("email_type", models.CharField(blank=True, editable=False, max_length=50, null=True)), + ("to_list", models.TextField(blank=True, editable=False, null=True)), ], ), ] diff --git a/api/migrations/0069_delete_notificationguid.py b/api/migrations/0069_delete_notificationguid.py index 0b60b08b1..b9af61fe0 100644 --- a/api/migrations/0069_delete_notificationguid.py +++ b/api/migrations/0069_delete_notificationguid.py @@ -6,11 +6,11 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0068_notificationguid'), + ("api", "0068_notificationguid"), ] operations = [ migrations.DeleteModel( - name='NotificationGUID', + name="NotificationGUID", ), ] diff --git a/api/migrations/0070_auto_20200618_0904.py b/api/migrations/0070_auto_20200618_0904.py index 1206138de..839ef484c 100644 --- a/api/migrations/0070_auto_20200618_0904.py +++ b/api/migrations/0070_auto_20200618_0904.py @@ -1,3392 +1,3709 @@ # Generated by Django 2.2.13 on 2020-06-18 09:04 -import api.models -import api.utils -from django.conf import settings +import re + import django.contrib.postgres.fields import django.core.validators -from django.db import migrations, models import django.db.models.deletion -import re import tinymce.models +from django.conf import settings +from django.db import migrations, models + +import api.models +import api.utils class Migration(migrations.Migration): dependencies = [ - ('api', '0069_delete_notificationguid'), + ("api", "0069_delete_notificationguid"), ] operations = [ migrations.AlterModelOptions( - name='action', - options={'verbose_name': 'action', 'verbose_name_plural': 'actions'}, + name="action", + options={"verbose_name": "action", "verbose_name_plural": "actions"}, ), migrations.AlterModelOptions( - name='actionstaken', - options={'verbose_name': 'actions taken', 'verbose_name_plural': 'all actions taken'}, + name="actionstaken", + options={"verbose_name": "actions taken", "verbose_name_plural": "all actions taken"}, ), migrations.AlterModelOptions( - name='admincontact', - options={'verbose_name': 'admin contact', 'verbose_name_plural': 'admin contacts'}, + name="admincontact", + options={"verbose_name": "admin contact", "verbose_name_plural": "admin contacts"}, ), migrations.AlterModelOptions( - name='adminkeyfigure', - options={'ordering': ('source',), 'verbose_name': 'admin key figure', 'verbose_name_plural': 'admin key figures'}, + name="adminkeyfigure", + options={"ordering": ("source",), "verbose_name": "admin key figure", "verbose_name_plural": "admin key figures"}, ), migrations.AlterModelOptions( - name='adminlink', - options={'verbose_name': 'admin link', 'verbose_name_plural': 'admin links'}, + name="adminlink", + options={"verbose_name": "admin link", "verbose_name_plural": "admin links"}, ), migrations.AlterModelOptions( - name='appeal', - options={'ordering': ('-start_date', '-end_date'), 'verbose_name': 'appeal', 'verbose_name_plural': 'appeals'}, + name="appeal", + options={"ordering": ("-start_date", "-end_date"), "verbose_name": "appeal", "verbose_name_plural": "appeals"}, ), migrations.AlterModelOptions( - name='appealdocument', - options={'verbose_name': 'appeal document', 'verbose_name_plural': 'appeal documents'}, + name="appealdocument", + options={"verbose_name": "appeal document", "verbose_name_plural": "appeal documents"}, ), migrations.AlterModelOptions( - name='authlog', - options={'verbose_name': 'auth log', 'verbose_name_plural': 'auth logs'}, + name="authlog", + options={"verbose_name": "auth log", "verbose_name_plural": "auth logs"}, ), migrations.AlterModelOptions( - name='country', - options={'ordering': ('name',), 'verbose_name': 'country', 'verbose_name_plural': 'countries'}, + name="country", + options={"ordering": ("name",), "verbose_name": "country", "verbose_name_plural": "countries"}, ), migrations.AlterModelOptions( - name='countrycontact', - options={'verbose_name': 'country contact', 'verbose_name_plural': 'country contacts'}, + name="countrycontact", + options={"verbose_name": "country contact", "verbose_name_plural": "country contacts"}, ), migrations.AlterModelOptions( - name='countrykeyfigure', - options={'ordering': ('source',), 'verbose_name': 'country key figure', 'verbose_name_plural': 'country key figures'}, + name="countrykeyfigure", + options={"ordering": ("source",), "verbose_name": "country key figure", "verbose_name_plural": "country key figures"}, ), migrations.AlterModelOptions( - name='countrylink', - options={'verbose_name': 'country link', 'verbose_name_plural': 'country links'}, + name="countrylink", + options={"verbose_name": "country link", "verbose_name_plural": "country links"}, ), migrations.AlterModelOptions( - name='countrysnippet', - options={'ordering': ('position', 'id'), 'verbose_name': 'country snippet', 'verbose_name_plural': 'country snippets'}, + name="countrysnippet", + options={ + "ordering": ("position", "id"), + "verbose_name": "country snippet", + "verbose_name_plural": "country snippets", + }, ), migrations.AlterModelOptions( - name='cronjob', - options={'verbose_name': 'cronjob log record', 'verbose_name_plural': 'cronjob log records'}, + name="cronjob", + options={"verbose_name": "cronjob log record", "verbose_name_plural": "cronjob log records"}, ), migrations.AlterModelOptions( - name='disastertype', - options={'ordering': ('name',), 'verbose_name': 'disaster type', 'verbose_name_plural': 'disaster types'}, + name="disastertype", + options={"ordering": ("name",), "verbose_name": "disaster type", "verbose_name_plural": "disaster types"}, ), migrations.AlterModelOptions( - name='district', - options={'ordering': ('code',), 'verbose_name': 'district', 'verbose_name_plural': 'districts'}, + name="district", + options={"ordering": ("code",), "verbose_name": "district", "verbose_name_plural": "districts"}, ), migrations.AlterModelOptions( - name='emergencyoperationsdataset', - options={'verbose_name': 'emergency operations dataset', 'verbose_name_plural': 'emergency operations datasets'}, + name="emergencyoperationsdataset", + options={"verbose_name": "emergency operations dataset", "verbose_name_plural": "emergency operations datasets"}, ), migrations.AlterModelOptions( - name='emergencyoperationsea', - options={'verbose_name': 'emergency operations emergency appeal', 'verbose_name_plural': 'emergency operations emergency appeals'}, + name="emergencyoperationsea", + options={ + "verbose_name": "emergency operations emergency appeal", + "verbose_name_plural": "emergency operations emergency appeals", + }, ), migrations.AlterModelOptions( - name='emergencyoperationsfr', - options={'verbose_name': 'emergency operations final report', 'verbose_name_plural': 'emergency operations final reports'}, + name="emergencyoperationsfr", + options={ + "verbose_name": "emergency operations final report", + "verbose_name_plural": "emergency operations final reports", + }, ), migrations.AlterModelOptions( - name='emergencyoperationspeoplereached', - options={'verbose_name': 'emergency operations people reached', 'verbose_name_plural': 'emergency operations people reached'}, + name="emergencyoperationspeoplereached", + options={ + "verbose_name": "emergency operations people reached", + "verbose_name_plural": "emergency operations people reached", + }, ), migrations.AlterModelOptions( - name='event', - options={'ordering': ('-disaster_start_date',), 'verbose_name': 'emergency', 'verbose_name_plural': 'emergencies'}, + name="event", + options={"ordering": ("-disaster_start_date",), "verbose_name": "emergency", "verbose_name_plural": "emergencies"}, ), migrations.AlterModelOptions( - name='eventcontact', - options={'verbose_name': 'event contact', 'verbose_name_plural': 'event contacts'}, + name="eventcontact", + options={"verbose_name": "event contact", "verbose_name_plural": "event contacts"}, ), migrations.AlterModelOptions( - name='fieldreport', - options={'ordering': ('-created_at', '-updated_at'), 'verbose_name': 'field report', 'verbose_name_plural': 'field reports'}, + name="fieldreport", + options={ + "ordering": ("-created_at", "-updated_at"), + "verbose_name": "field report", + "verbose_name_plural": "field reports", + }, ), migrations.AlterModelOptions( - name='fieldreportcontact', - options={'verbose_name': 'field report contanct', 'verbose_name_plural': 'field report contancts'}, + name="fieldreportcontact", + options={"verbose_name": "field report contanct", "verbose_name_plural": "field report contancts"}, ), migrations.AlterModelOptions( - name='gdacsevent', - options={'verbose_name': 'gdacs event', 'verbose_name_plural': 'gdacs events'}, + name="gdacsevent", + options={"verbose_name": "gdacs event", "verbose_name_plural": "gdacs events"}, ), migrations.AlterModelOptions( - name='keyfigure', - options={'verbose_name': 'key figure', 'verbose_name_plural': 'key figures'}, + name="keyfigure", + options={"verbose_name": "key figure", "verbose_name_plural": "key figures"}, ), migrations.AlterModelOptions( - name='profile', - options={'verbose_name': 'user profile', 'verbose_name_plural': 'user profiles'}, + name="profile", + options={"verbose_name": "user profile", "verbose_name_plural": "user profiles"}, ), migrations.AlterModelOptions( - name='region', - options={'ordering': ('name',), 'verbose_name': 'region', 'verbose_name_plural': 'regions'}, + name="region", + options={"ordering": ("name",), "verbose_name": "region", "verbose_name_plural": "regions"}, ), migrations.AlterModelOptions( - name='regioncontact', - options={'verbose_name': 'region contact', 'verbose_name_plural': 'region contacts'}, + name="regioncontact", + options={"verbose_name": "region contact", "verbose_name_plural": "region contacts"}, ), migrations.AlterModelOptions( - name='regionkeyfigure', - options={'ordering': ('source',), 'verbose_name': 'region key figure', 'verbose_name_plural': 'region key figures'}, + name="regionkeyfigure", + options={"ordering": ("source",), "verbose_name": "region key figure", "verbose_name_plural": "region key figures"}, ), migrations.AlterModelOptions( - name='regionlink', - options={'verbose_name': 'region link', 'verbose_name_plural': 'region links'}, + name="regionlink", + options={"verbose_name": "region link", "verbose_name_plural": "region links"}, ), migrations.AlterModelOptions( - name='regionsnippet', - options={'ordering': ('position', 'id'), 'verbose_name': 'region snippet', 'verbose_name_plural': 'region snippets'}, + name="regionsnippet", + options={"ordering": ("position", "id"), "verbose_name": "region snippet", "verbose_name_plural": "region snippets"}, ), migrations.AlterModelOptions( - name='reversiondifferencelog', - options={'verbose_name': 'reversion difference log', 'verbose_name_plural': 'reversion difference logs'}, + name="reversiondifferencelog", + options={"verbose_name": "reversion difference log", "verbose_name_plural": "reversion difference logs"}, ), migrations.AlterModelOptions( - name='situationreport', - options={'verbose_name': 'situation report', 'verbose_name_plural': 'situation reports'}, + name="situationreport", + options={"verbose_name": "situation report", "verbose_name_plural": "situation reports"}, ), migrations.AlterModelOptions( - name='situationreporttype', - options={'verbose_name': 'situation report type', 'verbose_name_plural': 'situation report types'}, + name="situationreporttype", + options={"verbose_name": "situation report type", "verbose_name_plural": "situation report types"}, ), migrations.AlterModelOptions( - name='snippet', - options={'ordering': ('position', 'id'), 'verbose_name': 'snippet', 'verbose_name_plural': 'snippets'}, + name="snippet", + options={"ordering": ("position", "id"), "verbose_name": "snippet", "verbose_name_plural": "snippets"}, ), migrations.AlterModelOptions( - name='source', - options={'verbose_name': 'source', 'verbose_name_plural': 'sources'}, + name="source", + options={"verbose_name": "source", "verbose_name_plural": "sources"}, ), migrations.AlterModelOptions( - name='sourcetype', - options={'verbose_name': 'source type', 'verbose_name_plural': 'source types'}, + name="sourcetype", + options={"verbose_name": "source type", "verbose_name_plural": "source types"}, ), migrations.RemoveField( - model_name='emergencyoperationspeoplereached', - name='dref_allocated', + model_name="emergencyoperationspeoplereached", + name="dref_allocated", ), migrations.AlterField( - model_name='action', - name='category', - field=models.CharField(choices=[('General', 'General'), ('Health', 'Health'), ('NS Institutional Strengthening', 'NS Institutional Strengthening'), ('Socioeconomic Interventions', 'Socioeconomic Interventions')], default='General', max_length=255, verbose_name='category'), + model_name="action", + name="category", + field=models.CharField( + choices=[ + ("General", "General"), + ("Health", "Health"), + ("NS Institutional Strengthening", "NS Institutional Strengthening"), + ("Socioeconomic Interventions", "Socioeconomic Interventions"), + ], + default="General", + max_length=255, + verbose_name="category", + ), ), migrations.AlterField( - model_name='action', - name='field_report_types', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('EVT', 'Event'), ('EW', 'Early Warning'), ('EPI', 'Epidemic'), ('COVID', 'COVID-19')], max_length=16), default=list, size=None, verbose_name='field report types'), + model_name="action", + name="field_report_types", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[("EVT", "Event"), ("EW", "Early Warning"), ("EPI", "Epidemic"), ("COVID", "COVID-19")], max_length=16 + ), + default=list, + size=None, + verbose_name="field report types", + ), ), migrations.AlterField( - model_name='action', - name='is_disabled', - field=models.BooleanField(default=False, help_text='Disable in form', verbose_name='is disabled?'), + model_name="action", + name="is_disabled", + field=models.BooleanField(default=False, help_text="Disable in form", verbose_name="is disabled?"), ), migrations.AlterField( - model_name='action', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="action", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='action', - name='organizations', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'Foreign Society'), ('FDRN', 'Federation')], max_length=4), blank=True, default=list, size=None, verbose_name='organizations'), + model_name="action", + name="organizations", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "Foreign Society"), ("FDRN", "Federation")], max_length=4 + ), + blank=True, + default=list, + size=None, + verbose_name="organizations", + ), ), migrations.AlterField( - model_name='actionstaken', - name='actions', - field=models.ManyToManyField(blank=True, to='api.Action', verbose_name='actions'), + model_name="actionstaken", + name="actions", + field=models.ManyToManyField(blank=True, to="api.Action", verbose_name="actions"), ), migrations.AlterField( - model_name='actionstaken', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions_taken', to='api.FieldReport', verbose_name='field report'), + model_name="actionstaken", + name="field_report", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="actions_taken", + to="api.FieldReport", + verbose_name="field report", + ), ), migrations.AlterField( - model_name='actionstaken', - name='organization', - field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'Foreign Society'), ('FDRN', 'Federation')], max_length=16, verbose_name='organization'), + model_name="actionstaken", + name="organization", + field=models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "Foreign Society"), ("FDRN", "Federation")], + max_length=16, + verbose_name="organization", + ), ), migrations.AlterField( - model_name='actionstaken', - name='summary', - field=models.TextField(blank=True, verbose_name='summary'), + model_name="actionstaken", + name="summary", + field=models.TextField(blank=True, verbose_name="summary"), ), migrations.AlterField( - model_name='admincontact', - name='ctype', - field=models.CharField(blank=True, max_length=100, verbose_name='type'), + model_name="admincontact", + name="ctype", + field=models.CharField(blank=True, max_length=100, verbose_name="type"), ), migrations.AlterField( - model_name='admincontact', - name='email', - field=models.CharField(max_length=300, verbose_name='email'), + model_name="admincontact", + name="email", + field=models.CharField(max_length=300, verbose_name="email"), ), migrations.AlterField( - model_name='admincontact', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="admincontact", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='admincontact', - name='title', - field=models.CharField(max_length=300, verbose_name='title'), + model_name="admincontact", + name="title", + field=models.CharField(max_length=300, verbose_name="title"), ), migrations.AlterField( - model_name='adminkeyfigure', - name='deck', - field=models.CharField(max_length=50, verbose_name='deck'), + model_name="adminkeyfigure", + name="deck", + field=models.CharField(max_length=50, verbose_name="deck"), ), migrations.AlterField( - model_name='adminkeyfigure', - name='figure', - field=models.CharField(max_length=100, verbose_name='figure'), + model_name="adminkeyfigure", + name="figure", + field=models.CharField(max_length=100, verbose_name="figure"), ), migrations.AlterField( - model_name='adminkeyfigure', - name='source', - field=models.CharField(max_length=256, verbose_name='source'), + model_name="adminkeyfigure", + name="source", + field=models.CharField(max_length=256, verbose_name="source"), ), migrations.AlterField( - model_name='adminkeyfigure', - name='visibility', - field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name='visibility'), + model_name="adminkeyfigure", + name="visibility", + field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), ), migrations.AlterField( - model_name='adminlink', - name='title', - field=models.CharField(max_length=100, verbose_name='title'), + model_name="adminlink", + name="title", + field=models.CharField(max_length=100, verbose_name="title"), ), migrations.AlterField( - model_name='adminlink', - name='url', - field=models.URLField(max_length=300, verbose_name='url'), + model_name="adminlink", + name="url", + field=models.URLField(max_length=300, verbose_name="url"), ), migrations.AlterField( - model_name='appeal', - name='aid', - field=models.CharField(max_length=20, verbose_name='appeal ID'), + model_name="appeal", + name="aid", + field=models.CharField(max_length=20, verbose_name="appeal ID"), ), migrations.AlterField( - model_name='appeal', - name='amount_funded', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='amount funded'), + model_name="appeal", + name="amount_funded", + field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name="amount funded"), ), migrations.AlterField( - model_name='appeal', - name='amount_requested', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='amount requested'), + model_name="appeal", + name="amount_requested", + field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name="amount requested"), ), migrations.AlterField( - model_name='appeal', - name='atype', - field=models.IntegerField(default=0, choices=api.models.AppealType.choices, verbose_name='appeal type'), + model_name="appeal", + name="atype", + field=models.IntegerField(default=0, choices=api.models.AppealType.choices, verbose_name="appeal type"), ), migrations.AlterField( - model_name='appeal', - name='code', - field=models.CharField(max_length=20, null=True, unique=True, verbose_name='code'), + model_name="appeal", + name="code", + field=models.CharField(max_length=20, null=True, unique=True, verbose_name="code"), ), migrations.AlterField( - model_name='appeal', - name='country', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country'), + model_name="appeal", + name="country", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='appeal', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="appeal", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='appeal', - name='dtype', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType', verbose_name='disaster type'), + model_name="appeal", + name="dtype", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.DisasterType", verbose_name="disaster type" + ), ), migrations.AlterField( - model_name='appeal', - name='end_date', - field=models.DateTimeField(null=True, verbose_name='end date'), + model_name="appeal", + name="end_date", + field=models.DateTimeField(null=True, verbose_name="end date"), ), migrations.AlterField( - model_name='appeal', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='appeals', to='api.Event', verbose_name='event'), + model_name="appeal", + name="event", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="appeals", + to="api.Event", + verbose_name="event", + ), ), migrations.AlterField( - model_name='appeal', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), + model_name="appeal", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified at"), ), migrations.AlterField( - model_name='appeal', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="appeal", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='appeal', - name='needs_confirmation', - field=models.BooleanField(default=False, verbose_name='needs confirmation?'), + model_name="appeal", + name="needs_confirmation", + field=models.BooleanField(default=False, verbose_name="needs confirmation?"), ), migrations.AlterField( - model_name='appeal', - name='num_beneficiaries', - field=models.IntegerField(default=0, verbose_name='number of beneficiaries'), + model_name="appeal", + name="num_beneficiaries", + field=models.IntegerField(default=0, verbose_name="number of beneficiaries"), ), migrations.AlterField( - model_name='appeal', - name='previous_update', - field=models.DateTimeField(blank=True, null=True, verbose_name='previous update'), + model_name="appeal", + name="previous_update", + field=models.DateTimeField(blank=True, null=True, verbose_name="previous update"), ), migrations.AlterField( - model_name='appeal', - name='real_data_update', - field=models.DateTimeField(blank=True, null=True, verbose_name='real data update'), + model_name="appeal", + name="real_data_update", + field=models.DateTimeField(blank=True, null=True, verbose_name="real data update"), ), migrations.AlterField( - model_name='appeal', - name='region', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Region', verbose_name='region'), + model_name="appeal", + name="region", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Region", verbose_name="region" + ), ), migrations.AlterField( - model_name='appeal', - name='sector', - field=models.CharField(blank=True, max_length=100, verbose_name='sector'), + model_name="appeal", + name="sector", + field=models.CharField(blank=True, max_length=100, verbose_name="sector"), ), migrations.AlterField( - model_name='appeal', - name='start_date', - field=models.DateTimeField(null=True, verbose_name='start date'), + model_name="appeal", + name="start_date", + field=models.DateTimeField(null=True, verbose_name="start date"), ), migrations.AlterField( - model_name='appeal', - name='status', - field=models.IntegerField(default=0, choices=api.models.AppealStatus.choices, verbose_name='status'), + model_name="appeal", + name="status", + field=models.IntegerField(default=0, choices=api.models.AppealStatus.choices, verbose_name="status"), ), migrations.AlterField( - model_name='appealdocument', - name='appeal', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Appeal', verbose_name='appeal'), + model_name="appealdocument", + name="appeal", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Appeal", verbose_name="appeal"), ), migrations.AlterField( - model_name='appealdocument', - name='created_at', - field=models.DateTimeField(verbose_name='created at'), + model_name="appealdocument", + name="created_at", + field=models.DateTimeField(verbose_name="created at"), ), migrations.AlterField( - model_name='appealdocument', - name='document', - field=models.FileField(blank=True, null=True, upload_to=api.models.appeal_document_path, verbose_name='document'), + model_name="appealdocument", + name="document", + field=models.FileField(blank=True, null=True, upload_to=api.models.appeal_document_path, verbose_name="document"), ), migrations.AlterField( - model_name='appealdocument', - name='document_url', - field=models.URLField(blank=True, verbose_name='document url'), + model_name="appealdocument", + name="document_url", + field=models.URLField(blank=True, verbose_name="document url"), ), migrations.AlterField( - model_name='appealdocument', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="appealdocument", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='authlog', - name='action', - field=models.CharField(max_length=64, verbose_name='action'), + model_name="authlog", + name="action", + field=models.CharField(max_length=64, verbose_name="action"), ), migrations.AlterField( - model_name='authlog', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="authlog", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='authlog', - name='username', - field=models.CharField(max_length=256, null=True, verbose_name='username'), + model_name="authlog", + name="username", + field=models.CharField(max_length=256, null=True, verbose_name="username"), ), migrations.AlterField( - model_name='country', - name='inform_score', - field=models.DecimalField(blank=True, decimal_places=2, max_digits=3, null=True, verbose_name='inform score'), + model_name="country", + name="inform_score", + field=models.DecimalField(blank=True, decimal_places=2, max_digits=3, null=True, verbose_name="inform score"), ), migrations.AlterField( - model_name='country', - name='iso', - field=models.CharField(max_length=2, null=True, verbose_name='ISO'), + model_name="country", + name="iso", + field=models.CharField(max_length=2, null=True, verbose_name="ISO"), ), migrations.AlterField( - model_name='country', - name='iso3', - field=models.CharField(max_length=3, null=True, verbose_name='ISO3'), + model_name="country", + name="iso3", + field=models.CharField(max_length=3, null=True, verbose_name="ISO3"), ), migrations.AlterField( - model_name='country', - name='key_priorities', - field=models.TextField(blank=True, null=True, verbose_name='key priorities'), + model_name="country", + name="key_priorities", + field=models.TextField(blank=True, null=True, verbose_name="key priorities"), ), migrations.AlterField( - model_name='country', - name='logo', - field=models.FileField(blank=True, null=True, upload_to=api.models.logo_document_path, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'jpg', 'gif'])], verbose_name='logo'), + model_name="country", + name="logo", + field=models.FileField( + blank=True, + null=True, + upload_to=api.models.logo_document_path, + validators=[django.core.validators.FileExtensionValidator(allowed_extensions=["png", "jpg", "gif"])], + verbose_name="logo", + ), ), migrations.AlterField( - model_name='country', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="country", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='country', - name='overview', - field=models.TextField(blank=True, null=True, verbose_name='overview'), + model_name="country", + name="overview", + field=models.TextField(blank=True, null=True, verbose_name="overview"), ), migrations.AlterField( - model_name='country', - name='record_type', - field=models.IntegerField(default=1, choices=api.models.CountryType.choices, help_text='Type of entity', verbose_name='type'), + model_name="country", + name="record_type", + field=models.IntegerField( + default=1, choices=api.models.CountryType.choices, help_text="Type of entity", verbose_name="type" + ), ), migrations.AlterField( - model_name='country', - name='region', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Region', verbose_name='region'), + model_name="country", + name="region", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Region", verbose_name="region" + ), ), migrations.AlterField( - model_name='country', - name='society_name', - field=models.TextField(blank=True, verbose_name='society name'), + model_name="country", + name="society_name", + field=models.TextField(blank=True, verbose_name="society name"), ), migrations.AlterField( - model_name='country', - name='wb_population', - field=models.PositiveIntegerField(blank=True, help_text='population data from WB API', null=True, verbose_name='WB population'), + model_name="country", + name="wb_population", + field=models.PositiveIntegerField( + blank=True, help_text="population data from WB API", null=True, verbose_name="WB population" + ), ), migrations.AlterField( - model_name='country', - name='wb_year', - field=models.CharField(blank=True, help_text='population data year from WB API', max_length=4, null=True, verbose_name='WB Year'), + model_name="country", + name="wb_year", + field=models.CharField( + blank=True, help_text="population data year from WB API", max_length=4, null=True, verbose_name="WB Year" + ), ), migrations.AlterField( - model_name='countrycontact', - name='country', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='api.Country', verbose_name='country'), + model_name="countrycontact", + name="country", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="contacts", to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='countrykeyfigure', - name='country', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='key_figures', to='api.Country', verbose_name='country'), + model_name="countrykeyfigure", + name="country", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="key_figures", to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='countrylink', - name='country', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='links', to='api.Country', verbose_name='country'), + model_name="countrylink", + name="country", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="links", to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='countrysnippet', - name='country', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='snippets', to='api.Country', verbose_name='country'), + model_name="countrysnippet", + name="country", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="snippets", to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='countrysnippet', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='countries/%Y/%m/%d/', verbose_name='image'), + model_name="countrysnippet", + name="image", + field=models.ImageField(blank=True, null=True, upload_to="countries/%Y/%m/%d/", verbose_name="image"), ), migrations.AlterField( - model_name='countrysnippet', - name='position', - field=models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name='position'), + model_name="countrysnippet", + name="position", + field=models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name="position"), ), migrations.AlterField( - model_name='countrysnippet', - name='snippet', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="countrysnippet", + name="snippet", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='countrysnippet', - name='visibility', - field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name='visibility'), + model_name="countrysnippet", + name="visibility", + field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), ), migrations.AlterField( - model_name='cronjob', - name='backend_side', - field=models.BooleanField(default=True, verbose_name='backend side'), + model_name="cronjob", + name="backend_side", + field=models.BooleanField(default=True, verbose_name="backend side"), ), migrations.AlterField( - model_name='cronjob', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="cronjob", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='cronjob', - name='message', - field=models.TextField(blank=True, null=True, verbose_name='message'), + model_name="cronjob", + name="message", + field=models.TextField(blank=True, null=True, verbose_name="message"), ), migrations.AlterField( - model_name='cronjob', - name='name', - field=models.CharField(default='', max_length=100, verbose_name='name'), + model_name="cronjob", + name="name", + field=models.CharField(default="", max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='cronjob', - name='num_result', - field=models.IntegerField(default=0, verbose_name='number of results'), + model_name="cronjob", + name="num_result", + field=models.IntegerField(default=0, verbose_name="number of results"), ), migrations.AlterField( - model_name='cronjob', - name='status', - field=models.IntegerField(default=-1, choices=api.models.CronJobStatus.choices, verbose_name='status'), + model_name="cronjob", + name="status", + field=models.IntegerField(default=-1, choices=api.models.CronJobStatus.choices, verbose_name="status"), ), migrations.AlterField( - model_name='cronjob', - name='storing_days', - field=models.IntegerField(default=3, verbose_name='storing days'), + model_name="cronjob", + name="storing_days", + field=models.IntegerField(default=3, verbose_name="storing days"), ), migrations.AlterField( - model_name='disastertype', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="disastertype", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='disastertype', - name='summary', - field=models.TextField(verbose_name='summary'), + model_name="disastertype", + name="summary", + field=models.TextField(verbose_name="summary"), ), migrations.AlterField( - model_name='district', - name='code', - field=models.CharField(max_length=10, verbose_name='code'), + model_name="district", + name="code", + field=models.CharField(max_length=10, verbose_name="code"), ), migrations.AlterField( - model_name='district', - name='country', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country'), + model_name="district", + name="country", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='district', - name='country_iso', - field=models.CharField(max_length=3, null=True, verbose_name='country ISO3'), + model_name="district", + name="country_iso", + field=models.CharField(max_length=3, null=True, verbose_name="country ISO3"), ), migrations.AlterField( - model_name='district', - name='country_name', - field=models.CharField(max_length=100, verbose_name='country name'), + model_name="district", + name="country_name", + field=models.CharField(max_length=100, verbose_name="country name"), ), migrations.AlterField( - model_name='district', - name='is_enclave', - field=models.BooleanField(default=False, help_text='Is it an enclave away from parent country?', verbose_name='is enclave?'), + model_name="district", + name="is_enclave", + field=models.BooleanField( + default=False, help_text="Is it an enclave away from parent country?", verbose_name="is enclave?" + ), ), migrations.AlterField( - model_name='district', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="district", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='district', - name='wb_population', - field=models.PositiveIntegerField(blank=True, help_text='population data from WB API', null=True, verbose_name='WB population'), + model_name="district", + name="wb_population", + field=models.PositiveIntegerField( + blank=True, help_text="population data from WB API", null=True, verbose_name="WB population" + ), ), migrations.AlterField( - model_name='district', - name='wb_year', - field=models.CharField(blank=True, help_text='population data year from WB API', max_length=4, null=True, verbose_name='WB year'), + model_name="district", + name="wb_year", + field=models.CharField( + blank=True, help_text="population data year from WB API", max_length=4, null=True, verbose_name="WB year" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='appeal_launch_date', - field=models.DateField(blank=True, null=True, verbose_name='appeal launch date'), + model_name="emergencyoperationsdataset", + name="appeal_launch_date", + field=models.DateField(blank=True, null=True, verbose_name="appeal launch date"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='appeal_number', - field=models.CharField(blank=True, max_length=20, null=True, verbose_name='appeal number'), + model_name="emergencyoperationsdataset", + name="appeal_number", + field=models.CharField(blank=True, max_length=20, null=True, verbose_name="appeal number"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='category_allocated', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='category allocated'), + model_name="emergencyoperationsdataset", + name="category_allocated", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="category allocated"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created_at'), + model_name="emergencyoperationsdataset", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created_at"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='date_of_issue', - field=models.DateField(blank=True, null=True, verbose_name='date of issue'), + model_name="emergencyoperationsdataset", + name="date_of_issue", + field=models.DateField(blank=True, null=True, verbose_name="date of issue"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='disaster_risk_reduction_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction female'), + model_name="emergencyoperationsdataset", + name="disaster_risk_reduction_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction female"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='disaster_risk_reduction_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction male'), + model_name="emergencyoperationsdataset", + name="disaster_risk_reduction_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction male"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='disaster_risk_reduction_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people reached'), + model_name="emergencyoperationsdataset", + name="disaster_risk_reduction_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction people reached"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='disaster_risk_reduction_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people targeted'), + model_name="emergencyoperationsdataset", + name="disaster_risk_reduction_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='disaster_risk_reduction_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people requirements'), + model_name="emergencyoperationsdataset", + name="disaster_risk_reduction_requirements", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of disaster risk reduction people requirements" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='dref_allocated', - field=models.IntegerField(blank=True, null=True, verbose_name='DREF allocated'), + model_name="emergencyoperationsdataset", + name="dref_allocated", + field=models.IntegerField(blank=True, null=True, verbose_name="DREF allocated"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='education_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of eduction female'), + model_name="emergencyoperationsdataset", + name="education_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of eduction female"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='education_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of eduction male'), + model_name="emergencyoperationsdataset", + name="education_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of eduction male"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='education_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of eduction people reached'), + model_name="emergencyoperationsdataset", + name="education_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of eduction people reached"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='education_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of eduction people targeted'), + model_name="emergencyoperationsdataset", + name="education_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of eduction people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='education_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of eduction requirements'), + model_name="emergencyoperationsdataset", + name="education_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of eduction requirements"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='expected_end_date', - field=models.DateField(blank=True, null=True, verbose_name='expected end date'), + model_name="emergencyoperationsdataset", + name="expected_end_date", + field=models.DateField(blank=True, null=True, verbose_name="expected end date"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='expected_time_frame', - field=models.IntegerField(blank=True, null=True, verbose_name='expected time frame'), + model_name="emergencyoperationsdataset", + name="expected_time_frame", + field=models.IntegerField(blank=True, null=True, verbose_name="expected time frame"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='glide_number', - field=models.CharField(blank=True, max_length=18, null=True, verbose_name='glide number'), + model_name="emergencyoperationsdataset", + name="glide_number", + field=models.CharField(blank=True, max_length=18, null=True, verbose_name="glide number"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='health_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health female'), + model_name="emergencyoperationsdataset", + name="health_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health female"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='health_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health male'), + model_name="emergencyoperationsdataset", + name="health_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health male"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='health_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health people reached'), + model_name="emergencyoperationsdataset", + name="health_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health people reached"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='health_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health people targeted'), + model_name="emergencyoperationsdataset", + name="health_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='health_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health requirements'), + model_name="emergencyoperationsdataset", + name="health_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health requirements"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='is_validated', - field=models.BooleanField(default=False, help_text='Did anyone check the editable data?', verbose_name='is validated?'), + model_name="emergencyoperationsdataset", + name="is_validated", + field=models.BooleanField( + default=False, help_text="Did anyone check the editable data?", verbose_name="is validated?" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs female'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs female"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs male'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs male"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic people reached'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic people reached"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic people targeted'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs requirements'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs requirements"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='migration_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration female'), + model_name="emergencyoperationsdataset", + name="migration_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration female"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='migration_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration male'), + model_name="emergencyoperationsdataset", + name="migration_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration male"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='migration_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration people reached'), + model_name="emergencyoperationsdataset", + name="migration_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration people reached"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='migration_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration people targeted'), + model_name="emergencyoperationsdataset", + name="migration_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='migration_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration requirements'), + model_name="emergencyoperationsdataset", + name="migration_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration requirements"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified_at'), + model_name="emergencyoperationsdataset", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified_at"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='num_of_people_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of people affected'), + model_name="emergencyoperationsdataset", + name="num_of_people_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of people affected"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='num_of_people_to_be_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of people to be assisted'), + model_name="emergencyoperationsdataset", + name="num_of_people_to_be_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of people to be assisted"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='protection_gender_and_inclusion_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion female'), + model_name="emergencyoperationsdataset", + name="protection_gender_and_inclusion_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of protection gender and inclusion female"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='protection_gender_and_inclusion_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion male'), + model_name="emergencyoperationsdataset", + name="protection_gender_and_inclusion_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of protection gender and inclusion male"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='protection_gender_and_inclusion_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion people reached'), + model_name="emergencyoperationsdataset", + name="protection_gender_and_inclusion_people_reached", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people reached" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='protection_gender_and_inclusion_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion people targeted'), + model_name="emergencyoperationsdataset", + name="protection_gender_and_inclusion_people_targeted", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people targeted" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='protection_gender_and_inclusion_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion requirements'), + model_name="emergencyoperationsdataset", + name="protection_gender_and_inclusion_requirements", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion requirements" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_appeal_launch_date', - field=models.TextField(blank=True, null=True, verbose_name='appeal launch date (raw)'), + model_name="emergencyoperationsdataset", + name="raw_appeal_launch_date", + field=models.TextField(blank=True, null=True, verbose_name="appeal launch date (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_appeal_number', - field=models.TextField(blank=True, null=True, verbose_name='appeal number (raw)'), + model_name="emergencyoperationsdataset", + name="raw_appeal_number", + field=models.TextField(blank=True, null=True, verbose_name="appeal number (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_category_allocated', - field=models.TextField(blank=True, null=True, verbose_name='category allocated (raw)'), + model_name="emergencyoperationsdataset", + name="raw_category_allocated", + field=models.TextField(blank=True, null=True, verbose_name="category allocated (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_date_of_issue', - field=models.TextField(blank=True, null=True, verbose_name='date of issue (raw)'), + model_name="emergencyoperationsdataset", + name="raw_date_of_issue", + field=models.TextField(blank=True, null=True, verbose_name="date of issue (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_disaster_risk_reduction_female', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction female (raw)'), + model_name="emergencyoperationsdataset", + name="raw_disaster_risk_reduction_female", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_disaster_risk_reduction_male', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction male (raw)'), + model_name="emergencyoperationsdataset", + name="raw_disaster_risk_reduction_male", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_disaster_risk_reduction_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction people reached (raw)'), + model_name="emergencyoperationsdataset", + name="raw_disaster_risk_reduction_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_disaster_risk_reduction_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction people targeted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_disaster_risk_reduction_people_targeted", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction people targeted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_disaster_risk_reduction_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction requirements (raw)'), + model_name="emergencyoperationsdataset", + name="raw_disaster_risk_reduction_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_education_female', - field=models.TextField(blank=True, null=True, verbose_name='number of eduction female (raw)'), + model_name="emergencyoperationsdataset", + name="raw_education_female", + field=models.TextField(blank=True, null=True, verbose_name="number of eduction female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_education_male', - field=models.TextField(blank=True, null=True, verbose_name='number of eduction male (raw)'), + model_name="emergencyoperationsdataset", + name="raw_education_male", + field=models.TextField(blank=True, null=True, verbose_name="number of eduction male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_education_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of eduction people reached (raw)'), + model_name="emergencyoperationsdataset", + name="raw_education_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of eduction people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_education_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of eduction people targeted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_education_people_targeted", + field=models.TextField(blank=True, null=True, verbose_name="number of eduction people targeted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_education_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of eduction requirements (raw)'), + model_name="emergencyoperationsdataset", + name="raw_education_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of eduction requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_expected_end_date', - field=models.TextField(blank=True, null=True, verbose_name='expected end date (raw)'), + model_name="emergencyoperationsdataset", + name="raw_expected_end_date", + field=models.TextField(blank=True, null=True, verbose_name="expected end date (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_expected_time_frame', - field=models.TextField(blank=True, null=True, verbose_name='expected time frame (raw)'), + model_name="emergencyoperationsdataset", + name="raw_expected_time_frame", + field=models.TextField(blank=True, null=True, verbose_name="expected time frame (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_glide_number', - field=models.TextField(blank=True, null=True, verbose_name='glide number (raw)'), + model_name="emergencyoperationsdataset", + name="raw_glide_number", + field=models.TextField(blank=True, null=True, verbose_name="glide number (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_health_female', - field=models.TextField(blank=True, null=True, verbose_name='health female (raw)'), + model_name="emergencyoperationsdataset", + name="raw_health_female", + field=models.TextField(blank=True, null=True, verbose_name="health female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_health_male', - field=models.TextField(blank=True, null=True, verbose_name='health male (raw)'), + model_name="emergencyoperationsdataset", + name="raw_health_male", + field=models.TextField(blank=True, null=True, verbose_name="health male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_health_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='health people reached (raw)'), + model_name="emergencyoperationsdataset", + name="raw_health_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="health people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_health_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='health people targeted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_health_people_targeted", + field=models.TextField(blank=True, null=True, verbose_name="health people targeted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_health_requirements', - field=models.TextField(blank=True, null=True, verbose_name='health requirements (raw)'), + model_name="emergencyoperationsdataset", + name="raw_health_requirements", + field=models.TextField(blank=True, null=True, verbose_name="health requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_female', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs female (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_female", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihhods and basic needs female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_male', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs male (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_male", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihhods and basic needs male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs people reached (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs people targeted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_people_targeted", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs people targeted (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs requirements (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_migration_female', - field=models.TextField(blank=True, null=True, verbose_name='number of migration female (raw)'), + model_name="emergencyoperationsdataset", + name="raw_migration_female", + field=models.TextField(blank=True, null=True, verbose_name="number of migration female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_migration_male', - field=models.TextField(blank=True, null=True, verbose_name='number of migration male (raw)'), + model_name="emergencyoperationsdataset", + name="raw_migration_male", + field=models.TextField(blank=True, null=True, verbose_name="number of migration male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_migration_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of migration people reached (raw)'), + model_name="emergencyoperationsdataset", + name="raw_migration_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of migration people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_migration_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of migration people targeted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_migration_people_targeted", + field=models.TextField(blank=True, null=True, verbose_name="number of migration people targeted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_migration_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of migration requirements (raw)'), + model_name="emergencyoperationsdataset", + name="raw_migration_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of migration requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_num_of_people_affected', - field=models.TextField(blank=True, null=True, verbose_name='number of people affected (raw)'), + model_name="emergencyoperationsdataset", + name="raw_num_of_people_affected", + field=models.TextField(blank=True, null=True, verbose_name="number of people affected (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_num_of_people_to_be_assisted', - field=models.TextField(blank=True, null=True, verbose_name='number of people to be assisted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_num_of_people_to_be_assisted", + field=models.TextField(blank=True, null=True, verbose_name="number of people to be assisted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_protection_gender_and_inclusion_female', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion female (raw)'), + model_name="emergencyoperationsdataset", + name="raw_protection_gender_and_inclusion_female", + field=models.TextField(blank=True, null=True, verbose_name="number of protection gender and inclusion female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_protection_gender_and_inclusion_male', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion male (raw)'), + model_name="emergencyoperationsdataset", + name="raw_protection_gender_and_inclusion_male", + field=models.TextField(blank=True, null=True, verbose_name="number of protection gender and inclusion male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_protection_gender_and_inclusion_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion people reached (raw)'), + model_name="emergencyoperationsdataset", + name="raw_protection_gender_and_inclusion_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_protection_gender_and_inclusion_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion people targeted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_protection_gender_and_inclusion_people_targeted", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people targeted (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_protection_gender_and_inclusion_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion requirements (raw)'), + model_name="emergencyoperationsdataset", + name="raw_protection_gender_and_inclusion_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_shelter_female', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter female (raw)'), + model_name="emergencyoperationsdataset", + name="raw_shelter_female", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_shelter_male', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter male (raw)'), + model_name="emergencyoperationsdataset", + name="raw_shelter_male", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_shelter_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter people reached (raw)'), + model_name="emergencyoperationsdataset", + name="raw_shelter_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_shelter_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter people targeted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_shelter_people_targeted", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter people targeted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_shelter_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter requirements (raw)'), + model_name="emergencyoperationsdataset", + name="raw_shelter_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_water_sanitation_and_hygiene_female', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene female (raw)'), + model_name="emergencyoperationsdataset", + name="raw_water_sanitation_and_hygiene_female", + field=models.TextField(blank=True, null=True, verbose_name="number of water sanitation and hygiene female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_water_sanitation_and_hygiene_male', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene male (raw)'), + model_name="emergencyoperationsdataset", + name="raw_water_sanitation_and_hygiene_male", + field=models.TextField(blank=True, null=True, verbose_name="number of water sanitation and hygiene male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_water_sanitation_and_hygiene_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene people reached (raw)'), + model_name="emergencyoperationsdataset", + name="raw_water_sanitation_and_hygiene_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_water_sanitation_and_hygiene_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene people targeted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_water_sanitation_and_hygiene_people_targeted", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene people targeted (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_water_sanitation_and_hygiene_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene requirements (raw)'), + model_name="emergencyoperationsdataset", + name="raw_water_sanitation_and_hygiene_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='shelter_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter female'), + model_name="emergencyoperationsdataset", + name="shelter_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter female"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='shelter_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter male'), + model_name="emergencyoperationsdataset", + name="shelter_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter male"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='shelter_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people reached'), + model_name="emergencyoperationsdataset", + name="shelter_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people reached"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='shelter_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people targeted'), + model_name="emergencyoperationsdataset", + name="shelter_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='shelter_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people requirements'), + model_name="emergencyoperationsdataset", + name="shelter_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people requirements"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='water_sanitation_and_hygiene_female', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene female'), + model_name="emergencyoperationsdataset", + name="water_sanitation_and_hygiene_female", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene female"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='water_sanitation_and_hygiene_male', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene male'), + model_name="emergencyoperationsdataset", + name="water_sanitation_and_hygiene_male", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene male"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='water_sanitation_and_hygiene_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene people reached'), + model_name="emergencyoperationsdataset", + name="water_sanitation_and_hygiene_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene people reached"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='water_sanitation_and_hygiene_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene people targeted'), + model_name="emergencyoperationsdataset", + name="water_sanitation_and_hygiene_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='water_sanitation_and_hygiene_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene requirements'), + model_name="emergencyoperationsdataset", + name="water_sanitation_and_hygiene_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene requirements"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='appeal_ends', - field=models.DateField(blank=True, null=True, verbose_name='appeal ends'), + model_name="emergencyoperationsea", + name="appeal_ends", + field=models.DateField(blank=True, null=True, verbose_name="appeal ends"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='appeal_launch_date', - field=models.DateField(blank=True, null=True, verbose_name='appeal launch date'), + model_name="emergencyoperationsea", + name="appeal_launch_date", + field=models.DateField(blank=True, null=True, verbose_name="appeal launch date"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='appeal_number', - field=models.CharField(blank=True, max_length=20, null=True, verbose_name='appeal number'), + model_name="emergencyoperationsea", + name="appeal_number", + field=models.CharField(blank=True, max_length=20, null=True, verbose_name="appeal number"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created_at'), + model_name="emergencyoperationsea", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created_at"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='current_operation_budget', - field=models.IntegerField(blank=True, null=True, verbose_name='current operation budget'), + model_name="emergencyoperationsea", + name="current_operation_budget", + field=models.IntegerField(blank=True, null=True, verbose_name="current operation budget"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='disaster_risk_reduction_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction female'), + model_name="emergencyoperationsea", + name="disaster_risk_reduction_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction female"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='disaster_risk_reduction_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction male'), + model_name="emergencyoperationsea", + name="disaster_risk_reduction_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction male"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='disaster_risk_reduction_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people reached'), + model_name="emergencyoperationsea", + name="disaster_risk_reduction_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction people reached"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='disaster_risk_reduction_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people targeted'), + model_name="emergencyoperationsea", + name="disaster_risk_reduction_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='disaster_risk_reduction_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people requirements'), + model_name="emergencyoperationsea", + name="disaster_risk_reduction_requirements", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of disaster risk reduction people requirements" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='dref_allocated', - field=models.IntegerField(blank=True, null=True, verbose_name='DREF allocated'), + model_name="emergencyoperationsea", + name="dref_allocated", + field=models.IntegerField(blank=True, null=True, verbose_name="DREF allocated"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='glide_number', - field=models.CharField(blank=True, max_length=18, null=True, verbose_name='glide number'), + model_name="emergencyoperationsea", + name="glide_number", + field=models.CharField(blank=True, max_length=18, null=True, verbose_name="glide number"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='health_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health female'), + model_name="emergencyoperationsea", + name="health_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health female"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='health_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health male'), + model_name="emergencyoperationsea", + name="health_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health male"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='health_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health people reached'), + model_name="emergencyoperationsea", + name="health_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health people reached"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='health_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health people targeted'), + model_name="emergencyoperationsea", + name="health_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='health_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health requirements'), + model_name="emergencyoperationsea", + name="health_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health requirements"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='is_validated', - field=models.BooleanField(default=False, help_text='Did anyone check the editable data?', verbose_name='is validated?'), + model_name="emergencyoperationsea", + name="is_validated", + field=models.BooleanField( + default=False, help_text="Did anyone check the editable data?", verbose_name="is validated?" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs female'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs female"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs male'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs male"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic people reached'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic people reached"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic people targeted'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs requirements'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs requirements"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='migration_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration female'), + model_name="emergencyoperationsea", + name="migration_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration female"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='migration_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration male'), + model_name="emergencyoperationsea", + name="migration_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration male"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='migration_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration people reached'), + model_name="emergencyoperationsea", + name="migration_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration people reached"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='migration_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration people targeted'), + model_name="emergencyoperationsea", + name="migration_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='migration_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration requirements'), + model_name="emergencyoperationsea", + name="migration_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration requirements"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified_at'), + model_name="emergencyoperationsea", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified_at"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='num_of_people_to_be_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of people to be assisted'), + model_name="emergencyoperationsea", + name="num_of_people_to_be_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of people to be assisted"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='protection_gender_and_inclusion_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion female'), + model_name="emergencyoperationsea", + name="protection_gender_and_inclusion_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of protection gender and inclusion female"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='protection_gender_and_inclusion_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion male'), + model_name="emergencyoperationsea", + name="protection_gender_and_inclusion_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of protection gender and inclusion male"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='protection_gender_and_inclusion_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion people reached'), + model_name="emergencyoperationsea", + name="protection_gender_and_inclusion_people_reached", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people reached" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='protection_gender_and_inclusion_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion people targeted'), + model_name="emergencyoperationsea", + name="protection_gender_and_inclusion_people_targeted", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people targeted" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='protection_gender_and_inclusion_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion requirements'), + model_name="emergencyoperationsea", + name="protection_gender_and_inclusion_requirements", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion requirements" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_appeal_ends', - field=models.TextField(blank=True, null=True, verbose_name='appeal ends (raw)'), + model_name="emergencyoperationsea", + name="raw_appeal_ends", + field=models.TextField(blank=True, null=True, verbose_name="appeal ends (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_appeal_launch_date', - field=models.TextField(blank=True, null=True, verbose_name='appeal launch date (raw)'), + model_name="emergencyoperationsea", + name="raw_appeal_launch_date", + field=models.TextField(blank=True, null=True, verbose_name="appeal launch date (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_appeal_number', - field=models.TextField(blank=True, null=True, verbose_name='appeal number (raw)'), + model_name="emergencyoperationsea", + name="raw_appeal_number", + field=models.TextField(blank=True, null=True, verbose_name="appeal number (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_current_operation_budget', - field=models.TextField(blank=True, null=True, verbose_name='current operation budget (raw)'), + model_name="emergencyoperationsea", + name="raw_current_operation_budget", + field=models.TextField(blank=True, null=True, verbose_name="current operation budget (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_disaster_risk_reduction_female', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction female (raw)'), + model_name="emergencyoperationsea", + name="raw_disaster_risk_reduction_female", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_disaster_risk_reduction_male', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction male (raw)'), + model_name="emergencyoperationsea", + name="raw_disaster_risk_reduction_male", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_disaster_risk_reduction_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction people reached (raw)'), + model_name="emergencyoperationsea", + name="raw_disaster_risk_reduction_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_disaster_risk_reduction_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction people targeted (raw)'), + model_name="emergencyoperationsea", + name="raw_disaster_risk_reduction_people_targeted", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction people targeted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_disaster_risk_reduction_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction requirements (raw)'), + model_name="emergencyoperationsea", + name="raw_disaster_risk_reduction_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_glide_number', - field=models.TextField(blank=True, null=True, verbose_name='glide number (raw)'), + model_name="emergencyoperationsea", + name="raw_glide_number", + field=models.TextField(blank=True, null=True, verbose_name="glide number (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_health_female', - field=models.TextField(blank=True, null=True, verbose_name='health female (raw)'), + model_name="emergencyoperationsea", + name="raw_health_female", + field=models.TextField(blank=True, null=True, verbose_name="health female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_health_male', - field=models.TextField(blank=True, null=True, verbose_name='health male (raw)'), + model_name="emergencyoperationsea", + name="raw_health_male", + field=models.TextField(blank=True, null=True, verbose_name="health male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_health_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='health people reached (raw)'), + model_name="emergencyoperationsea", + name="raw_health_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="health people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_health_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='health people targeted (raw)'), + model_name="emergencyoperationsea", + name="raw_health_people_targeted", + field=models.TextField(blank=True, null=True, verbose_name="health people targeted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_health_requirements', - field=models.TextField(blank=True, null=True, verbose_name='health requirements (raw)'), + model_name="emergencyoperationsea", + name="raw_health_requirements", + field=models.TextField(blank=True, null=True, verbose_name="health requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_female', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs female (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_female", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihhods and basic needs female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_male', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs male (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_male", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihhods and basic needs male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs people reached (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs people targeted (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_people_targeted", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs people targeted (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs requirements (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_migration_female', - field=models.TextField(blank=True, null=True, verbose_name='number of migration female (raw)'), + model_name="emergencyoperationsea", + name="raw_migration_female", + field=models.TextField(blank=True, null=True, verbose_name="number of migration female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_migration_male', - field=models.TextField(blank=True, null=True, verbose_name='number of migration male (raw)'), + model_name="emergencyoperationsea", + name="raw_migration_male", + field=models.TextField(blank=True, null=True, verbose_name="number of migration male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_migration_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of migration people reached (raw)'), + model_name="emergencyoperationsea", + name="raw_migration_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of migration people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_migration_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of migration people targeted (raw)'), + model_name="emergencyoperationsea", + name="raw_migration_people_targeted", + field=models.TextField(blank=True, null=True, verbose_name="number of migration people targeted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_migration_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of migration requirements (raw)'), + model_name="emergencyoperationsea", + name="raw_migration_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of migration requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_num_of_people_to_be_assisted', - field=models.TextField(blank=True, null=True, verbose_name='number of people to be assisted (raw)'), + model_name="emergencyoperationsea", + name="raw_num_of_people_to_be_assisted", + field=models.TextField(blank=True, null=True, verbose_name="number of people to be assisted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_protection_gender_and_inclusion_female', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion female (raw)'), + model_name="emergencyoperationsea", + name="raw_protection_gender_and_inclusion_female", + field=models.TextField(blank=True, null=True, verbose_name="number of protection gender and inclusion female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_protection_gender_and_inclusion_male', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion male (raw)'), + model_name="emergencyoperationsea", + name="raw_protection_gender_and_inclusion_male", + field=models.TextField(blank=True, null=True, verbose_name="number of protection gender and inclusion male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_protection_gender_and_inclusion_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion people reached (raw)'), + model_name="emergencyoperationsea", + name="raw_protection_gender_and_inclusion_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_protection_gender_and_inclusion_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion people targeted (raw)'), + model_name="emergencyoperationsea", + name="raw_protection_gender_and_inclusion_people_targeted", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people targeted (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_protection_gender_and_inclusion_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion requirements (raw)'), + model_name="emergencyoperationsea", + name="raw_protection_gender_and_inclusion_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_shelter_female', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter female (raw)'), + model_name="emergencyoperationsea", + name="raw_shelter_female", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_shelter_male', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter male (raw)'), + model_name="emergencyoperationsea", + name="raw_shelter_male", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_shelter_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter people reached (raw)'), + model_name="emergencyoperationsea", + name="raw_shelter_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_shelter_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter people targeted (raw)'), + model_name="emergencyoperationsea", + name="raw_shelter_people_targeted", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter people targeted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_shelter_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter requirements (raw)'), + model_name="emergencyoperationsea", + name="raw_shelter_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_water_sanitation_and_hygiene_female', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene female (raw)'), + model_name="emergencyoperationsea", + name="raw_water_sanitation_and_hygiene_female", + field=models.TextField(blank=True, null=True, verbose_name="number of water sanitation and hygiene female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_water_sanitation_and_hygiene_male', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene male (raw)'), + model_name="emergencyoperationsea", + name="raw_water_sanitation_and_hygiene_male", + field=models.TextField(blank=True, null=True, verbose_name="number of water sanitation and hygiene male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_water_sanitation_and_hygiene_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene people reached (raw)'), + model_name="emergencyoperationsea", + name="raw_water_sanitation_and_hygiene_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_water_sanitation_and_hygiene_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene people targeted (raw)'), + model_name="emergencyoperationsea", + name="raw_water_sanitation_and_hygiene_people_targeted", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene people targeted (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_water_sanitation_and_hygiene_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene requirements (raw)'), + model_name="emergencyoperationsea", + name="raw_water_sanitation_and_hygiene_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='shelter_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter female'), + model_name="emergencyoperationsea", + name="shelter_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter female"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='shelter_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter male'), + model_name="emergencyoperationsea", + name="shelter_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter male"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='shelter_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people reached'), + model_name="emergencyoperationsea", + name="shelter_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people reached"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='shelter_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people targeted'), + model_name="emergencyoperationsea", + name="shelter_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='shelter_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people requirements'), + model_name="emergencyoperationsea", + name="shelter_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people requirements"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='water_sanitation_and_hygiene_female', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene female'), + model_name="emergencyoperationsea", + name="water_sanitation_and_hygiene_female", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene female"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='water_sanitation_and_hygiene_male', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene male'), + model_name="emergencyoperationsea", + name="water_sanitation_and_hygiene_male", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene male"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='water_sanitation_and_hygiene_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene people reached'), + model_name="emergencyoperationsea", + name="water_sanitation_and_hygiene_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene people reached"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='water_sanitation_and_hygiene_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene people targeted'), + model_name="emergencyoperationsea", + name="water_sanitation_and_hygiene_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='water_sanitation_and_hygiene_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene requirements'), + model_name="emergencyoperationsea", + name="water_sanitation_and_hygiene_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene requirements"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='appeal_number', - field=models.CharField(blank=True, max_length=20, null=True, verbose_name='appeal number'), + model_name="emergencyoperationsfr", + name="appeal_number", + field=models.CharField(blank=True, max_length=20, null=True, verbose_name="appeal number"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created_at'), + model_name="emergencyoperationsfr", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created_at"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='date_of_disaster', - field=models.DateField(blank=True, null=True, verbose_name='date of disaster'), + model_name="emergencyoperationsfr", + name="date_of_disaster", + field=models.DateField(blank=True, null=True, verbose_name="date of disaster"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='date_of_issue', - field=models.DateField(blank=True, null=True, verbose_name='date of issue'), + model_name="emergencyoperationsfr", + name="date_of_issue", + field=models.DateField(blank=True, null=True, verbose_name="date of issue"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='disaster_risk_reduction_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction female'), + model_name="emergencyoperationsfr", + name="disaster_risk_reduction_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction female"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='disaster_risk_reduction_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction male'), + model_name="emergencyoperationsfr", + name="disaster_risk_reduction_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction male"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='disaster_risk_reduction_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people reached'), + model_name="emergencyoperationsfr", + name="disaster_risk_reduction_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction people reached"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='disaster_risk_reduction_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people requirements'), + model_name="emergencyoperationsfr", + name="disaster_risk_reduction_requirements", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of disaster risk reduction people requirements" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='glide_number', - field=models.CharField(blank=True, max_length=18, null=True, verbose_name='glide number'), + model_name="emergencyoperationsfr", + name="glide_number", + field=models.CharField(blank=True, max_length=18, null=True, verbose_name="glide number"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='health_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health female'), + model_name="emergencyoperationsfr", + name="health_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health female"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='health_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health male'), + model_name="emergencyoperationsfr", + name="health_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health male"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='health_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health people reached'), + model_name="emergencyoperationsfr", + name="health_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health people reached"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='health_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health requirements'), + model_name="emergencyoperationsfr", + name="health_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health requirements"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='is_validated', - field=models.BooleanField(default=False, help_text='Did anyone check the editable data?', verbose_name='is validated?'), + model_name="emergencyoperationsfr", + name="is_validated", + field=models.BooleanField( + default=False, help_text="Did anyone check the editable data?", verbose_name="is validated?" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='livelihoods_and_basic_needs_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs female'), + model_name="emergencyoperationsfr", + name="livelihoods_and_basic_needs_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs female"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='livelihoods_and_basic_needs_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs male'), + model_name="emergencyoperationsfr", + name="livelihoods_and_basic_needs_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs male"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='livelihoods_and_basic_needs_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic people reached'), + model_name="emergencyoperationsfr", + name="livelihoods_and_basic_needs_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic people reached"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='livelihoods_and_basic_needs_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs requirements'), + model_name="emergencyoperationsfr", + name="livelihoods_and_basic_needs_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs requirements"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='migration_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration female'), + model_name="emergencyoperationsfr", + name="migration_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration female"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='migration_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration male'), + model_name="emergencyoperationsfr", + name="migration_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration male"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='migration_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration people reached'), + model_name="emergencyoperationsfr", + name="migration_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration people reached"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='migration_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration requirements'), + model_name="emergencyoperationsfr", + name="migration_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration requirements"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified_at'), + model_name="emergencyoperationsfr", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified_at"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='num_of_other_partner_involved', - field=models.TextField(blank=True, null=True, verbose_name='number of other partner involved'), + model_name="emergencyoperationsfr", + name="num_of_other_partner_involved", + field=models.TextField(blank=True, null=True, verbose_name="number of other partner involved"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='num_of_partner_ns_involved', - field=models.TextField(blank=True, null=True, verbose_name='number of NS partner involved'), + model_name="emergencyoperationsfr", + name="num_of_partner_ns_involved", + field=models.TextField(blank=True, null=True, verbose_name="number of NS partner involved"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='num_of_people_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of people affected'), + model_name="emergencyoperationsfr", + name="num_of_people_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of people affected"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='num_of_people_to_be_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of people to be assisted'), + model_name="emergencyoperationsfr", + name="num_of_people_to_be_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of people to be assisted"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='operation_end_date', - field=models.DateField(blank=True, null=True, verbose_name='operation end date'), + model_name="emergencyoperationsfr", + name="operation_end_date", + field=models.DateField(blank=True, null=True, verbose_name="operation end date"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='operation_start_date', - field=models.DateField(blank=True, null=True, verbose_name='operation start date'), + model_name="emergencyoperationsfr", + name="operation_start_date", + field=models.DateField(blank=True, null=True, verbose_name="operation start date"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='overall_operation_budget', - field=models.IntegerField(blank=True, null=True, verbose_name='overall operation budget'), + model_name="emergencyoperationsfr", + name="overall_operation_budget", + field=models.IntegerField(blank=True, null=True, verbose_name="overall operation budget"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='protection_gender_and_inclusion_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion female'), + model_name="emergencyoperationsfr", + name="protection_gender_and_inclusion_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of protection gender and inclusion female"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='protection_gender_and_inclusion_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion male'), + model_name="emergencyoperationsfr", + name="protection_gender_and_inclusion_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of protection gender and inclusion male"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='protection_gender_and_inclusion_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion people reached'), + model_name="emergencyoperationsfr", + name="protection_gender_and_inclusion_people_reached", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people reached" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='protection_gender_and_inclusion_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion requirements'), + model_name="emergencyoperationsfr", + name="protection_gender_and_inclusion_requirements", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion requirements" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_appeal_number', - field=models.TextField(blank=True, null=True, verbose_name='appeal number (raw)'), + model_name="emergencyoperationsfr", + name="raw_appeal_number", + field=models.TextField(blank=True, null=True, verbose_name="appeal number (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_date_of_disaster', - field=models.TextField(blank=True, null=True, verbose_name='date of disaster (raw)'), + model_name="emergencyoperationsfr", + name="raw_date_of_disaster", + field=models.TextField(blank=True, null=True, verbose_name="date of disaster (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_date_of_issue', - field=models.TextField(blank=True, null=True, verbose_name='date of issue (raw)'), + model_name="emergencyoperationsfr", + name="raw_date_of_issue", + field=models.TextField(blank=True, null=True, verbose_name="date of issue (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_disaster_risk_reduction_female', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction female (raw)'), + model_name="emergencyoperationsfr", + name="raw_disaster_risk_reduction_female", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_disaster_risk_reduction_male', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction male (raw)'), + model_name="emergencyoperationsfr", + name="raw_disaster_risk_reduction_male", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_disaster_risk_reduction_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction people reached (raw)'), + model_name="emergencyoperationsfr", + name="raw_disaster_risk_reduction_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_disaster_risk_reduction_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction requirements (raw)'), + model_name="emergencyoperationsfr", + name="raw_disaster_risk_reduction_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_glide_number', - field=models.TextField(blank=True, null=True, verbose_name='glide number (raw)'), + model_name="emergencyoperationsfr", + name="raw_glide_number", + field=models.TextField(blank=True, null=True, verbose_name="glide number (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_health_female', - field=models.TextField(blank=True, null=True, verbose_name='health female (raw)'), + model_name="emergencyoperationsfr", + name="raw_health_female", + field=models.TextField(blank=True, null=True, verbose_name="health female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_health_male', - field=models.TextField(blank=True, null=True, verbose_name='health male (raw)'), + model_name="emergencyoperationsfr", + name="raw_health_male", + field=models.TextField(blank=True, null=True, verbose_name="health male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_health_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='health people reached (raw)'), + model_name="emergencyoperationsfr", + name="raw_health_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="health people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_health_requirements', - field=models.TextField(blank=True, null=True, verbose_name='health requirements (raw)'), + model_name="emergencyoperationsfr", + name="raw_health_requirements", + field=models.TextField(blank=True, null=True, verbose_name="health requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_livelihoods_and_basic_needs_female', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs female (raw)'), + model_name="emergencyoperationsfr", + name="raw_livelihoods_and_basic_needs_female", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihhods and basic needs female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_livelihoods_and_basic_needs_male', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs male (raw)'), + model_name="emergencyoperationsfr", + name="raw_livelihoods_and_basic_needs_male", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihhods and basic needs male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_livelihoods_and_basic_needs_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs people reached (raw)'), + model_name="emergencyoperationsfr", + name="raw_livelihoods_and_basic_needs_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_livelihoods_and_basic_needs_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs requirements (raw)'), + model_name="emergencyoperationsfr", + name="raw_livelihoods_and_basic_needs_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_migration_female', - field=models.TextField(blank=True, null=True, verbose_name='number of migration female (raw)'), + model_name="emergencyoperationsfr", + name="raw_migration_female", + field=models.TextField(blank=True, null=True, verbose_name="number of migration female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_migration_male', - field=models.TextField(blank=True, null=True, verbose_name='number of migration male (raw)'), + model_name="emergencyoperationsfr", + name="raw_migration_male", + field=models.TextField(blank=True, null=True, verbose_name="number of migration male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_migration_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of migration people reached (raw)'), + model_name="emergencyoperationsfr", + name="raw_migration_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of migration people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_migration_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of migration requirements (raw)'), + model_name="emergencyoperationsfr", + name="raw_migration_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of migration requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_num_of_other_partner_involved', - field=models.TextField(blank=True, null=True, verbose_name='number of other partner involved (raw)'), + model_name="emergencyoperationsfr", + name="raw_num_of_other_partner_involved", + field=models.TextField(blank=True, null=True, verbose_name="number of other partner involved (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_num_of_partner_ns_involved', - field=models.TextField(blank=True, null=True, verbose_name='number of NS partner involved (raw)'), + model_name="emergencyoperationsfr", + name="raw_num_of_partner_ns_involved", + field=models.TextField(blank=True, null=True, verbose_name="number of NS partner involved (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_num_of_people_affected', - field=models.TextField(blank=True, null=True, verbose_name='number of people affected (raw)'), + model_name="emergencyoperationsfr", + name="raw_num_of_people_affected", + field=models.TextField(blank=True, null=True, verbose_name="number of people affected (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_num_of_people_to_be_assisted', - field=models.TextField(blank=True, null=True, verbose_name='number of people to be assisted (raw)'), + model_name="emergencyoperationsfr", + name="raw_num_of_people_to_be_assisted", + field=models.TextField(blank=True, null=True, verbose_name="number of people to be assisted (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_operation_end_date', - field=models.TextField(blank=True, null=True, verbose_name='operation end date (raw)'), + model_name="emergencyoperationsfr", + name="raw_operation_end_date", + field=models.TextField(blank=True, null=True, verbose_name="operation end date (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_overall_operation_budget', - field=models.TextField(blank=True, null=True, verbose_name='overall operation budget (raw)'), + model_name="emergencyoperationsfr", + name="raw_overall_operation_budget", + field=models.TextField(blank=True, null=True, verbose_name="overall operation budget (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_protection_gender_and_inclusion_female', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion female (raw)'), + model_name="emergencyoperationsfr", + name="raw_protection_gender_and_inclusion_female", + field=models.TextField(blank=True, null=True, verbose_name="number of protection gender and inclusion female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_protection_gender_and_inclusion_male', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion male (raw)'), + model_name="emergencyoperationsfr", + name="raw_protection_gender_and_inclusion_male", + field=models.TextField(blank=True, null=True, verbose_name="number of protection gender and inclusion male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_protection_gender_and_inclusion_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion people reached (raw)'), + model_name="emergencyoperationsfr", + name="raw_protection_gender_and_inclusion_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_protection_gender_and_inclusion_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion requirements (raw)'), + model_name="emergencyoperationsfr", + name="raw_protection_gender_and_inclusion_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_shelter_female', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter female (raw)'), + model_name="emergencyoperationsfr", + name="raw_shelter_female", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_shelter_male', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter male (raw)'), + model_name="emergencyoperationsfr", + name="raw_shelter_male", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_shelter_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter people reached (raw)'), + model_name="emergencyoperationsfr", + name="raw_shelter_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_shelter_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter requirements (raw)'), + model_name="emergencyoperationsfr", + name="raw_shelter_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_water_sanitation_and_hygiene_female', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene female (raw)'), + model_name="emergencyoperationsfr", + name="raw_water_sanitation_and_hygiene_female", + field=models.TextField(blank=True, null=True, verbose_name="number of water sanitation and hygiene female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_water_sanitation_and_hygiene_male', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene male (raw)'), + model_name="emergencyoperationsfr", + name="raw_water_sanitation_and_hygiene_male", + field=models.TextField(blank=True, null=True, verbose_name="number of water sanitation and hygiene male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_water_sanitation_and_hygiene_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene people reached (raw)'), + model_name="emergencyoperationsfr", + name="raw_water_sanitation_and_hygiene_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_water_sanitation_and_hygiene_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene requirements (raw)'), + model_name="emergencyoperationsfr", + name="raw_water_sanitation_and_hygiene_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='shelter_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter female'), + model_name="emergencyoperationsfr", + name="shelter_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter female"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='shelter_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter male'), + model_name="emergencyoperationsfr", + name="shelter_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter male"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='shelter_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people reached'), + model_name="emergencyoperationsfr", + name="shelter_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people reached"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='shelter_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people requirements'), + model_name="emergencyoperationsfr", + name="shelter_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people requirements"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='water_sanitation_and_hygiene_female', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene female'), + model_name="emergencyoperationsfr", + name="water_sanitation_and_hygiene_female", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene female"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='water_sanitation_and_hygiene_male', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene male'), + model_name="emergencyoperationsfr", + name="water_sanitation_and_hygiene_male", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene male"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='water_sanitation_and_hygiene_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene people reached'), + model_name="emergencyoperationsfr", + name="water_sanitation_and_hygiene_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene people reached"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='water_sanitation_and_hygiene_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene requirements'), + model_name="emergencyoperationsfr", + name="water_sanitation_and_hygiene_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene requirements"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='appeal_number', - field=models.CharField(blank=True, max_length=20, null=True, verbose_name='appeal number'), + model_name="emergencyoperationspeoplereached", + name="appeal_number", + field=models.CharField(blank=True, max_length=20, null=True, verbose_name="appeal number"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created_at'), + model_name="emergencyoperationspeoplereached", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created_at"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='date_of_issue', - field=models.DateField(blank=True, null=True, verbose_name='date of issue'), + model_name="emergencyoperationspeoplereached", + name="date_of_issue", + field=models.DateField(blank=True, null=True, verbose_name="date of issue"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='disaster_risk_reduction_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction female'), + model_name="emergencyoperationspeoplereached", + name="disaster_risk_reduction_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction female"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='disaster_risk_reduction_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction male'), + model_name="emergencyoperationspeoplereached", + name="disaster_risk_reduction_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction male"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='disaster_risk_reduction_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people reached'), + model_name="emergencyoperationspeoplereached", + name="disaster_risk_reduction_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of disaster risk reduction people reached"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='disaster_risk_reduction_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of disaster risk reduction people requirements'), + model_name="emergencyoperationspeoplereached", + name="disaster_risk_reduction_requirements", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of disaster risk reduction people requirements" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='epoa_update_num', - field=models.IntegerField(blank=True, null=True, verbose_name='EPOA update number'), + model_name="emergencyoperationspeoplereached", + name="epoa_update_num", + field=models.IntegerField(blank=True, null=True, verbose_name="EPOA update number"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='glide_number', - field=models.CharField(blank=True, max_length=18, null=True, verbose_name='glide number'), + model_name="emergencyoperationspeoplereached", + name="glide_number", + field=models.CharField(blank=True, max_length=18, null=True, verbose_name="glide number"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='health_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health female'), + model_name="emergencyoperationspeoplereached", + name="health_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health female"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='health_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health male'), + model_name="emergencyoperationspeoplereached", + name="health_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health male"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='health_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health people reached'), + model_name="emergencyoperationspeoplereached", + name="health_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health people reached"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='health_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of health requirements'), + model_name="emergencyoperationspeoplereached", + name="health_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of health requirements"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='is_validated', - field=models.BooleanField(default=False, help_text='Did anyone check the editable data?', verbose_name='is validated?'), + model_name="emergencyoperationspeoplereached", + name="is_validated", + field=models.BooleanField( + default=False, help_text="Did anyone check the editable data?", verbose_name="is validated?" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='livelihoods_and_basic_needs_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs female'), + model_name="emergencyoperationspeoplereached", + name="livelihoods_and_basic_needs_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs female"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='livelihoods_and_basic_needs_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs male'), + model_name="emergencyoperationspeoplereached", + name="livelihoods_and_basic_needs_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs male"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='livelihoods_and_basic_needs_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic people reached'), + model_name="emergencyoperationspeoplereached", + name="livelihoods_and_basic_needs_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic people reached"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='livelihoods_and_basic_needs_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihhods and basic needs requirements'), + model_name="emergencyoperationspeoplereached", + name="livelihoods_and_basic_needs_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihhods and basic needs requirements"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='migration_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration female'), + model_name="emergencyoperationspeoplereached", + name="migration_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration female"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='migration_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration male'), + model_name="emergencyoperationspeoplereached", + name="migration_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration male"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='migration_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration people reached'), + model_name="emergencyoperationspeoplereached", + name="migration_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration people reached"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='migration_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of migration requirements'), + model_name="emergencyoperationspeoplereached", + name="migration_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of migration requirements"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified_at'), + model_name="emergencyoperationspeoplereached", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified_at"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='operation_start_date', - field=models.DateField(blank=True, null=True, verbose_name='operation start date'), + model_name="emergencyoperationspeoplereached", + name="operation_start_date", + field=models.DateField(blank=True, null=True, verbose_name="operation start date"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='operation_timeframe', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='operation timeframe'), + model_name="emergencyoperationspeoplereached", + name="operation_timeframe", + field=models.CharField(blank=True, max_length=200, null=True, verbose_name="operation timeframe"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='protection_gender_and_inclusion_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion female'), + model_name="emergencyoperationspeoplereached", + name="protection_gender_and_inclusion_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of protection gender and inclusion female"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='protection_gender_and_inclusion_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion male'), + model_name="emergencyoperationspeoplereached", + name="protection_gender_and_inclusion_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of protection gender and inclusion male"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='protection_gender_and_inclusion_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion people reached'), + model_name="emergencyoperationspeoplereached", + name="protection_gender_and_inclusion_people_reached", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people reached" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='protection_gender_and_inclusion_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of protection gender and inclusion requirements'), + model_name="emergencyoperationspeoplereached", + name="protection_gender_and_inclusion_requirements", + field=models.IntegerField( + blank=True, null=True, verbose_name="number of protection gender and inclusion requirements" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_appeal_number', - field=models.TextField(blank=True, null=True, verbose_name='appeal number (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_appeal_number", + field=models.TextField(blank=True, null=True, verbose_name="appeal number (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_date_of_issue', - field=models.TextField(blank=True, null=True, verbose_name='date of issue (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_date_of_issue", + field=models.TextField(blank=True, null=True, verbose_name="date of issue (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_disaster_risk_reduction_female', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction female (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_disaster_risk_reduction_female", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_disaster_risk_reduction_male', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction male (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_disaster_risk_reduction_male", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_disaster_risk_reduction_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction people reached (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_disaster_risk_reduction_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_disaster_risk_reduction_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of disaster risk reduction requirements (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_disaster_risk_reduction_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of disaster risk reduction requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_epoa_update_num', - field=models.TextField(blank=True, null=True, verbose_name='EPOA update number (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_epoa_update_num", + field=models.TextField(blank=True, null=True, verbose_name="EPOA update number (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_glide_number', - field=models.TextField(blank=True, null=True, verbose_name='glide number (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_glide_number", + field=models.TextField(blank=True, null=True, verbose_name="glide number (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_health_female', - field=models.TextField(blank=True, null=True, verbose_name='health female (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_health_female", + field=models.TextField(blank=True, null=True, verbose_name="health female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_health_male', - field=models.TextField(blank=True, null=True, verbose_name='health male (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_health_male", + field=models.TextField(blank=True, null=True, verbose_name="health male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_health_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='health people reached (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_health_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="health people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_health_requirements', - field=models.TextField(blank=True, null=True, verbose_name='health requirements (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_health_requirements", + field=models.TextField(blank=True, null=True, verbose_name="health requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_livelihoods_and_basic_needs_female', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs female (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_livelihoods_and_basic_needs_female", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihhods and basic needs female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_livelihoods_and_basic_needs_male', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs male (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_livelihoods_and_basic_needs_male", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihhods and basic needs male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_livelihoods_and_basic_needs_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs people reached (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_livelihoods_and_basic_needs_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_livelihoods_and_basic_needs_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihhods and basic needs requirements (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_livelihoods_and_basic_needs_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihhods and basic needs requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_migration_female', - field=models.TextField(blank=True, null=True, verbose_name='number of migration female (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_migration_female", + field=models.TextField(blank=True, null=True, verbose_name="number of migration female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_migration_male', - field=models.TextField(blank=True, null=True, verbose_name='number of migration male (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_migration_male", + field=models.TextField(blank=True, null=True, verbose_name="number of migration male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_migration_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of migration people reached (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_migration_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of migration people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_migration_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of migration requirements (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_migration_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of migration requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_operation_timeframe', - field=models.TextField(blank=True, null=True, verbose_name='operation timeframe (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_operation_timeframe", + field=models.TextField(blank=True, null=True, verbose_name="operation timeframe (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_protection_gender_and_inclusion_female', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion female (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_protection_gender_and_inclusion_female", + field=models.TextField(blank=True, null=True, verbose_name="number of protection gender and inclusion female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_protection_gender_and_inclusion_male', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion male (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_protection_gender_and_inclusion_male", + field=models.TextField(blank=True, null=True, verbose_name="number of protection gender and inclusion male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_protection_gender_and_inclusion_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion people reached (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_protection_gender_and_inclusion_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_protection_gender_and_inclusion_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of protection gender and inclusion requirements (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_protection_gender_and_inclusion_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of protection gender and inclusion requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_shelter_female', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter female (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_shelter_female", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_shelter_male', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter male (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_shelter_male", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_shelter_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter people reached (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_shelter_people_reached", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter people reached (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_shelter_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of shelter requirements (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_shelter_requirements", + field=models.TextField(blank=True, null=True, verbose_name="number of shelter requirements (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_time_frame_covered_by_update', - field=models.TextField(blank=True, null=True, verbose_name='time frame covered by update (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_time_frame_covered_by_update", + field=models.TextField(blank=True, null=True, verbose_name="time frame covered by update (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_water_sanitation_and_hygiene_female', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene female (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_water_sanitation_and_hygiene_female", + field=models.TextField(blank=True, null=True, verbose_name="number of water sanitation and hygiene female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_water_sanitation_and_hygiene_male', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene male (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_water_sanitation_and_hygiene_male", + field=models.TextField(blank=True, null=True, verbose_name="number of water sanitation and hygiene male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_water_sanitation_and_hygiene_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene people reached (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_water_sanitation_and_hygiene_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_water_sanitation_and_hygiene_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of water sanitation and hygiene requirements (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_water_sanitation_and_hygiene_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of water sanitation and hygiene requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='shelter_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter female'), + model_name="emergencyoperationspeoplereached", + name="shelter_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter female"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='shelter_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter male'), + model_name="emergencyoperationspeoplereached", + name="shelter_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter male"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='shelter_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people reached'), + model_name="emergencyoperationspeoplereached", + name="shelter_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people reached"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='shelter_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of shelter people requirements'), + model_name="emergencyoperationspeoplereached", + name="shelter_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of shelter people requirements"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='time_frame_covered_by_update', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='time frame covered by update'), + model_name="emergencyoperationspeoplereached", + name="time_frame_covered_by_update", + field=models.CharField(blank=True, max_length=200, null=True, verbose_name="time frame covered by update"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='water_sanitation_and_hygiene_female', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene female'), + model_name="emergencyoperationspeoplereached", + name="water_sanitation_and_hygiene_female", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene female"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='water_sanitation_and_hygiene_male', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene male'), + model_name="emergencyoperationspeoplereached", + name="water_sanitation_and_hygiene_male", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene male"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='water_sanitation_and_hygiene_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene people reached'), + model_name="emergencyoperationspeoplereached", + name="water_sanitation_and_hygiene_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene people reached"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='water_sanitation_and_hygiene_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='water sanitation and hygiene requirements'), + model_name="emergencyoperationspeoplereached", + name="water_sanitation_and_hygiene_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="water sanitation and hygiene requirements"), ), migrations.AlterField( - model_name='event', - name='auto_generated', - field=models.BooleanField(default=False, editable=False, verbose_name='auto generated'), + model_name="event", + name="auto_generated", + field=models.BooleanField(default=False, editable=False, verbose_name="auto generated"), ), migrations.AlterField( - model_name='event', - name='auto_generated_source', - field=models.CharField(blank=True, editable=False, max_length=50, null=True, verbose_name='auto generated source'), + model_name="event", + name="auto_generated_source", + field=models.CharField(blank=True, editable=False, max_length=50, null=True, verbose_name="auto generated source"), ), migrations.AlterField( - model_name='event', - name='countries', - field=models.ManyToManyField(to='api.Country', verbose_name='countries'), + model_name="event", + name="countries", + field=models.ManyToManyField(to="api.Country", verbose_name="countries"), ), migrations.AlterField( - model_name='event', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="event", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='event', - name='disaster_start_date', - field=models.DateTimeField(verbose_name='disaster start date'), + model_name="event", + name="disaster_start_date", + field=models.DateTimeField(verbose_name="disaster start date"), ), migrations.AlterField( - model_name='event', - name='districts', - field=models.ManyToManyField(blank=True, to='api.District', verbose_name='districts'), + model_name="event", + name="districts", + field=models.ManyToManyField(blank=True, to="api.District", verbose_name="districts"), ), migrations.AlterField( - model_name='event', - name='dtype', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType', verbose_name='disaster type'), + model_name="event", + name="dtype", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.DisasterType", verbose_name="disaster type" + ), ), migrations.AlterField( - model_name='event', - name='glide', - field=models.CharField(blank=True, max_length=18, verbose_name='glide'), + model_name="event", + name="glide", + field=models.CharField(blank=True, max_length=18, verbose_name="glide"), ), migrations.AlterField( - model_name='event', - name='hide_attached_field_reports', - field=models.BooleanField(default=False, verbose_name='hide attached field reports?'), + model_name="event", + name="hide_attached_field_reports", + field=models.BooleanField(default=False, verbose_name="hide attached field reports?"), ), migrations.AlterField( - model_name='event', - name='is_featured', - field=models.BooleanField(default=False, verbose_name='is featured on home page'), + model_name="event", + name="is_featured", + field=models.BooleanField(default=False, verbose_name="is featured on home page"), ), migrations.AlterField( - model_name='event', - name='is_featured_region', - field=models.BooleanField(default=False, verbose_name='is featured on region page'), + model_name="event", + name="is_featured_region", + field=models.BooleanField(default=False, verbose_name="is featured on region page"), ), migrations.AlterField( - model_name='event', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="event", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='event', - name='num_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of affected'), + model_name="event", + name="num_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of affected"), ), migrations.AlterField( - model_name='event', - name='num_dead', - field=models.IntegerField(blank=True, null=True, verbose_name='number of dead'), + model_name="event", + name="num_dead", + field=models.IntegerField(blank=True, null=True, verbose_name="number of dead"), ), migrations.AlterField( - model_name='event', - name='num_displaced', - field=models.IntegerField(blank=True, null=True, verbose_name='name'), + model_name="event", + name="num_displaced", + field=models.IntegerField(blank=True, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='event', - name='num_injured', - field=models.IntegerField(blank=True, null=True, verbose_name='number of injured'), + model_name="event", + name="num_injured", + field=models.IntegerField(blank=True, null=True, verbose_name="number of injured"), ), migrations.AlterField( - model_name='event', - name='num_missing', - field=models.IntegerField(blank=True, null=True, verbose_name='number of missing'), + model_name="event", + name="num_missing", + field=models.IntegerField(blank=True, null=True, verbose_name="number of missing"), ), migrations.AlterField( - model_name='event', - name='previous_update', - field=models.DateTimeField(blank=True, null=True, verbose_name='previous update'), + model_name="event", + name="previous_update", + field=models.DateTimeField(blank=True, null=True, verbose_name="previous update"), ), migrations.AlterField( - model_name='event', - name='regions', - field=models.ManyToManyField(to='api.Region', verbose_name='regions'), + model_name="event", + name="regions", + field=models.ManyToManyField(to="api.Region", verbose_name="regions"), ), migrations.AlterField( - model_name='event', - name='slug', - field=models.CharField(blank=True, default=None, editable=False, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug", + field=models.CharField( + blank=True, + default=None, + editable=False, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AlterField( - model_name='event', - name='summary', - field=tinymce.models.HTMLField(blank=True, default='', verbose_name='summary'), + model_name="event", + name="summary", + field=tinymce.models.HTMLField(blank=True, default="", verbose_name="summary"), ), migrations.AlterField( - model_name='event', - name='tab_one_title', - field=models.CharField(blank=True, default='Additional Information', max_length=50, verbose_name='tab one title'), + model_name="event", + name="tab_one_title", + field=models.CharField(blank=True, default="Additional Information", max_length=50, verbose_name="tab one title"), ), migrations.AlterField( - model_name='event', - name='tab_three_title', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='tab three title'), + model_name="event", + name="tab_three_title", + field=models.CharField(blank=True, max_length=50, null=True, verbose_name="tab three title"), ), migrations.AlterField( - model_name='event', - name='tab_two_title', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='tab two title'), + model_name="event", + name="tab_two_title", + field=models.CharField(blank=True, max_length=50, null=True, verbose_name="tab two title"), ), migrations.AlterField( - model_name='event', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='updated at'), + model_name="event", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="updated at"), ), migrations.AlterField( - model_name='eventcontact', - name='ctype', - field=models.CharField(blank=True, max_length=100, verbose_name='type'), + model_name="eventcontact", + name="ctype", + field=models.CharField(blank=True, max_length=100, verbose_name="type"), ), migrations.AlterField( - model_name='eventcontact', - name='email', - field=models.CharField(max_length=300, verbose_name='email'), + model_name="eventcontact", + name="email", + field=models.CharField(max_length=300, verbose_name="email"), ), migrations.AlterField( - model_name='eventcontact', - name='event', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='api.Event', verbose_name='event'), + model_name="eventcontact", + name="event", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="contacts", to="api.Event", verbose_name="event" + ), ), migrations.AlterField( - model_name='eventcontact', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="eventcontact", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='eventcontact', - name='phone', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='phone'), + model_name="eventcontact", + name="phone", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="phone"), ), migrations.AlterField( - model_name='eventcontact', - name='title', - field=models.CharField(max_length=300, verbose_name='title'), + model_name="eventcontact", + name="title", + field=models.CharField(max_length=300, verbose_name="title"), ), migrations.AlterField( - model_name='fieldreport', - name='actions_others', - field=models.TextField(blank=True, null=True, verbose_name='actions taken (others)'), + model_name="fieldreport", + name="actions_others", + field=models.TextField(blank=True, null=True, verbose_name="actions taken (others)"), ), migrations.AlterField( - model_name='fieldreport', - name='affected_pop_centres', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='affected population centres'), + model_name="fieldreport", + name="affected_pop_centres", + field=models.CharField(blank=True, max_length=512, null=True, verbose_name="affected population centres"), ), migrations.AlterField( - model_name='fieldreport', - name='appeal', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='appeal'), + model_name="fieldreport", + name="appeal", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="appeal"), ), migrations.AlterField( - model_name='fieldreport', - name='appeal_amount', - field=models.IntegerField(blank=True, null=True, verbose_name='appeal amount'), + model_name="fieldreport", + name="appeal_amount", + field=models.IntegerField(blank=True, null=True, verbose_name="appeal amount"), ), migrations.AlterField( - model_name='fieldreport', - name='bulletin', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='bulletin'), + model_name="fieldreport", + name="bulletin", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="bulletin"), ), migrations.AlterField( - model_name='fieldreport', - name='cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of cases'), + model_name="fieldreport", + name="cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of cases"), ), migrations.AlterField( - model_name='fieldreport', - name='confirmed_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of confirmed cases'), + model_name="fieldreport", + name="confirmed_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of confirmed cases"), ), migrations.AlterField( - model_name='fieldreport', - name='countries', - field=models.ManyToManyField(to='api.Country', verbose_name='countries'), + model_name="fieldreport", + name="countries", + field=models.ManyToManyField(to="api.Country", verbose_name="countries"), ), migrations.AlterField( - model_name='fieldreport', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="fieldreport", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='fieldreport', - name='description', - field=tinymce.models.HTMLField(blank=True, default='', verbose_name='description'), + model_name="fieldreport", + name="description", + field=tinymce.models.HTMLField(blank=True, default="", verbose_name="description"), ), migrations.AlterField( - model_name='fieldreport', - name='districts', - field=models.ManyToManyField(blank=True, to='api.District', verbose_name='districts'), + model_name="fieldreport", + name="districts", + field=models.ManyToManyField(blank=True, to="api.District", verbose_name="districts"), ), migrations.AlterField( - model_name='fieldreport', - name='dref', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='DREF'), + model_name="fieldreport", + name="dref", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="DREF"), ), migrations.AlterField( - model_name='fieldreport', - name='dref_amount', - field=models.IntegerField(blank=True, null=True, verbose_name='DREF amount'), + model_name="fieldreport", + name="dref_amount", + field=models.IntegerField(blank=True, null=True, verbose_name="DREF amount"), ), migrations.AlterField( - model_name='fieldreport', - name='dtype', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.DisasterType', verbose_name='disaster type'), + model_name="fieldreport", + name="dtype", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="api.DisasterType", verbose_name="disaster type" + ), ), migrations.AlterField( - model_name='fieldreport', - name='epi_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of cases (epidemic)'), + model_name="fieldreport", + name="epi_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of cases (epidemic)"), ), migrations.AlterField( - model_name='fieldreport', - name='epi_confirmed_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of confirmed cases (epidemic)'), + model_name="fieldreport", + name="epi_confirmed_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of confirmed cases (epidemic)"), ), migrations.AlterField( - model_name='fieldreport', - name='epi_figures_source', - field=models.IntegerField(blank=True, choices=api.models.EPISourceChoices.choices, default=0, null=True, verbose_name='figures source (epidemic)'), + model_name="fieldreport", + name="epi_figures_source", + field=models.IntegerField( + blank=True, + choices=api.models.EPISourceChoices.choices, + default=0, + null=True, + verbose_name="figures source (epidemic)", + ), ), migrations.AlterField( - model_name='fieldreport', - name='epi_num_dead', - field=models.IntegerField(blank=True, null=True, verbose_name='number of dead (epidemic)'), + model_name="fieldreport", + name="epi_num_dead", + field=models.IntegerField(blank=True, null=True, verbose_name="number of dead (epidemic)"), ), migrations.AlterField( - model_name='fieldreport', - name='epi_probable_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of probable cases (epidemic)'), + model_name="fieldreport", + name="epi_probable_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of probable cases (epidemic)"), ), migrations.AlterField( - model_name='fieldreport', - name='epi_suspected_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of suspected cases (epidemic)'), + model_name="fieldreport", + name="epi_suspected_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of suspected cases (epidemic)"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_base_camp', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU base camp'), + model_name="fieldreport", + name="eru_base_camp", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU base camp"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_base_camp_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU base camp units'), + model_name="fieldreport", + name="eru_base_camp_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU base camp units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_basic_health_care', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU basic health care'), + model_name="fieldreport", + name="eru_basic_health_care", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU basic health care"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_basic_health_care_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU basic health units'), + model_name="fieldreport", + name="eru_basic_health_care_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU basic health units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_deployment_hospital', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU deployment hospital'), + model_name="fieldreport", + name="eru_deployment_hospital", + field=models.IntegerField( + default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU deployment hospital" + ), ), migrations.AlterField( - model_name='fieldreport', - name='eru_deployment_hospital_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU deployment hospital units'), + model_name="fieldreport", + name="eru_deployment_hospital_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU deployment hospital units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_it_telecom', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU IT telecom'), + model_name="fieldreport", + name="eru_it_telecom", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU IT telecom"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_it_telecom_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU IT telecom units'), + model_name="fieldreport", + name="eru_it_telecom_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU IT telecom units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_logistics', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU logistics'), + model_name="fieldreport", + name="eru_logistics", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU logistics"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_logistics_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU logistics units'), + model_name="fieldreport", + name="eru_logistics_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU logistics units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_referral_hospital', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU referral hospital'), + model_name="fieldreport", + name="eru_referral_hospital", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU referral hospital"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_referral_hospital_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU referral hospital units'), + model_name="fieldreport", + name="eru_referral_hospital_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU referral hospital units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_relief', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU relief'), + model_name="fieldreport", + name="eru_relief", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU relief"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_relief_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU relief units'), + model_name="fieldreport", + name="eru_relief_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU relief units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_15', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU water sanitaion M15'), + model_name="fieldreport", + name="eru_water_sanitation_15", + field=models.IntegerField( + default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU water sanitaion M15" + ), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_15_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU water sanitaion M15 units'), + model_name="fieldreport", + name="eru_water_sanitation_15_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU water sanitaion M15 units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_20', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU water sanitaion MSM20'), + model_name="fieldreport", + name="eru_water_sanitation_20", + field=models.IntegerField( + default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU water sanitaion MSM20" + ), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_20_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU water sanitaion MSM20 units'), + model_name="fieldreport", + name="eru_water_sanitation_20_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU water sanitaion MSM20 units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_40', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='ERU water sanitaion M40'), + model_name="fieldreport", + name="eru_water_sanitation_40", + field=models.IntegerField( + default=0, choices=api.models.RequestChoices.choices, verbose_name="ERU water sanitaion M40" + ), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_40_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU water sanitaion M40 units'), + model_name="fieldreport", + name="eru_water_sanitation_40_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU water sanitaion M40 units"), ), migrations.AlterField( - model_name='fieldreport', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='field_reports', to='api.Event', verbose_name='event'), + model_name="fieldreport", + name="event", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="field_reports", + to="api.Event", + verbose_name="event", + ), ), migrations.AlterField( - model_name='fieldreport', - name='fact', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='fact'), + model_name="fieldreport", + name="fact", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="fact"), ), migrations.AlterField( - model_name='fieldreport', - name='forecast_based_action', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='forecast based action'), + model_name="fieldreport", + name="forecast_based_action", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="forecast based action"), ), migrations.AlterField( - model_name='fieldreport', - name='forecast_based_action_amount', - field=models.IntegerField(blank=True, null=True, verbose_name='forecast based action amount'), + model_name="fieldreport", + name="forecast_based_action_amount", + field=models.IntegerField(blank=True, null=True, verbose_name="forecast based action amount"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_affected_pop_centres', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='affected population centres (goverment)'), + model_name="fieldreport", + name="gov_affected_pop_centres", + field=models.CharField(blank=True, max_length=512, null=True, verbose_name="affected population centres (goverment)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of affected (goverment)'), + model_name="fieldreport", + name="gov_num_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of affected (goverment)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of assisted (goverment)'), + model_name="fieldreport", + name="gov_num_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of assisted (goverment)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_dead', - field=models.IntegerField(blank=True, null=True, verbose_name='number of dead (goverment)'), + model_name="fieldreport", + name="gov_num_dead", + field=models.IntegerField(blank=True, null=True, verbose_name="number of dead (goverment)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_displaced', - field=models.IntegerField(blank=True, null=True, verbose_name='number of displaced (goverment)'), + model_name="fieldreport", + name="gov_num_displaced", + field=models.IntegerField(blank=True, null=True, verbose_name="number of displaced (goverment)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_highest_risk', - field=models.IntegerField(blank=True, null=True, verbose_name='people at highest risk (goverment)'), + model_name="fieldreport", + name="gov_num_highest_risk", + field=models.IntegerField(blank=True, null=True, verbose_name="people at highest risk (goverment)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_injured', - field=models.IntegerField(blank=True, null=True, verbose_name='number of injured (goverment)'), + model_name="fieldreport", + name="gov_num_injured", + field=models.IntegerField(blank=True, null=True, verbose_name="number of injured (goverment)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_missing', - field=models.IntegerField(blank=True, null=True, verbose_name='number of missing (goverment)'), + model_name="fieldreport", + name="gov_num_missing", + field=models.IntegerField(blank=True, null=True, verbose_name="number of missing (goverment)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_potentially_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='potentially affected (goverment)'), + model_name="fieldreport", + name="gov_num_potentially_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="potentially affected (goverment)"), ), migrations.AlterField( - model_name='fieldreport', - name='health_min_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of cases (MOH)'), + model_name="fieldreport", + name="health_min_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of cases (MOH)"), ), migrations.AlterField( - model_name='fieldreport', - name='health_min_confirmed_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of confirmed cases (MOH)'), + model_name="fieldreport", + name="health_min_confirmed_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of confirmed cases (MOH)"), ), migrations.AlterField( - model_name='fieldreport', - name='health_min_num_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of assisted (who)'), + model_name="fieldreport", + name="health_min_num_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of assisted (who)"), ), migrations.AlterField( - model_name='fieldreport', - name='health_min_num_dead', - field=models.IntegerField(blank=True, null=True, verbose_name='number of dead (MOH)'), + model_name="fieldreport", + name="health_min_num_dead", + field=models.IntegerField(blank=True, null=True, verbose_name="number of dead (MOH)"), ), migrations.AlterField( - model_name='fieldreport', - name='health_min_probable_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of probabale cases (MOH)'), + model_name="fieldreport", + name="health_min_probable_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of probabale cases (MOH)"), ), migrations.AlterField( - model_name='fieldreport', - name='health_min_suspected_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of suspected cases (MOH)'), + model_name="fieldreport", + name="health_min_suspected_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of suspected cases (MOH)"), ), migrations.AlterField( - model_name='fieldreport', - name='ifrc_staff', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='IFRC staff'), + model_name="fieldreport", + name="ifrc_staff", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="IFRC staff"), ), migrations.AlterField( - model_name='fieldreport', - name='imminent_dref', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='imminent dref'), + model_name="fieldreport", + name="imminent_dref", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="imminent dref"), ), migrations.AlterField( - model_name='fieldreport', - name='imminent_dref_amount', - field=models.IntegerField(blank=True, null=True, verbose_name='imminent dref amount'), + model_name="fieldreport", + name="imminent_dref_amount", + field=models.IntegerField(blank=True, null=True, verbose_name="imminent dref amount"), ), migrations.AlterField( - model_name='fieldreport', - name='is_covid_report', - field=models.BooleanField(default=False, help_text='Is this a Field Report specific to the COVID-19 emergency?', verbose_name='is covid report?'), + model_name="fieldreport", + name="is_covid_report", + field=models.BooleanField( + default=False, + help_text="Is this a Field Report specific to the COVID-19 emergency?", + verbose_name="is covid report?", + ), ), migrations.AlterField( - model_name='fieldreport', - name='ns_request_assistance', - field=models.BooleanField(default=False, verbose_name='NS request assistance'), + model_name="fieldreport", + name="ns_request_assistance", + field=models.BooleanField(default=False, verbose_name="NS request assistance"), ), migrations.AlterField( - model_name='fieldreport', - name='num_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of affected'), + model_name="fieldreport", + name="num_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of affected"), ), migrations.AlterField( - model_name='fieldreport', - name='num_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of assisted'), + model_name="fieldreport", + name="num_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of assisted"), ), migrations.AlterField( - model_name='fieldreport', - name='num_dead', - field=models.IntegerField(blank=True, null=True, verbose_name='number of dead'), + model_name="fieldreport", + name="num_dead", + field=models.IntegerField(blank=True, null=True, verbose_name="number of dead"), ), migrations.AlterField( - model_name='fieldreport', - name='num_displaced', - field=models.IntegerField(blank=True, null=True, verbose_name='number of displaced'), + model_name="fieldreport", + name="num_displaced", + field=models.IntegerField(blank=True, null=True, verbose_name="number of displaced"), ), migrations.AlterField( - model_name='fieldreport', - name='num_expats_delegates', - field=models.IntegerField(blank=True, null=True, verbose_name='number of expatriate delegates'), + model_name="fieldreport", + name="num_expats_delegates", + field=models.IntegerField(blank=True, null=True, verbose_name="number of expatriate delegates"), ), migrations.AlterField( - model_name='fieldreport', - name='num_fact', - field=models.IntegerField(blank=True, null=True, verbose_name='number of fact'), + model_name="fieldreport", + name="num_fact", + field=models.IntegerField(blank=True, null=True, verbose_name="number of fact"), ), migrations.AlterField( - model_name='fieldreport', - name='num_highest_risk', - field=models.IntegerField(blank=True, null=True, verbose_name='number of highest risk'), + model_name="fieldreport", + name="num_highest_risk", + field=models.IntegerField(blank=True, null=True, verbose_name="number of highest risk"), ), migrations.AlterField( - model_name='fieldreport', - name='num_ifrc_staff', - field=models.IntegerField(blank=True, null=True, verbose_name='number of IFRC staff'), + model_name="fieldreport", + name="num_ifrc_staff", + field=models.IntegerField(blank=True, null=True, verbose_name="number of IFRC staff"), ), migrations.AlterField( - model_name='fieldreport', - name='num_injured', - field=models.IntegerField(blank=True, null=True, verbose_name='number of injured'), + model_name="fieldreport", + name="num_injured", + field=models.IntegerField(blank=True, null=True, verbose_name="number of injured"), ), migrations.AlterField( - model_name='fieldreport', - name='num_localstaff', - field=models.IntegerField(blank=True, null=True, verbose_name='number of localstaff'), + model_name="fieldreport", + name="num_localstaff", + field=models.IntegerField(blank=True, null=True, verbose_name="number of localstaff"), ), migrations.AlterField( - model_name='fieldreport', - name='num_missing', - field=models.IntegerField(blank=True, null=True, verbose_name='number of missing'), + model_name="fieldreport", + name="num_missing", + field=models.IntegerField(blank=True, null=True, verbose_name="number of missing"), ), migrations.AlterField( - model_name='fieldreport', - name='num_potentially_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of potentially affected'), + model_name="fieldreport", + name="num_potentially_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of potentially affected"), ), migrations.AlterField( - model_name='fieldreport', - name='num_rdrt', - field=models.IntegerField(blank=True, null=True, verbose_name='number of RDRT'), + model_name="fieldreport", + name="num_rdrt", + field=models.IntegerField(blank=True, null=True, verbose_name="number of RDRT"), ), migrations.AlterField( - model_name='fieldreport', - name='num_volunteers', - field=models.IntegerField(blank=True, null=True, verbose_name='number of volunteers'), + model_name="fieldreport", + name="num_volunteers", + field=models.IntegerField(blank=True, null=True, verbose_name="number of volunteers"), ), migrations.AlterField( - model_name='fieldreport', - name='other_affected_pop_centres', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='number of affected population centres (other)'), + model_name="fieldreport", + name="other_affected_pop_centres", + field=models.CharField( + blank=True, max_length=512, null=True, verbose_name="number of affected population centres (other)" + ), ), migrations.AlterField( - model_name='fieldreport', - name='other_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of cases (other)'), + model_name="fieldreport", + name="other_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of cases (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_confirmed_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of confirmed cases (other)'), + model_name="fieldreport", + name="other_confirmed_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of confirmed cases (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_num_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of affected (other)'), + model_name="fieldreport", + name="other_num_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of affected (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_num_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of assisted (other)'), + model_name="fieldreport", + name="other_num_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of assisted (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_num_dead', - field=models.IntegerField(blank=True, null=True, verbose_name='number of dead (other)'), + model_name="fieldreport", + name="other_num_dead", + field=models.IntegerField(blank=True, null=True, verbose_name="number of dead (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_num_displaced', - field=models.IntegerField(blank=True, null=True, verbose_name='number of displace (other)'), + model_name="fieldreport", + name="other_num_displaced", + field=models.IntegerField(blank=True, null=True, verbose_name="number of displace (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_num_highest_risk', - field=models.IntegerField(blank=True, null=True, verbose_name='number of highest risk (other)'), + model_name="fieldreport", + name="other_num_highest_risk", + field=models.IntegerField(blank=True, null=True, verbose_name="number of highest risk (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_num_injured', - field=models.IntegerField(blank=True, null=True, verbose_name='number of injured (other)'), + model_name="fieldreport", + name="other_num_injured", + field=models.IntegerField(blank=True, null=True, verbose_name="number of injured (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_num_missing', - field=models.IntegerField(blank=True, null=True, verbose_name='number of missing (other)'), + model_name="fieldreport", + name="other_num_missing", + field=models.IntegerField(blank=True, null=True, verbose_name="number of missing (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_num_potentially_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of potentially affected (other)'), + model_name="fieldreport", + name="other_num_potentially_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of potentially affected (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_probable_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of probable cases (other)'), + model_name="fieldreport", + name="other_probable_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of probable cases (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_sources', - field=models.TextField(blank=True, default='', verbose_name='sources (other)'), + model_name="fieldreport", + name="other_sources", + field=models.TextField(blank=True, default="", verbose_name="sources (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='other_suspected_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of suspected cases (other)'), + model_name="fieldreport", + name="other_suspected_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of suspected cases (other)"), ), migrations.AlterField( - model_name='fieldreport', - name='previous_update', - field=models.DateTimeField(blank=True, null=True, verbose_name='previous updated at'), + model_name="fieldreport", + name="previous_update", + field=models.DateTimeField(blank=True, null=True, verbose_name="previous updated at"), ), migrations.AlterField( - model_name='fieldreport', - name='probable_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of probable cases'), + model_name="fieldreport", + name="probable_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of probable cases"), ), migrations.AlterField( - model_name='fieldreport', - name='rdrt', - field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name='RDRT'), + model_name="fieldreport", + name="rdrt", + field=models.IntegerField(default=0, choices=api.models.RequestChoices.choices, verbose_name="RDRT"), ), migrations.AlterField( - model_name='fieldreport', - name='regions', - field=models.ManyToManyField(blank=True, to='api.Region', verbose_name='regions'), + model_name="fieldreport", + name="regions", + field=models.ManyToManyField(blank=True, to="api.Region", verbose_name="regions"), ), migrations.AlterField( - model_name='fieldreport', - name='report_date', - field=models.DateTimeField(editable=False, null=True, verbose_name='report date'), + model_name="fieldreport", + name="report_date", + field=models.DateTimeField(editable=False, null=True, verbose_name="report date"), ), migrations.AlterField( - model_name='fieldreport', - name='request_assistance', - field=models.BooleanField(default=False, verbose_name='request assistance'), + model_name="fieldreport", + name="request_assistance", + field=models.BooleanField(default=False, verbose_name="request assistance"), ), migrations.AlterField( - model_name='fieldreport', - name='rid', - field=models.CharField(blank=True, editable=False, max_length=100, null=True, verbose_name='r id'), + model_name="fieldreport", + name="rid", + field=models.CharField(blank=True, editable=False, max_length=100, null=True, verbose_name="r id"), ), migrations.AlterField( - model_name='fieldreport', - name='sit_fields_date', - field=models.DateTimeField(blank=True, null=True, verbose_name='situation fields date'), + model_name="fieldreport", + name="sit_fields_date", + field=models.DateTimeField(blank=True, null=True, verbose_name="situation fields date"), ), migrations.AlterField( - model_name='fieldreport', - name='start_date', - field=models.DateTimeField(blank=True, null=True, verbose_name='start date'), + model_name="fieldreport", + name="start_date", + field=models.DateTimeField(blank=True, null=True, verbose_name="start date"), ), migrations.AlterField( - model_name='fieldreport', - name='status', - field=models.IntegerField(default=0, verbose_name='status'), + model_name="fieldreport", + name="status", + field=models.IntegerField(default=0, verbose_name="status"), ), migrations.AlterField( - model_name='fieldreport', - name='summary', - field=models.TextField(blank=True, verbose_name='summary'), + model_name="fieldreport", + name="summary", + field=models.TextField(blank=True, verbose_name="summary"), ), migrations.AlterField( - model_name='fieldreport', - name='suspected_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of suspected cases'), + model_name="fieldreport", + name="suspected_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of suspected cases"), ), migrations.AlterField( - model_name='fieldreport', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='updated at'), + model_name="fieldreport", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="updated at"), ), migrations.AlterField( - model_name='fieldreport', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user', to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="fieldreport", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="user", + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), migrations.AlterField( - model_name='fieldreport', - name='visibility', - field=models.IntegerField(default=1, choices=api.models.VisibilityChoices.choices, verbose_name='visibility'), + model_name="fieldreport", + name="visibility", + field=models.IntegerField(default=1, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), ), migrations.AlterField( - model_name='fieldreport', - name='who_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of cases (WHO)'), + model_name="fieldreport", + name="who_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of cases (WHO)"), ), migrations.AlterField( - model_name='fieldreport', - name='who_confirmed_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of confirmed cases (WHO)'), + model_name="fieldreport", + name="who_confirmed_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of confirmed cases (WHO)"), ), migrations.AlterField( - model_name='fieldreport', - name='who_num_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of assisted (who)'), + model_name="fieldreport", + name="who_num_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of assisted (who)"), ), migrations.AlterField( - model_name='fieldreport', - name='who_num_dead', - field=models.IntegerField(blank=True, null=True, verbose_name='number of number of dead (WHO)'), + model_name="fieldreport", + name="who_num_dead", + field=models.IntegerField(blank=True, null=True, verbose_name="number of number of dead (WHO)"), ), migrations.AlterField( - model_name='fieldreport', - name='who_probable_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of probable cases (WHO)'), + model_name="fieldreport", + name="who_probable_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of probable cases (WHO)"), ), migrations.AlterField( - model_name='fieldreport', - name='who_suspected_cases', - field=models.IntegerField(blank=True, null=True, verbose_name='number of suspected cases (WHO)'), + model_name="fieldreport", + name="who_suspected_cases", + field=models.IntegerField(blank=True, null=True, verbose_name="number of suspected cases (WHO)"), ), migrations.AlterField( - model_name='fieldreportcontact', - name='ctype', - field=models.CharField(blank=True, max_length=100, verbose_name='type'), + model_name="fieldreportcontact", + name="ctype", + field=models.CharField(blank=True, max_length=100, verbose_name="type"), ), migrations.AlterField( - model_name='fieldreportcontact', - name='email', - field=models.CharField(max_length=300, verbose_name='email'), + model_name="fieldreportcontact", + name="email", + field=models.CharField(max_length=300, verbose_name="email"), ), migrations.AlterField( - model_name='fieldreportcontact', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='api.FieldReport', verbose_name='field report'), + model_name="fieldreportcontact", + name="field_report", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="contacts", + to="api.FieldReport", + verbose_name="field report", + ), ), migrations.AlterField( - model_name='fieldreportcontact', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="fieldreportcontact", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='fieldreportcontact', - name='phone', - field=models.CharField(blank=True, max_length=50, verbose_name='phone'), + model_name="fieldreportcontact", + name="phone", + field=models.CharField(blank=True, max_length=50, verbose_name="phone"), ), migrations.AlterField( - model_name='fieldreportcontact', - name='title', - field=models.CharField(max_length=300, verbose_name='title'), + model_name="fieldreportcontact", + name="title", + field=models.CharField(max_length=300, verbose_name="title"), ), migrations.AlterField( - model_name='gdacsevent', - name='alert_level', - field=models.IntegerField(default=0, choices=api.models.AlertLevel.choices, verbose_name='alert level'), + model_name="gdacsevent", + name="alert_level", + field=models.IntegerField(default=0, choices=api.models.AlertLevel.choices, verbose_name="alert level"), ), migrations.AlterField( - model_name='gdacsevent', - name='alert_score', - field=models.CharField(max_length=16, null=True, verbose_name='alert score'), + model_name="gdacsevent", + name="alert_score", + field=models.CharField(max_length=16, null=True, verbose_name="alert score"), ), migrations.AlterField( - model_name='gdacsevent', - name='countries', - field=models.ManyToManyField(to='api.Country', verbose_name='countries'), + model_name="gdacsevent", + name="countries", + field=models.ManyToManyField(to="api.Country", verbose_name="countries"), ), migrations.AlterField( - model_name='gdacsevent', - name='country_text', - field=models.TextField(verbose_name='country text'), + model_name="gdacsevent", + name="country_text", + field=models.TextField(verbose_name="country text"), ), migrations.AlterField( - model_name='gdacsevent', - name='description', - field=models.TextField(verbose_name='description'), + model_name="gdacsevent", + name="description", + field=models.TextField(verbose_name="description"), ), migrations.AlterField( - model_name='gdacsevent', - name='event_type', - field=models.CharField(max_length=16, verbose_name='event type'), + model_name="gdacsevent", + name="event_type", + field=models.CharField(max_length=16, verbose_name="event type"), ), migrations.AlterField( - model_name='gdacsevent', - name='eventid', - field=models.CharField(max_length=12, verbose_name='event id'), + model_name="gdacsevent", + name="eventid", + field=models.CharField(max_length=12, verbose_name="event id"), ), migrations.AlterField( - model_name='gdacsevent', - name='image', - field=models.URLField(null=True, verbose_name='image'), + model_name="gdacsevent", + name="image", + field=models.URLField(null=True, verbose_name="image"), ), migrations.AlterField( - model_name='gdacsevent', - name='lat', - field=models.FloatField(verbose_name='latitude'), + model_name="gdacsevent", + name="lat", + field=models.FloatField(verbose_name="latitude"), ), migrations.AlterField( - model_name='gdacsevent', - name='lon', - field=models.FloatField(verbose_name='longitude'), + model_name="gdacsevent", + name="lon", + field=models.FloatField(verbose_name="longitude"), ), migrations.AlterField( - model_name='gdacsevent', - name='population_unit', - field=models.CharField(max_length=16, verbose_name='population unit'), + model_name="gdacsevent", + name="population_unit", + field=models.CharField(max_length=16, verbose_name="population unit"), ), migrations.AlterField( - model_name='gdacsevent', - name='population_value', - field=models.CharField(max_length=16, verbose_name='population value'), + model_name="gdacsevent", + name="population_value", + field=models.CharField(max_length=16, verbose_name="population value"), ), migrations.AlterField( - model_name='gdacsevent', - name='publication_date', - field=models.DateTimeField(verbose_name='publication date'), + model_name="gdacsevent", + name="publication_date", + field=models.DateTimeField(verbose_name="publication date"), ), migrations.AlterField( - model_name='gdacsevent', - name='report', - field=models.URLField(null=True, verbose_name='report'), + model_name="gdacsevent", + name="report", + field=models.URLField(null=True, verbose_name="report"), ), migrations.AlterField( - model_name='gdacsevent', - name='severity', - field=models.TextField(verbose_name='severity'), + model_name="gdacsevent", + name="severity", + field=models.TextField(verbose_name="severity"), ), migrations.AlterField( - model_name='gdacsevent', - name='severity_unit', - field=models.CharField(max_length=16, verbose_name='severity unit'), + model_name="gdacsevent", + name="severity_unit", + field=models.CharField(max_length=16, verbose_name="severity unit"), ), migrations.AlterField( - model_name='gdacsevent', - name='severity_value', - field=models.CharField(max_length=16, verbose_name='severity value'), + model_name="gdacsevent", + name="severity_value", + field=models.CharField(max_length=16, verbose_name="severity value"), ), migrations.AlterField( - model_name='gdacsevent', - name='title', - field=models.TextField(verbose_name='title'), + model_name="gdacsevent", + name="title", + field=models.TextField(verbose_name="title"), ), migrations.AlterField( - model_name='gdacsevent', - name='vulnerability', - field=models.FloatField(verbose_name='vulnerability'), + model_name="gdacsevent", + name="vulnerability", + field=models.FloatField(verbose_name="vulnerability"), ), migrations.AlterField( - model_name='gdacsevent', - name='year', - field=models.IntegerField(verbose_name='year'), + model_name="gdacsevent", + name="year", + field=models.IntegerField(verbose_name="year"), ), migrations.AlterField( - model_name='keyfigure', - name='deck', - field=models.CharField(help_text='key figure units', max_length=50, verbose_name='deck'), + model_name="keyfigure", + name="deck", + field=models.CharField(help_text="key figure units", max_length=50, verbose_name="deck"), ), migrations.AlterField( - model_name='keyfigure', - name='event', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='key_figures', to='api.Event', verbose_name='event'), + model_name="keyfigure", + name="event", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="key_figures", to="api.Event", verbose_name="event" + ), ), migrations.AlterField( - model_name='keyfigure', - name='number', - field=models.CharField(help_text='key figure metric', max_length=100, verbose_name='number'), + model_name="keyfigure", + name="number", + field=models.CharField(help_text="key figure metric", max_length=100, verbose_name="number"), ), migrations.AlterField( - model_name='keyfigure', - name='source', - field=models.CharField(help_text='key figure website link, publication', max_length=256, verbose_name='source'), + model_name="keyfigure", + name="source", + field=models.CharField(help_text="key figure website link, publication", max_length=256, verbose_name="source"), ), migrations.AlterField( - model_name='profile', - name='city', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='city'), + model_name="profile", + name="city", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="city"), ), migrations.AlterField( - model_name='profile', - name='country', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country'), + model_name="profile", + name="country", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='profile', - name='department', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='department'), + model_name="profile", + name="department", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="department"), ), migrations.AlterField( - model_name='profile', - name='org', - field=models.CharField(blank=True, max_length=100, verbose_name='organization'), + model_name="profile", + name="org", + field=models.CharField(blank=True, max_length=100, verbose_name="organization"), ), migrations.AlterField( - model_name='profile', - name='org_type', - field=models.CharField(blank=True, choices=[('NTLS', 'National Society'), ('DLGN', 'Delegation'), ('SCRT', 'Secretariat'), ('ICRC', 'ICRC'), ('OTHR', 'Other')], max_length=4, verbose_name='organization type'), + model_name="profile", + name="org_type", + field=models.CharField( + blank=True, + choices=[ + ("NTLS", "National Society"), + ("DLGN", "Delegation"), + ("SCRT", "Secretariat"), + ("ICRC", "ICRC"), + ("OTHR", "Other"), + ], + max_length=4, + verbose_name="organization type", + ), ), migrations.AlterField( - model_name='profile', - name='phone_number', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='phone number'), + model_name="profile", + name="phone_number", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="phone number"), ), migrations.AlterField( - model_name='profile', - name='position', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='position'), + model_name="profile", + name="position", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="position"), ), migrations.AlterField( - model_name='profile', - name='user', - field=models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='profile', serialize=False, to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="profile", + name="user", + field=models.OneToOneField( + editable=False, + on_delete=django.db.models.deletion.CASCADE, + primary_key=True, + related_name="profile", + serialize=False, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), migrations.AlterField( - model_name='region', - name='name', - field=models.IntegerField(choices=api.models.RegionName.choices, default=0, verbose_name='name'), + model_name="region", + name="name", + field=models.IntegerField(choices=api.models.RegionName.choices, default=0, verbose_name="name"), ), migrations.AlterField( - model_name='regioncontact', - name='region', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='api.Region', verbose_name='region'), + model_name="regioncontact", + name="region", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="contacts", to="api.Region", verbose_name="region" + ), ), migrations.AlterField( - model_name='regionkeyfigure', - name='region', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='key_figures', to='api.Region', verbose_name='region'), + model_name="regionkeyfigure", + name="region", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="key_figures", to="api.Region", verbose_name="region" + ), ), migrations.AlterField( - model_name='regionlink', - name='region', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='links', to='api.Region', verbose_name='region'), + model_name="regionlink", + name="region", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="links", to="api.Region", verbose_name="region" + ), ), migrations.AlterField( - model_name='regionsnippet', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='regions/%Y/%m/%d/', verbose_name='image'), + model_name="regionsnippet", + name="image", + field=models.ImageField(blank=True, null=True, upload_to="regions/%Y/%m/%d/", verbose_name="image"), ), migrations.AlterField( - model_name='regionsnippet', - name='position', - field=models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name='position'), + model_name="regionsnippet", + name="position", + field=models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name="position"), ), migrations.AlterField( - model_name='regionsnippet', - name='region', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='snippets', to='api.Region', verbose_name='region'), + model_name="regionsnippet", + name="region", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="snippets", to="api.Region", verbose_name="region" + ), ), migrations.AlterField( - model_name='regionsnippet', - name='snippet', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="regionsnippet", + name="snippet", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='regionsnippet', - name='visibility', - field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name='visibility'), + model_name="regionsnippet", + name="visibility", + field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), ), migrations.AlterField( - model_name='reversiondifferencelog', - name='action', - field=models.CharField(max_length=64, verbose_name='action'), + model_name="reversiondifferencelog", + name="action", + field=models.CharField(max_length=64, verbose_name="action"), ), migrations.AlterField( - model_name='reversiondifferencelog', - name='changed_from', - field=django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), blank=True, default=list, null=True, size=None, verbose_name='changed from'), + model_name="reversiondifferencelog", + name="changed_from", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(blank=True, null=True), + blank=True, + default=list, + null=True, + size=None, + verbose_name="changed from", + ), ), migrations.AlterField( - model_name='reversiondifferencelog', - name='changed_to', - field=django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), blank=True, default=list, null=True, size=None, verbose_name='changed to'), + model_name="reversiondifferencelog", + name="changed_to", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(blank=True, null=True), + blank=True, + default=list, + null=True, + size=None, + verbose_name="changed to", + ), ), migrations.AlterField( - model_name='reversiondifferencelog', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="reversiondifferencelog", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='reversiondifferencelog', - name='object_id', - field=models.CharField(blank=True, max_length=191, verbose_name='object id'), + model_name="reversiondifferencelog", + name="object_id", + field=models.CharField(blank=True, max_length=191, verbose_name="object id"), ), migrations.AlterField( - model_name='reversiondifferencelog', - name='object_name', - field=models.TextField(blank=True, null=True, verbose_name='object name'), + model_name="reversiondifferencelog", + name="object_name", + field=models.TextField(blank=True, null=True, verbose_name="object name"), ), migrations.AlterField( - model_name='reversiondifferencelog', - name='object_type', - field=models.CharField(blank=True, max_length=50, verbose_name='object type'), + model_name="reversiondifferencelog", + name="object_type", + field=models.CharField(blank=True, max_length=50, verbose_name="object type"), ), migrations.AlterField( - model_name='reversiondifferencelog', - name='username', - field=models.CharField(max_length=256, null=True, verbose_name='username'), + model_name="reversiondifferencelog", + name="username", + field=models.CharField(max_length=256, null=True, verbose_name="username"), ), migrations.AlterField( - model_name='situationreport', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="situationreport", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='situationreport', - name='document', - field=models.FileField(blank=True, null=True, upload_to=api.models.sitrep_document_path, verbose_name='document'), + model_name="situationreport", + name="document", + field=models.FileField(blank=True, null=True, upload_to=api.models.sitrep_document_path, verbose_name="document"), ), migrations.AlterField( - model_name='situationreport', - name='document_url', - field=models.URLField(blank=True, verbose_name='document url'), + model_name="situationreport", + name="document_url", + field=models.URLField(blank=True, verbose_name="document url"), ), migrations.AlterField( - model_name='situationreport', - name='event', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Event', verbose_name='event'), + model_name="situationreport", + name="event", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Event", verbose_name="event"), ), migrations.AlterField( - model_name='situationreport', - name='is_pinned', - field=models.BooleanField(default=False, help_text='pin this report at the top', verbose_name='is pinned?'), + model_name="situationreport", + name="is_pinned", + field=models.BooleanField(default=False, help_text="pin this report at the top", verbose_name="is pinned?"), ), migrations.AlterField( - model_name='situationreport', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="situationreport", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='situationreport', - name='type', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='situation_reports', to='api.SituationReportType', verbose_name='type'), + model_name="situationreport", + name="type", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="situation_reports", + to="api.SituationReportType", + verbose_name="type", + ), ), migrations.AlterField( - model_name='situationreport', - name='visibility', - field=models.IntegerField(default=1, choices=api.models.VisibilityChoices.choices, verbose_name='visibility'), + model_name="situationreport", + name="visibility", + field=models.IntegerField(default=1, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), ), migrations.AlterField( - model_name='situationreporttype', - name='is_primary', - field=models.BooleanField(default=False, editable=False, help_text='Ensure this type gets precedence over others that are empty', verbose_name='is primary?'), + model_name="situationreporttype", + name="is_primary", + field=models.BooleanField( + default=False, + editable=False, + help_text="Ensure this type gets precedence over others that are empty", + verbose_name="is primary?", + ), ), migrations.AlterField( - model_name='situationreporttype', - name='type', - field=models.CharField(max_length=50, verbose_name='type'), + model_name="situationreporttype", + name="type", + field=models.CharField(max_length=50, verbose_name="type"), ), migrations.AlterField( - model_name='snippet', - name='event', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='snippets', to='api.Event', verbose_name='event'), + model_name="snippet", + name="event", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="snippets", to="api.Event", verbose_name="event" + ), ), migrations.AlterField( - model_name='snippet', - name='image', - field=models.ImageField(blank=True, null=True, upload_to=api.models.snippet_image_path, verbose_name='image'), + model_name="snippet", + name="image", + field=models.ImageField(blank=True, null=True, upload_to=api.models.snippet_image_path, verbose_name="image"), ), migrations.AlterField( - model_name='snippet', - name='position', - field=models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name='position'), + model_name="snippet", + name="position", + field=models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name="position"), ), migrations.AlterField( - model_name='snippet', - name='snippet', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="snippet", + name="snippet", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='snippet', - name='tab', - field=models.IntegerField(default=1, choices=api.models.TabNumber.choices, verbose_name='tab'), + model_name="snippet", + name="tab", + field=models.IntegerField(default=1, choices=api.models.TabNumber.choices, verbose_name="tab"), ), migrations.AlterField( - model_name='snippet', - name='visibility', - field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name='visibility'), + model_name="snippet", + name="visibility", + field=models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), ), migrations.AlterField( - model_name='source', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sources', to='api.FieldReport', verbose_name='field report'), + model_name="source", + name="field_report", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="sources", + to="api.FieldReport", + verbose_name="field report", + ), ), migrations.AlterField( - model_name='source', - name='spec', - field=models.TextField(blank=True, verbose_name='spec'), + model_name="source", + name="spec", + field=models.TextField(blank=True, verbose_name="spec"), ), migrations.AlterField( - model_name='source', - name='stype', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.SourceType', verbose_name='type'), + model_name="source", + name="stype", + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="api.SourceType", verbose_name="type"), ), migrations.AlterField( - model_name='sourcetype', - name='name', - field=models.CharField(max_length=40, verbose_name='name'), + model_name="sourcetype", + name="name", + field=models.CharField(max_length=40, verbose_name="name"), ), ] diff --git a/api/migrations/0071_auto_20200623_0704.py b/api/migrations/0071_auto_20200623_0704.py index c40bc914a..57445eae6 100644 --- a/api/migrations/0071_auto_20200623_0704.py +++ b/api/migrations/0071_auto_20200623_0704.py @@ -6,21 +6,21 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0070_auto_20200618_0904'), + ("api", "0070_auto_20200618_0904"), ] operations = [ migrations.AlterModelOptions( - name='countrykeyfigure', - options={'verbose_name': 'country key figure', 'verbose_name_plural': 'country key figures'}, + name="countrykeyfigure", + options={"verbose_name": "country key figure", "verbose_name_plural": "country key figures"}, ), migrations.AlterModelOptions( - name='regionkeyfigure', - options={'verbose_name': 'region key figure', 'verbose_name_plural': 'region key figures'}, + name="regionkeyfigure", + options={"verbose_name": "region key figure", "verbose_name_plural": "region key figures"}, ), migrations.AlterField( - model_name='snippet', - name='snippet', - field=models.TextField(blank=True, null=True, verbose_name='snippet'), + model_name="snippet", + name="snippet", + field=models.TextField(blank=True, null=True, verbose_name="snippet"), ), ] diff --git a/api/migrations/0072_auto_20200623_0734.py b/api/migrations/0072_auto_20200623_0734.py index 49056820a..36bad4e4d 100644 --- a/api/migrations/0072_auto_20200623_0734.py +++ b/api/migrations/0072_auto_20200623_0734.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0071_auto_20200623_0704'), + ("api", "0071_auto_20200623_0704"), ] operations = [ migrations.AlterField( - model_name='countrysnippet', - name='snippet', - field=models.TextField(blank=True, null=True, verbose_name='snippet'), + model_name="countrysnippet", + name="snippet", + field=models.TextField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='regionsnippet', - name='snippet', - field=models.TextField(blank=True, null=True, verbose_name='snippet'), + model_name="regionsnippet", + name="snippet", + field=models.TextField(blank=True, null=True, verbose_name="snippet"), ), ] diff --git a/api/migrations/0073_auto_20200624_1538.py b/api/migrations/0073_auto_20200624_1538.py index b9a2e7492..e3439c8b7 100644 --- a/api/migrations/0073_auto_20200624_1538.py +++ b/api/migrations/0073_auto_20200624_1538.py @@ -1,29 +1,29 @@ # Generated by Django 2.2.13 on 2020-06-24 15:38 -from django.db import models, migrations import tinymce.models +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0072_auto_20200623_0734'), + ("api", "0072_auto_20200623_0734"), ] operations = [ migrations.AlterField( - model_name='countrysnippet', - name='snippet', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="countrysnippet", + name="snippet", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='regionsnippet', - name='snippet', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="regionsnippet", + name="snippet", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='snippet', - name='snippet', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="snippet", + name="snippet", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), ] diff --git a/api/migrations/0074_auto_20200701_0939.py b/api/migrations/0074_auto_20200701_0939.py index 9f2b7a0ea..edd52e012 100644 --- a/api/migrations/0074_auto_20200701_0939.py +++ b/api/migrations/0074_auto_20200701_0939.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0073_auto_20200624_1538'), + ("api", "0073_auto_20200624_1538"), ] operations = [ migrations.AlterField( - model_name='countrysnippet', - name='snippet', - field=models.TextField(blank=True, null=True, verbose_name='snippet'), + model_name="countrysnippet", + name="snippet", + field=models.TextField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='regionsnippet', - name='snippet', - field=models.TextField(blank=True, null=True, verbose_name='snippet'), + model_name="regionsnippet", + name="snippet", + field=models.TextField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='snippet', - name='snippet', - field=models.TextField(blank=True, null=True, verbose_name='snippet'), + model_name="snippet", + name="snippet", + field=models.TextField(blank=True, null=True, verbose_name="snippet"), ), ] diff --git a/api/migrations/0075_auto_20200707_1231.py b/api/migrations/0075_auto_20200707_1231.py index adfe9c29a..8b53dc109 100644 --- a/api/migrations/0075_auto_20200707_1231.py +++ b/api/migrations/0075_auto_20200707_1231.py @@ -1,31 +1,31 @@ # Generated by Django 2.2.13 on 2020-07-07 12:31 -from django.contrib.postgres.operations import CreateExtension import django.contrib.gis.db.models.fields -from django.db import models, migrations +from django.contrib.postgres.operations import CreateExtension +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0074_auto_20200701_0939'), + ("api", "0074_auto_20200701_0939"), ] operations = [ - CreateExtension('postgis'), + CreateExtension("postgis"), migrations.AddField( - model_name='country', - name='bbox', + model_name="country", + name="bbox", field=django.contrib.gis.db.models.fields.PolygonField(blank=True, null=True, srid=4326), ), migrations.AddField( - model_name='country', - name='centroid', + model_name="country", + name="centroid", field=django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326), ), migrations.AddField( - model_name='country', - name='geom', + model_name="country", + name="geom", field=django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326), ), ] diff --git a/api/migrations/0075_profile_last_frontend_login.py b/api/migrations/0075_profile_last_frontend_login.py index 875ecf591..bcd7d57c8 100644 --- a/api/migrations/0075_profile_last_frontend_login.py +++ b/api/migrations/0075_profile_last_frontend_login.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0074_auto_20200701_0939'), + ("api", "0074_auto_20200701_0939"), ] operations = [ migrations.AddField( - model_name='profile', - name='last_frontend_login', - field=models.DateTimeField(blank=True, null=True, verbose_name='last frontend login'), + model_name="profile", + name="last_frontend_login", + field=models.DateTimeField(blank=True, null=True, verbose_name="last frontend login"), ), ] diff --git a/api/migrations/0076_auto_20200721_0950.py b/api/migrations/0076_auto_20200721_0950.py index 4c8c6f5ff..1140aef88 100644 --- a/api/migrations/0076_auto_20200721_0950.py +++ b/api/migrations/0076_auto_20200721_0950.py @@ -1,29 +1,29 @@ # Generated by Django 2.2.13 on 2020-07-21 09:50 import django.contrib.gis.db.models.fields -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0075_auto_20200707_1231'), + ("api", "0075_auto_20200707_1231"), ] operations = [ migrations.AddField( - model_name='district', - name='bbox', + model_name="district", + name="bbox", field=django.contrib.gis.db.models.fields.PolygonField(blank=True, null=True, srid=4326), ), migrations.AddField( - model_name='district', - name='centroid', + model_name="district", + name="centroid", field=django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326), ), migrations.AddField( - model_name='district', - name='geom', + model_name="district", + name="geom", field=django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326), ), ] diff --git a/api/migrations/0076_auto_20200728_1500.py b/api/migrations/0076_auto_20200728_1500.py index 5ba7dd577..364192911 100644 --- a/api/migrations/0076_auto_20200728_1500.py +++ b/api/migrations/0076_auto_20200728_1500.py @@ -6,80 +6,80 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0075_profile_last_frontend_login'), + ("api", "0075_profile_last_frontend_login"), ] operations = [ migrations.RemoveField( - model_name='fieldreport', - name='cases', + model_name="fieldreport", + name="cases", ), migrations.RemoveField( - model_name='fieldreport', - name='confirmed_cases', + model_name="fieldreport", + name="confirmed_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='health_min_cases', + model_name="fieldreport", + name="health_min_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='health_min_confirmed_cases', + model_name="fieldreport", + name="health_min_confirmed_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='health_min_num_dead', + model_name="fieldreport", + name="health_min_num_dead", ), migrations.RemoveField( - model_name='fieldreport', - name='health_min_probable_cases', + model_name="fieldreport", + name="health_min_probable_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='health_min_suspected_cases', + model_name="fieldreport", + name="health_min_suspected_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='other_cases', + model_name="fieldreport", + name="other_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='other_confirmed_cases', + model_name="fieldreport", + name="other_confirmed_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='other_probable_cases', + model_name="fieldreport", + name="other_probable_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='other_suspected_cases', + model_name="fieldreport", + name="other_suspected_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='probable_cases', + model_name="fieldreport", + name="probable_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='suspected_cases', + model_name="fieldreport", + name="suspected_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='who_cases', + model_name="fieldreport", + name="who_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='who_confirmed_cases', + model_name="fieldreport", + name="who_confirmed_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='who_num_dead', + model_name="fieldreport", + name="who_num_dead", ), migrations.RemoveField( - model_name='fieldreport', - name='who_probable_cases', + model_name="fieldreport", + name="who_probable_cases", ), migrations.RemoveField( - model_name='fieldreport', - name='who_suspected_cases', + model_name="fieldreport", + name="who_suspected_cases", ), ] diff --git a/api/migrations/0077_auto_20200721_1051.py b/api/migrations/0077_auto_20200721_1051.py index 24d534da7..8ad0dc1c8 100644 --- a/api/migrations/0077_auto_20200721_1051.py +++ b/api/migrations/0077_auto_20200721_1051.py @@ -1,12 +1,12 @@ # Generated by Django 2.2.13 on 2020-07-21 10:51 -from django.db import migrations, models from django.core.exceptions import ObjectDoesNotExist +from django.db import migrations, models def delete_idn(apps, schema_editor): - District = apps.get_model('api', 'District') - FieldReport = apps.get_model('api', 'FieldReport') + District = apps.get_model("api", "District") + FieldReport = apps.get_model("api", "FieldReport") try: idn = District.objects.get(id=3525) @@ -22,10 +22,11 @@ def delete_idn(apps, schema_editor): except ObjectDoesNotExist: pass + class Migration(migrations.Migration): dependencies = [ - ('api', '0076_auto_20200721_0950'), + ("api", "0076_auto_20200721_0950"), ] operations = [ diff --git a/api/migrations/0078_auto_20200721_1108.py b/api/migrations/0078_auto_20200721_1108.py index e9776555e..fedd056eb 100644 --- a/api/migrations/0078_auto_20200721_1108.py +++ b/api/migrations/0078_auto_20200721_1108.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0077_auto_20200721_1051'), + ("api", "0077_auto_20200721_1051"), ] operations = [ migrations.AlterField( - model_name='district', - name='country_iso', - field=models.CharField(max_length=2, null=True, verbose_name='country ISO2'), + model_name="district", + name="country_iso", + field=models.CharField(max_length=2, null=True, verbose_name="country ISO2"), ), ] diff --git a/api/migrations/0079_auto_20200728_0920.py b/api/migrations/0079_auto_20200728_0920.py index 6448ded63..27fedcb98 100644 --- a/api/migrations/0079_auto_20200728_0920.py +++ b/api/migrations/0079_auto_20200728_0920.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0078_auto_20200721_1108'), + ("api", "0078_auto_20200721_1108"), ] operations = [ migrations.AddField( - model_name='country', - name='independent', - field=models.BooleanField(default=None, help_text='Is this an independent country?'), + model_name="country", + name="independent", + field=models.BooleanField(default=None, help_text="Is this an independent country?"), ) ] diff --git a/api/migrations/0080_region_bbox.py b/api/migrations/0080_region_bbox.py index 0216e2a2b..e7f53be4f 100644 --- a/api/migrations/0080_region_bbox.py +++ b/api/migrations/0080_region_bbox.py @@ -1,19 +1,19 @@ # Generated by Django 2.2.13 on 2020-07-29 09:51 import django.contrib.gis.db.models.fields -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0079_auto_20200728_0920'), + ("api", "0079_auto_20200728_0920"), ] operations = [ migrations.AddField( - model_name='region', - name='bbox', + model_name="region", + name="bbox", field=django.contrib.gis.db.models.fields.PolygonField(blank=True, null=True, srid=4326), ), ] diff --git a/api/migrations/0081_merge_20200730_1237.py b/api/migrations/0081_merge_20200730_1237.py index e8c224dac..b5feda731 100644 --- a/api/migrations/0081_merge_20200730_1237.py +++ b/api/migrations/0081_merge_20200730_1237.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0080_region_bbox'), - ('api', '0076_auto_20200728_1500'), + ("api", "0080_region_bbox"), + ("api", "0076_auto_20200728_1500"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0082_auto_20200806_0635.py b/api/migrations/0082_auto_20200806_0635.py index 818267f61..12aaa8baa 100644 --- a/api/migrations/0082_auto_20200806_0635.py +++ b/api/migrations/0082_auto_20200806_0635.py @@ -1,452 +1,522 @@ # Generated by Django 2.2.13 on 2020-08-06 06:35 -import api.utils -import django.core.validators -from django.db import migrations, models import re + +import django.core.validators import tinymce.models +from django.db import migrations, models + +import api.utils class Migration(migrations.Migration): dependencies = [ - ('api', '0081_merge_20200730_1237'), + ("api", "0081_merge_20200730_1237"), ] operations = [ migrations.AddField( - model_name='action', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="action", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='action', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="action", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='action', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="action", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='action', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="action", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='actionstaken', - name='summary_ar', - field=models.TextField(blank=True, null=True, verbose_name='summary'), + model_name="actionstaken", + name="summary_ar", + field=models.TextField(blank=True, null=True, verbose_name="summary"), ), migrations.AddField( - model_name='actionstaken', - name='summary_en', - field=models.TextField(blank=True, null=True, verbose_name='summary'), + model_name="actionstaken", + name="summary_en", + field=models.TextField(blank=True, null=True, verbose_name="summary"), ), migrations.AddField( - model_name='actionstaken', - name='summary_es', - field=models.TextField(blank=True, null=True, verbose_name='summary'), + model_name="actionstaken", + name="summary_es", + field=models.TextField(blank=True, null=True, verbose_name="summary"), ), migrations.AddField( - model_name='actionstaken', - name='summary_fr', - field=models.TextField(blank=True, null=True, verbose_name='summary'), + model_name="actionstaken", + name="summary_fr", + field=models.TextField(blank=True, null=True, verbose_name="summary"), ), migrations.AddField( - model_name='appeal', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="appeal", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='appeal', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="appeal", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='appeal', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="appeal", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='appeal', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="appeal", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='appealdocument', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="appealdocument", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='appealdocument', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="appealdocument", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='appealdocument', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="appealdocument", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='appealdocument', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="appealdocument", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='country', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="country", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='country', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="country", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='country', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="country", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='country', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="country", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='country', - name='overview_ar', - field=models.TextField(blank=True, null=True, verbose_name='overview'), + model_name="country", + name="overview_ar", + field=models.TextField(blank=True, null=True, verbose_name="overview"), ), migrations.AddField( - model_name='country', - name='overview_en', - field=models.TextField(blank=True, null=True, verbose_name='overview'), + model_name="country", + name="overview_en", + field=models.TextField(blank=True, null=True, verbose_name="overview"), ), migrations.AddField( - model_name='country', - name='overview_es', - field=models.TextField(blank=True, null=True, verbose_name='overview'), + model_name="country", + name="overview_es", + field=models.TextField(blank=True, null=True, verbose_name="overview"), ), migrations.AddField( - model_name='country', - name='overview_fr', - field=models.TextField(blank=True, null=True, verbose_name='overview'), + model_name="country", + name="overview_fr", + field=models.TextField(blank=True, null=True, verbose_name="overview"), ), migrations.AddField( - model_name='countrysnippet', - name='snippet_ar', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="countrysnippet", + name="snippet_ar", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='countrysnippet', - name='snippet_en', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="countrysnippet", + name="snippet_en", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='countrysnippet', - name='snippet_es', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="countrysnippet", + name="snippet_es", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='countrysnippet', - name='snippet_fr', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="countrysnippet", + name="snippet_fr", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='disastertype', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="disastertype", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='disastertype', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="disastertype", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='disastertype', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="disastertype", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='disastertype', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="disastertype", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='disastertype', - name='summary_ar', - field=models.TextField(null=True, verbose_name='summary'), + model_name="disastertype", + name="summary_ar", + field=models.TextField(null=True, verbose_name="summary"), ), migrations.AddField( - model_name='disastertype', - name='summary_en', - field=models.TextField(null=True, verbose_name='summary'), + model_name="disastertype", + name="summary_en", + field=models.TextField(null=True, verbose_name="summary"), ), migrations.AddField( - model_name='disastertype', - name='summary_es', - field=models.TextField(null=True, verbose_name='summary'), + model_name="disastertype", + name="summary_es", + field=models.TextField(null=True, verbose_name="summary"), ), migrations.AddField( - model_name='disastertype', - name='summary_fr', - field=models.TextField(null=True, verbose_name='summary'), + model_name="disastertype", + name="summary_fr", + field=models.TextField(null=True, verbose_name="summary"), ), migrations.AddField( - model_name='event', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="event", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='event', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="event", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='event', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="event", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='event', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="event", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='event', - name='slug_ar', - field=models.CharField(blank=True, default=None, editable=False, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_ar", + field=models.CharField( + blank=True, + default=None, + editable=False, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AddField( - model_name='event', - name='slug_en', - field=models.CharField(blank=True, default=None, editable=False, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_en", + field=models.CharField( + blank=True, + default=None, + editable=False, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AddField( - model_name='event', - name='slug_es', - field=models.CharField(blank=True, default=None, editable=False, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_es", + field=models.CharField( + blank=True, + default=None, + editable=False, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AddField( - model_name='event', - name='slug_fr', - field=models.CharField(blank=True, default=None, editable=False, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_fr", + field=models.CharField( + blank=True, + default=None, + editable=False, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AddField( - model_name='fieldreport', - name='actions_others_ar', - field=models.TextField(blank=True, null=True, verbose_name='actions taken (others)'), + model_name="fieldreport", + name="actions_others_ar", + field=models.TextField(blank=True, null=True, verbose_name="actions taken (others)"), ), migrations.AddField( - model_name='fieldreport', - name='actions_others_en', - field=models.TextField(blank=True, null=True, verbose_name='actions taken (others)'), + model_name="fieldreport", + name="actions_others_en", + field=models.TextField(blank=True, null=True, verbose_name="actions taken (others)"), ), migrations.AddField( - model_name='fieldreport', - name='actions_others_es', - field=models.TextField(blank=True, null=True, verbose_name='actions taken (others)'), + model_name="fieldreport", + name="actions_others_es", + field=models.TextField(blank=True, null=True, verbose_name="actions taken (others)"), ), migrations.AddField( - model_name='fieldreport', - name='actions_others_fr', - field=models.TextField(blank=True, null=True, verbose_name='actions taken (others)'), + model_name="fieldreport", + name="actions_others_fr", + field=models.TextField(blank=True, null=True, verbose_name="actions taken (others)"), ), migrations.AddField( - model_name='fieldreport', - name='description_ar', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='description'), + model_name="fieldreport", + name="description_ar", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="description"), ), migrations.AddField( - model_name='fieldreport', - name='description_en', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='description'), + model_name="fieldreport", + name="description_en", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="description"), ), migrations.AddField( - model_name='fieldreport', - name='description_es', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='description'), + model_name="fieldreport", + name="description_es", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="description"), ), migrations.AddField( - model_name='fieldreport', - name='description_fr', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='description'), + model_name="fieldreport", + name="description_fr", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="description"), ), migrations.AddField( - model_name='fieldreport', - name='other_sources_ar', - field=models.TextField(blank=True, default='', null=True, verbose_name='sources (other)'), + model_name="fieldreport", + name="other_sources_ar", + field=models.TextField(blank=True, default="", null=True, verbose_name="sources (other)"), ), migrations.AddField( - model_name='fieldreport', - name='other_sources_en', - field=models.TextField(blank=True, default='', null=True, verbose_name='sources (other)'), + model_name="fieldreport", + name="other_sources_en", + field=models.TextField(blank=True, default="", null=True, verbose_name="sources (other)"), ), migrations.AddField( - model_name='fieldreport', - name='other_sources_es', - field=models.TextField(blank=True, default='', null=True, verbose_name='sources (other)'), + model_name="fieldreport", + name="other_sources_es", + field=models.TextField(blank=True, default="", null=True, verbose_name="sources (other)"), ), migrations.AddField( - model_name='fieldreport', - name='other_sources_fr', - field=models.TextField(blank=True, default='', null=True, verbose_name='sources (other)'), + model_name="fieldreport", + name="other_sources_fr", + field=models.TextField(blank=True, default="", null=True, verbose_name="sources (other)"), ), migrations.AddField( - model_name='fieldreport', - name='summary_ar', - field=models.TextField(blank=True, null=True, verbose_name='summary'), + model_name="fieldreport", + name="summary_ar", + field=models.TextField(blank=True, null=True, verbose_name="summary"), ), migrations.AddField( - model_name='fieldreport', - name='summary_en', - field=models.TextField(blank=True, null=True, verbose_name='summary'), + model_name="fieldreport", + name="summary_en", + field=models.TextField(blank=True, null=True, verbose_name="summary"), ), migrations.AddField( - model_name='fieldreport', - name='summary_es', - field=models.TextField(blank=True, null=True, verbose_name='summary'), + model_name="fieldreport", + name="summary_es", + field=models.TextField(blank=True, null=True, verbose_name="summary"), ), migrations.AddField( - model_name='fieldreport', - name='summary_fr', - field=models.TextField(blank=True, null=True, verbose_name='summary'), + model_name="fieldreport", + name="summary_fr", + field=models.TextField(blank=True, null=True, verbose_name="summary"), ), migrations.AddField( - model_name='gdacsevent', - name='country_text_ar', - field=models.TextField(null=True, verbose_name='country text'), + model_name="gdacsevent", + name="country_text_ar", + field=models.TextField(null=True, verbose_name="country text"), ), migrations.AddField( - model_name='gdacsevent', - name='country_text_en', - field=models.TextField(null=True, verbose_name='country text'), + model_name="gdacsevent", + name="country_text_en", + field=models.TextField(null=True, verbose_name="country text"), ), migrations.AddField( - model_name='gdacsevent', - name='country_text_es', - field=models.TextField(null=True, verbose_name='country text'), + model_name="gdacsevent", + name="country_text_es", + field=models.TextField(null=True, verbose_name="country text"), ), migrations.AddField( - model_name='gdacsevent', - name='country_text_fr', - field=models.TextField(null=True, verbose_name='country text'), + model_name="gdacsevent", + name="country_text_fr", + field=models.TextField(null=True, verbose_name="country text"), ), migrations.AddField( - model_name='gdacsevent', - name='description_ar', - field=models.TextField(null=True, verbose_name='description'), + model_name="gdacsevent", + name="description_ar", + field=models.TextField(null=True, verbose_name="description"), ), migrations.AddField( - model_name='gdacsevent', - name='description_en', - field=models.TextField(null=True, verbose_name='description'), + model_name="gdacsevent", + name="description_en", + field=models.TextField(null=True, verbose_name="description"), ), migrations.AddField( - model_name='gdacsevent', - name='description_es', - field=models.TextField(null=True, verbose_name='description'), + model_name="gdacsevent", + name="description_es", + field=models.TextField(null=True, verbose_name="description"), ), migrations.AddField( - model_name='gdacsevent', - name='description_fr', - field=models.TextField(null=True, verbose_name='description'), + model_name="gdacsevent", + name="description_fr", + field=models.TextField(null=True, verbose_name="description"), ), migrations.AddField( - model_name='gdacsevent', - name='title_ar', - field=models.TextField(null=True, verbose_name='title'), + model_name="gdacsevent", + name="title_ar", + field=models.TextField(null=True, verbose_name="title"), ), migrations.AddField( - model_name='gdacsevent', - name='title_en', - field=models.TextField(null=True, verbose_name='title'), + model_name="gdacsevent", + name="title_en", + field=models.TextField(null=True, verbose_name="title"), ), migrations.AddField( - model_name='gdacsevent', - name='title_es', - field=models.TextField(null=True, verbose_name='title'), + model_name="gdacsevent", + name="title_es", + field=models.TextField(null=True, verbose_name="title"), ), migrations.AddField( - model_name='gdacsevent', - name='title_fr', - field=models.TextField(null=True, verbose_name='title'), + model_name="gdacsevent", + name="title_fr", + field=models.TextField(null=True, verbose_name="title"), ), migrations.AddField( - model_name='regionsnippet', - name='snippet_ar', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="regionsnippet", + name="snippet_ar", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='regionsnippet', - name='snippet_en', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="regionsnippet", + name="snippet_en", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='regionsnippet', - name='snippet_es', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="regionsnippet", + name="snippet_es", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='regionsnippet', - name='snippet_fr', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="regionsnippet", + name="snippet_fr", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='situationreport', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="situationreport", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='situationreport', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="situationreport", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='situationreport', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="situationreport", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='situationreport', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="situationreport", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='snippet', - name='snippet_ar', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="snippet", + name="snippet_ar", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='snippet', - name='snippet_en', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="snippet", + name="snippet_en", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='snippet', - name='snippet_es', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="snippet", + name="snippet_es", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AddField( - model_name='snippet', - name='snippet_fr', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="snippet", + name="snippet_fr", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='countrysnippet', - name='snippet', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="countrysnippet", + name="snippet", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='regionsnippet', - name='snippet', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="regionsnippet", + name="snippet", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), migrations.AlterField( - model_name='snippet', - name='snippet', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet'), + model_name="snippet", + name="snippet", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet"), ), ] diff --git a/api/migrations/0083_auto_20200814_0503.py b/api/migrations/0083_auto_20200814_0503.py index 8bb394812..c7c011bcc 100644 --- a/api/migrations/0083_auto_20200814_0503.py +++ b/api/migrations/0083_auto_20200814_0503.py @@ -6,32 +6,32 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0082_auto_20200806_0635'), + ("api", "0082_auto_20200806_0635"), ] operations = [ migrations.AlterModelOptions( - name='fieldreportcontact', - options={'verbose_name': 'field report contacts', 'verbose_name_plural': 'field report contacts'}, + name="fieldreportcontact", + options={"verbose_name": "field report contacts", "verbose_name_plural": "field report contacts"}, ), migrations.AddField( - model_name='country', - name='society_name_ar', - field=models.TextField(blank=True, null=True, verbose_name='society name'), + model_name="country", + name="society_name_ar", + field=models.TextField(blank=True, null=True, verbose_name="society name"), ), migrations.AddField( - model_name='country', - name='society_name_en', - field=models.TextField(blank=True, null=True, verbose_name='society name'), + model_name="country", + name="society_name_en", + field=models.TextField(blank=True, null=True, verbose_name="society name"), ), migrations.AddField( - model_name='country', - name='society_name_es', - field=models.TextField(blank=True, null=True, verbose_name='society name'), + model_name="country", + name="society_name_es", + field=models.TextField(blank=True, null=True, verbose_name="society name"), ), migrations.AddField( - model_name='country', - name='society_name_fr', - field=models.TextField(blank=True, null=True, verbose_name='society name'), + model_name="country", + name="society_name_fr", + field=models.TextField(blank=True, null=True, verbose_name="society name"), ), ] diff --git a/api/migrations/0084_region_label.py b/api/migrations/0084_region_label.py index b9d3e84e3..c5c1a0182 100644 --- a/api/migrations/0084_region_label.py +++ b/api/migrations/0084_region_label.py @@ -2,15 +2,10 @@ from django.db import migrations, models + def add_region_labels(apps, schema_editor): - Region = apps.get_model('api', 'Region') - region_map = { - 0: 'Africa', - 1: 'Americas', - 2: 'Asia Pacific', - 3: 'Europe', - 4: 'Middle East & North Africa' - } + Region = apps.get_model("api", "Region") + region_map = {0: "Africa", 1: "Americas", 2: "Asia Pacific", 3: "Europe", 4: "Middle East & North Africa"} # for each Region, add the label regions = Region.objects.all() @@ -22,14 +17,14 @@ def add_region_labels(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('api', '0083_auto_20200814_0503'), + ("api", "0083_auto_20200814_0503"), ] operations = [ migrations.AddField( - model_name='region', - name='label', - field=models.CharField(blank=True, max_length=150, verbose_name='name of the region'), + model_name="region", + name="label", + field=models.CharField(blank=True, max_length=150, verbose_name="name of the region"), ), - migrations.RunPython(add_region_labels) + migrations.RunPython(add_region_labels), ] diff --git a/api/migrations/0085_auto_20200903_0843.py b/api/migrations/0085_auto_20200903_0843.py index 558d97242..a323202dd 100644 --- a/api/migrations/0085_auto_20200903_0843.py +++ b/api/migrations/0085_auto_20200903_0843.py @@ -1,55 +1,62 @@ # Generated by Django 2.2.13 on 2020-09-03 08:43 -import api.models import django.core.validators from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0084_region_label'), + ("api", "0084_region_label"), ] operations = [ migrations.AddField( - model_name='country', - name='is_deprecated', - field=models.BooleanField(default=False, help_text='Is this an active, valid country?'), + model_name="country", + name="is_deprecated", + field=models.BooleanField(default=False, help_text="Is this an active, valid country?"), ), migrations.AddField( - model_name='district', - name='is_deprecated', - field=models.BooleanField(default=False, help_text='Is this an active, valid district?'), + model_name="district", + name="is_deprecated", + field=models.BooleanField(default=False, help_text="Is this an active, valid district?"), ), migrations.AlterField( - model_name='appealdocument', - name='document', - field=models.FileField(blank=True, null=True, upload_to=api.models.appeal_document_path, verbose_name='document'), + model_name="appealdocument", + name="document", + field=models.FileField(blank=True, null=True, upload_to=api.models.appeal_document_path, verbose_name="document"), ), migrations.AlterField( - model_name='country', - name='logo', - field=models.FileField(blank=True, null=True, upload_to=api.models.logo_document_path, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'jpg', 'gif'])], verbose_name='logo'), + model_name="country", + name="logo", + field=models.FileField( + blank=True, + null=True, + upload_to=api.models.logo_document_path, + validators=[django.core.validators.FileExtensionValidator(allowed_extensions=["png", "jpg", "gif"])], + verbose_name="logo", + ), ), migrations.AlterField( - model_name='countrysnippet', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='countries/%Y/%m/%d/', verbose_name='image'), + model_name="countrysnippet", + name="image", + field=models.ImageField(blank=True, null=True, upload_to="countries/%Y/%m/%d/", verbose_name="image"), ), migrations.AlterField( - model_name='regionsnippet', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='regions/%Y/%m/%d/', verbose_name='image'), + model_name="regionsnippet", + name="image", + field=models.ImageField(blank=True, null=True, upload_to="regions/%Y/%m/%d/", verbose_name="image"), ), migrations.AlterField( - model_name='situationreport', - name='document', - field=models.FileField(blank=True, null=True, upload_to=api.models.sitrep_document_path, verbose_name='document'), + model_name="situationreport", + name="document", + field=models.FileField(blank=True, null=True, upload_to=api.models.sitrep_document_path, verbose_name="document"), ), migrations.AlterField( - model_name='snippet', - name='image', - field=models.ImageField(blank=True, null=True, upload_to=api.models.snippet_image_path, verbose_name='image'), + model_name="snippet", + name="image", + field=models.ImageField(blank=True, null=True, upload_to=api.models.snippet_image_path, verbose_name="image"), ), ] diff --git a/api/migrations/0086_auto_20200916_0942.py b/api/migrations/0086_auto_20200916_0942.py index 16843cb5a..154b51da7 100644 --- a/api/migrations/0086_auto_20200916_0942.py +++ b/api/migrations/0086_auto_20200916_0942.py @@ -6,58 +6,58 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0085_auto_20200903_0843'), + ("api", "0085_auto_20200903_0843"), ] operations = [ migrations.AddField( - model_name='situationreporttype', - name='type_ar', - field=models.CharField(max_length=150, null=True, verbose_name='type'), + model_name="situationreporttype", + name="type_ar", + field=models.CharField(max_length=150, null=True, verbose_name="type"), ), migrations.AddField( - model_name='situationreporttype', - name='type_en', - field=models.CharField(max_length=150, null=True, verbose_name='type'), + model_name="situationreporttype", + name="type_en", + field=models.CharField(max_length=150, null=True, verbose_name="type"), ), migrations.AddField( - model_name='situationreporttype', - name='type_es', - field=models.CharField(max_length=150, null=True, verbose_name='type'), + model_name="situationreporttype", + name="type_es", + field=models.CharField(max_length=150, null=True, verbose_name="type"), ), migrations.AddField( - model_name='situationreporttype', - name='type_fr', - field=models.CharField(max_length=150, null=True, verbose_name='type'), + model_name="situationreporttype", + name="type_fr", + field=models.CharField(max_length=150, null=True, verbose_name="type"), ), migrations.AlterField( - model_name='action', - name='name', - field=models.CharField(max_length=400, verbose_name='name'), + model_name="action", + name="name", + field=models.CharField(max_length=400, verbose_name="name"), ), migrations.AlterField( - model_name='action', - name='name_ar', - field=models.CharField(max_length=400, null=True, verbose_name='name'), + model_name="action", + name="name_ar", + field=models.CharField(max_length=400, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='action', - name='name_en', - field=models.CharField(max_length=400, null=True, verbose_name='name'), + model_name="action", + name="name_en", + field=models.CharField(max_length=400, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='action', - name='name_es', - field=models.CharField(max_length=400, null=True, verbose_name='name'), + model_name="action", + name="name_es", + field=models.CharField(max_length=400, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='action', - name='name_fr', - field=models.CharField(max_length=400, null=True, verbose_name='name'), + model_name="action", + name="name_fr", + field=models.CharField(max_length=400, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='situationreporttype', - name='type', - field=models.CharField(max_length=150, verbose_name='type'), + model_name="situationreporttype", + name="type", + field=models.CharField(max_length=150, verbose_name="type"), ), ] diff --git a/api/migrations/0087_auto_20200918_0922.py b/api/migrations/0087_auto_20200918_0922.py index 609987bab..dddb8afbe 100644 --- a/api/migrations/0087_auto_20200918_0922.py +++ b/api/migrations/0087_auto_20200918_0922.py @@ -6,33 +6,33 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0086_auto_20200916_0942'), + ("api", "0086_auto_20200916_0942"), ] operations = [ migrations.AddField( - model_name='region', - name='label_ar', - field=models.CharField(blank=True, max_length=250, null=True, verbose_name='name of the region'), + model_name="region", + name="label_ar", + field=models.CharField(blank=True, max_length=250, null=True, verbose_name="name of the region"), ), migrations.AddField( - model_name='region', - name='label_en', - field=models.CharField(blank=True, max_length=250, null=True, verbose_name='name of the region'), + model_name="region", + name="label_en", + field=models.CharField(blank=True, max_length=250, null=True, verbose_name="name of the region"), ), migrations.AddField( - model_name='region', - name='label_es', - field=models.CharField(blank=True, max_length=250, null=True, verbose_name='name of the region'), + model_name="region", + name="label_es", + field=models.CharField(blank=True, max_length=250, null=True, verbose_name="name of the region"), ), migrations.AddField( - model_name='region', - name='label_fr', - field=models.CharField(blank=True, max_length=250, null=True, verbose_name='name of the region'), + model_name="region", + name="label_fr", + field=models.CharField(blank=True, max_length=250, null=True, verbose_name="name of the region"), ), migrations.AlterField( - model_name='region', - name='label', - field=models.CharField(blank=True, max_length=250, verbose_name='name of the region'), + model_name="region", + name="label", + field=models.CharField(blank=True, max_length=250, verbose_name="name of the region"), ), ] diff --git a/api/migrations/0088_auto_20201105_0943.py b/api/migrations/0088_auto_20201105_0943.py index a44b3e4fc..8d61bcccd 100644 --- a/api/migrations/0088_auto_20201105_0943.py +++ b/api/migrations/0088_auto_20201105_0943.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0087_auto_20200918_0922'), + ("api", "0087_auto_20200918_0922"), ] operations = [ migrations.AddField( - model_name='country', - name='fdrs', - field=models.CharField(max_length=6, null=True, verbose_name='FDRS'), + model_name="country", + name="fdrs", + field=models.CharField(max_length=6, null=True, verbose_name="FDRS"), ), migrations.AlterField( - model_name='event', - name='num_displaced', - field=models.IntegerField(blank=True, null=True, verbose_name='number of displaced'), + model_name="event", + name="num_displaced", + field=models.IntegerField(blank=True, null=True, verbose_name="number of displaced"), ), ] diff --git a/api/migrations/0088_auto_20201118_1144.py b/api/migrations/0088_auto_20201118_1144.py index 4577b471d..767abfcaf 100644 --- a/api/migrations/0088_auto_20201118_1144.py +++ b/api/migrations/0088_auto_20201118_1144.py @@ -1,37 +1,55 @@ # Generated by Django 2.2.13 on 2020-11-18 11:44 import django.contrib.gis.db.models.fields -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0087_auto_20200918_0922'), + ("api", "0087_auto_20200918_0922"), ] operations = [ migrations.CreateModel( - name='CountryGeoms', + name="CountryGeoms", fields=[ - ('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)), - ('country', models.OneToOneField(on_delete=django.db.models.deletion.DO_NOTHING, primary_key=True, serialize=False, to='api.Country', verbose_name='country')), + ("geom", django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)), + ( + "country", + models.OneToOneField( + on_delete=django.db.models.deletion.DO_NOTHING, + primary_key=True, + serialize=False, + to="api.Country", + verbose_name="country", + ), + ), ], ), migrations.CreateModel( - name='DistrictGeoms', + name="DistrictGeoms", fields=[ - ('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)), - ('district', models.OneToOneField(on_delete=django.db.models.deletion.DO_NOTHING, primary_key=True, serialize=False, to='api.District', verbose_name='district')), + ("geom", django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)), + ( + "district", + models.OneToOneField( + on_delete=django.db.models.deletion.DO_NOTHING, + primary_key=True, + serialize=False, + to="api.District", + verbose_name="district", + ), + ), ], ), migrations.RemoveField( - model_name='country', - name='geom', + model_name="country", + name="geom", ), migrations.RemoveField( - model_name='district', - name='geom', - ) + model_name="district", + name="geom", + ), ] diff --git a/api/migrations/0088_auto_20201119_0809.py b/api/migrations/0088_auto_20201119_0809.py index 87dd88f79..3e0c2ec2e 100644 --- a/api/migrations/0088_auto_20201119_0809.py +++ b/api/migrations/0088_auto_20201119_0809.py @@ -1,101 +1,140 @@ # Generated by Django 2.2.13 on 2020-11-19 08:09 -import api.models -from django.db import migrations, models import django.db.models.deletion import tinymce.models +from django.db import migrations, models + +import api.models class Migration(migrations.Migration): dependencies = [ - ('api', '0087_auto_20200918_0922'), + ("api", "0087_auto_20200918_0922"), ] operations = [ migrations.AddField( - model_name='country', - name='additional_tab_name', - field=models.CharField(blank=True, max_length=100, verbose_name='Label for Extra Tab'), + model_name="country", + name="additional_tab_name", + field=models.CharField(blank=True, max_length=100, verbose_name="Label for Extra Tab"), ), migrations.AddField( - model_name='region', - name='additional_tab_name', - field=models.CharField(blank=True, max_length=100, verbose_name='Label for Additional Tab'), + model_name="region", + name="additional_tab_name", + field=models.CharField(blank=True, max_length=100, verbose_name="Label for Additional Tab"), ), migrations.AlterField( - model_name='event', - name='num_displaced', - field=models.IntegerField(blank=True, null=True, verbose_name='number of displaced'), + model_name="event", + name="num_displaced", + field=models.IntegerField(blank=True, null=True, verbose_name="number of displaced"), ), migrations.CreateModel( - name='RegionProfileSnippet', + name="RegionProfileSnippet", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(blank=True, max_length=255)), - ('snippet', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_en', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_es', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_fr', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_ar', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('visibility', models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name='visibility')), - ('position', models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name='position')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='profile_snippets', to='api.Region', verbose_name='region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(blank=True, max_length=255)), + ("snippet", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_en", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_es", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_fr", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_ar", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ( + "visibility", + models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), + ), + ("position", models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name="position")), + ( + "region", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="profile_snippets", + to="api.Region", + verbose_name="region", + ), + ), ], options={ - 'verbose_name': 'region profile snippet', - 'verbose_name_plural': 'region profile snippets', - 'ordering': ('position', 'id'), + "verbose_name": "region profile snippet", + "verbose_name_plural": "region profile snippets", + "ordering": ("position", "id"), }, ), migrations.CreateModel( - name='RegionPreparednessSnippet', + name="RegionPreparednessSnippet", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(blank=True, max_length=255)), - ('snippet', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_en', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_es', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_fr', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_ar', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('visibility', models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name='visibility')), - ('position', models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name='position')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='preparedness_snippets', to='api.Region', verbose_name='region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(blank=True, max_length=255)), + ("snippet", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_en", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_es", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_fr", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_ar", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ( + "visibility", + models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), + ), + ("position", models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name="position")), + ( + "region", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="preparedness_snippets", + to="api.Region", + verbose_name="region", + ), + ), ], options={ - 'verbose_name': 'region preparedness snippet', - 'verbose_name_plural': 'region preparedness snippets', - 'ordering': ('position', 'id'), + "verbose_name": "region preparedness snippet", + "verbose_name_plural": "region preparedness snippets", + "ordering": ("position", "id"), }, ), migrations.CreateModel( - name='RegionEmergencySnippet', + name="RegionEmergencySnippet", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(blank=True, max_length=255)), - ('snippet', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_en', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_es', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_fr', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('snippet_ar', tinymce.models.HTMLField(blank=True, null=True, verbose_name='snippet')), - ('visibility', models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name='visibility')), - ('position', models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name='position')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='emergency_snippets', to='api.Region', verbose_name='region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(blank=True, max_length=255)), + ("snippet", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_en", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_es", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_fr", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ("snippet_ar", tinymce.models.HTMLField(blank=True, null=True, verbose_name="snippet")), + ( + "visibility", + models.IntegerField(default=3, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), + ), + ("position", models.IntegerField(default=3, choices=api.models.PositionType.choices, verbose_name="position")), + ( + "region", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="emergency_snippets", + to="api.Region", + verbose_name="region", + ), + ), ], options={ - 'verbose_name': 'region emergencies snippet', - 'verbose_name_plural': 'region emergencies snippets', - 'ordering': ('position', 'id'), + "verbose_name": "region emergencies snippet", + "verbose_name_plural": "region emergencies snippets", + "ordering": ("position", "id"), }, ), migrations.CreateModel( - name='RegionAdditionalLink', + name="RegionAdditionalLink", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255)), - ('url', models.URLField()), - ('show_in_go', models.BooleanField(default=False, help_text='Show link contents within GO')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='additional_links', to='api.Region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255)), + ("url", models.URLField()), + ("show_in_go", models.BooleanField(default=False, help_text="Show link contents within GO")), + ( + "region", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="additional_links", to="api.Region" + ), + ), ], ), ] diff --git a/api/migrations/0089_auto_20201119_0818.py b/api/migrations/0089_auto_20201119_0818.py index b220bf4fa..0387dd9d4 100644 --- a/api/migrations/0089_auto_20201119_0818.py +++ b/api/migrations/0089_auto_20201119_0818.py @@ -6,68 +6,68 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0088_auto_20201119_0809'), + ("api", "0088_auto_20201119_0809"), ] operations = [ migrations.AddField( - model_name='regionemergencysnippet', - name='title_ar', + model_name="regionemergencysnippet", + name="title_ar", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionemergencysnippet', - name='title_en', + model_name="regionemergencysnippet", + name="title_en", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionemergencysnippet', - name='title_es', + model_name="regionemergencysnippet", + name="title_es", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionemergencysnippet', - name='title_fr', + model_name="regionemergencysnippet", + name="title_fr", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionpreparednesssnippet', - name='title_ar', + model_name="regionpreparednesssnippet", + name="title_ar", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionpreparednesssnippet', - name='title_en', + model_name="regionpreparednesssnippet", + name="title_en", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionpreparednesssnippet', - name='title_es', + model_name="regionpreparednesssnippet", + name="title_es", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionpreparednesssnippet', - name='title_fr', + model_name="regionpreparednesssnippet", + name="title_fr", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionprofilesnippet', - name='title_ar', + model_name="regionprofilesnippet", + name="title_ar", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionprofilesnippet', - name='title_en', + model_name="regionprofilesnippet", + name="title_en", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionprofilesnippet', - name='title_es', + model_name="regionprofilesnippet", + name="title_es", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='regionprofilesnippet', - name='title_fr', + model_name="regionprofilesnippet", + name="title_fr", field=models.CharField(blank=True, max_length=255, null=True), ), ] diff --git a/api/migrations/0090_auto_20201120_1045.py b/api/migrations/0090_auto_20201120_1045.py index b98ada9f1..0025fff6f 100644 --- a/api/migrations/0090_auto_20201120_1045.py +++ b/api/migrations/0090_auto_20201120_1045.py @@ -6,16 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0089_auto_20201119_0818'), + ("api", "0089_auto_20201119_0818"), ] operations = [ migrations.AddField( - model_name='regionlink', - name='show_in_go', - field=models.BooleanField(default=False, help_text='Show link contents within GO'), + model_name="regionlink", + name="show_in_go", + field=models.BooleanField(default=False, help_text="Show link contents within GO"), ), migrations.DeleteModel( - name='RegionAdditionalLink', + name="RegionAdditionalLink", ), ] diff --git a/api/migrations/0091_auto_20201120_1118.py b/api/migrations/0091_auto_20201120_1118.py index 6de93de02..6abdcff78 100644 --- a/api/migrations/0091_auto_20201120_1118.py +++ b/api/migrations/0091_auto_20201120_1118.py @@ -6,113 +6,113 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0090_auto_20201120_1045'), + ("api", "0090_auto_20201120_1045"), ] operations = [ migrations.AddField( - model_name='country', - name='nsi_annual_fdrs_reporting', - field=models.CharField(blank=True, max_length=16, verbose_name='Annual Reporting to FDRS'), + model_name="country", + name="nsi_annual_fdrs_reporting", + field=models.CharField(blank=True, max_length=16, verbose_name="Annual Reporting to FDRS"), ), migrations.AddField( - model_name='country', - name='nsi_branches', - field=models.CharField(blank=True, max_length=16, verbose_name='Branches'), + model_name="country", + name="nsi_branches", + field=models.CharField(blank=True, max_length=16, verbose_name="Branches"), ), migrations.AddField( - model_name='country', - name='nsi_cmc_dashboard_compliance', - field=models.CharField(blank=True, max_length=16, verbose_name='Complying with CMC Dashboard'), + model_name="country", + name="nsi_cmc_dashboard_compliance", + field=models.CharField(blank=True, max_length=16, verbose_name="Complying with CMC Dashboard"), ), migrations.AddField( - model_name='country', - name='nsi_domestically_generated_income', - field=models.CharField(blank=True, max_length=16, verbose_name='>50% Domestically Generated Income'), + model_name="country", + name="nsi_domestically_generated_income", + field=models.CharField(blank=True, max_length=16, verbose_name=">50% Domestically Generated Income"), ), migrations.AddField( - model_name='country', - name='nsi_expenditures', - field=models.CharField(blank=True, max_length=16, verbose_name='Expenditures (CHF)'), + model_name="country", + name="nsi_expenditures", + field=models.CharField(blank=True, max_length=16, verbose_name="Expenditures (CHF)"), ), migrations.AddField( - model_name='country', - name='nsi_gov_financial_support', - field=models.CharField(blank=True, max_length=16, verbose_name='Gov Financial Support'), + model_name="country", + name="nsi_gov_financial_support", + field=models.CharField(blank=True, max_length=16, verbose_name="Gov Financial Support"), ), migrations.AddField( - model_name='country', - name='nsi_income', - field=models.CharField(blank=True, max_length=16, verbose_name='Income (CHF)'), + model_name="country", + name="nsi_income", + field=models.CharField(blank=True, max_length=16, verbose_name="Income (CHF)"), ), migrations.AddField( - model_name='country', - name='nsi_policy_implementation', - field=models.CharField(blank=True, max_length=16, verbose_name='Your Policy / Programme Implementation'), + model_name="country", + name="nsi_policy_implementation", + field=models.CharField(blank=True, max_length=16, verbose_name="Your Policy / Programme Implementation"), ), migrations.AddField( - model_name='country', - name='nsi_risk_management_framework', - field=models.CharField(blank=True, max_length=16, verbose_name='Risk Management Framework'), + model_name="country", + name="nsi_risk_management_framework", + field=models.CharField(blank=True, max_length=16, verbose_name="Risk Management Framework"), ), migrations.AddField( - model_name='country', - name='nsi_staff', - field=models.CharField(blank=True, max_length=16, verbose_name='Staff'), + model_name="country", + name="nsi_staff", + field=models.CharField(blank=True, max_length=16, verbose_name="Staff"), ), migrations.AddField( - model_name='country', - name='nsi_trained_in_first_aid', - field=models.CharField(blank=True, max_length=16, verbose_name='Trained in First Aid'), + model_name="country", + name="nsi_trained_in_first_aid", + field=models.CharField(blank=True, max_length=16, verbose_name="Trained in First Aid"), ), migrations.AddField( - model_name='country', - name='nsi_volunteers', - field=models.CharField(blank=True, max_length=16, verbose_name='Volunteers'), + model_name="country", + name="nsi_volunteers", + field=models.CharField(blank=True, max_length=16, verbose_name="Volunteers"), ), migrations.AddField( - model_name='country', - name='nsi_youth', - field=models.CharField(blank=True, max_length=16, verbose_name='Youth - 6-19 Yrs'), + model_name="country", + name="nsi_youth", + field=models.CharField(blank=True, max_length=16, verbose_name="Youth - 6-19 Yrs"), ), migrations.AddField( - model_name='country', - name='wash_kit10', - field=models.IntegerField(null=True, verbose_name='WASH Kit10'), + model_name="country", + name="wash_kit10", + field=models.IntegerField(null=True, verbose_name="WASH Kit10"), ), migrations.AddField( - model_name='country', - name='wash_kit2', - field=models.IntegerField(null=True, verbose_name='WASH Kit2'), + model_name="country", + name="wash_kit2", + field=models.IntegerField(null=True, verbose_name="WASH Kit2"), ), migrations.AddField( - model_name='country', - name='wash_kit5', - field=models.IntegerField(null=True, verbose_name='WASH Kit5'), + model_name="country", + name="wash_kit5", + field=models.IntegerField(null=True, verbose_name="WASH Kit5"), ), migrations.AddField( - model_name='country', - name='wash_ndrt_trained', - field=models.IntegerField(null=True, verbose_name='NDRT Trained'), + model_name="country", + name="wash_ndrt_trained", + field=models.IntegerField(null=True, verbose_name="NDRT Trained"), ), migrations.AddField( - model_name='country', - name='wash_rdrt_trained', - field=models.IntegerField(null=True, verbose_name='RDRT Trained'), + model_name="country", + name="wash_rdrt_trained", + field=models.IntegerField(null=True, verbose_name="RDRT Trained"), ), migrations.AddField( - model_name='country', - name='wash_staff_at_branch', - field=models.IntegerField(null=True, verbose_name='WASH Staff at Branch'), + model_name="country", + name="wash_staff_at_branch", + field=models.IntegerField(null=True, verbose_name="WASH Staff at Branch"), ), migrations.AddField( - model_name='country', - name='wash_staff_at_hq', - field=models.IntegerField(null=True, verbose_name='WASH Staff at HQ'), + model_name="country", + name="wash_staff_at_hq", + field=models.IntegerField(null=True, verbose_name="WASH Staff at HQ"), ), migrations.AddField( - model_name='country', - name='wash_total_staff', - field=models.IntegerField(null=True, verbose_name='Total WASH Staff'), + model_name="country", + name="wash_total_staff", + field=models.IntegerField(null=True, verbose_name="Total WASH Staff"), ), ] diff --git a/api/migrations/0092_auto_20201123_1025.py b/api/migrations/0092_auto_20201123_1025.py index 20a56dfac..003ec2e6d 100644 --- a/api/migrations/0092_auto_20201123_1025.py +++ b/api/migrations/0092_auto_20201123_1025.py @@ -6,60 +6,60 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0091_auto_20201120_1118'), + ("api", "0091_auto_20201120_1118"), ] operations = [ migrations.RemoveField( - model_name='country', - name='nsi_annual_fdrs_reporting', + model_name="country", + name="nsi_annual_fdrs_reporting", ), migrations.RemoveField( - model_name='country', - name='nsi_branches', + model_name="country", + name="nsi_branches", ), migrations.RemoveField( - model_name='country', - name='nsi_cmc_dashboard_compliance', + model_name="country", + name="nsi_cmc_dashboard_compliance", ), migrations.RemoveField( - model_name='country', - name='nsi_domestically_generated_income', + model_name="country", + name="nsi_domestically_generated_income", ), migrations.RemoveField( - model_name='country', - name='nsi_expenditures', + model_name="country", + name="nsi_expenditures", ), migrations.RemoveField( - model_name='country', - name='nsi_gov_financial_support', + model_name="country", + name="nsi_gov_financial_support", ), migrations.RemoveField( - model_name='country', - name='nsi_income', + model_name="country", + name="nsi_income", ), migrations.RemoveField( - model_name='country', - name='nsi_policy_implementation', + model_name="country", + name="nsi_policy_implementation", ), migrations.RemoveField( - model_name='country', - name='nsi_risk_management_framework', + model_name="country", + name="nsi_risk_management_framework", ), migrations.RemoveField( - model_name='country', - name='nsi_staff', + model_name="country", + name="nsi_staff", ), migrations.RemoveField( - model_name='country', - name='nsi_trained_in_first_aid', + model_name="country", + name="nsi_trained_in_first_aid", ), migrations.RemoveField( - model_name='country', - name='nsi_volunteers', + model_name="country", + name="nsi_volunteers", ), migrations.RemoveField( - model_name='country', - name='nsi_youth', + model_name="country", + name="nsi_youth", ), ] diff --git a/api/migrations/0093_auto_20201123_1026.py b/api/migrations/0093_auto_20201123_1026.py index 3c068c097..9b40a05c8 100644 --- a/api/migrations/0093_auto_20201123_1026.py +++ b/api/migrations/0093_auto_20201123_1026.py @@ -6,73 +6,73 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0092_auto_20201123_1025'), + ("api", "0092_auto_20201123_1025"), ] operations = [ migrations.AddField( - model_name='country', - name='nsi_annual_fdrs_reporting', - field=models.BooleanField(verbose_name='Annual Reporting to FDRS'), + model_name="country", + name="nsi_annual_fdrs_reporting", + field=models.BooleanField(verbose_name="Annual Reporting to FDRS"), ), migrations.AddField( - model_name='country', - name='nsi_branches', - field=models.IntegerField(blank=True, null=True, verbose_name='Branches'), + model_name="country", + name="nsi_branches", + field=models.IntegerField(blank=True, null=True, verbose_name="Branches"), ), migrations.AddField( - model_name='country', - name='nsi_cmc_dashboard_compliance', - field=models.BooleanField(verbose_name='Complying with CMC Dashboard'), + model_name="country", + name="nsi_cmc_dashboard_compliance", + field=models.BooleanField(verbose_name="Complying with CMC Dashboard"), ), migrations.AddField( - model_name='country', - name='nsi_domestically_generated_income', - field=models.BooleanField(verbose_name='>50% Domestically Generated Income'), + model_name="country", + name="nsi_domestically_generated_income", + field=models.BooleanField(verbose_name=">50% Domestically Generated Income"), ), migrations.AddField( - model_name='country', - name='nsi_expenditures', - field=models.IntegerField(blank=True, null=True, verbose_name='Expenditures (CHF)'), + model_name="country", + name="nsi_expenditures", + field=models.IntegerField(blank=True, null=True, verbose_name="Expenditures (CHF)"), ), migrations.AddField( - model_name='country', - name='nsi_gov_financial_support', - field=models.BooleanField(verbose_name='Gov Financial Support'), + model_name="country", + name="nsi_gov_financial_support", + field=models.BooleanField(verbose_name="Gov Financial Support"), ), migrations.AddField( - model_name='country', - name='nsi_income', - field=models.IntegerField(blank=True, null=True, verbose_name='Income (CHF)'), + model_name="country", + name="nsi_income", + field=models.IntegerField(blank=True, null=True, verbose_name="Income (CHF)"), ), migrations.AddField( - model_name='country', - name='nsi_policy_implementation', - field=models.BooleanField(verbose_name='Your Policy / Programme Implementation'), + model_name="country", + name="nsi_policy_implementation", + field=models.BooleanField(verbose_name="Your Policy / Programme Implementation"), ), migrations.AddField( - model_name='country', - name='nsi_risk_management_framework', - field=models.BooleanField(verbose_name='Risk Management Framework'), + model_name="country", + name="nsi_risk_management_framework", + field=models.BooleanField(verbose_name="Risk Management Framework"), ), migrations.AddField( - model_name='country', - name='nsi_staff', - field=models.IntegerField(blank=True, null=True, verbose_name='Staff'), + model_name="country", + name="nsi_staff", + field=models.IntegerField(blank=True, null=True, verbose_name="Staff"), ), migrations.AddField( - model_name='country', - name='nsi_trained_in_first_aid', - field=models.IntegerField(blank=True, null=True, verbose_name='Trained in First Aid'), + model_name="country", + name="nsi_trained_in_first_aid", + field=models.IntegerField(blank=True, null=True, verbose_name="Trained in First Aid"), ), migrations.AddField( - model_name='country', - name='nsi_volunteers', - field=models.IntegerField(blank=True, null=True, verbose_name='Volunteers'), + model_name="country", + name="nsi_volunteers", + field=models.IntegerField(blank=True, null=True, verbose_name="Volunteers"), ), migrations.AddField( - model_name='country', - name='nsi_youth', - field=models.IntegerField(blank=True, null=True, verbose_name='Youth - 6-19 Yrs'), + model_name="country", + name="nsi_youth", + field=models.IntegerField(blank=True, null=True, verbose_name="Youth - 6-19 Yrs"), ), ] diff --git a/api/migrations/0094_merge_20201123_1340.py b/api/migrations/0094_merge_20201123_1340.py index dc86c0b13..581013f03 100644 --- a/api/migrations/0094_merge_20201123_1340.py +++ b/api/migrations/0094_merge_20201123_1340.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0088_auto_20201105_0943'), - ('api', '0093_auto_20201123_1026'), + ("api", "0088_auto_20201105_0943"), + ("api", "0093_auto_20201123_1026"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0095_auto_20201124_0813.py b/api/migrations/0095_auto_20201124_0813.py index 12ab37a83..2be065028 100644 --- a/api/migrations/0095_auto_20201124_0813.py +++ b/api/migrations/0095_auto_20201124_0813.py @@ -6,20 +6,20 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0094_merge_20201123_1340'), + ("api", "0094_merge_20201123_1340"), ] operations = [ migrations.RemoveField( - model_name='regionemergencysnippet', - name='visibility', + model_name="regionemergencysnippet", + name="visibility", ), migrations.RemoveField( - model_name='regionpreparednesssnippet', - name='visibility', + model_name="regionpreparednesssnippet", + name="visibility", ), migrations.RemoveField( - model_name='regionprofilesnippet', - name='visibility', + model_name="regionprofilesnippet", + name="visibility", ), ] diff --git a/api/migrations/0096_auto_20201124_0855.py b/api/migrations/0096_auto_20201124_0855.py index 7b8483213..d509b2dcc 100644 --- a/api/migrations/0096_auto_20201124_0855.py +++ b/api/migrations/0096_auto_20201124_0855.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0095_auto_20201124_0813'), + ("api", "0095_auto_20201124_0813"), ] operations = [ migrations.AddField( - model_name='region', - name='additional_tab_name_ar', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Additional Tab'), + model_name="region", + name="additional_tab_name_ar", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Additional Tab"), ), migrations.AddField( - model_name='region', - name='additional_tab_name_en', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Additional Tab'), + model_name="region", + name="additional_tab_name_en", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Additional Tab"), ), migrations.AddField( - model_name='region', - name='additional_tab_name_es', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Additional Tab'), + model_name="region", + name="additional_tab_name_es", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Additional Tab"), ), migrations.AddField( - model_name='region', - name='additional_tab_name_fr', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Additional Tab'), + model_name="region", + name="additional_tab_name_fr", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Additional Tab"), ), ] diff --git a/api/migrations/0097_auto_20201124_0856.py b/api/migrations/0097_auto_20201124_0856.py index 4dd95dbed..70e3e854d 100644 --- a/api/migrations/0097_auto_20201124_0856.py +++ b/api/migrations/0097_auto_20201124_0856.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0096_auto_20201124_0855'), + ("api", "0096_auto_20201124_0855"), ] operations = [ migrations.AddField( - model_name='country', - name='additional_tab_name_ar', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Extra Tab'), + model_name="country", + name="additional_tab_name_ar", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Extra Tab"), ), migrations.AddField( - model_name='country', - name='additional_tab_name_en', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Extra Tab'), + model_name="country", + name="additional_tab_name_en", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Extra Tab"), ), migrations.AddField( - model_name='country', - name='additional_tab_name_es', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Extra Tab'), + model_name="country", + name="additional_tab_name_es", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Extra Tab"), ), migrations.AddField( - model_name='country', - name='additional_tab_name_fr', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Extra Tab'), + model_name="country", + name="additional_tab_name_fr", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Extra Tab"), ), ] diff --git a/api/migrations/0098_auto_20201125_1156.py b/api/migrations/0098_auto_20201125_1156.py index 7f565fb0c..6b088e864 100644 --- a/api/migrations/0098_auto_20201125_1156.py +++ b/api/migrations/0098_auto_20201125_1156.py @@ -6,48 +6,48 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0097_auto_20201124_0856'), + ("api", "0097_auto_20201124_0856"), ] operations = [ migrations.AlterField( - model_name='country', - name='wash_kit10', - field=models.IntegerField(blank=True, null=True, verbose_name='WASH Kit10'), + model_name="country", + name="wash_kit10", + field=models.IntegerField(blank=True, null=True, verbose_name="WASH Kit10"), ), migrations.AlterField( - model_name='country', - name='wash_kit2', - field=models.IntegerField(blank=True, null=True, verbose_name='WASH Kit2'), + model_name="country", + name="wash_kit2", + field=models.IntegerField(blank=True, null=True, verbose_name="WASH Kit2"), ), migrations.AlterField( - model_name='country', - name='wash_kit5', - field=models.IntegerField(blank=True, null=True, verbose_name='WASH Kit5'), + model_name="country", + name="wash_kit5", + field=models.IntegerField(blank=True, null=True, verbose_name="WASH Kit5"), ), migrations.AlterField( - model_name='country', - name='wash_ndrt_trained', - field=models.IntegerField(blank=True, null=True, verbose_name='NDRT Trained'), + model_name="country", + name="wash_ndrt_trained", + field=models.IntegerField(blank=True, null=True, verbose_name="NDRT Trained"), ), migrations.AlterField( - model_name='country', - name='wash_rdrt_trained', - field=models.IntegerField(blank=True, null=True, verbose_name='RDRT Trained'), + model_name="country", + name="wash_rdrt_trained", + field=models.IntegerField(blank=True, null=True, verbose_name="RDRT Trained"), ), migrations.AlterField( - model_name='country', - name='wash_staff_at_branch', - field=models.IntegerField(blank=True, null=True, verbose_name='WASH Staff at Branch'), + model_name="country", + name="wash_staff_at_branch", + field=models.IntegerField(blank=True, null=True, verbose_name="WASH Staff at Branch"), ), migrations.AlterField( - model_name='country', - name='wash_staff_at_hq', - field=models.IntegerField(blank=True, null=True, verbose_name='WASH Staff at HQ'), + model_name="country", + name="wash_staff_at_hq", + field=models.IntegerField(blank=True, null=True, verbose_name="WASH Staff at HQ"), ), migrations.AlterField( - model_name='country', - name='wash_total_staff', - field=models.IntegerField(blank=True, null=True, verbose_name='Total WASH Staff'), + model_name="country", + name="wash_total_staff", + field=models.IntegerField(blank=True, null=True, verbose_name="Total WASH Staff"), ), ] diff --git a/api/migrations/0099_auto_20201127_1048.py b/api/migrations/0099_auto_20201127_1048.py index c628516a7..afc8b4a7c 100644 --- a/api/migrations/0099_auto_20201127_1048.py +++ b/api/migrations/0099_auto_20201127_1048.py @@ -6,33 +6,33 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0098_auto_20201125_1156'), + ("api", "0098_auto_20201125_1156"), ] operations = [ migrations.AlterField( - model_name='country', - name='additional_tab_name', - field=models.CharField(blank=True, max_length=100, verbose_name='Label for Additional Tab'), + model_name="country", + name="additional_tab_name", + field=models.CharField(blank=True, max_length=100, verbose_name="Label for Additional Tab"), ), migrations.AlterField( - model_name='country', - name='additional_tab_name_ar', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Additional Tab'), + model_name="country", + name="additional_tab_name_ar", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Additional Tab"), ), migrations.AlterField( - model_name='country', - name='additional_tab_name_en', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Additional Tab'), + model_name="country", + name="additional_tab_name_en", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Additional Tab"), ), migrations.AlterField( - model_name='country', - name='additional_tab_name_es', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Additional Tab'), + model_name="country", + name="additional_tab_name_es", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Additional Tab"), ), migrations.AlterField( - model_name='country', - name='additional_tab_name_fr', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Label for Additional Tab'), + model_name="country", + name="additional_tab_name_fr", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Label for Additional Tab"), ), ] diff --git a/api/migrations/0100_auto_20201130_0954.py b/api/migrations/0100_auto_20201130_0954.py index c4aabe42a..d5fb09b27 100644 --- a/api/migrations/0100_auto_20201130_0954.py +++ b/api/migrations/0100_auto_20201130_0954.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0099_auto_20201127_1048'), + ("api", "0099_auto_20201127_1048"), ] operations = [ migrations.AlterField( - model_name='country', - name='fdrs', - field=models.CharField(blank=True, max_length=6, null=True, verbose_name='FDRS'), + model_name="country", + name="fdrs", + field=models.CharField(blank=True, max_length=6, null=True, verbose_name="FDRS"), ), ] diff --git a/api/migrations/0101_merge_20201210_0822.py b/api/migrations/0101_merge_20201210_0822.py index cd03454bd..9141e047b 100644 --- a/api/migrations/0101_merge_20201210_0822.py +++ b/api/migrations/0101_merge_20201210_0822.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0100_auto_20201130_0954'), - ('api', '0088_auto_20201118_1144'), + ("api", "0100_auto_20201130_0954"), + ("api", "0088_auto_20201118_1144"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0101_uppercase_iso.py b/api/migrations/0101_uppercase_iso.py index c91c2d6b2..7c20dbf10 100644 --- a/api/migrations/0101_uppercase_iso.py +++ b/api/migrations/0101_uppercase_iso.py @@ -1,18 +1,18 @@ -from django.db.models.functions import Upper from django.db import migrations, models +from django.db.models.functions import Upper def uppercase_iso(apps, schema_editor): - Country = apps.get_model('api', 'Country') - District = apps.get_model('api', 'District') + Country = apps.get_model("api", "Country") + District = apps.get_model("api", "District") - Country.objects.update(iso3=Upper('iso3'), iso=Upper('iso')) - District.objects.update(country_iso=Upper('country_iso')) + Country.objects.update(iso3=Upper("iso3"), iso=Upper("iso")) + District.objects.update(country_iso=Upper("country_iso")) class Migration(migrations.Migration): dependencies = [ - ('api', '0100_auto_20201130_0954'), + ("api", "0100_auto_20201130_0954"), ] operations = [ diff --git a/api/migrations/0102_auto_20201208_1314.py b/api/migrations/0102_auto_20201208_1314.py index 3e5c04cb0..3c33e35df 100644 --- a/api/migrations/0102_auto_20201208_1314.py +++ b/api/migrations/0102_auto_20201208_1314.py @@ -7,23 +7,38 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0101_uppercase_iso'), + ("api", "0101_uppercase_iso"), ] operations = [ migrations.AlterField( - model_name='country', - name='iso', - field=models.CharField(max_length=2, null=True, validators=[django.core.validators.RegexValidator('^[A-Z]*$', 'ISO must be uppercase')], verbose_name='ISO'), + model_name="country", + name="iso", + field=models.CharField( + max_length=2, + null=True, + validators=[django.core.validators.RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + verbose_name="ISO", + ), ), migrations.AlterField( - model_name='country', - name='iso3', - field=models.CharField(max_length=3, null=True, validators=[django.core.validators.RegexValidator('^[A-Z]*$', 'ISO must be uppercase')], verbose_name='ISO3'), + model_name="country", + name="iso3", + field=models.CharField( + max_length=3, + null=True, + validators=[django.core.validators.RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + verbose_name="ISO3", + ), ), migrations.AlterField( - model_name='district', - name='country_iso', - field=models.CharField(max_length=2, null=True, validators=[django.core.validators.RegexValidator('^[A-Z]*$', 'ISO must be uppercase')], verbose_name='country ISO2'), + model_name="district", + name="country_iso", + field=models.CharField( + max_length=2, + null=True, + validators=[django.core.validators.RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + verbose_name="country ISO2", + ), ), ] diff --git a/api/migrations/0103_merge_20201210_0900.py b/api/migrations/0103_merge_20201210_0900.py index 292a8fef9..14df4fd36 100644 --- a/api/migrations/0103_merge_20201210_0900.py +++ b/api/migrations/0103_merge_20201210_0900.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0101_merge_20201210_0822'), - ('api', '0102_auto_20201208_1314'), + ("api", "0101_merge_20201210_0822"), + ("api", "0102_auto_20201208_1314"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0104_auto_20201210_0910.py b/api/migrations/0104_auto_20201210_0910.py index cfc2e1ee7..772b53eed 100644 --- a/api/migrations/0104_auto_20201210_0910.py +++ b/api/migrations/0104_auto_20201210_0910.py @@ -7,18 +7,30 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0103_merge_20201210_0900'), + ("api", "0103_merge_20201210_0900"), ] operations = [ migrations.AlterField( - model_name='country', - name='iso', - field=models.CharField(blank=True, max_length=2, null=True, validators=[django.core.validators.RegexValidator('^[A-Z]*$', 'ISO must be uppercase')], verbose_name='ISO'), + model_name="country", + name="iso", + field=models.CharField( + blank=True, + max_length=2, + null=True, + validators=[django.core.validators.RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + verbose_name="ISO", + ), ), migrations.AlterField( - model_name='country', - name='iso3', - field=models.CharField(blank=True, max_length=3, null=True, validators=[django.core.validators.RegexValidator('^[A-Z]*$', 'ISO must be uppercase')], verbose_name='ISO3'), + model_name="country", + name="iso3", + field=models.CharField( + blank=True, + max_length=3, + null=True, + validators=[django.core.validators.RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + verbose_name="ISO3", + ), ), ] diff --git a/api/migrations/0105_auto_20201211_0758.py b/api/migrations/0105_auto_20201211_0758.py index c6222de88..b186cd8b4 100644 --- a/api/migrations/0105_auto_20201211_0758.py +++ b/api/migrations/0105_auto_20201211_0758.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0104_auto_20201210_0910'), + ("api", "0104_auto_20201210_0910"), ] operations = [ migrations.AddField( - model_name='event', - name='hide_field_report_map', - field=models.BooleanField(default=False, verbose_name='hide field report map'), + model_name="event", + name="hide_field_report_map", + field=models.BooleanField(default=False, verbose_name="hide field report map"), ), migrations.AlterField( - model_name='event', - name='hide_attached_field_reports', - field=models.BooleanField(default=False, verbose_name='hide field report numeric details'), + model_name="event", + name="hide_attached_field_reports", + field=models.BooleanField(default=False, verbose_name="hide field report numeric details"), ), ] diff --git a/api/migrations/0106_auto_20201214_0858.py b/api/migrations/0106_auto_20201214_0858.py index 22a9e8048..c441e3461 100644 --- a/api/migrations/0106_auto_20201214_0858.py +++ b/api/migrations/0106_auto_20201214_0858.py @@ -1,24 +1,31 @@ # Generated by Django 2.2.13 on 2020-12-14 08:58 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0105_auto_20201211_0758'), + ("api", "0105_auto_20201211_0758"), ] operations = [ migrations.AddField( - model_name='country', - name='disputed', - field=models.BooleanField(default=False, help_text='Is this country disputed?'), + model_name="country", + name="disputed", + field=models.BooleanField(default=False, help_text="Is this country disputed?"), ), migrations.AddField( - model_name='country', - name='sovereign_state', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='Country ID of the Sovereign State'), + model_name="country", + name="sovereign_state", + field=models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Country", + verbose_name="Country ID of the Sovereign State", + ), ), ] diff --git a/api/migrations/0106_auto_20210126_0820.py b/api/migrations/0106_auto_20210126_0820.py index f33c1428a..e4b7282c0 100644 --- a/api/migrations/0106_auto_20210126_0820.py +++ b/api/migrations/0106_auto_20210126_0820.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0105_auto_20201211_0758'), + ("api", "0105_auto_20201211_0758"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='epi_cases_since_last_fr', - field=models.IntegerField(blank=True, null=True, verbose_name='number of new cases since the last field report'), + model_name="fieldreport", + name="epi_cases_since_last_fr", + field=models.IntegerField(blank=True, null=True, verbose_name="number of new cases since the last field report"), ), migrations.AddField( - model_name='fieldreport', - name='epi_deaths_since_last_fr', - field=models.IntegerField(blank=True, null=True, verbose_name='number of new deaths since last field report'), + model_name="fieldreport", + name="epi_deaths_since_last_fr", + field=models.IntegerField(blank=True, null=True, verbose_name="number of new deaths since last field report"), ), ] diff --git a/api/migrations/0106_auto_20210219_0908.py b/api/migrations/0106_auto_20210219_0908.py index 06b27f655..b7ae0059e 100644 --- a/api/migrations/0106_auto_20210219_0908.py +++ b/api/migrations/0106_auto_20210219_0908.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0105_auto_20201211_0758'), + ("api", "0105_auto_20201211_0758"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='ns_request_assistance', - field=models.BooleanField(verbose_name='NS request assistance'), + model_name="fieldreport", + name="ns_request_assistance", + field=models.BooleanField(verbose_name="NS request assistance"), ), migrations.AlterField( - model_name='fieldreport', - name='request_assistance', - field=models.BooleanField(verbose_name='request assistance'), + model_name="fieldreport", + name="request_assistance", + field=models.BooleanField(verbose_name="request assistance"), ), ] diff --git a/api/migrations/0107_action_tooltip_text.py b/api/migrations/0107_action_tooltip_text.py index 96edeb0ae..7f4d56173 100644 --- a/api/migrations/0107_action_tooltip_text.py +++ b/api/migrations/0107_action_tooltip_text.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0106_auto_20210126_0820'), + ("api", "0106_auto_20210126_0820"), ] operations = [ migrations.AddField( - model_name='action', - name='tooltip_text', - field=models.TextField(blank='true', null=True, verbose_name='tooltip text'), + model_name="action", + name="tooltip_text", + field=models.TextField(blank="true", null=True, verbose_name="tooltip text"), ), ] diff --git a/api/migrations/0108_fieldreport_epi_notes_since_last_fr.py b/api/migrations/0108_fieldreport_epi_notes_since_last_fr.py index 0e7b6f9b2..7048b0d3f 100644 --- a/api/migrations/0108_fieldreport_epi_notes_since_last_fr.py +++ b/api/migrations/0108_fieldreport_epi_notes_since_last_fr.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0107_action_tooltip_text'), + ("api", "0107_action_tooltip_text"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='epi_notes_since_last_fr', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="fieldreport", + name="epi_notes_since_last_fr", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), ] diff --git a/api/migrations/0109_auto_20210201_0949.py b/api/migrations/0109_auto_20210201_0949.py index 6f5576efd..60436ce89 100644 --- a/api/migrations/0109_auto_20210201_0949.py +++ b/api/migrations/0109_auto_20210201_0949.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0108_fieldreport_epi_notes_since_last_fr'), + ("api", "0108_fieldreport_epi_notes_since_last_fr"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='notes_health', - field=models.TextField(blank=True, null=True, verbose_name=''), + model_name="fieldreport", + name="notes_health", + field=models.TextField(blank=True, null=True, verbose_name=""), ), migrations.AddField( - model_name='fieldreport', - name='notes_ns', - field=models.TextField(blank=True, null=True, verbose_name=''), + model_name="fieldreport", + name="notes_ns", + field=models.TextField(blank=True, null=True, verbose_name=""), ), ] diff --git a/api/migrations/0110_auto_20210202_0950.py b/api/migrations/0110_auto_20210202_0950.py index b8a070365..ec6b18d14 100644 --- a/api/migrations/0110_auto_20210202_0950.py +++ b/api/migrations/0110_auto_20210202_0950.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0109_auto_20210201_0949'), + ("api", "0109_auto_20210201_0949"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='notes_socioeco', - field=models.TextField(blank=True, null=True, verbose_name='Description (Socioeconomic Interventions)'), + model_name="fieldreport", + name="notes_socioeco", + field=models.TextField(blank=True, null=True, verbose_name="Description (Socioeconomic Interventions)"), ), migrations.AlterField( - model_name='fieldreport', - name='notes_health', - field=models.TextField(blank=True, null=True, verbose_name='Description (Health)'), + model_name="fieldreport", + name="notes_health", + field=models.TextField(blank=True, null=True, verbose_name="Description (Health)"), ), migrations.AlterField( - model_name='fieldreport', - name='notes_ns', - field=models.TextField(blank=True, null=True, verbose_name='Description (NS Institutional Strengthening)'), + model_name="fieldreport", + name="notes_ns", + field=models.TextField(blank=True, null=True, verbose_name="Description (NS Institutional Strengthening)"), ), ] diff --git a/api/migrations/0111_externalpartner_externalpartnercategory_fieldreportexternalpartner_fieldreportexternalpartnercategor.py b/api/migrations/0111_externalpartner_externalpartnercategory_fieldreportexternalpartner_fieldreportexternalpartnercategor.py index 67dfd815d..9c389828a 100644 --- a/api/migrations/0111_externalpartner_externalpartnercategory_fieldreportexternalpartner_fieldreportexternalpartnercategor.py +++ b/api/migrations/0111_externalpartner_externalpartnercategory_fieldreportexternalpartner_fieldreportexternalpartnercategor.py @@ -1,83 +1,118 @@ # Generated by Django 2.2.13 on 2021-02-02 18:11 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0110_auto_20210202_0950'), + ("api", "0110_auto_20210202_0950"), ] operations = [ migrations.CreateModel( - name='ExternalPartner', + name="ExternalPartner", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200, verbose_name='name')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=200, verbose_name="name")), ], options={ - 'verbose_name': 'external partner', - 'verbose_name_plural': 'external partners', + "verbose_name": "external partner", + "verbose_name_plural": "external partners", }, ), migrations.CreateModel( - name='ExternalPartnerCategory', + name="ExternalPartnerCategory", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200, verbose_name='name')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=200, verbose_name="name")), ], options={ - 'verbose_name': 'external partner category', - 'verbose_name_plural': 'external partner caregories', + "verbose_name": "external partner category", + "verbose_name_plural": "external partner caregories", }, ), migrations.CreateModel( - name='SupportedActivity', + name="SupportedActivity", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200, verbose_name='name')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=200, verbose_name="name")), ], options={ - 'verbose_name': 'supported activity', - 'verbose_name_plural': 'supported activities', + "verbose_name": "supported activity", + "verbose_name_plural": "supported activities", }, ), migrations.CreateModel( - name='FieldReportSupportedActivity', + name="FieldReportSupportedActivity", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('field_report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='supportedactivities', to='api.FieldReport', verbose_name='field report')), - ('supported_activities', models.ManyToManyField(blank=True, to='api.SupportedActivity', verbose_name='supported activities')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "field_report", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="supportedactivities", + to="api.FieldReport", + verbose_name="field report", + ), + ), + ( + "supported_activities", + models.ManyToManyField(blank=True, to="api.SupportedActivity", verbose_name="supported activities"), + ), ], options={ - 'verbose_name': 'field report supported activities', - 'verbose_name_plural': 'field report supported activities', + "verbose_name": "field report supported activities", + "verbose_name_plural": "field report supported activities", }, ), migrations.CreateModel( - name='FieldReportExternalPartnerCategory', + name="FieldReportExternalPartnerCategory", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('external_partner_categories', models.ManyToManyField(blank=True, to='api.ExternalPartnerCategory', verbose_name='external partner categories')), - ('field_report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='externalpartnercategories', to='api.FieldReport', verbose_name='field report')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "external_partner_categories", + models.ManyToManyField( + blank=True, to="api.ExternalPartnerCategory", verbose_name="external partner categories" + ), + ), + ( + "field_report", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="externalpartnercategories", + to="api.FieldReport", + verbose_name="field report", + ), + ), ], options={ - 'verbose_name': 'field report external partner categories', - 'verbose_name_plural': 'field report external partner categories', + "verbose_name": "field report external partner categories", + "verbose_name_plural": "field report external partner categories", }, ), migrations.CreateModel( - name='FieldReportExternalPartner', + name="FieldReportExternalPartner", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('external_partners', models.ManyToManyField(blank=True, to='api.ExternalPartner', verbose_name='external partners')), - ('field_report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='externalpartners', to='api.FieldReport', verbose_name='field report')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "external_partners", + models.ManyToManyField(blank=True, to="api.ExternalPartner", verbose_name="external partners"), + ), + ( + "field_report", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="externalpartners", + to="api.FieldReport", + verbose_name="field report", + ), + ), ], options={ - 'verbose_name': 'field report external partners', - 'verbose_name_plural': 'field report external partners', + "verbose_name": "field report external partners", + "verbose_name_plural": "field report external partners", }, ), ] diff --git a/api/migrations/0112_auto_20210202_1825.py b/api/migrations/0112_auto_20210202_1825.py index b194a91a3..46d3f494e 100644 --- a/api/migrations/0112_auto_20210202_1825.py +++ b/api/migrations/0112_auto_20210202_1825.py @@ -6,68 +6,68 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0111_externalpartner_externalpartnercategory_fieldreportexternalpartner_fieldreportexternalpartnercategor'), + ("api", "0111_externalpartner_externalpartnercategory_fieldreportexternalpartner_fieldreportexternalpartnercategor"), ] operations = [ migrations.AddField( - model_name='externalpartner', - name='name_ar', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="externalpartner", + name="name_ar", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='externalpartner', - name='name_en', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="externalpartner", + name="name_en", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='externalpartner', - name='name_es', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="externalpartner", + name="name_es", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='externalpartner', - name='name_fr', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="externalpartner", + name="name_fr", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='externalpartnercategory', - name='name_ar', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="externalpartnercategory", + name="name_ar", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='externalpartnercategory', - name='name_en', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="externalpartnercategory", + name="name_en", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='externalpartnercategory', - name='name_es', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="externalpartnercategory", + name="name_es", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='externalpartnercategory', - name='name_fr', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="externalpartnercategory", + name="name_fr", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='supportedactivity', - name='name_ar', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="supportedactivity", + name="name_ar", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='supportedactivity', - name='name_en', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="supportedactivity", + name="name_en", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='supportedactivity', - name='name_es', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="supportedactivity", + name="name_es", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='supportedactivity', - name='name_fr', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="supportedactivity", + name="name_fr", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), ] diff --git a/api/migrations/0113_auto_20210204_1021.py b/api/migrations/0113_auto_20210204_1021.py index 8a887f009..ae1d569f7 100644 --- a/api/migrations/0113_auto_20210204_1021.py +++ b/api/migrations/0113_auto_20210204_1021.py @@ -1,29 +1,44 @@ # Generated by Django 2.2.13 on 2021-02-04 10:21 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0112_auto_20210202_1825'), + ("api", "0112_auto_20210202_1825"), ] operations = [ migrations.AlterField( - model_name='fieldreportexternalpartner', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='external_partners', to='api.FieldReport', verbose_name='field report'), + model_name="fieldreportexternalpartner", + name="field_report", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="external_partners", + to="api.FieldReport", + verbose_name="field report", + ), ), migrations.AlterField( - model_name='fieldreportexternalpartnercategory', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='external_partner_categories', to='api.FieldReport', verbose_name='field report'), + model_name="fieldreportexternalpartnercategory", + name="field_report", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="external_partner_categories", + to="api.FieldReport", + verbose_name="field report", + ), ), migrations.AlterField( - model_name='fieldreportsupportedactivity', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='supported_activities', to='api.FieldReport', verbose_name='field report'), + model_name="fieldreportsupportedactivity", + name="field_report", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="supported_activities", + to="api.FieldReport", + verbose_name="field report", + ), ), ] diff --git a/api/migrations/0114_auto_20210204_1203.py b/api/migrations/0114_auto_20210204_1203.py index d6f2d3cde..2757613cd 100644 --- a/api/migrations/0114_auto_20210204_1203.py +++ b/api/migrations/0114_auto_20210204_1203.py @@ -6,48 +6,50 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0113_auto_20210204_1021'), + ("api", "0113_auto_20210204_1021"), ] operations = [ migrations.RemoveField( - model_name='fieldreportexternalpartnercategory', - name='external_partner_categories', + model_name="fieldreportexternalpartnercategory", + name="external_partner_categories", ), migrations.RemoveField( - model_name='fieldreportexternalpartnercategory', - name='field_report', + model_name="fieldreportexternalpartnercategory", + name="field_report", ), migrations.RemoveField( - model_name='fieldreportsupportedactivity', - name='field_report', + model_name="fieldreportsupportedactivity", + name="field_report", ), migrations.RemoveField( - model_name='fieldreportsupportedactivity', - name='supported_activities', + model_name="fieldreportsupportedactivity", + name="supported_activities", ), migrations.AddField( - model_name='fieldreport', - name='external_partner_categories', - field=models.ManyToManyField(blank=True, to='api.ExternalPartnerCategory', verbose_name='external partner categories'), + model_name="fieldreport", + name="external_partner_categories", + field=models.ManyToManyField( + blank=True, to="api.ExternalPartnerCategory", verbose_name="external partner categories" + ), ), migrations.AddField( - model_name='fieldreport', - name='external_partners', - field=models.ManyToManyField(blank=True, to='api.ExternalPartner', verbose_name='external partners'), + model_name="fieldreport", + name="external_partners", + field=models.ManyToManyField(blank=True, to="api.ExternalPartner", verbose_name="external partners"), ), migrations.AddField( - model_name='fieldreport', - name='supported_activities', - field=models.ManyToManyField(blank=True, to='api.SupportedActivity', verbose_name='supported activities'), + model_name="fieldreport", + name="supported_activities", + field=models.ManyToManyField(blank=True, to="api.SupportedActivity", verbose_name="supported activities"), ), migrations.DeleteModel( - name='FieldReportExternalPartner', + name="FieldReportExternalPartner", ), migrations.DeleteModel( - name='FieldReportExternalPartnerCategory', + name="FieldReportExternalPartnerCategory", ), migrations.DeleteModel( - name='FieldReportSupportedActivity', + name="FieldReportSupportedActivity", ), ] diff --git a/api/migrations/0115_merge_20210204_1319.py b/api/migrations/0115_merge_20210204_1319.py index 8cec8e2e7..cc2d0377e 100644 --- a/api/migrations/0115_merge_20210204_1319.py +++ b/api/migrations/0115_merge_20210204_1319.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0106_auto_20201214_0858'), - ('api', '0114_auto_20210204_1203'), + ("api", "0106_auto_20201214_0858"), + ("api", "0114_auto_20210204_1203"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0116_auto_20210205_0905.py b/api/migrations/0116_auto_20210205_0905.py index 729803361..ca36b5f68 100644 --- a/api/migrations/0116_auto_20210205_0905.py +++ b/api/migrations/0116_auto_20210205_0905.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0115_merge_20210204_1319'), + ("api", "0115_merge_20210204_1319"), ] operations = [ migrations.AddField( - model_name='action', - name='tooltip_text_ar', - field=models.TextField(blank='true', null=True, verbose_name='tooltip text'), + model_name="action", + name="tooltip_text_ar", + field=models.TextField(blank="true", null=True, verbose_name="tooltip text"), ), migrations.AddField( - model_name='action', - name='tooltip_text_en', - field=models.TextField(blank='true', null=True, verbose_name='tooltip text'), + model_name="action", + name="tooltip_text_en", + field=models.TextField(blank="true", null=True, verbose_name="tooltip text"), ), migrations.AddField( - model_name='action', - name='tooltip_text_es', - field=models.TextField(blank='true', null=True, verbose_name='tooltip text'), + model_name="action", + name="tooltip_text_es", + field=models.TextField(blank="true", null=True, verbose_name="tooltip text"), ), migrations.AddField( - model_name='action', - name='tooltip_text_fr', - field=models.TextField(blank='true', null=True, verbose_name='tooltip text'), + model_name="action", + name="tooltip_text_fr", + field=models.TextField(blank="true", null=True, verbose_name="tooltip text"), ), ] diff --git a/api/migrations/0116_auto_20210205_1443.py b/api/migrations/0116_auto_20210205_1443.py index cee7091f9..51de691c4 100644 --- a/api/migrations/0116_auto_20210205_1443.py +++ b/api/migrations/0116_auto_20210205_1443.py @@ -6,15 +6,15 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0115_merge_20210204_1319'), + ("api", "0115_merge_20210204_1319"), ] operations = [ migrations.RemoveField( - model_name='fieldreport', - name='external_partner_categories', + model_name="fieldreport", + name="external_partner_categories", ), migrations.DeleteModel( - name='ExternalPartnerCategory', + name="ExternalPartnerCategory", ), ] diff --git a/api/migrations/0117_merge_20210205_1458.py b/api/migrations/0117_merge_20210205_1458.py index d3bef8750..2b4070225 100644 --- a/api/migrations/0117_merge_20210205_1458.py +++ b/api/migrations/0117_merge_20210205_1458.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0116_auto_20210205_1443'), - ('api', '0116_auto_20210205_0905'), + ("api", "0116_auto_20210205_1443"), + ("api", "0116_auto_20210205_0905"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0118_country_in_search.py b/api/migrations/0118_country_in_search.py index 0f9aa78a1..86bea4edb 100644 --- a/api/migrations/0118_country_in_search.py +++ b/api/migrations/0118_country_in_search.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0117_merge_20210205_1458'), + ("api", "0117_merge_20210205_1458"), ] operations = [ migrations.AddField( - model_name='country', - name='in_search', - field=models.BooleanField(default=True, verbose_name='Include in Search?'), + model_name="country", + name="in_search", + field=models.BooleanField(default=True, verbose_name="Include in Search?"), ), ] diff --git a/api/migrations/0119_auto_20210208_1003.py b/api/migrations/0119_auto_20210208_1003.py index 343a8885c..b111a5832 100644 --- a/api/migrations/0119_auto_20210208_1003.py +++ b/api/migrations/0119_auto_20210208_1003.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0118_country_in_search'), + ("api", "0118_country_in_search"), ] operations = [ migrations.AlterField( - model_name='country', - name='in_search', - field=models.BooleanField(default=True, verbose_name='Include in Search'), + model_name="country", + name="in_search", + field=models.BooleanField(default=True, verbose_name="Include in Search"), ), ] diff --git a/api/migrations/0120_maincontact.py b/api/migrations/0120_maincontact.py index 585ddc780..ed154a8da 100644 --- a/api/migrations/0120_maincontact.py +++ b/api/migrations/0120_maincontact.py @@ -6,25 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0119_auto_20210208_1003'), + ("api", "0119_auto_20210208_1003"), ] operations = [ migrations.CreateModel( - name='MainContact', + name="MainContact", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('extent', models.CharField(max_length=300, verbose_name='extent')), - ('extent_en', models.CharField(max_length=300, null=True, verbose_name='extent')), - ('extent_es', models.CharField(max_length=300, null=True, verbose_name='extent')), - ('extent_fr', models.CharField(max_length=300, null=True, verbose_name='extent')), - ('extent_ar', models.CharField(max_length=300, null=True, verbose_name='extent')), - ('name', models.CharField(max_length=300, verbose_name='name')), - ('email', models.CharField(max_length=300, verbose_name='email')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("extent", models.CharField(max_length=300, verbose_name="extent")), + ("extent_en", models.CharField(max_length=300, null=True, verbose_name="extent")), + ("extent_es", models.CharField(max_length=300, null=True, verbose_name="extent")), + ("extent_fr", models.CharField(max_length=300, null=True, verbose_name="extent")), + ("extent_ar", models.CharField(max_length=300, null=True, verbose_name="extent")), + ("name", models.CharField(max_length=300, verbose_name="name")), + ("email", models.CharField(max_length=300, verbose_name="email")), ], options={ - 'verbose_name': 'main contact', - 'verbose_name_plural': 'main contacts', + "verbose_name": "main contact", + "verbose_name_plural": "main contacts", }, ), ] diff --git a/api/migrations/0121_geccode.py b/api/migrations/0121_geccode.py index 20e1c64fd..8002a7a0f 100644 --- a/api/migrations/0121_geccode.py +++ b/api/migrations/0121_geccode.py @@ -1,22 +1,25 @@ # Generated by Django 2.2.13 on 2021-02-22 07:12 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0120_maincontact'), + ("api", "0120_maincontact"), ] operations = [ migrations.CreateModel( - name='GECCode', + name="GECCode", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.CharField(max_length=3, verbose_name='3 letter GEC code')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.Country', verbose_name='country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("code", models.CharField(max_length=3, verbose_name="3 letter GEC code")), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to="api.Country", verbose_name="country"), + ), ], ), ] diff --git a/api/migrations/0122_auto_20210308_0705.py b/api/migrations/0122_auto_20210308_0705.py index e775dc54b..c7e587ec0 100644 --- a/api/migrations/0122_auto_20210308_0705.py +++ b/api/migrations/0122_auto_20210308_0705.py @@ -7,13 +7,19 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0121_geccode'), + ("api", "0121_geccode"), ] operations = [ migrations.AlterField( - model_name='district', - name='country_iso', - field=models.CharField(blank=True, max_length=2, null=True, validators=[django.core.validators.RegexValidator('^[A-Z]*$', 'ISO must be uppercase')], verbose_name='country ISO2'), + model_name="district", + name="country_iso", + field=models.CharField( + blank=True, + max_length=2, + null=True, + validators=[django.core.validators.RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + verbose_name="country ISO2", + ), ), ] diff --git a/api/migrations/0122_merge_20210301_1001.py b/api/migrations/0122_merge_20210301_1001.py index ccc541711..e6682faf4 100644 --- a/api/migrations/0122_merge_20210301_1001.py +++ b/api/migrations/0122_merge_20210301_1001.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0106_auto_20210219_0908'), - ('api', '0121_geccode'), + ("api", "0106_auto_20210219_0908"), + ("api", "0121_geccode"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0123_auto_20210301_1014.py b/api/migrations/0123_auto_20210301_1014.py index 2442c782b..b6ebe5a66 100644 --- a/api/migrations/0123_auto_20210301_1014.py +++ b/api/migrations/0123_auto_20210301_1014.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0122_merge_20210301_1001'), + ("api", "0122_merge_20210301_1001"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='ns_request_assistance', - field=models.BooleanField(default=None, verbose_name='NS request assistance'), + model_name="fieldreport", + name="ns_request_assistance", + field=models.BooleanField(default=None, verbose_name="NS request assistance"), ), migrations.AlterField( - model_name='fieldreport', - name='request_assistance', - field=models.BooleanField(default=None, verbose_name='request assistance'), + model_name="fieldreport", + name="request_assistance", + field=models.BooleanField(default=None, verbose_name="request assistance"), ), ] diff --git a/api/migrations/0123_auto_20210318_1520.py b/api/migrations/0123_auto_20210318_1520.py index 66bd09566..e6ca5a467 100644 --- a/api/migrations/0123_auto_20210318_1520.py +++ b/api/migrations/0123_auto_20210318_1520.py @@ -6,16 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0122_auto_20210308_0705'), + ("api", "0122_auto_20210308_0705"), ] operations = [ migrations.RemoveField( - model_name='district', - name='country_iso', + model_name="district", + name="country_iso", ), migrations.RemoveField( - model_name='district', - name='country_name', + model_name="district", + name="country_name", ), ] diff --git a/api/migrations/0124_merge_20210414_0714.py b/api/migrations/0124_merge_20210414_0714.py index fd36a327b..c38ded994 100644 --- a/api/migrations/0124_merge_20210414_0714.py +++ b/api/migrations/0124_merge_20210414_0714.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0123_auto_20210318_1520'), - ('api', '0123_auto_20210301_1014'), + ("api", "0123_auto_20210318_1520"), + ("api", "0123_auto_20210301_1014"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0125_erpguid.py b/api/migrations/0125_erpguid.py index e6a699b23..362c4bfee 100644 --- a/api/migrations/0125_erpguid.py +++ b/api/migrations/0125_erpguid.py @@ -1,23 +1,33 @@ # Generated by Django 2.2.13 on 2021-03-02 11:48 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0124_merge_20210414_0714'), + ("api", "0124_merge_20210414_0714"), ] operations = [ migrations.CreateModel( - name='ERPGUID', + name="ERPGUID", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('api_guid', models.CharField(help_text='Can be used to do a GET request to check on the microservice API side.', max_length=200)), - ('field_report', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.FieldReport', verbose_name='field report')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ( + "api_guid", + models.CharField( + help_text="Can be used to do a GET request to check on the microservice API side.", max_length=200 + ), + ), + ( + "field_report", + models.ForeignKey( + on_delete=django.db.models.deletion.DO_NOTHING, to="api.FieldReport", verbose_name="field report" + ), + ), ], ), ] diff --git a/api/migrations/0126_auto_20210418_1357.py b/api/migrations/0126_auto_20210418_1357.py index 1b4441cb4..d336fe245 100644 --- a/api/migrations/0126_auto_20210418_1357.py +++ b/api/migrations/0126_auto_20210418_1357.py @@ -1,24 +1,26 @@ # Generated by Django 2.2.20 on 2021-04-18 13:57 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0125_erpguid'), + ("api", "0125_erpguid"), ] operations = [ migrations.AlterField( - model_name='erpguid', - name='field_report', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.FieldReport', verbose_name='field report'), + model_name="erpguid", + name="field_report", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="api.FieldReport", verbose_name="field report" + ), ), migrations.AlterField( - model_name='geccode', - name='country', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='country'), + model_name="geccode", + name="country", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Country", verbose_name="country"), ), ] diff --git a/api/migrations/0127_appealfilter.py b/api/migrations/0127_appealfilter.py index c12e031d5..53fc92cde 100644 --- a/api/migrations/0127_appealfilter.py +++ b/api/migrations/0127_appealfilter.py @@ -6,20 +6,20 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0126_auto_20210418_1357'), + ("api", "0126_auto_20210418_1357"), ] operations = [ migrations.CreateModel( - name='AppealFilter', + name="AppealFilter", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, verbose_name='name')), - ('value', models.CharField(max_length=1000, verbose_name='value')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=100, verbose_name="name")), + ("value", models.CharField(max_length=1000, verbose_name="value")), ], options={ - 'verbose_name': 'appeal filter', - 'verbose_name_plural': 'appeal filters', + "verbose_name": "appeal filter", + "verbose_name_plural": "appeal filters", }, ), ] diff --git a/api/migrations/0128_appealhistory.py b/api/migrations/0128_appealhistory.py index 623e5051b..a04baf979 100644 --- a/api/migrations/0128_appealhistory.py +++ b/api/migrations/0128_appealhistory.py @@ -1,38 +1,60 @@ # Generated by Django 2.2.20 on 2021-05-31 06:51 -import api.models -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + +import api.models class Migration(migrations.Migration): dependencies = [ - ('api', '0127_appealfilter'), + ("api", "0127_appealfilter"), ] operations = [ migrations.CreateModel( - name='AppealHistory', + name="AppealHistory", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('num_beneficiaries', models.IntegerField(default=0, verbose_name='number of beneficiaries')), - ('amount_requested', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='amount requested')), - ('amount_funded', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='amount funded')), - ('valid_from', models.DateTimeField(null=True, verbose_name='valid_from')), - ('valid_to', models.DateTimeField(null=True, verbose_name='valid_to')), - ('aid', models.CharField(max_length=20, verbose_name='appeal ID')), - ('start_date', models.DateTimeField(null=True, verbose_name='start date')), - ('end_date', models.DateTimeField(null=True, verbose_name='end date')), - ('atype', models.IntegerField(default=0, choices=api.models.AppealType.choices, verbose_name='appeal type')), - ('appeal', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Appeal', verbose_name='appeal')), - ('country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country')), - ('region', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Region', verbose_name='region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("num_beneficiaries", models.IntegerField(default=0, verbose_name="number of beneficiaries")), + ( + "amount_requested", + models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name="amount requested"), + ), + ( + "amount_funded", + models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name="amount funded"), + ), + ("valid_from", models.DateTimeField(null=True, verbose_name="valid_from")), + ("valid_to", models.DateTimeField(null=True, verbose_name="valid_to")), + ("aid", models.CharField(max_length=20, verbose_name="appeal ID")), + ("start_date", models.DateTimeField(null=True, verbose_name="start date")), + ("end_date", models.DateTimeField(null=True, verbose_name="end date")), + ("atype", models.IntegerField(default=0, choices=api.models.AppealType.choices, verbose_name="appeal type")), + ( + "appeal", + models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Appeal", verbose_name="appeal" + ), + ), + ( + "country", + models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="country" + ), + ), + ( + "region", + models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Region", verbose_name="region" + ), + ), ], options={ - 'verbose_name': 'appealhistory', - 'verbose_name_plural': 'appealhistories', - 'ordering': ('-start_date', '-end_date'), + "verbose_name": "appealhistory", + "verbose_name_plural": "appealhistories", + "ordering": ("-start_date", "-end_date"), }, ), ] diff --git a/api/migrations/0129_appealhistory_fill.py b/api/migrations/0129_appealhistory_fill.py index 1793c4c1e..2c256a5b9 100644 --- a/api/migrations/0129_appealhistory_fill.py +++ b/api/migrations/0129_appealhistory_fill.py @@ -1,19 +1,23 @@ # Generated by Django 2.2.20 on 2021-06-01 06:51 -import api.models -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + +import api.models class Migration(migrations.Migration): dependencies = [ - ('api', '0128_appealhistory'), + ("api", "0128_appealhistory"), ] operations = [ migrations.RunSQL( - sql=[("INSERT INTO api_appealhistory(appeal_id,valid_from, valid_to, num_beneficiaries, amount_requested, amount_funded, aid, start_date, end_date,atype, country_id, region_id) select id,'1900-01-01', '2200-01-01', num_beneficiaries, amount_requested, amount_funded, aid, start_date, end_date,atype, country_id, region_id from api_appeal")], + sql=[ + ( + "INSERT INTO api_appealhistory(appeal_id,valid_from, valid_to, num_beneficiaries, amount_requested, amount_funded, aid, start_date, end_date,atype, country_id, region_id) select id,'1900-01-01', '2200-01-01', num_beneficiaries, amount_requested, amount_funded, aid, start_date, end_date,atype, country_id, region_id from api_appeal" + ) + ], reverse_sql=[("DELETE FROM api_appealhistory where valid_to = '2200-01-01'")], ) ] - diff --git a/api/migrations/0130_auto_20210615_0920.py b/api/migrations/0130_auto_20210615_0920.py index 510ed804c..7146ce2f3 100644 --- a/api/migrations/0130_auto_20210615_0920.py +++ b/api/migrations/0130_auto_20210615_0920.py @@ -1,35 +1,38 @@ # Generated by Django 2.2.20 on 2021-06-15 09:20 -import api.models -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + +import api.models class Migration(migrations.Migration): dependencies = [ - ('api', '0129_appealhistory_fill'), + ("api", "0129_appealhistory_fill"), ] operations = [ migrations.AddField( - model_name='appealhistory', - name='dtype', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType', verbose_name='disaster type'), + model_name="appealhistory", + name="dtype", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.DisasterType", verbose_name="disaster type" + ), ), migrations.AddField( - model_name='appealhistory', - name='needs_confirmation', - field=models.BooleanField(default=False, verbose_name='needs confirmation?'), + model_name="appealhistory", + name="needs_confirmation", + field=models.BooleanField(default=False, verbose_name="needs confirmation?"), ), migrations.AddField( - model_name='appealhistory', - name='status', - field=models.IntegerField(default=0, choices=api.models.AppealStatus.choices, verbose_name='status'), + model_name="appealhistory", + name="status", + field=models.IntegerField(default=0, choices=api.models.AppealStatus.choices, verbose_name="status"), ), migrations.AddField( - model_name='appealhistory', - name='code', - field=models.CharField(max_length=20, null=True, verbose_name='code'), + model_name="appealhistory", + name="code", + field=models.CharField(max_length=20, null=True, verbose_name="code"), ), ] diff --git a/api/migrations/0131_appealhistory_fill_2.py b/api/migrations/0131_appealhistory_fill_2.py index 3b9a1e947..9eae6b210 100644 --- a/api/migrations/0131_appealhistory_fill_2.py +++ b/api/migrations/0131_appealhistory_fill_2.py @@ -1,18 +1,21 @@ +import django.db.models.deletion +from django.db import migrations, models import api.models -from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('api', '0130_auto_20210615_0920'), + ("api", "0130_auto_20210615_0920"), ] operations = [ migrations.RunSQL( - sql=[("UPDATE api_appealhistory SET dtype_id = api_appeal.dtype_id, status = api_appeal.status, needs_confirmation = api_appeal.needs_confirmation, code = api_appeal.code from api_appeal WHERE api_appeal.aid = api_appealhistory.aid")], + sql=[ + ( + "UPDATE api_appealhistory SET dtype_id = api_appeal.dtype_id, status = api_appeal.status, needs_confirmation = api_appeal.needs_confirmation, code = api_appeal.code from api_appeal WHERE api_appeal.aid = api_appealhistory.aid" + ) + ], reverse_sql=[("DELETE FROM api_appealhistory where valid_to = '2200-01-01'")], ) ] - diff --git a/api/migrations/0132_auto_20210701_0635.py b/api/migrations/0132_auto_20210701_0635.py index 3fdf83df0..907a0e46f 100644 --- a/api/migrations/0132_auto_20210701_0635.py +++ b/api/migrations/0132_auto_20210701_0635.py @@ -1,51 +1,76 @@ # Generated by Django 2.2.20 on 2021-07-01 06:35 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0131_appealhistory_fill_2'), + ("api", "0131_appealhistory_fill_2"), ] operations = [ migrations.CreateModel( - name='EventLink', + name="EventLink", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=200, verbose_name='title')), - ('title_en', models.CharField(max_length=200, null=True, verbose_name='title')), - ('title_es', models.CharField(max_length=200, null=True, verbose_name='title')), - ('title_fr', models.CharField(max_length=200, null=True, verbose_name='title')), - ('title_ar', models.CharField(max_length=200, null=True, verbose_name='title')), - ('description', models.TextField(verbose_name='description')), - ('description_en', models.TextField(null=True, verbose_name='description')), - ('description_es', models.TextField(null=True, verbose_name='description')), - ('description_fr', models.TextField(null=True, verbose_name='description')), - ('description_ar', models.TextField(null=True, verbose_name='description')), - ('url', models.URLField(verbose_name='url')), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='links', related_query_name='link', to='api.Event', verbose_name='event')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=200, verbose_name="title")), + ("title_en", models.CharField(max_length=200, null=True, verbose_name="title")), + ("title_es", models.CharField(max_length=200, null=True, verbose_name="title")), + ("title_fr", models.CharField(max_length=200, null=True, verbose_name="title")), + ("title_ar", models.CharField(max_length=200, null=True, verbose_name="title")), + ("description", models.TextField(verbose_name="description")), + ("description_en", models.TextField(null=True, verbose_name="description")), + ("description_es", models.TextField(null=True, verbose_name="description")), + ("description_fr", models.TextField(null=True, verbose_name="description")), + ("description_ar", models.TextField(null=True, verbose_name="description")), + ("url", models.URLField(verbose_name="url")), + ( + "event", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="links", + related_query_name="link", + to="api.Event", + verbose_name="event", + ), + ), ], ), migrations.CreateModel( - name='EventFeaturedDocument', + name="EventFeaturedDocument", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=200, verbose_name='title')), - ('title_en', models.CharField(max_length=200, null=True, verbose_name='title')), - ('title_es', models.CharField(max_length=200, null=True, verbose_name='title')), - ('title_fr', models.CharField(max_length=200, null=True, verbose_name='title')), - ('title_ar', models.CharField(max_length=200, null=True, verbose_name='title')), - ('description', models.TextField(verbose_name='description')), - ('description_en', models.TextField(null=True, verbose_name='description')), - ('description_es', models.TextField(null=True, verbose_name='description')), - ('description_fr', models.TextField(null=True, verbose_name='description')), - ('description_ar', models.TextField(null=True, verbose_name='description')), - ('thumbnail', models.ImageField(help_text='Please maintain aspect ratio (3:4) of image while uploading', upload_to='event-featured-documents/thumbnail/', verbose_name='thumbnail')), - ('file', models.FileField(upload_to='event-featured-documents/file/', verbose_name='file')), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='featured_documents', related_query_name='featured_document', to='api.Event', verbose_name='event')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=200, verbose_name="title")), + ("title_en", models.CharField(max_length=200, null=True, verbose_name="title")), + ("title_es", models.CharField(max_length=200, null=True, verbose_name="title")), + ("title_fr", models.CharField(max_length=200, null=True, verbose_name="title")), + ("title_ar", models.CharField(max_length=200, null=True, verbose_name="title")), + ("description", models.TextField(verbose_name="description")), + ("description_en", models.TextField(null=True, verbose_name="description")), + ("description_es", models.TextField(null=True, verbose_name="description")), + ("description_fr", models.TextField(null=True, verbose_name="description")), + ("description_ar", models.TextField(null=True, verbose_name="description")), + ( + "thumbnail", + models.ImageField( + help_text="Please maintain aspect ratio (3:4) of image while uploading", + upload_to="event-featured-documents/thumbnail/", + verbose_name="thumbnail", + ), + ), + ("file", models.FileField(upload_to="event-featured-documents/file/", verbose_name="file")), + ( + "event", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="featured_documents", + related_query_name="featured_document", + to="api.Event", + verbose_name="event", + ), + ), ], ), ] diff --git a/api/migrations/0133_auto_20210729_1609.py b/api/migrations/0133_auto_20210729_1609.py index a96194fa4..aef59c815 100644 --- a/api/migrations/0133_auto_20210729_1609.py +++ b/api/migrations/0133_auto_20210729_1609.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0132_auto_20210701_0635'), + ("api", "0132_auto_20210701_0635"), ] operations = [ migrations.AlterField( - model_name='appealhistory', - name='code', - field=models.CharField(max_length=20, null=True, verbose_name='code'), + model_name="appealhistory", + name="code", + field=models.CharField(max_length=20, null=True, verbose_name="code"), ), ] diff --git a/api/migrations/0133_auto_20210922_1327.py b/api/migrations/0133_auto_20210922_1327.py index 5e9e32407..e9b3a0141 100644 --- a/api/migrations/0133_auto_20210922_1327.py +++ b/api/migrations/0133_auto_20210922_1327.py @@ -6,13 +6,17 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0132_auto_20210701_0635'), + ("api", "0132_auto_20210701_0635"), ] operations = [ migrations.AlterField( - model_name='eventfeatureddocument', - name='thumbnail', - field=models.ImageField(help_text='Image should be portrait (3:4 aspect ratio) and scaled down to as close to 96x128 as the image size', upload_to='event-featured-documents/thumbnail/', verbose_name='thumbnail'), + model_name="eventfeatureddocument", + name="thumbnail", + field=models.ImageField( + help_text="Image should be portrait (3:4 aspect ratio) and scaled down to as close to 96x128 as the image size", + upload_to="event-featured-documents/thumbnail/", + verbose_name="thumbnail", + ), ), ] diff --git a/api/migrations/0134_generaldocument.py b/api/migrations/0134_generaldocument.py index 0fb317d1b..59641a04a 100644 --- a/api/migrations/0134_generaldocument.py +++ b/api/migrations/0134_generaldocument.py @@ -1,48 +1,52 @@ # Generated by Django 2.2.24 on 2021-11-04 14:33 -import api.models from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0133_auto_20210922_1327'), + ("api", "0133_auto_20210922_1327"), ] operations = [ migrations.CreateModel( - name='GeneralDocument', + name="GeneralDocument", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(verbose_name='created at')), - ('name', models.CharField(max_length=100, verbose_name='name')), - ('document', models.FileField(blank=True, null=True, upload_to=api.models.general_document_path, verbose_name='document')), - ('document_url', models.URLField(blank=True, verbose_name='document url')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(verbose_name="created at")), + ("name", models.CharField(max_length=100, verbose_name="name")), + ( + "document", + models.FileField(blank=True, null=True, upload_to=api.models.general_document_path, verbose_name="document"), + ), + ("document_url", models.URLField(blank=True, verbose_name="document url")), ], options={ - 'verbose_name': 'general document', - 'verbose_name_plural': 'general documents', + "verbose_name": "general document", + "verbose_name_plural": "general documents", }, ), migrations.AddField( - model_name='GeneralDocument', - name='name_ar', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="GeneralDocument", + name="name_ar", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='GeneralDocument', - name='name_en', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="GeneralDocument", + name="name_en", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='GeneralDocument', - name='name_es', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="GeneralDocument", + name="name_es", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='GeneralDocument', - name='name_fr', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="GeneralDocument", + name="name_fr", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), ] diff --git a/api/migrations/0134_merge_20211020_0622.py b/api/migrations/0134_merge_20211020_0622.py index cb982db50..a8279fa4e 100644 --- a/api/migrations/0134_merge_20211020_0622.py +++ b/api/migrations/0134_merge_20211020_0622.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0133_auto_20210729_1609'), - ('api', '0133_auto_20210922_1327'), + ("api", "0133_auto_20210729_1609"), + ("api", "0133_auto_20210922_1327"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0135_usercountry.py b/api/migrations/0135_usercountry.py index fcdadb3fa..99ab93589 100644 --- a/api/migrations/0135_usercountry.py +++ b/api/migrations/0135_usercountry.py @@ -1,28 +1,43 @@ # Generated by Django 2.2.24 on 2021-11-11 09:05 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('api', '0134_generaldocument'), + ("api", "0134_generaldocument"), ] operations = [ migrations.CreateModel( - name='UserCountry', + name="UserCountry", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='country')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='userName', to=settings.AUTH_USER_MODEL, verbose_name='user')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "country", + models.ForeignKey( + null=True, on_delete=django.db.models.deletion.CASCADE, to="api.Country", verbose_name="country" + ), + ), + ( + "user", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="userName", + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), + ), ], options={ - 'verbose_name': 'User Country', - 'verbose_name_plural': 'User Countries', + "verbose_name": "User Country", + "verbose_name_plural": "User Countries", }, ), ] diff --git a/api/migrations/0136_event_visibility.py b/api/migrations/0136_event_visibility.py index da3f6cb82..5b4d357ec 100644 --- a/api/migrations/0136_event_visibility.py +++ b/api/migrations/0136_event_visibility.py @@ -1,19 +1,20 @@ # Generated by Django 2.2.24 on 2021-11-17 15:29 +from django.db import migrations, models + import api.models -from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ - ('api', '0135_usercountry'), + ("api", "0135_usercountry"), ] operations = [ migrations.AddField( - model_name='event', - name='visibility', - field=models.IntegerField(default=1, choices=api.models.VisibilityChoices.choices, verbose_name='visibility'), + model_name="event", + name="visibility", + field=models.IntegerField(default=1, choices=api.models.VisibilityChoices.choices, verbose_name="visibility"), ), ] diff --git a/api/migrations/0137_auto_20211227_1441.py b/api/migrations/0137_auto_20211227_1441.py index 23befd20d..f5002eb96 100644 --- a/api/migrations/0137_auto_20211227_1441.py +++ b/api/migrations/0137_auto_20211227_1441.py @@ -1,39 +1,40 @@ # Generated by Django 2.2.24 on 2021-12-27 14:41 -import api.models from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0136_event_visibility'), + ("api", "0136_event_visibility"), ] operations = [ migrations.AlterField( - model_name='generaldocument', - name='document', - field=models.FileField(blank=True, null=True, upload_to=api.models.general_document_path, verbose_name='document'), + model_name="generaldocument", + name="document", + field=models.FileField(blank=True, null=True, upload_to=api.models.general_document_path, verbose_name="document"), ), migrations.AlterField( - model_name='generaldocument', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='generaldocument', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='generaldocument', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='generaldocument', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), ] diff --git a/api/migrations/0137_auto_20220105_1533.py b/api/migrations/0137_auto_20220105_1533.py index 9d7404476..176a7a71f 100644 --- a/api/migrations/0137_auto_20220105_1533.py +++ b/api/migrations/0137_auto_20220105_1533.py @@ -1,43 +1,44 @@ # Generated by Django 2.2.25 on 2022-01-05 15:33 -import api.models from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0136_event_visibility'), + ("api", "0136_event_visibility"), ] operations = [ migrations.AlterModelOptions( - name='keyfigure', - options={'ordering': ('id',), 'verbose_name': 'key figure', 'verbose_name_plural': 'key figures'}, + name="keyfigure", + options={"ordering": ("id",), "verbose_name": "key figure", "verbose_name_plural": "key figures"}, ), migrations.AlterField( - model_name='generaldocument', - name='document', - field=models.FileField(blank=True, null=True, upload_to=api.models.general_document_path, verbose_name='document'), + model_name="generaldocument", + name="document", + field=models.FileField(blank=True, null=True, upload_to=api.models.general_document_path, verbose_name="document"), ), migrations.AlterField( - model_name='generaldocument', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='generaldocument', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='generaldocument', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='generaldocument', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), ] diff --git a/api/migrations/0137_merge_20220104_0845.py b/api/migrations/0137_merge_20220104_0845.py index 42e02ed38..b59dda24e 100644 --- a/api/migrations/0137_merge_20220104_0845.py +++ b/api/migrations/0137_merge_20220104_0845.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0136_event_visibility'), - ('api', '0134_merge_20211020_0622'), + ("api", "0136_event_visibility"), + ("api", "0134_merge_20211020_0622"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0138_auto_20220104_1027.py b/api/migrations/0138_auto_20220104_1027.py index 90f40b8ff..823f70d65 100644 --- a/api/migrations/0138_auto_20220104_1027.py +++ b/api/migrations/0138_auto_20220104_1027.py @@ -1,39 +1,40 @@ # Generated by Django 2.2.24 on 2022-01-04 10:27 -import api.models from django.db import migrations, models +import api.models + class Migration(migrations.Migration): dependencies = [ - ('api', '0137_auto_20220105_1533'), + ("api", "0137_auto_20220105_1533"), ] operations = [ migrations.AlterField( - model_name='generaldocument', - name='document', - field=models.FileField(blank=True, null=True, upload_to=api.models.general_document_path, verbose_name='document'), + model_name="generaldocument", + name="document", + field=models.FileField(blank=True, null=True, upload_to=api.models.general_document_path, verbose_name="document"), ), migrations.AlterField( - model_name='generaldocument', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='generaldocument', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='generaldocument', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='generaldocument', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="generaldocument", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), ] diff --git a/api/migrations/0138_auto_20220105_0543.py b/api/migrations/0138_auto_20220105_0543.py index f49b28d5a..611a07612 100644 --- a/api/migrations/0138_auto_20220105_0543.py +++ b/api/migrations/0138_auto_20220105_0543.py @@ -7,18 +7,36 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0137_auto_20211227_1441'), + ("api", "0137_auto_20211227_1441"), ] operations = [ migrations.AlterField( - model_name='action', - name='organizations', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'Foreign Society'), ('FDRN', 'Federation'), ('GOV', 'Government')], max_length=4), blank=True, default=list, size=None, verbose_name='organizations'), + model_name="action", + name="organizations", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[ + ("NTLS", "National Society"), + ("PNS", "Foreign Society"), + ("FDRN", "Federation"), + ("GOV", "Government"), + ], + max_length=4, + ), + blank=True, + default=list, + size=None, + verbose_name="organizations", + ), ), migrations.AlterField( - model_name='actionstaken', - name='organization', - field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'Foreign Society'), ('FDRN', 'Federation'), ('GOV', 'Government')], max_length=16, verbose_name='organization'), + model_name="actionstaken", + name="organization", + field=models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "Foreign Society"), ("FDRN", "Federation"), ("GOV", "Government")], + max_length=16, + verbose_name="organization", + ), ), ] diff --git a/api/migrations/0139_userregion.py b/api/migrations/0139_userregion.py index 696138820..73f61d7ea 100644 --- a/api/migrations/0139_userregion.py +++ b/api/migrations/0139_userregion.py @@ -1,28 +1,43 @@ # Generated by Django 2.2.24 on 2022-01-04 16:32 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('api', '0138_auto_20220104_1027'), + ("api", "0138_auto_20220104_1027"), ] operations = [ migrations.CreateModel( - name='UserRegion', + name="UserRegion", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('region', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='api.Region', verbose_name='region')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='userRegionName', to=settings.AUTH_USER_MODEL, verbose_name='user')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "region", + models.ForeignKey( + null=True, on_delete=django.db.models.deletion.CASCADE, to="api.Region", verbose_name="region" + ), + ), + ( + "user", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="userRegionName", + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), + ), ], options={ - 'verbose_name': 'Regional Admin', - 'verbose_name_plural': 'Regional Admins', + "verbose_name": "Regional Admin", + "verbose_name_plural": "Regional Admins", }, ), ] diff --git a/api/migrations/0140_auto_20220126_1112.py b/api/migrations/0140_auto_20220126_1112.py index f91133273..ceda40864 100644 --- a/api/migrations/0140_auto_20220126_1112.py +++ b/api/migrations/0140_auto_20220126_1112.py @@ -6,18 +6,22 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0139_userregion'), + ("api", "0139_userregion"), ] operations = [ migrations.AddField( - model_name='appeal', - name='triggering_amount', - field=models.DecimalField(decimal_places=2, default=0.0, editable=False, max_digits=12, verbose_name='triggering amount'), + model_name="appeal", + name="triggering_amount", + field=models.DecimalField( + decimal_places=2, default=0.0, editable=False, max_digits=12, verbose_name="triggering amount" + ), ), migrations.AddField( - model_name='appealhistory', - name='triggering_amount', - field=models.DecimalField(decimal_places=2, default=0.0, editable=False, max_digits=12, verbose_name='triggering amount'), + model_name="appealhistory", + name="triggering_amount", + field=models.DecimalField( + decimal_places=2, default=0.0, editable=False, max_digits=12, verbose_name="triggering amount" + ), ), ] diff --git a/api/migrations/0141_merge_20220202_0546.py b/api/migrations/0141_merge_20220202_0546.py index cfcd42f7d..e522a3d25 100644 --- a/api/migrations/0141_merge_20220202_0546.py +++ b/api/migrations/0141_merge_20220202_0546.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0140_auto_20220126_1112'), - ('api', '0137_merge_20220104_0845'), + ("api", "0140_auto_20220126_1112"), + ("api", "0137_merge_20220104_0845"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0142_auto_20220202_0551.py b/api/migrations/0142_auto_20220202_0551.py index a23092d47..2c0e2553a 100644 --- a/api/migrations/0142_auto_20220202_0551.py +++ b/api/migrations/0142_auto_20220202_0551.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0141_merge_20220202_0546'), + ("api", "0141_merge_20220202_0546"), ] operations = [ migrations.AlterField( - model_name='appealhistory', - name='code', - field=models.CharField(max_length=20, null=True, verbose_name='code'), + model_name="appealhistory", + name="code", + field=models.CharField(max_length=20, null=True, verbose_name="code"), ), ] diff --git a/api/migrations/0143_auto_20220218_0817.py b/api/migrations/0143_auto_20220218_0817.py index f76a63986..066bb7c18 100644 --- a/api/migrations/0143_auto_20220218_0817.py +++ b/api/migrations/0143_auto_20220218_0817.py @@ -1,41 +1,123 @@ # Generated by Django 2.2.27 on 2022-02-18 08:17 -import api.utils +import re + import django.core.validators from django.db import migrations, models -import re + +import api.utils class Migration(migrations.Migration): dependencies = [ - ('api', '0142_auto_20220202_0551'), + ("api", "0142_auto_20220202_0551"), ] operations = [ migrations.AlterField( - model_name='event', - name='slug', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AlterField( - model_name='event', - name='slug_ar', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_ar", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AlterField( - model_name='event', - name='slug_en', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_en", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AlterField( - model_name='event', - name='slug_es', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_es", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AlterField( - model_name='event', - name='slug_fr', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_fr", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergencies/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), ] diff --git a/api/migrations/0143_merge_20220214_0557.py b/api/migrations/0143_merge_20220214_0557.py index 613410908..990293044 100644 --- a/api/migrations/0143_merge_20220214_0557.py +++ b/api/migrations/0143_merge_20220214_0557.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0138_auto_20220105_0543'), - ('api', '0142_auto_20220202_0551'), + ("api", "0138_auto_20220105_0543"), + ("api", "0142_auto_20220202_0551"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0144_merge_20220218_0941.py b/api/migrations/0144_merge_20220218_0941.py index 4854ea82e..8e167fc3d 100644 --- a/api/migrations/0144_merge_20220218_0941.py +++ b/api/migrations/0144_merge_20220218_0941.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0143_auto_20220218_0817'), - ('api', '0143_merge_20220214_0557'), + ("api", "0143_auto_20220218_0817"), + ("api", "0143_merge_20220214_0557"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0145_auto_20220218_1338.py b/api/migrations/0145_auto_20220218_1338.py index 88056242b..c1b80ed8c 100644 --- a/api/migrations/0145_auto_20220218_1338.py +++ b/api/migrations/0145_auto_20220218_1338.py @@ -1,41 +1,123 @@ # Generated by Django 2.2.27 on 2022-02-18 13:38 -import api.utils +import re + import django.core.validators from django.db import migrations, models -import re + +import api.utils class Migration(migrations.Migration): dependencies = [ - ('api', '0144_merge_20220218_0941'), + ("api", "0144_merge_20220218_0941"), ] operations = [ migrations.AlterField( - model_name='event', - name='slug', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AlterField( - model_name='event', - name='slug_ar', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_ar", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AlterField( - model_name='event', - name='slug_en', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_en", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AlterField( - model_name='event', - name='slug_es', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_es", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), migrations.AlterField( - model_name='event', - name='slug_fr', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), + model_name="event", + name="slug_fr", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), ), ] diff --git a/api/migrations/0146_auto_20220228_0952.py b/api/migrations/0146_auto_20220228_0952.py index 6d4df0434..725965272 100644 --- a/api/migrations/0146_auto_20220228_0952.py +++ b/api/migrations/0146_auto_20220228_0952.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0145_auto_20220218_1338'), + ("api", "0145_auto_20220218_1338"), ] operations = [ migrations.AlterField( - model_name='generaldocument', - name='created_at', - field=models.DateTimeField(blank=True, verbose_name='created at'), + model_name="generaldocument", + name="created_at", + field=models.DateTimeField(blank=True, verbose_name="created at"), ), ] diff --git a/api/migrations/0147_auto_20220304_1057.py b/api/migrations/0147_auto_20220304_1057.py index d31e8447d..97891d7d0 100644 --- a/api/migrations/0147_auto_20220304_1057.py +++ b/api/migrations/0147_auto_20220304_1057.py @@ -6,33 +6,33 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0146_auto_20220228_0952'), + ("api", "0146_auto_20220228_0952"), ] operations = [ migrations.AlterField( - model_name='event', - name='name', - field=models.CharField(max_length=256, verbose_name='name'), + model_name="event", + name="name", + field=models.CharField(max_length=256, verbose_name="name"), ), migrations.AlterField( - model_name='event', - name='name_ar', - field=models.CharField(max_length=256, null=True, verbose_name='name'), + model_name="event", + name="name_ar", + field=models.CharField(max_length=256, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='event', - name='name_en', - field=models.CharField(max_length=256, null=True, verbose_name='name'), + model_name="event", + name="name_en", + field=models.CharField(max_length=256, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='event', - name='name_es', - field=models.CharField(max_length=256, null=True, verbose_name='name'), + model_name="event", + name="name_es", + field=models.CharField(max_length=256, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='event', - name='name_fr', - field=models.CharField(max_length=256, null=True, verbose_name='name'), + model_name="event", + name="name_fr", + field=models.CharField(max_length=256, null=True, verbose_name="name"), ), ] diff --git a/api/migrations/0148_auto_20220314_1059.py b/api/migrations/0148_auto_20220314_1059.py index 11b7cd993..e3fabd968 100644 --- a/api/migrations/0148_auto_20220314_1059.py +++ b/api/migrations/0148_auto_20220314_1059.py @@ -6,18 +6,20 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0147_auto_20220304_1057'), + ("api", "0147_auto_20220304_1057"), ] operations = [ migrations.AddField( - model_name='country', - name='average_household_size', - field=models.IntegerField(blank=True, null=True, verbose_name='Average Household Size'), + model_name="country", + name="average_household_size", + field=models.IntegerField(blank=True, null=True, verbose_name="Average Household Size"), ), migrations.AddField( - model_name='event', - name='countries_for_preview', - field=models.ManyToManyField(blank=True, related_name='countries_for_preview', to='api.Country', verbose_name='countries for preview'), + model_name="event", + name="countries_for_preview", + field=models.ManyToManyField( + blank=True, related_name="countries_for_preview", to="api.Country", verbose_name="countries for preview" + ), ), ] diff --git a/api/migrations/0149_auto_20220318_0413.py b/api/migrations/0149_auto_20220318_0413.py index e342935be..281348e90 100644 --- a/api/migrations/0149_auto_20220318_0413.py +++ b/api/migrations/0149_auto_20220318_0413.py @@ -6,13 +6,15 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0148_auto_20220314_1059'), + ("api", "0148_auto_20220314_1059"), ] operations = [ migrations.AlterField( - model_name='country', - name='average_household_size', - field=models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='Average Household Size'), + model_name="country", + name="average_household_size", + field=models.DecimalField( + blank=True, decimal_places=2, max_digits=5, null=True, verbose_name="Average Household Size" + ), ), ] diff --git a/api/migrations/0150_admin2_admin2geoms.py b/api/migrations/0150_admin2_admin2geoms.py index 32b8f7a2b..a71e9e3e6 100644 --- a/api/migrations/0150_admin2_admin2geoms.py +++ b/api/migrations/0150_admin2_admin2geoms.py @@ -1,38 +1,50 @@ # Generated by Django 2.2.27 on 2022-03-23 11:22 import django.contrib.gis.db.models.fields -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0149_auto_20220318_0413'), + ("api", "0149_auto_20220318_0413"), ] operations = [ migrations.CreateModel( - name='Admin2', + name="Admin2", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, verbose_name='name')), - ('code', models.CharField(max_length=64, unique=True, verbose_name='code')), - ('centroid', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326)), - ('bbox', django.contrib.gis.db.models.fields.PolygonField(blank=True, null=True, srid=4326)), - ('admin1', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.District', verbose_name='Admin 1')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=100, verbose_name="name")), + ("code", models.CharField(max_length=64, unique=True, verbose_name="code")), + ("centroid", django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326)), + ("bbox", django.contrib.gis.db.models.fields.PolygonField(blank=True, null=True, srid=4326)), + ( + "admin1", + models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="api.District", verbose_name="Admin 1"), + ), ], options={ - 'verbose_name': 'admin2', - 'verbose_name_plural': 'admin2s', - 'ordering': ('code',), + "verbose_name": "admin2", + "verbose_name_plural": "admin2s", + "ordering": ("code",), }, ), migrations.CreateModel( - name='Admin2Geoms', + name="Admin2Geoms", fields=[ - ('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)), - ('admin2', models.OneToOneField(on_delete=django.db.models.deletion.DO_NOTHING, primary_key=True, serialize=False, to='api.Admin2', verbose_name='admin2')), + ("geom", django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)), + ( + "admin2", + models.OneToOneField( + on_delete=django.db.models.deletion.DO_NOTHING, + primary_key=True, + serialize=False, + to="api.Admin2", + verbose_name="admin2", + ), + ), ], ), ] diff --git a/api/migrations/0150_event_emergency_response_contact_email.py b/api/migrations/0150_event_emergency_response_contact_email.py index 069aff9cb..1bc41a725 100644 --- a/api/migrations/0150_event_emergency_response_contact_email.py +++ b/api/migrations/0150_event_emergency_response_contact_email.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0149_auto_20220318_0413'), + ("api", "0149_auto_20220318_0413"), ] operations = [ migrations.AddField( - model_name='event', - name='emergency_response_contact_email', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='emergency response contact email'), + model_name="event", + name="emergency_response_contact_email", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="emergency response contact email"), ), ] diff --git a/api/migrations/0151_merge_20220325_1027.py b/api/migrations/0151_merge_20220325_1027.py index 19f742a56..e07bbc8d0 100644 --- a/api/migrations/0151_merge_20220325_1027.py +++ b/api/migrations/0151_merge_20220325_1027.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0150_event_emergency_response_contact_email'), - ('api', '0150_admin2_admin2geoms'), + ("api", "0150_event_emergency_response_contact_email"), + ("api", "0150_admin2_admin2geoms"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0152_countryoffieldreporttoreview.py b/api/migrations/0152_countryoffieldreporttoreview.py index 3dde68355..4e6e9c9d8 100644 --- a/api/migrations/0152_countryoffieldreporttoreview.py +++ b/api/migrations/0152_countryoffieldreporttoreview.py @@ -1,24 +1,33 @@ # Generated by Django 2.2.27 on 2022-04-12 13:33 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0151_merge_20220325_1027'), + ("api", "0151_merge_20220325_1027"), ] operations = [ migrations.CreateModel( - name='CountryOfFieldReportToReview', + name="CountryOfFieldReportToReview", fields=[ - ('country', models.OneToOneField(on_delete=django.db.models.deletion.DO_NOTHING, primary_key=True, serialize=False, to='api.Country', verbose_name='country')), + ( + "country", + models.OneToOneField( + on_delete=django.db.models.deletion.DO_NOTHING, + primary_key=True, + serialize=False, + to="api.Country", + verbose_name="country", + ), + ), ], options={ - 'verbose_name': 'Country of Field Report to review', - 'verbose_name_plural': 'Countries of Field Report to review', + "verbose_name": "Country of Field Report to review", + "verbose_name_plural": "Countries of Field Report to review", }, ), ] diff --git a/api/migrations/0153_auto_20220510_0730.py b/api/migrations/0153_auto_20220510_0730.py index ebc6c5afb..09a2ad54e 100644 --- a/api/migrations/0153_auto_20220510_0730.py +++ b/api/migrations/0153_auto_20220510_0730.py @@ -6,13 +6,17 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0152_countryoffieldreporttoreview'), + ("api", "0152_countryoffieldreporttoreview"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='status', - field=models.IntegerField(choices=[(0, 'Unknown'), (2, 'Two'), (3, 'Three'), (8, 'Early Warning'), (9, 'Event-related'), (10, 'Ten')], default=0, verbose_name='type'), + model_name="fieldreport", + name="status", + field=models.IntegerField( + choices=[(0, "Unknown"), (2, "Two"), (3, "Three"), (8, "Early Warning"), (9, "Event-related"), (10, "Ten")], + default=0, + verbose_name="type", + ), ), ] diff --git a/api/migrations/0153_auto_20220513_0633.py b/api/migrations/0153_auto_20220513_0633.py index d0386ed4c..76097209c 100644 --- a/api/migrations/0153_auto_20220513_0633.py +++ b/api/migrations/0153_auto_20220513_0633.py @@ -7,18 +7,31 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0152_countryoffieldreporttoreview'), + ("api", "0152_countryoffieldreporttoreview"), ] operations = [ migrations.AlterField( - model_name='action', - name='organizations', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'RCRC'), ('FDRN', 'Federation'), ('GOV', 'Government')], max_length=4), blank=True, default=list, size=None, verbose_name='organizations'), + model_name="action", + name="organizations", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "RCRC"), ("FDRN", "Federation"), ("GOV", "Government")], + max_length=4, + ), + blank=True, + default=list, + size=None, + verbose_name="organizations", + ), ), migrations.AlterField( - model_name='actionstaken', - name='organization', - field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'RCRC'), ('FDRN', 'Federation'), ('GOV', 'Government')], max_length=16, verbose_name='organization'), + model_name="actionstaken", + name="organization", + field=models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "RCRC"), ("FDRN", "Federation"), ("GOV", "Government")], + max_length=16, + verbose_name="organization", + ), ), ] diff --git a/api/migrations/0154_merge_20220513_0934.py b/api/migrations/0154_merge_20220513_0934.py index 1c9e95396..ae3b1a15b 100644 --- a/api/migrations/0154_merge_20220513_0934.py +++ b/api/migrations/0154_merge_20220513_0934.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0153_auto_20220513_0633'), - ('api', '0153_auto_20220510_0730'), + ("api", "0153_auto_20220513_0633"), + ("api", "0153_auto_20220510_0730"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0155_auto_20220523_0824.py b/api/migrations/0155_auto_20220523_0824.py index db3071583..ebd4facfe 100644 --- a/api/migrations/0155_auto_20220523_0824.py +++ b/api/migrations/0155_auto_20220523_0824.py @@ -1,96 +1,195 @@ # Generated by Django 3.2 on 2022-05-23 08:24 -import api.utils +import re + import django.core.validators from django.db import migrations, models -import re + +import api.utils class Migration(migrations.Migration): dependencies = [ - ('api', '0154_merge_20220513_0934'), + ("api", "0154_merge_20220513_0934"), ] operations = [ migrations.AlterField( - model_name='country', - name='independent', - field=models.BooleanField(default=None, help_text='Is this an independent country?', null=True), - ), - migrations.AlterField( - model_name='country', - name='nsi_annual_fdrs_reporting', - field=models.BooleanField(blank=True, null=True, verbose_name='Annual Reporting to FDRS'), - ), - migrations.AlterField( - model_name='country', - name='nsi_cmc_dashboard_compliance', - field=models.BooleanField(blank=True, null=True, verbose_name='Complying with CMC Dashboard'), - ), - migrations.AlterField( - model_name='country', - name='nsi_domestically_generated_income', - field=models.BooleanField(blank=True, null=True, verbose_name='>50% Domestically Generated Income'), - ), - migrations.AlterField( - model_name='country', - name='nsi_gov_financial_support', - field=models.BooleanField(blank=True, null=True, verbose_name='Gov Financial Support'), - ), - migrations.AlterField( - model_name='country', - name='nsi_policy_implementation', - field=models.BooleanField(blank=True, null=True, verbose_name='Your Policy / Programme Implementation'), - ), - migrations.AlterField( - model_name='country', - name='nsi_risk_management_framework', - field=models.BooleanField(blank=True, null=True, verbose_name='Risk Management Framework'), - ), - migrations.AlterField( - model_name='event', - name='slug', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), 'Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.', 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), - ), - migrations.AlterField( - model_name='event', - name='slug_ar', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), 'Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.', 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), - ), - migrations.AlterField( - model_name='event', - name='slug_en', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), 'Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.', 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), - ), - migrations.AlterField( - model_name='event', - name='slug_es', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), 'Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.', 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), - ), - migrations.AlterField( - model_name='event', - name='slug_fr', - field=models.CharField(blank=True, default=None, help_text='Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.', max_length=50, null=True, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), 'Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.', 'invalid'), api.utils.validate_slug_number], verbose_name='slug'), - ), - migrations.AlterField( - model_name='fieldreport', - name='epi_figures_source', - field=models.IntegerField(blank=True, choices=[(0, 'Ministry of health'), (1, 'WHO'), (2, 'OTHER')], null=True, verbose_name='figures source (epidemic)'), - ), - migrations.AlterField( - model_name='fieldreport', - name='ns_request_assistance', - field=models.BooleanField(blank=True, default=None, null=True, verbose_name='NS request assistance'), - ), - migrations.AlterField( - model_name='fieldreport', - name='request_assistance', - field=models.BooleanField(blank=True, default=None, null=True, verbose_name='request assistance'), - ), - migrations.AlterField( - model_name='profile', - name='org_type', - field=models.CharField(blank=True, choices=[('NTLS', 'National Society'), ('DLGN', 'Delegation'), ('SCRT', 'Secretariat'), ('ICRC', 'ICRC'), ('OTHR', 'Other')], default='OTHR', max_length=4, verbose_name='organization type'), + model_name="country", + name="independent", + field=models.BooleanField(default=None, help_text="Is this an independent country?", null=True), + ), + migrations.AlterField( + model_name="country", + name="nsi_annual_fdrs_reporting", + field=models.BooleanField(blank=True, null=True, verbose_name="Annual Reporting to FDRS"), + ), + migrations.AlterField( + model_name="country", + name="nsi_cmc_dashboard_compliance", + field=models.BooleanField(blank=True, null=True, verbose_name="Complying with CMC Dashboard"), + ), + migrations.AlterField( + model_name="country", + name="nsi_domestically_generated_income", + field=models.BooleanField(blank=True, null=True, verbose_name=">50% Domestically Generated Income"), + ), + migrations.AlterField( + model_name="country", + name="nsi_gov_financial_support", + field=models.BooleanField(blank=True, null=True, verbose_name="Gov Financial Support"), + ), + migrations.AlterField( + model_name="country", + name="nsi_policy_implementation", + field=models.BooleanField(blank=True, null=True, verbose_name="Your Policy / Programme Implementation"), + ), + migrations.AlterField( + model_name="country", + name="nsi_risk_management_framework", + field=models.BooleanField(blank=True, null=True, verbose_name="Risk Management Framework"), + ), + migrations.AlterField( + model_name="event", + name="slug", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), + ), + migrations.AlterField( + model_name="event", + name="slug_ar", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), + ), + migrations.AlterField( + model_name="event", + name="slug_en", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), + ), + migrations.AlterField( + model_name="event", + name="slug_es", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), + ), + migrations.AlterField( + model_name="event", + name="slug_fr", + field=models.CharField( + blank=True, + default=None, + help_text="Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019. The string cannot start with a number and is forced to be lowercase. Recommend using hyphens over underscores. Special characters like # is not allowed.", + max_length=50, + null=True, + unique=True, + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + api.utils.validate_slug_number, + ], + verbose_name="slug", + ), + ), + migrations.AlterField( + model_name="fieldreport", + name="epi_figures_source", + field=models.IntegerField( + blank=True, + choices=[(0, "Ministry of health"), (1, "WHO"), (2, "OTHER")], + null=True, + verbose_name="figures source (epidemic)", + ), + ), + migrations.AlterField( + model_name="fieldreport", + name="ns_request_assistance", + field=models.BooleanField(blank=True, default=None, null=True, verbose_name="NS request assistance"), + ), + migrations.AlterField( + model_name="fieldreport", + name="request_assistance", + field=models.BooleanField(blank=True, default=None, null=True, verbose_name="request assistance"), + ), + migrations.AlterField( + model_name="profile", + name="org_type", + field=models.CharField( + blank=True, + choices=[ + ("NTLS", "National Society"), + ("DLGN", "Delegation"), + ("SCRT", "Secretariat"), + ("ICRC", "ICRC"), + ("OTHR", "Other"), + ], + default="OTHR", + max_length=4, + verbose_name="organization type", + ), ), ] diff --git a/api/migrations/0155_auto_20220621_0757.py b/api/migrations/0155_auto_20220621_0757.py index 68d3bc37e..36f0da80e 100644 --- a/api/migrations/0155_auto_20220621_0757.py +++ b/api/migrations/0155_auto_20220621_0757.py @@ -6,18 +6,22 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0155_auto_20220523_0824'), + ("api", "0155_auto_20220523_0824"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='health_min_num_assisted', - field=models.IntegerField(blank=True, help_text='not used any more', null=True, verbose_name='number of assisted (ministry of health)'), + model_name="fieldreport", + name="health_min_num_assisted", + field=models.IntegerField( + blank=True, help_text="not used any more", null=True, verbose_name="number of assisted (ministry of health)" + ), ), migrations.AlterField( - model_name='fieldreport', - name='who_num_assisted', - field=models.IntegerField(blank=True, help_text='not used any more', null=True, verbose_name='number of assisted (who)'), + model_name="fieldreport", + name="who_num_assisted", + field=models.IntegerField( + blank=True, help_text="not used any more", null=True, verbose_name="number of assisted (who)" + ), ), ] diff --git a/api/migrations/0156_appealfilter_comment.py b/api/migrations/0156_appealfilter_comment.py index f6af2f0ac..c29b51364 100644 --- a/api/migrations/0156_appealfilter_comment.py +++ b/api/migrations/0156_appealfilter_comment.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0155_auto_20220621_0757'), + ("api", "0155_auto_20220621_0757"), ] operations = [ migrations.AddField( - model_name='appealfilter', - name='notes', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="appealfilter", + name="notes", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), ] diff --git a/api/migrations/0157_event_image_and_summary_translations.py b/api/migrations/0157_event_image_and_summary_translations.py index f40f8330b..ac804fa0f 100644 --- a/api/migrations/0157_event_image_and_summary_translations.py +++ b/api/migrations/0157_event_image_and_summary_translations.py @@ -1,40 +1,41 @@ # Generated by Django 2.2.27 on 2022-09-06 09:46 -import api.models -from django.db import migrations, models import tinymce.models +from django.db import migrations, models + +import api.models class Migration(migrations.Migration): dependencies = [ - ('api', '0156_appealfilter_comment'), + ("api", "0156_appealfilter_comment"), ] operations = [ migrations.AddField( - model_name='event', - name='image', - field=models.ImageField(blank=True, null=True, upload_to=api.models.snippet_image_path, verbose_name='image'), + model_name="event", + name="image", + field=models.ImageField(blank=True, null=True, upload_to=api.models.snippet_image_path, verbose_name="image"), ), migrations.AddField( - model_name='event', - name='summary_ar', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='summary'), + model_name="event", + name="summary_ar", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="summary"), ), migrations.AddField( - model_name='event', - name='summary_en', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='summary'), + model_name="event", + name="summary_en", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="summary"), ), migrations.AddField( - model_name='event', - name='summary_es', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='summary'), + model_name="event", + name="summary_es", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="summary"), ), migrations.AddField( - model_name='event', - name='summary_fr', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='summary'), + model_name="event", + name="summary_fr", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="summary"), ), ] diff --git a/api/migrations/0158_alter_admin2geoms_geom.py b/api/migrations/0158_alter_admin2geoms_geom.py index ab5670f32..6a640c731 100644 --- a/api/migrations/0158_alter_admin2geoms_geom.py +++ b/api/migrations/0158_alter_admin2geoms_geom.py @@ -7,13 +7,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0157_event_image_and_summary_translations'), + ("api", "0157_event_image_and_summary_translations"), ] operations = [ migrations.AlterField( - model_name='admin2geoms', - name='geom', + model_name="admin2geoms", + name="geom", field=django.contrib.gis.db.models.fields.GeometryField(blank=True, null=True, srid=4326), ), ] diff --git a/api/migrations/0158_fieldreport_recent_affected.py b/api/migrations/0158_fieldreport_recent_affected.py index fcaa77620..53641e29a 100644 --- a/api/migrations/0158_fieldreport_recent_affected.py +++ b/api/migrations/0158_fieldreport_recent_affected.py @@ -6,22 +6,36 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0157_event_image_and_summary_translations'), + ("api", "0157_event_image_and_summary_translations"), ] operations = [ migrations.AddField( - model_name='fieldreport', - name='recent_affected', - field=models.IntegerField(choices=[(0, 'Unknown'), (1, 'Red Cross / Red Crescent'), (2, 'Government'), (3, 'Other'), (4, 'Red Cross / Red Crescent, potentially'), (5, 'Government, potentially'), (6, 'Other, potentially')], default=0, verbose_name='recent source of affected people'), + model_name="fieldreport", + name="recent_affected", + field=models.IntegerField( + choices=[ + (0, "Unknown"), + (1, "Red Cross / Red Crescent"), + (2, "Government"), + (3, "Other"), + (4, "Red Cross / Red Crescent, potentially"), + (5, "Government, potentially"), + (6, "Other, potentially"), + ], + default=0, + verbose_name="recent source of affected people", + ), ), migrations.RunSQL( - sql=[("update api_fieldreport set recent_affected=6 where other_num_potentially_affected>0"), - ("update api_fieldreport set recent_affected=5 where gov_num_potentially_affected>0"), - ("update api_fieldreport set recent_affected=4 where num_potentially_affected>0"), - ("update api_fieldreport set recent_affected=3 where other_num_affected>0"), - ("update api_fieldreport set recent_affected=2 where gov_num_affected>0"), - ("update api_fieldreport set recent_affected=1 where num_affected>0")], + sql=[ + ("update api_fieldreport set recent_affected=6 where other_num_potentially_affected>0"), + ("update api_fieldreport set recent_affected=5 where gov_num_potentially_affected>0"), + ("update api_fieldreport set recent_affected=4 where num_potentially_affected>0"), + ("update api_fieldreport set recent_affected=3 where other_num_affected>0"), + ("update api_fieldreport set recent_affected=2 where gov_num_affected>0"), + ("update api_fieldreport set recent_affected=1 where num_affected>0"), + ], reverse_sql=[("update api_fieldreport set recent_affected=0")], - ) + ), ] diff --git a/api/migrations/0159_auto_20221022_1542.py b/api/migrations/0159_auto_20221022_1542.py index a8dc5e79a..c5da3e3e8 100644 --- a/api/migrations/0159_auto_20221022_1542.py +++ b/api/migrations/0159_auto_20221022_1542.py @@ -6,18 +6,36 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0158_fieldreport_recent_affected'), + ("api", "0158_fieldreport_recent_affected"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='recent_affected', - field=models.IntegerField(choices=[(0, 'Unknown'), (1, 'Red Cross / Red Crescent'), (2, 'Government'), (3, 'Other'), (4, 'Red Cross / Red Crescent, potentially'), (5, 'Government, potentially'), (6, 'Other, potentially')], default=0, help_text='Key/value pairs', verbose_name='recent source of affected people'), + model_name="fieldreport", + name="recent_affected", + field=models.IntegerField( + choices=[ + (0, "Unknown"), + (1, "Red Cross / Red Crescent"), + (2, "Government"), + (3, "Other"), + (4, "Red Cross / Red Crescent, potentially"), + (5, "Government, potentially"), + (6, "Other, potentially"), + ], + default=0, + help_text='Key/value pairs', + verbose_name="recent source of affected people", + ), ), migrations.AlterField( - model_name='fieldreport', - name='status', - field=models.IntegerField(choices=[(0, 'Unknown'), (2, 'Two'), (3, 'Three'), (8, 'Early Warning'), (9, 'Event-related'), (10, 'Ten')], default=0, help_text='Key/value pairs', verbose_name='type'), + model_name="fieldreport", + name="status", + field=models.IntegerField( + choices=[(0, "Unknown"), (2, "Two"), (3, "Three"), (8, "Early Warning"), (9, "Event-related"), (10, "Ten")], + default=0, + help_text='Key/value pairs', + verbose_name="type", + ), ), ] diff --git a/api/migrations/0159_auto_20221028_0940.py b/api/migrations/0159_auto_20221028_0940.py index 641837a1e..ed400edfa 100644 --- a/api/migrations/0159_auto_20221028_0940.py +++ b/api/migrations/0159_auto_20221028_0940.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0158_alter_admin2geoms_geom'), + ("api", "0158_alter_admin2geoms_geom"), ] operations = [ migrations.AddField( - model_name='admin2', - name='alternate_name', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Alternate Name'), + model_name="admin2", + name="alternate_name", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Alternate Name"), ), migrations.AddField( - model_name='admin2', - name='alternate_name_code', - field=models.CharField(blank=True, max_length=10, null=True, verbose_name='Alternate Name Language Code'), + model_name="admin2", + name="alternate_name_code", + field=models.CharField(blank=True, max_length=10, null=True, verbose_name="Alternate Name Language Code"), ), migrations.AddField( - model_name='admin2', - name='local_name', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Local Name'), + model_name="admin2", + name="local_name", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="Local Name"), ), migrations.AddField( - model_name='admin2', - name='local_name_code', - field=models.CharField(blank=True, max_length=10, null=True, verbose_name='Local Name Language Code'), + model_name="admin2", + name="local_name_code", + field=models.CharField(blank=True, max_length=10, null=True, verbose_name="Local Name Language Code"), ), ] diff --git a/api/migrations/0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940.py b/api/migrations/0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940.py index 12e69aebf..71511ed4e 100644 --- a/api/migrations/0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940.py +++ b/api/migrations/0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0159_auto_20221022_1542'), - ('api', '0159_auto_20221028_0940'), + ("api", "0159_auto_20221022_1542"), + ("api", "0159_auto_20221028_0940"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0161_alter_event_options.py b/api/migrations/0161_alter_event_options.py index 3ff0e6ce9..f24e5d0ae 100644 --- a/api/migrations/0161_alter_event_options.py +++ b/api/migrations/0161_alter_event_options.py @@ -6,12 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940'), + ("api", "0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940"), ] operations = [ migrations.AlterModelOptions( - name='event', - options={'ordering': ('-disaster_start_date', 'id'), 'verbose_name': 'emergency', 'verbose_name_plural': 'emergencies'}, + name="event", + options={ + "ordering": ("-disaster_start_date", "id"), + "verbose_name": "emergency", + "verbose_name_plural": "emergencies", + }, ), ] diff --git a/api/migrations/0162_admin2_created_at.py b/api/migrations/0162_admin2_created_at.py index b2b7862ed..f87136ffb 100644 --- a/api/migrations/0162_admin2_created_at.py +++ b/api/migrations/0162_admin2_created_at.py @@ -1,20 +1,20 @@ # Generated by Django 3.2.18 on 2023-03-31 11:42 -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0161_alter_event_options'), + ("api", "0161_alter_event_options"), ] operations = [ migrations.AddField( - model_name='admin2', - name='created_at', - field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'), + model_name="admin2", + name="created_at", + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name="Created at"), preserve_default=False, ), ] diff --git a/api/migrations/0163_admin2_is_deprecated.py b/api/migrations/0163_admin2_is_deprecated.py index e27c0b665..6374f5712 100644 --- a/api/migrations/0163_admin2_is_deprecated.py +++ b/api/migrations/0163_admin2_is_deprecated.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0162_admin2_created_at'), + ("api", "0162_admin2_created_at"), ] operations = [ migrations.AddField( - model_name='admin2', - name='is_deprecated', - field=models.BooleanField(default=False, help_text='Is this a deprecated area?'), + model_name="admin2", + name="is_deprecated", + field=models.BooleanField(default=False, help_text="Is this a deprecated area?"), ), ] diff --git a/api/migrations/0163_auto_20230410_0720.py b/api/migrations/0163_auto_20230410_0720.py index a4b92ca2a..c15cc1aea 100644 --- a/api/migrations/0163_auto_20230410_0720.py +++ b/api/migrations/0163_auto_20230410_0720.py @@ -6,248 +6,440 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0162_admin2_created_at'), + ("api", "0162_admin2_created_at"), ] operations = [ migrations.AddField( - model_name='action', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='action', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='actionstaken', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='actionstaken', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='appeal', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='appeal', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='appealdocument', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='appealdocument', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='country', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='country', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='countrysnippet', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='countrysnippet', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='disastertype', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='disastertype', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='event', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='event', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='eventfeatureddocument', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='eventfeatureddocument', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='eventlink', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='eventlink', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='externalpartner', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='externalpartner', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='fieldreport', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='fieldreport', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='gdacsevent', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='gdacsevent', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='generaldocument', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='generaldocument', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='maincontact', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='maincontact', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='region', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='region', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='regionemergencysnippet', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='regionemergencysnippet', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='regionpreparednesssnippet', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='regionpreparednesssnippet', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='regionprofilesnippet', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='regionprofilesnippet', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='regionsnippet', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='regionsnippet', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='situationreport', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='situationreport', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='situationreporttype', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='situationreporttype', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='snippet', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='snippet', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='supportedactivity', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='supportedactivity', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="action", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="action", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="actionstaken", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="actionstaken", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="appeal", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="appeal", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="appealdocument", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="appealdocument", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="country", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="country", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="countrysnippet", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="countrysnippet", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="disastertype", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="disastertype", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="event", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="event", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="eventfeatureddocument", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="eventfeatureddocument", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="eventlink", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="eventlink", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="externalpartner", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="externalpartner", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="fieldreport", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="fieldreport", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="gdacsevent", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="gdacsevent", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="generaldocument", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="generaldocument", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="maincontact", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="maincontact", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="region", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="region", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="regionemergencysnippet", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="regionemergencysnippet", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="regionpreparednesssnippet", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="regionpreparednesssnippet", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="regionprofilesnippet", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="regionprofilesnippet", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="regionsnippet", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="regionsnippet", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="situationreport", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="situationreport", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="situationreporttype", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="situationreporttype", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="snippet", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="snippet", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="supportedactivity", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="supportedactivity", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/api/migrations/0164_appealdocumenttype.py b/api/migrations/0164_appealdocumenttype.py index c120c17ed..e206e4ed6 100644 --- a/api/migrations/0164_appealdocumenttype.py +++ b/api/migrations/0164_appealdocumenttype.py @@ -6,21 +6,21 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0163_admin2_is_deprecated'), + ("api", "0163_admin2_is_deprecated"), ] operations = [ migrations.CreateModel( - name='AppealDocumentType', + name="AppealDocumentType", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, verbose_name='name')), - ('public_site_or_fednet', models.BooleanField(default=False, verbose_name='Sourced by FedNet?')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=100, verbose_name="name")), + ("public_site_or_fednet", models.BooleanField(default=False, verbose_name="Sourced by FedNet?")), ], options={ - 'verbose_name': 'appeal document type', - 'verbose_name_plural': 'appeal document types', - 'ordering': ('name',), + "verbose_name": "appeal document type", + "verbose_name_plural": "appeal document types", + "ordering": ("name",), }, ), ] diff --git a/api/migrations/0164_merge_20230419_0524.py b/api/migrations/0164_merge_20230419_0524.py index aeca6f5ff..a213cf46c 100644 --- a/api/migrations/0164_merge_20230419_0524.py +++ b/api/migrations/0164_merge_20230419_0524.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0163_admin2_is_deprecated'), - ('api', '0163_auto_20230410_0720'), + ("api", "0163_admin2_is_deprecated"), + ("api", "0163_auto_20230410_0720"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0165_auto_20230424_1725.py b/api/migrations/0165_auto_20230424_1725.py index cc7d0a17e..9a1a81277 100644 --- a/api/migrations/0165_auto_20230424_1725.py +++ b/api/migrations/0165_auto_20230424_1725.py @@ -1,13 +1,13 @@ # Generated by Django 3.2.18 on 2023-04-24 17:25 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0164_appealdocumenttype'), + ("api", "0164_appealdocumenttype"), ] operations = [ @@ -16,18 +16,27 @@ class Migration(migrations.Migration): reverse_sql=[("update api_country set iso3=null where iso3='';")], ), migrations.AddField( - model_name='appealdocument', - name='description', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='description'), + model_name="appealdocument", + name="description", + field=models.CharField(blank=True, max_length=200, null=True, verbose_name="description"), ), migrations.AddField( - model_name='appealdocument', - name='type', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.appealdocumenttype', verbose_name='type'), + model_name="appealdocument", + name="type", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.appealdocumenttype", verbose_name="type" + ), ), migrations.AlterField( - model_name='country', - name='iso3', - field=models.CharField(blank=True, max_length=3, null=True, unique=True, validators=[django.core.validators.RegexValidator('^[A-Z]*$', 'ISO must be uppercase')], verbose_name='ISO3'), + model_name="country", + name="iso3", + field=models.CharField( + blank=True, + max_length=3, + null=True, + unique=True, + validators=[django.core.validators.RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + verbose_name="ISO3", + ), ), ] diff --git a/api/migrations/0166_auto_20230424_1742.py b/api/migrations/0166_auto_20230424_1742.py index 59d4ac198..84d2140a1 100644 --- a/api/migrations/0166_auto_20230424_1742.py +++ b/api/migrations/0166_auto_20230424_1742.py @@ -1,20 +1,27 @@ # Generated by Django 3.2.18 on 2023-04-24 17:42 import django.core.validators -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0165_auto_20230424_1725'), + ("api", "0165_auto_20230424_1725"), ] operations = [ migrations.AddField( - model_name='appealdocument', - name='iso3', - field=models.ForeignKey(db_column='iso3', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.country', to_field='iso3', verbose_name='iso3'), + model_name="appealdocument", + name="iso3", + field=models.ForeignKey( + db_column="iso3", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.country", + to_field="iso3", + verbose_name="iso3", + ), ), ] diff --git a/api/migrations/0167_alter_appealdocument_iso3.py b/api/migrations/0167_alter_appealdocument_iso3.py index ab0f31db3..15b88f2a9 100644 --- a/api/migrations/0167_alter_appealdocument_iso3.py +++ b/api/migrations/0167_alter_appealdocument_iso3.py @@ -1,19 +1,26 @@ # Generated by Django 3.2.18 on 2023-04-25 06:47 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0166_auto_20230424_1742'), + ("api", "0166_auto_20230424_1742"), ] operations = [ migrations.AlterField( - model_name='appealdocument', - name='iso3', - field=models.ForeignKey(db_column='iso3', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.country', to_field='iso3', verbose_name='location'), + model_name="appealdocument", + name="iso3", + field=models.ForeignKey( + db_column="iso3", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.country", + to_field="iso3", + verbose_name="location", + ), ), ] diff --git a/api/migrations/0168_alter_country_iso.py b/api/migrations/0168_alter_country_iso.py index 703a415e8..a639f1773 100644 --- a/api/migrations/0168_alter_country_iso.py +++ b/api/migrations/0168_alter_country_iso.py @@ -7,7 +7,7 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0167_alter_appealdocument_iso3'), + ("api", "0167_alter_appealdocument_iso3"), ] operations = [ @@ -16,8 +16,15 @@ class Migration(migrations.Migration): reverse_sql=[("update api_country set iso=null where iso='';")], ), migrations.AlterField( - model_name='country', - name='iso', - field=models.CharField(blank=True, max_length=2, null=True, unique=True, validators=[django.core.validators.RegexValidator('^[A-Z]*$', 'ISO must be uppercase')], verbose_name='ISO'), + model_name="country", + name="iso", + field=models.CharField( + blank=True, + max_length=2, + null=True, + unique=True, + validators=[django.core.validators.RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + verbose_name="ISO", + ), ), ] diff --git a/api/migrations/0169_auto_20230425_1120.py b/api/migrations/0169_auto_20230425_1120.py index d3712cb0f..ecc912093 100644 --- a/api/migrations/0169_auto_20230425_1120.py +++ b/api/migrations/0169_auto_20230425_1120.py @@ -1,23 +1,30 @@ # Generated by Django 3.2.18 on 2023-04-25 11:20 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0168_alter_country_iso'), + ("api", "0168_alter_country_iso"), ] operations = [ migrations.RemoveField( - model_name='appealdocument', - name='iso3', + model_name="appealdocument", + name="iso3", ), migrations.AddField( - model_name='appealdocument', - name='iso', - field=models.ForeignKey(db_column='iso', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.country', to_field='iso', verbose_name='location'), + model_name="appealdocument", + name="iso", + field=models.ForeignKey( + db_column="iso", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.country", + to_field="iso", + verbose_name="location", + ), ), ] diff --git a/api/migrations/0170_merge_0163_auto_20230410_0720_0169_auto_20230425_1120.py b/api/migrations/0170_merge_0163_auto_20230410_0720_0169_auto_20230425_1120.py index 7aff631cd..dd2d2c492 100644 --- a/api/migrations/0170_merge_0163_auto_20230410_0720_0169_auto_20230425_1120.py +++ b/api/migrations/0170_merge_0163_auto_20230410_0720_0169_auto_20230425_1120.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0163_auto_20230410_0720'), - ('api', '0169_auto_20230425_1120'), + ("api", "0163_auto_20230410_0720"), + ("api", "0169_auto_20230425_1120"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0171_merge_20230614_0818.py b/api/migrations/0171_merge_20230614_0818.py index 421ffa00e..998bf2ca5 100644 --- a/api/migrations/0171_merge_20230614_0818.py +++ b/api/migrations/0171_merge_20230614_0818.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0164_merge_20230419_0524'), - ('api', '0170_merge_0163_auto_20230410_0720_0169_auto_20230425_1120'), + ("api", "0164_merge_20230419_0524"), + ("api", "0170_merge_0163_auto_20230410_0720_0169_auto_20230425_1120"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0172_alter_fieldreport_status.py b/api/migrations/0172_alter_fieldreport_status.py index b872c31c7..6de3aa75a 100644 --- a/api/migrations/0172_alter_fieldreport_status.py +++ b/api/migrations/0172_alter_fieldreport_status.py @@ -6,13 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0171_merge_20230614_0818'), + ("api", "0171_merge_20230614_0818"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='status', - field=models.IntegerField(choices=[(0, 'Unknown'), (2, 'Two'), (3, 'Three'), (8, 'Early Warning / Early Action'), (9, 'Event-related'), (10, 'Event')], default=0, help_text='Key/value pairs', verbose_name='type'), + model_name="fieldreport", + name="status", + field=models.IntegerField( + choices=[ + (0, "Unknown"), + (2, "Two"), + (3, "Three"), + (8, "Early Warning / Early Action"), + (9, "Event-related"), + (10, "Event"), + ], + default=0, + help_text='Key/value pairs', + verbose_name="type", + ), ), ] diff --git a/api/migrations/0173_export.py b/api/migrations/0173_export.py index b0df53b49..564b97e29 100644 --- a/api/migrations/0173_export.py +++ b/api/migrations/0173_export.py @@ -1,26 +1,32 @@ # Generated by Django 3.2.20 on 2023-08-29 08:10 -from django.db import migrations, models import uuid +from django.db import migrations, models + class Migration(migrations.Migration): dependencies = [ - ('api', '0172_alter_fieldreport_status'), + ("api", "0172_alter_fieldreport_status"), ] operations = [ migrations.CreateModel( - name='Export', + name="Export", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('url', models.URLField(max_length=255, verbose_name='Url')), - ('token', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), - ('requested_at', models.DateTimeField(blank=True, null=True, verbose_name='Requested At')), - ('completed_at', models.DateTimeField(blank=True, null=True, verbose_name='Completed At')), - ('status', models.IntegerField(choices=[(0, 'Pending'), (1, 'Completed'), (2, 'Errored')], default=0, verbose_name='Status')), - ('pdf_file', models.FileField(blank=True, max_length=255, null=True, upload_to='', verbose_name='Pdf File')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("url", models.URLField(max_length=255, verbose_name="Url")), + ("token", models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ("requested_at", models.DateTimeField(blank=True, null=True, verbose_name="Requested At")), + ("completed_at", models.DateTimeField(blank=True, null=True, verbose_name="Completed At")), + ( + "status", + models.IntegerField( + choices=[(0, "Pending"), (1, "Completed"), (2, "Errored")], default=0, verbose_name="Status" + ), + ), + ("pdf_file", models.FileField(blank=True, max_length=255, null=True, upload_to="", verbose_name="Pdf File")), ], ), ] diff --git a/api/migrations/0174_alter_export_pdf_file.py b/api/migrations/0174_alter_export_pdf_file.py index 0ef1a7fe2..7ea8e5613 100644 --- a/api/migrations/0174_alter_export_pdf_file.py +++ b/api/migrations/0174_alter_export_pdf_file.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0173_export'), + ("api", "0173_export"), ] operations = [ migrations.AlterField( - model_name='export', - name='pdf_file', - field=models.FileField(blank=True, max_length=255, null=True, upload_to='pdf-export/', verbose_name='Pdf File'), + model_name="export", + name="pdf_file", + field=models.FileField(blank=True, max_length=255, null=True, upload_to="pdf-export/", verbose_name="Pdf File"), ), ] diff --git a/api/migrations/0175_export_selector.py b/api/migrations/0175_export_selector.py index 64600e215..2007c23d6 100644 --- a/api/migrations/0175_export_selector.py +++ b/api/migrations/0175_export_selector.py @@ -1,20 +1,20 @@ # Generated by Django 3.2.20 on 2023-08-30 06:04 -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0174_alter_export_pdf_file'), + ("api", "0174_alter_export_pdf_file"), ] operations = [ migrations.AddField( - model_name='export', - name='selector', - field=models.CharField(default=django.utils.timezone.now, max_length=255, verbose_name='Selector'), + model_name="export", + name="selector", + field=models.CharField(default=django.utils.timezone.now, max_length=255, verbose_name="Selector"), preserve_default=False, ), ] diff --git a/api/migrations/0176_auto_20230906_0446.py b/api/migrations/0176_auto_20230906_0446.py index 81e2cef6d..42fa381ea 100644 --- a/api/migrations/0176_auto_20230906_0446.py +++ b/api/migrations/0176_auto_20230906_0446.py @@ -1,12 +1,14 @@ # Generated by Django 3.2.20 on 2023-09-06 04:46 from django.db import migrations, models + from api.management.commands.triggers_to_db import Command as CustomTriggerDbCommand + class Migration(migrations.Migration): dependencies = [ - ('api', '0175_export_selector'), + ("api", "0175_export_selector"), ] operations = [ @@ -15,14 +17,14 @@ class Migration(migrations.Migration): reverse_code=CustomTriggerDbCommand.apply, ), migrations.AlterField( - model_name='appeal', - name='amount_funded', - field=models.FloatField(default=0.0, verbose_name='amount funded'), + model_name="appeal", + name="amount_funded", + field=models.FloatField(default=0.0, verbose_name="amount funded"), ), migrations.AlterField( - model_name='appeal', - name='amount_requested', - field=models.FloatField(default=0.0, verbose_name='amount requested'), + model_name="appeal", + name="amount_requested", + field=models.FloatField(default=0.0, verbose_name="amount requested"), ), migrations.RunPython( CustomTriggerDbCommand.apply, diff --git a/api/migrations/0177_alter_export_selector.py b/api/migrations/0177_alter_export_selector.py index 0f64cc37d..9db967956 100644 --- a/api/migrations/0177_alter_export_selector.py +++ b/api/migrations/0177_alter_export_selector.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0176_auto_20230906_0446'), + ("api", "0176_auto_20230906_0446"), ] operations = [ migrations.AlterField( - model_name='export', - name='selector', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Selector'), + model_name="export", + name="selector", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Selector"), ), ] diff --git a/api/migrations/0178_auto_20230911_0923.py b/api/migrations/0178_auto_20230911_0923.py index 4ef41987e..fdfd428be 100644 --- a/api/migrations/0178_auto_20230911_0923.py +++ b/api/migrations/0178_auto_20230911_0923.py @@ -1,39 +1,50 @@ # Generated by Django 3.2.20 on 2023-09-11 09:23 -from django.conf import settings -from django.db import migrations, models import django.db.models.deletion import django.utils.timezone +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('api', '0177_alter_export_selector'), + ("api", "0177_alter_export_selector"), ] operations = [ migrations.AddField( - model_name='export', - name='export_id', - field=models.IntegerField(default=1, verbose_name='Export Id'), + model_name="export", + name="export_id", + field=models.IntegerField(default=1, verbose_name="Export Id"), preserve_default=False, ), migrations.AddField( - model_name='export', - name='export_type', - field=models.CharField(choices=[('dref-applications', 'Dref Applications')], default=django.utils.timezone.now, max_length=255, verbose_name='Export Type'), + model_name="export", + name="export_type", + field=models.CharField( + choices=[("dref-applications", "Dref Applications")], + default=django.utils.timezone.now, + max_length=255, + verbose_name="Export Type", + ), preserve_default=False, ), migrations.AddField( - model_name='export', - name='requested_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="export", + name="requested_by", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), migrations.AlterField( - model_name='export', - name='url', - field=models.URLField(blank=True, max_length=255, null=True, verbose_name='Url'), + model_name="export", + name="url", + field=models.URLField(blank=True, max_length=255, null=True, verbose_name="Url"), ), ] diff --git a/api/migrations/0179_alter_export_export_type.py b/api/migrations/0179_alter_export_export_type.py index afc78affe..d0ead8257 100644 --- a/api/migrations/0179_alter_export_export_type.py +++ b/api/migrations/0179_alter_export_export_type.py @@ -6,13 +6,21 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0178_auto_20230911_0923'), + ("api", "0178_auto_20230911_0923"), ] operations = [ migrations.AlterField( - model_name='export', - name='export_type', - field=models.CharField(choices=[('dref-applications', 'Dref Applications'), ('dref-ops-updates', 'Dref Operational Updates'), ('dref-final-reports', 'Dref Final Reports')], max_length=255, verbose_name='Export Type'), + model_name="export", + name="export_type", + field=models.CharField( + choices=[ + ("dref-applications", "Dref Applications"), + ("dref-ops-updates", "Dref Operational Updates"), + ("dref-final-reports", "Dref Final Reports"), + ], + max_length=255, + verbose_name="Export Type", + ), ), ] diff --git a/api/migrations/0180_auto_20230913_0433.py b/api/migrations/0180_auto_20230913_0433.py index 60b1dc23c..555dd9dbe 100644 --- a/api/migrations/0180_auto_20230913_0433.py +++ b/api/migrations/0180_auto_20230913_0433.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0179_alter_export_export_type'), + ("api", "0179_alter_export_export_type"), ] operations = [ migrations.AlterField( - model_name='appealhistory', - name='amount_funded', - field=models.FloatField(default=0.0, verbose_name='amount funded'), + model_name="appealhistory", + name="amount_funded", + field=models.FloatField(default=0.0, verbose_name="amount funded"), ), migrations.AlterField( - model_name='appealhistory', - name='amount_requested', - field=models.FloatField(default=0.0, verbose_name='amount requested'), + model_name="appealhistory", + name="amount_requested", + field=models.FloatField(default=0.0, verbose_name="amount requested"), ), ] diff --git a/api/migrations/0181_auto_20230914_1026.py b/api/migrations/0181_auto_20230914_1026.py index 8bd5e65aa..d828816ec 100644 --- a/api/migrations/0181_auto_20230914_1026.py +++ b/api/migrations/0181_auto_20230914_1026.py @@ -6,43 +6,72 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0180_auto_20230913_0433'), + ("api", "0180_auto_20230913_0433"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='appeal', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, null=True, verbose_name='appeal'), + model_name="fieldreport", + name="appeal", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], + default=0, + null=True, + verbose_name="appeal", + ), ), migrations.AlterField( - model_name='fieldreport', - name='bulletin', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, null=True, verbose_name='bulletin'), + model_name="fieldreport", + name="bulletin", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], + default=0, + null=True, + verbose_name="bulletin", + ), ), migrations.AlterField( - model_name='fieldreport', - name='dref', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, null=True, verbose_name='DREF'), + model_name="fieldreport", + name="dref", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], default=0, null=True, verbose_name="DREF" + ), ), migrations.AlterField( - model_name='fieldreport', - name='fact', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, null=True, verbose_name='fact'), + model_name="fieldreport", + name="fact", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], default=0, null=True, verbose_name="fact" + ), ), migrations.AlterField( - model_name='fieldreport', - name='forecast_based_action', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, null=True, verbose_name='forecast based action'), + model_name="fieldreport", + name="forecast_based_action", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], + default=0, + null=True, + verbose_name="forecast based action", + ), ), migrations.AlterField( - model_name='fieldreport', - name='ifrc_staff', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, null=True, verbose_name='IFRC staff'), + model_name="fieldreport", + name="ifrc_staff", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], + default=0, + null=True, + verbose_name="IFRC staff", + ), ), migrations.AlterField( - model_name='fieldreport', - name='imminent_dref', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, null=True, verbose_name='imminent dref'), + model_name="fieldreport", + name="imminent_dref", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], + default=0, + null=True, + verbose_name="imminent dref", + ), ), ] diff --git a/api/migrations/0182_alter_export_export_type.py b/api/migrations/0182_alter_export_export_type.py index c598f56eb..ec50135c7 100644 --- a/api/migrations/0182_alter_export_export_type.py +++ b/api/migrations/0182_alter_export_export_type.py @@ -6,13 +6,21 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0181_auto_20230914_1026'), + ("api", "0181_auto_20230914_1026"), ] operations = [ migrations.AlterField( - model_name='export', - name='export_type', - field=models.CharField(choices=[('dref-applications', 'Dref Applications'), ('dref-operational-updates', 'Dref Operational Updates'), ('dref-final-reports', 'Dref Final Reports')], max_length=255, verbose_name='Export Type'), + model_name="export", + name="export_type", + field=models.CharField( + choices=[ + ("dref-applications", "Dref Applications"), + ("dref-operational-updates", "Dref Operational Updates"), + ("dref-final-reports", "Dref Final Reports"), + ], + max_length=255, + verbose_name="Export Type", + ), ), ] diff --git a/api/migrations/0183_auto_20230928_0635.py b/api/migrations/0183_auto_20230928_0635.py index 5b48ba593..4b7d0c9ff 100644 --- a/api/migrations/0183_auto_20230928_0635.py +++ b/api/migrations/0183_auto_20230928_0635.py @@ -6,148 +6,164 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0182_alter_export_export_type'), + ("api", "0182_alter_export_export_type"), ] operations = [ migrations.AddField( - model_name='fieldreportcontact', - name='ctype_ar', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='type'), + model_name="fieldreportcontact", + name="ctype_ar", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="type"), ), migrations.AddField( - model_name='fieldreportcontact', - name='ctype_en', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='type'), + model_name="fieldreportcontact", + name="ctype_en", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="type"), ), migrations.AddField( - model_name='fieldreportcontact', - name='ctype_es', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='type'), + model_name="fieldreportcontact", + name="ctype_es", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="type"), ), migrations.AddField( - model_name='fieldreportcontact', - name='ctype_fr', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='type'), + model_name="fieldreportcontact", + name="ctype_fr", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="type"), ), migrations.AddField( - model_name='fieldreportcontact', - name='email_ar', - field=models.CharField(max_length=300, null=True, verbose_name='email'), + model_name="fieldreportcontact", + name="email_ar", + field=models.CharField(max_length=300, null=True, verbose_name="email"), ), migrations.AddField( - model_name='fieldreportcontact', - name='email_en', - field=models.CharField(max_length=300, null=True, verbose_name='email'), + model_name="fieldreportcontact", + name="email_en", + field=models.CharField(max_length=300, null=True, verbose_name="email"), ), migrations.AddField( - model_name='fieldreportcontact', - name='email_es', - field=models.CharField(max_length=300, null=True, verbose_name='email'), + model_name="fieldreportcontact", + name="email_es", + field=models.CharField(max_length=300, null=True, verbose_name="email"), ), migrations.AddField( - model_name='fieldreportcontact', - name='email_fr', - field=models.CharField(max_length=300, null=True, verbose_name='email'), + model_name="fieldreportcontact", + name="email_fr", + field=models.CharField(max_length=300, null=True, verbose_name="email"), ), migrations.AddField( - model_name='fieldreportcontact', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="fieldreportcontact", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='fieldreportcontact', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="fieldreportcontact", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='fieldreportcontact', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="fieldreportcontact", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='fieldreportcontact', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="fieldreportcontact", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='fieldreportcontact', - name='phone_ar', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='phone'), + model_name="fieldreportcontact", + name="phone_ar", + field=models.CharField(blank=True, max_length=50, null=True, verbose_name="phone"), ), migrations.AddField( - model_name='fieldreportcontact', - name='phone_en', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='phone'), + model_name="fieldreportcontact", + name="phone_en", + field=models.CharField(blank=True, max_length=50, null=True, verbose_name="phone"), ), migrations.AddField( - model_name='fieldreportcontact', - name='phone_es', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='phone'), + model_name="fieldreportcontact", + name="phone_es", + field=models.CharField(blank=True, max_length=50, null=True, verbose_name="phone"), ), migrations.AddField( - model_name='fieldreportcontact', - name='phone_fr', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='phone'), + model_name="fieldreportcontact", + name="phone_fr", + field=models.CharField(blank=True, max_length=50, null=True, verbose_name="phone"), ), migrations.AddField( - model_name='fieldreportcontact', - name='title_ar', - field=models.CharField(max_length=300, null=True, verbose_name='title'), + model_name="fieldreportcontact", + name="title_ar", + field=models.CharField(max_length=300, null=True, verbose_name="title"), ), migrations.AddField( - model_name='fieldreportcontact', - name='title_en', - field=models.CharField(max_length=300, null=True, verbose_name='title'), + model_name="fieldreportcontact", + name="title_en", + field=models.CharField(max_length=300, null=True, verbose_name="title"), ), migrations.AddField( - model_name='fieldreportcontact', - name='title_es', - field=models.CharField(max_length=300, null=True, verbose_name='title'), + model_name="fieldreportcontact", + name="title_es", + field=models.CharField(max_length=300, null=True, verbose_name="title"), ), migrations.AddField( - model_name='fieldreportcontact', - name='title_fr', - field=models.CharField(max_length=300, null=True, verbose_name='title'), + model_name="fieldreportcontact", + name="title_fr", + field=models.CharField(max_length=300, null=True, verbose_name="title"), ), migrations.AddField( - model_name='fieldreportcontact', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="fieldreportcontact", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='fieldreportcontact', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="fieldreportcontact", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='source', - name='spec_ar', - field=models.TextField(blank=True, null=True, verbose_name='spec'), + model_name="source", + name="spec_ar", + field=models.TextField(blank=True, null=True, verbose_name="spec"), ), migrations.AddField( - model_name='source', - name='spec_en', - field=models.TextField(blank=True, null=True, verbose_name='spec'), + model_name="source", + name="spec_en", + field=models.TextField(blank=True, null=True, verbose_name="spec"), ), migrations.AddField( - model_name='source', - name='spec_es', - field=models.TextField(blank=True, null=True, verbose_name='spec'), + model_name="source", + name="spec_es", + field=models.TextField(blank=True, null=True, verbose_name="spec"), ), migrations.AddField( - model_name='source', - name='spec_fr', - field=models.TextField(blank=True, null=True, verbose_name='spec'), + model_name="source", + name="spec_fr", + field=models.TextField(blank=True, null=True, verbose_name="spec"), ), migrations.AddField( - model_name='source', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="source", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='source', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="source", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/api/migrations/0184_auto_20231004_0756.py b/api/migrations/0184_auto_20231004_0756.py index 1a0b2bb0f..aa58d9e0d 100644 --- a/api/migrations/0184_auto_20231004_0756.py +++ b/api/migrations/0184_auto_20231004_0756.py @@ -6,96 +6,96 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0183_auto_20230928_0635'), + ("api", "0183_auto_20230928_0635"), ] operations = [ migrations.RemoveField( - model_name='fieldreportcontact', - name='ctype_ar', + model_name="fieldreportcontact", + name="ctype_ar", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='ctype_en', + model_name="fieldreportcontact", + name="ctype_en", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='ctype_es', + model_name="fieldreportcontact", + name="ctype_es", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='ctype_fr', + model_name="fieldreportcontact", + name="ctype_fr", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='email_ar', + model_name="fieldreportcontact", + name="email_ar", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='email_en', + model_name="fieldreportcontact", + name="email_en", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='email_es', + model_name="fieldreportcontact", + name="email_es", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='email_fr', + model_name="fieldreportcontact", + name="email_fr", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='name_ar', + model_name="fieldreportcontact", + name="name_ar", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='name_en', + model_name="fieldreportcontact", + name="name_en", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='name_es', + model_name="fieldreportcontact", + name="name_es", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='name_fr', + model_name="fieldreportcontact", + name="name_fr", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='phone_ar', + model_name="fieldreportcontact", + name="phone_ar", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='phone_en', + model_name="fieldreportcontact", + name="phone_en", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='phone_es', + model_name="fieldreportcontact", + name="phone_es", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='phone_fr', + model_name="fieldreportcontact", + name="phone_fr", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='title_ar', + model_name="fieldreportcontact", + name="title_ar", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='title_en', + model_name="fieldreportcontact", + name="title_en", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='title_es', + model_name="fieldreportcontact", + name="title_es", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='title_fr', + model_name="fieldreportcontact", + name="title_fr", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='translation_module_original_language', + model_name="fieldreportcontact", + name="translation_module_original_language", ), migrations.RemoveField( - model_name='fieldreportcontact', - name='translation_module_skip_auto_translation', + model_name="fieldreportcontact", + name="translation_module_skip_auto_translation", ), ] diff --git a/api/migrations/0185_alter_fieldreport_status.py b/api/migrations/0185_alter_fieldreport_status.py index 2f4282787..d2c60c8e2 100644 --- a/api/migrations/0185_alter_fieldreport_status.py +++ b/api/migrations/0185_alter_fieldreport_status.py @@ -6,13 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0184_auto_20231004_0756'), + ("api", "0184_auto_20231004_0756"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='status', - field=models.IntegerField(choices=[(0, 'Unknown'), (2, 'Two'), (3, 'Three'), (8, 'Early Warning / Early Action'), (9, 'Event'), (10, 'Ten')], default=0, help_text='Key/value pairs', verbose_name='type'), + model_name="fieldreport", + name="status", + field=models.IntegerField( + choices=[ + (0, "Unknown"), + (2, "Two"), + (3, "Three"), + (8, "Early Warning / Early Action"), + (9, "Event"), + (10, "Ten"), + ], + default=0, + help_text='Key/value pairs', + verbose_name="type", + ), ), ] diff --git a/api/migrations/0186_auto_20231103_0904.py b/api/migrations/0186_auto_20231103_0904.py index 4c033085f..da8527e0a 100644 --- a/api/migrations/0186_auto_20231103_0904.py +++ b/api/migrations/0186_auto_20231103_0904.py @@ -6,263 +6,297 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0185_alter_fieldreport_status'), + ("api", "0185_alter_fieldreport_status"), ] operations = [ migrations.AlterField( - model_name='fieldreport', - name='gov_affected_pop_centres', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='affected population centres (government)'), + model_name="fieldreport", + name="gov_affected_pop_centres", + field=models.CharField( + blank=True, max_length=512, null=True, verbose_name="affected population centres (government)" + ), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of affected (government)'), + model_name="fieldreport", + name="gov_num_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of affected (government)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of assisted (government)'), + model_name="fieldreport", + name="gov_num_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of assisted (government)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_dead', - field=models.IntegerField(blank=True, null=True, verbose_name='number of dead (government)'), + model_name="fieldreport", + name="gov_num_dead", + field=models.IntegerField(blank=True, null=True, verbose_name="number of dead (government)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_displaced', - field=models.IntegerField(blank=True, null=True, verbose_name='number of displaced (government)'), + model_name="fieldreport", + name="gov_num_displaced", + field=models.IntegerField(blank=True, null=True, verbose_name="number of displaced (government)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_highest_risk', - field=models.IntegerField(blank=True, null=True, verbose_name='people at highest risk (government)'), + model_name="fieldreport", + name="gov_num_highest_risk", + field=models.IntegerField(blank=True, null=True, verbose_name="people at highest risk (government)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_injured', - field=models.IntegerField(blank=True, null=True, verbose_name='number of injured (government)'), + model_name="fieldreport", + name="gov_num_injured", + field=models.IntegerField(blank=True, null=True, verbose_name="number of injured (government)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_missing', - field=models.IntegerField(blank=True, null=True, verbose_name='number of missing (government)'), + model_name="fieldreport", + name="gov_num_missing", + field=models.IntegerField(blank=True, null=True, verbose_name="number of missing (government)"), ), migrations.AlterField( - model_name='fieldreport', - name='gov_num_potentially_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='potentially affected (government)'), + model_name="fieldreport", + name="gov_num_potentially_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="potentially affected (government)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs female'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs female"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs male'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs male"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic people reached'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic people reached"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic people targeted'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='livelihoods_and_basic_needs_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs requirements'), + model_name="emergencyoperationsdataset", + name="livelihoods_and_basic_needs_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs requirements"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_female', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs female (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_female", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihoods and basic needs female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_male', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs male (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_male", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihoods and basic needs male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs people reached (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs people targeted (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_people_targeted", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs people targeted (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsdataset', - name='raw_livelihoods_and_basic_needs_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs requirements (raw)'), + model_name="emergencyoperationsdataset", + name="raw_livelihoods_and_basic_needs_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs female'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs female"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs male'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs male"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic people reached'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic people reached"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic people targeted'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic people targeted"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='livelihoods_and_basic_needs_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs requirements'), + model_name="emergencyoperationsea", + name="livelihoods_and_basic_needs_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs requirements"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_female', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs female (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_female", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihoods and basic needs female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_male', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs male (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_male", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihoods and basic needs male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs people reached (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_people_targeted', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs people targeted (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_people_targeted", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs people targeted (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsea', - name='raw_livelihoods_and_basic_needs_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs requirements (raw)'), + model_name="emergencyoperationsea", + name="raw_livelihoods_and_basic_needs_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='livelihoods_and_basic_needs_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs female'), + model_name="emergencyoperationsfr", + name="livelihoods_and_basic_needs_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs female"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='livelihoods_and_basic_needs_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs male'), + model_name="emergencyoperationsfr", + name="livelihoods_and_basic_needs_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs male"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='livelihoods_and_basic_needs_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic people reached'), + model_name="emergencyoperationsfr", + name="livelihoods_and_basic_needs_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic people reached"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='livelihoods_and_basic_needs_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs requirements'), + model_name="emergencyoperationsfr", + name="livelihoods_and_basic_needs_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs requirements"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_livelihoods_and_basic_needs_female', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs female (raw)'), + model_name="emergencyoperationsfr", + name="raw_livelihoods_and_basic_needs_female", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihoods and basic needs female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_livelihoods_and_basic_needs_male', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs male (raw)'), + model_name="emergencyoperationsfr", + name="raw_livelihoods_and_basic_needs_male", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihoods and basic needs male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_livelihoods_and_basic_needs_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs people reached (raw)'), + model_name="emergencyoperationsfr", + name="raw_livelihoods_and_basic_needs_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationsfr', - name='raw_livelihoods_and_basic_needs_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs requirements (raw)'), + model_name="emergencyoperationsfr", + name="raw_livelihoods_and_basic_needs_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs requirements (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='livelihoods_and_basic_needs_female', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs female'), + model_name="emergencyoperationspeoplereached", + name="livelihoods_and_basic_needs_female", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs female"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='livelihoods_and_basic_needs_male', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs male'), + model_name="emergencyoperationspeoplereached", + name="livelihoods_and_basic_needs_male", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs male"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='livelihoods_and_basic_needs_people_reached', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic people reached'), + model_name="emergencyoperationspeoplereached", + name="livelihoods_and_basic_needs_people_reached", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic people reached"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='livelihoods_and_basic_needs_requirements', - field=models.IntegerField(blank=True, null=True, verbose_name='number of livelihoods and basic needs requirements'), + model_name="emergencyoperationspeoplereached", + name="livelihoods_and_basic_needs_requirements", + field=models.IntegerField(blank=True, null=True, verbose_name="number of livelihoods and basic needs requirements"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_livelihoods_and_basic_needs_female', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs female (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_livelihoods_and_basic_needs_female", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihoods and basic needs female (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_livelihoods_and_basic_needs_male', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs male (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_livelihoods_and_basic_needs_male", + field=models.TextField(blank=True, null=True, verbose_name="number of livelihoods and basic needs male (raw)"), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_livelihoods_and_basic_needs_people_reached', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs people reached (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_livelihoods_and_basic_needs_people_reached", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs people reached (raw)" + ), ), migrations.AlterField( - model_name='emergencyoperationspeoplereached', - name='raw_livelihoods_and_basic_needs_requirements', - field=models.TextField(blank=True, null=True, verbose_name='number of livelihoods and basic needs requirements (raw)'), + model_name="emergencyoperationspeoplereached", + name="raw_livelihoods_and_basic_needs_requirements", + field=models.TextField( + blank=True, null=True, verbose_name="number of livelihoods and basic needs requirements (raw)" + ), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_15', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, verbose_name='ERU water sanitation M15'), + model_name="fieldreport", + name="eru_water_sanitation_15", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], + default=0, + verbose_name="ERU water sanitation M15", + ), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_15_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU water sanitation M15 units'), + model_name="fieldreport", + name="eru_water_sanitation_15_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU water sanitation M15 units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_20', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, verbose_name='ERU water sanitation MSM20'), + model_name="fieldreport", + name="eru_water_sanitation_20", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], + default=0, + verbose_name="ERU water sanitation MSM20", + ), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_20_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU water sanitation MSM20 units'), + model_name="fieldreport", + name="eru_water_sanitation_20_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU water sanitation MSM20 units"), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_40', - field=models.IntegerField(choices=[(0, 'No'), (1, 'Requested'), (2, 'Planned'), (3, 'Completed')], default=0, verbose_name='ERU water sanitation M40'), + model_name="fieldreport", + name="eru_water_sanitation_40", + field=models.IntegerField( + choices=[(0, "No"), (1, "Requested"), (2, "Planned"), (3, "Completed")], + default=0, + verbose_name="ERU water sanitation M40", + ), ), migrations.AlterField( - model_name='fieldreport', - name='eru_water_sanitation_40_units', - field=models.IntegerField(blank=True, null=True, verbose_name='ERU water sanitation M40 units'), + model_name="fieldreport", + name="eru_water_sanitation_40_units", + field=models.IntegerField(blank=True, null=True, verbose_name="ERU water sanitation M40 units"), ), ] diff --git a/api/migrations/0187_auto_20231218_0508.py b/api/migrations/0187_auto_20231218_0508.py index 253fd7a7d..accf24e20 100644 --- a/api/migrations/0187_auto_20231218_0508.py +++ b/api/migrations/0187_auto_20231218_0508.py @@ -1,28 +1,32 @@ # Generated by Django 3.2.23 on 2023-12-18 05:08 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0186_auto_20231103_0904'), + ("api", "0186_auto_20231103_0904"), ] # NOTE: Default value `0` as expected # If migration error, to be fixed manually operations = [ migrations.AlterField( - model_name='appeal', - name='country', - field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='country'), + model_name="appeal", + name="country", + field=models.ForeignKey( + default=0, on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="country" + ), preserve_default=False, ), migrations.AlterField( - model_name='appealhistory', - name='country', - field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='country'), + model_name="appealhistory", + name="country", + field=models.ForeignKey( + default=0, on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="country" + ), preserve_default=False, ), ] diff --git a/api/migrations/0187_gdacsevent_disaster_type.py b/api/migrations/0187_gdacsevent_disaster_type.py index 0d9e49189..a32673edf 100644 --- a/api/migrations/0187_gdacsevent_disaster_type.py +++ b/api/migrations/0187_gdacsevent_disaster_type.py @@ -1,19 +1,21 @@ # Generated by Django 3.2.23 on 2023-11-30 08:59 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0186_auto_20231103_0904'), + ("api", "0186_auto_20231103_0904"), ] operations = [ migrations.AddField( - model_name='gdacsevent', - name='disaster_type', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='api.disastertype', verbose_name='disaster type'), + model_name="gdacsevent", + name="disaster_type", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.PROTECT, to="api.disastertype", verbose_name="disaster type" + ), ), ] diff --git a/api/migrations/0188_alter_export_export_type.py b/api/migrations/0188_alter_export_export_type.py index 92caa52a8..2a3d55566 100644 --- a/api/migrations/0188_alter_export_export_type.py +++ b/api/migrations/0188_alter_export_export_type.py @@ -6,13 +6,22 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0187_auto_20231218_0508'), + ("api", "0187_auto_20231218_0508"), ] operations = [ migrations.AlterField( - model_name='export', - name='export_type', - field=models.CharField(choices=[('dref-applications', 'Dref Applications'), ('dref-operational-updates', 'Dref Operational Updates'), ('dref-final-reports', 'Dref Final Reports'), ('per', 'Per')], max_length=255, verbose_name='Export Type'), + model_name="export", + name="export_type", + field=models.CharField( + choices=[ + ("dref-applications", "Dref Applications"), + ("dref-operational-updates", "Dref Operational Updates"), + ("dref-final-reports", "Dref Final Reports"), + ("per", "Per"), + ], + max_length=255, + verbose_name="Export Type", + ), ), ] diff --git a/api/migrations/0188_auto_20231130_0900.py b/api/migrations/0188_auto_20231130_0900.py index bae4a8bab..d6e522db2 100644 --- a/api/migrations/0188_auto_20231130_0900.py +++ b/api/migrations/0188_auto_20231130_0900.py @@ -5,8 +5,8 @@ class Migration(migrations.Migration): def migrate_event_type(apps, schema_editor): - GDACSEvent = apps.get_model('api', 'GDACSEvent') - DisasterType = apps.get_model('api', 'DisasterType') + GDACSEvent = apps.get_model("api", "GDACSEvent") + DisasterType = apps.get_model("api", "DisasterType") event_type_map = { "EQ": "Earthquake", "TC": "Cyclone", @@ -16,13 +16,13 @@ def migrate_event_type(apps, schema_editor): "VO": "Volcanic Eruption", } for gdacs_event in GDACSEvent.objects.all(): - gdacs_event.disaster_type, created = DisasterType.objects.get_or_create(name=event_type_map.get(gdacs_event.event_type)) + gdacs_event.disaster_type, created = DisasterType.objects.get_or_create( + name=event_type_map.get(gdacs_event.event_type) + ) gdacs_event.save() dependencies = [ - ('api', '0187_gdacsevent_disaster_type'), + ("api", "0187_gdacsevent_disaster_type"), ] - operations = [ - migrations.RunPython(migrate_event_type, reverse_code=migrations.RunPython.noop) - ] + operations = [migrations.RunPython(migrate_event_type, reverse_code=migrations.RunPython.noop)] diff --git a/api/migrations/0188_auto_20240109_0508.py b/api/migrations/0188_auto_20240109_0508.py index 9f7cfb775..64c9016f1 100644 --- a/api/migrations/0188_auto_20240109_0508.py +++ b/api/migrations/0188_auto_20240109_0508.py @@ -6,24 +6,24 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0187_auto_20231218_0508'), + ("api", "0187_auto_20231218_0508"), ] operations = [ migrations.RemoveField( - model_name='event', - name='slug_ar', + model_name="event", + name="slug_ar", ), migrations.RemoveField( - model_name='event', - name='slug_en', + model_name="event", + name="slug_en", ), migrations.RemoveField( - model_name='event', - name='slug_es', + model_name="event", + name="slug_es", ), migrations.RemoveField( - model_name='event', - name='slug_fr', + model_name="event", + name="slug_fr", ), ] diff --git a/api/migrations/0189_auto_20231212_0434.py b/api/migrations/0189_auto_20231212_0434.py index 6b9b1e98a..158321acc 100644 --- a/api/migrations/0189_auto_20231212_0434.py +++ b/api/migrations/0189_auto_20231212_0434.py @@ -6,38 +6,38 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0188_auto_20231130_0900'), + ("api", "0188_auto_20231130_0900"), ] operations = [ migrations.AddField( - model_name='country', - name='address_1', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Address 1'), + model_name="country", + name="address_1", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Address 1"), ), migrations.AddField( - model_name='country', - name='address_2', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Address 2'), + model_name="country", + name="address_2", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Address 2"), ), migrations.AddField( - model_name='country', - name='city_code', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='City Code'), + model_name="country", + name="city_code", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="City Code"), ), migrations.AddField( - model_name='country', - name='email', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Email'), + model_name="country", + name="email", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Email"), ), migrations.AddField( - model_name='country', - name='phone', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Phone'), + model_name="country", + name="phone", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Phone"), ), migrations.AddField( - model_name='country', - name='website', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Website'), + model_name="country", + name="website", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Website"), ), ] diff --git a/api/migrations/0189_auto_20240219_0904.py b/api/migrations/0189_auto_20240219_0904.py index d976f9209..a2e5501cb 100644 --- a/api/migrations/0189_auto_20240219_0904.py +++ b/api/migrations/0189_auto_20240219_0904.py @@ -6,72 +6,72 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0188_auto_20240109_0508'), + ("api", "0188_auto_20240109_0508"), ] operations = [ migrations.RemoveField( - model_name='eventfeatureddocument', - name='description_ar', + model_name="eventfeatureddocument", + name="description_ar", ), migrations.RemoveField( - model_name='eventfeatureddocument', - name='description_en', + model_name="eventfeatureddocument", + name="description_en", ), migrations.RemoveField( - model_name='eventfeatureddocument', - name='description_es', + model_name="eventfeatureddocument", + name="description_es", ), migrations.RemoveField( - model_name='eventfeatureddocument', - name='description_fr', + model_name="eventfeatureddocument", + name="description_fr", ), migrations.RemoveField( - model_name='eventfeatureddocument', - name='title_ar', + model_name="eventfeatureddocument", + name="title_ar", ), migrations.RemoveField( - model_name='eventfeatureddocument', - name='title_en', + model_name="eventfeatureddocument", + name="title_en", ), migrations.RemoveField( - model_name='eventfeatureddocument', - name='title_es', + model_name="eventfeatureddocument", + name="title_es", ), migrations.RemoveField( - model_name='eventfeatureddocument', - name='title_fr', + model_name="eventfeatureddocument", + name="title_fr", ), migrations.RemoveField( - model_name='eventfeatureddocument', - name='translation_module_original_language', + model_name="eventfeatureddocument", + name="translation_module_original_language", ), migrations.RemoveField( - model_name='eventfeatureddocument', - name='translation_module_skip_auto_translation', + model_name="eventfeatureddocument", + name="translation_module_skip_auto_translation", ), migrations.RemoveField( - model_name='situationreport', - name='name_ar', + model_name="situationreport", + name="name_ar", ), migrations.RemoveField( - model_name='situationreport', - name='name_en', + model_name="situationreport", + name="name_en", ), migrations.RemoveField( - model_name='situationreport', - name='name_es', + model_name="situationreport", + name="name_es", ), migrations.RemoveField( - model_name='situationreport', - name='name_fr', + model_name="situationreport", + name="name_fr", ), migrations.RemoveField( - model_name='situationreport', - name='translation_module_original_language', + model_name="situationreport", + name="translation_module_original_language", ), migrations.RemoveField( - model_name='situationreport', - name='translation_module_skip_auto_translation', + model_name="situationreport", + name="translation_module_skip_auto_translation", ), ] diff --git a/api/migrations/0189_merge_20240117_0551.py b/api/migrations/0189_merge_20240117_0551.py index a3795e6d5..3c0827eb0 100644 --- a/api/migrations/0189_merge_20240117_0551.py +++ b/api/migrations/0189_merge_20240117_0551.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0188_alter_export_export_type'), - ('api', '0188_auto_20240109_0508'), + ("api", "0188_alter_export_export_type"), + ("api", "0188_auto_20240109_0508"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0190_auto_20240220_0510.py b/api/migrations/0190_auto_20240220_0510.py index 91c2a25e6..1b2b8437e 100644 --- a/api/migrations/0190_auto_20240220_0510.py +++ b/api/migrations/0190_auto_20240220_0510.py @@ -6,68 +6,84 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0189_auto_20240219_0904'), + ("api", "0189_auto_20240219_0904"), ] operations = [ migrations.AddField( - model_name='adminkeyfigure', - name='deck_ar', - field=models.CharField(max_length=50, null=True, verbose_name='deck'), + model_name="adminkeyfigure", + name="deck_ar", + field=models.CharField(max_length=50, null=True, verbose_name="deck"), ), migrations.AddField( - model_name='adminkeyfigure', - name='deck_en', - field=models.CharField(max_length=50, null=True, verbose_name='deck'), + model_name="adminkeyfigure", + name="deck_en", + field=models.CharField(max_length=50, null=True, verbose_name="deck"), ), migrations.AddField( - model_name='adminkeyfigure', - name='deck_es', - field=models.CharField(max_length=50, null=True, verbose_name='deck'), + model_name="adminkeyfigure", + name="deck_es", + field=models.CharField(max_length=50, null=True, verbose_name="deck"), ), migrations.AddField( - model_name='adminkeyfigure', - name='deck_fr', - field=models.CharField(max_length=50, null=True, verbose_name='deck'), + model_name="adminkeyfigure", + name="deck_fr", + field=models.CharField(max_length=50, null=True, verbose_name="deck"), ), migrations.AddField( - model_name='adminkeyfigure', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="adminkeyfigure", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='adminkeyfigure', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="adminkeyfigure", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='keyfigure', - name='deck_ar', - field=models.CharField(help_text='key figure units', max_length=50, null=True, verbose_name='deck'), + model_name="keyfigure", + name="deck_ar", + field=models.CharField(help_text="key figure units", max_length=50, null=True, verbose_name="deck"), ), migrations.AddField( - model_name='keyfigure', - name='deck_en', - field=models.CharField(help_text='key figure units', max_length=50, null=True, verbose_name='deck'), + model_name="keyfigure", + name="deck_en", + field=models.CharField(help_text="key figure units", max_length=50, null=True, verbose_name="deck"), ), migrations.AddField( - model_name='keyfigure', - name='deck_es', - field=models.CharField(help_text='key figure units', max_length=50, null=True, verbose_name='deck'), + model_name="keyfigure", + name="deck_es", + field=models.CharField(help_text="key figure units", max_length=50, null=True, verbose_name="deck"), ), migrations.AddField( - model_name='keyfigure', - name='deck_fr', - field=models.CharField(help_text='key figure units', max_length=50, null=True, verbose_name='deck'), + model_name="keyfigure", + name="deck_fr", + field=models.CharField(help_text="key figure units", max_length=50, null=True, verbose_name="deck"), ), migrations.AddField( - model_name='keyfigure', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="keyfigure", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='keyfigure', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="keyfigure", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/api/migrations/0190_countrydirectory.py b/api/migrations/0190_countrydirectory.py index bdf898460..24c669aa6 100644 --- a/api/migrations/0190_countrydirectory.py +++ b/api/migrations/0190_countrydirectory.py @@ -1,24 +1,27 @@ # Generated by Django 3.2.23 on 2023-12-12 08:29 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0189_auto_20231212_0434'), + ("api", "0189_auto_20231212_0434"), ] operations = [ migrations.CreateModel( - name='CountryDirectory', + name="CountryDirectory", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='First Name')), - ('last_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Last Name')), - ('position', models.CharField(blank=True, max_length=255, null=True, verbose_name='Position')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("first_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="First Name")), + ("last_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="Last Name")), + ("position", models.CharField(blank=True, max_length=255, null=True, verbose_name="Position")), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="Country"), + ), ], ), ] diff --git a/api/migrations/0190_remove_export_selector.py b/api/migrations/0190_remove_export_selector.py index 1fa969bb7..0fe62d5cc 100644 --- a/api/migrations/0190_remove_export_selector.py +++ b/api/migrations/0190_remove_export_selector.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0189_merge_20240117_0551'), + ("api", "0189_merge_20240117_0551"), ] operations = [ migrations.RemoveField( - model_name='export', - name='selector', + model_name="export", + name="selector", ), ] diff --git a/api/migrations/0191_countrykeydocument.py b/api/migrations/0191_countrykeydocument.py index 94937db55..094ed0508 100644 --- a/api/migrations/0191_countrykeydocument.py +++ b/api/migrations/0191_countrykeydocument.py @@ -1,26 +1,29 @@ # Generated by Django 3.2.23 on 2023-12-12 10:35 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0190_countrydirectory'), + ("api", "0190_countrydirectory"), ] operations = [ migrations.CreateModel( - name='CountryKeyDocument', + name="CountryKeyDocument", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('url', models.CharField(max_length=255, verbose_name='Url')), - ('thumbnail', models.CharField(max_length=255, verbose_name='Thumbnail')), - ('document_type', models.CharField(max_length=255, verbose_name='Document Type')), - ('year', models.DateField(verbose_name='Year')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=255, verbose_name="Name")), + ("url", models.CharField(max_length=255, verbose_name="Url")), + ("thumbnail", models.CharField(max_length=255, verbose_name="Thumbnail")), + ("document_type", models.CharField(max_length=255, verbose_name="Document Type")), + ("year", models.DateField(verbose_name="Year")), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="Country"), + ), ], ), ] diff --git a/api/migrations/0192_nsdinitiatives.py b/api/migrations/0192_nsdinitiatives.py index 44b3a71a1..3271afe0e 100644 --- a/api/migrations/0192_nsdinitiatives.py +++ b/api/migrations/0192_nsdinitiatives.py @@ -1,28 +1,40 @@ # Generated by Django 3.2.23 on 2023-12-13 05:19 import django.contrib.postgres.fields -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0191_countrykeydocument'), + ("api", "0191_countrykeydocument"), ] operations = [ migrations.CreateModel( - name='NSDInitiatives', + name="NSDInitiatives", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='Title')), - ('fund_type', models.CharField(max_length=255, verbose_name='Fund Type')), - ('allocation', models.IntegerField(verbose_name='Allocation in CHF')), - ('year', models.CharField(max_length=20, verbose_name='Year')), - ('funding_period', models.IntegerField(verbose_name='Funding Period in Month')), - ('categories', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), default=list, null=True, size=None, verbose_name='Funding categories')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="Title")), + ("fund_type", models.CharField(max_length=255, verbose_name="Fund Type")), + ("allocation", models.IntegerField(verbose_name="Allocation in CHF")), + ("year", models.CharField(max_length=20, verbose_name="Year")), + ("funding_period", models.IntegerField(verbose_name="Funding Period in Month")), + ( + "categories", + django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(max_length=255), + default=list, + null=True, + size=None, + verbose_name="Funding categories", + ), + ), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="Country"), + ), ], ), ] diff --git a/api/migrations/0193_countrycapacitystrengthening.py b/api/migrations/0193_countrycapacitystrengthening.py index 8a506897b..16db40dd9 100644 --- a/api/migrations/0193_countrycapacitystrengthening.py +++ b/api/migrations/0193_countrycapacitystrengthening.py @@ -1,27 +1,33 @@ # Generated by Django 3.2.23 on 2023-12-18 06:41 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0192_nsdinitiatives'), + ("api", "0192_nsdinitiatives"), ] operations = [ migrations.CreateModel( - name='CountryCapacityStrengthening', + name="CountryCapacityStrengthening", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('assessment_code', models.CharField(max_length=255, verbose_name='Assessment Code')), - ('year', models.CharField(max_length=25, verbose_name='Year of Assessment')), - ('submission_date', models.DateTimeField(verbose_name='Submission Date')), - ('url', models.CharField(max_length=255, verbose_name='Url')), - ('assessment_type', models.IntegerField(choices=[(0, 'Ocac'), (1, 'Boca')], verbose_name='Country Assessment Type')), - ('branch_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Branch Name')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("assessment_code", models.CharField(max_length=255, verbose_name="Assessment Code")), + ("year", models.CharField(max_length=25, verbose_name="Year of Assessment")), + ("submission_date", models.DateTimeField(verbose_name="Submission Date")), + ("url", models.CharField(max_length=255, verbose_name="Url")), + ( + "assessment_type", + models.IntegerField(choices=[(0, "Ocac"), (1, "Boca")], verbose_name="Country Assessment Type"), + ), + ("branch_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="Branch Name")), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="Country"), + ), ], ), ] diff --git a/api/migrations/0194_countryorganizationalcapacity.py b/api/migrations/0194_countryorganizationalcapacity.py index 3cf03704e..6b2397356 100644 --- a/api/migrations/0194_countryorganizationalcapacity.py +++ b/api/migrations/0194_countryorganizationalcapacity.py @@ -1,25 +1,28 @@ # Generated by Django 3.2.23 on 2023-12-18 09:08 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0193_countrycapacitystrengthening'), + ("api", "0193_countrycapacitystrengthening"), ] operations = [ migrations.CreateModel( - name='CountryOrganizationalCapacity', + name="CountryOrganizationalCapacity", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('leadership_capacity', models.TextField(blank=True, null=True, verbose_name='Leadership Capacity')), - ('youth_capacity', models.TextField(blank=True, null=True, verbose_name='Youth Capacity')), - ('volunteer_capacity', models.TextField(blank=True, null=True, verbose_name='Volunteer Capacity')), - ('financial_capacity', models.TextField(blank=True, null=True, verbose_name='Financial Capacity')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("leadership_capacity", models.TextField(blank=True, null=True, verbose_name="Leadership Capacity")), + ("youth_capacity", models.TextField(blank=True, null=True, verbose_name="Youth Capacity")), + ("volunteer_capacity", models.TextField(blank=True, null=True, verbose_name="Volunteer Capacity")), + ("financial_capacity", models.TextField(blank=True, null=True, verbose_name="Financial Capacity")), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="Country"), + ), ], ), ] diff --git a/api/migrations/0195_merge_20231219_0511.py b/api/migrations/0195_merge_20231219_0511.py index 7a4418b67..6466ad93f 100644 --- a/api/migrations/0195_merge_20231219_0511.py +++ b/api/migrations/0195_merge_20231219_0511.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0187_auto_20231218_0508'), - ('api', '0194_countryorganizationalcapacity'), + ("api", "0187_auto_20231218_0508"), + ("api", "0194_countryorganizationalcapacity"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0196_alter_gdacsevent_severity.py b/api/migrations/0196_alter_gdacsevent_severity.py index 8edb6c837..f699ee3ac 100644 --- a/api/migrations/0196_alter_gdacsevent_severity.py +++ b/api/migrations/0196_alter_gdacsevent_severity.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0195_merge_20231219_0511'), + ("api", "0195_merge_20231219_0511"), ] operations = [ migrations.AlterField( - model_name='gdacsevent', - name='severity', - field=models.TextField(blank=True, null=True, verbose_name='severity'), + model_name="gdacsevent", + name="severity", + field=models.TextField(blank=True, null=True, verbose_name="severity"), ), ] diff --git a/api/migrations/0197_country_founded_date.py b/api/migrations/0197_country_founded_date.py index 685ed7147..9f4b64a5f 100644 --- a/api/migrations/0197_country_founded_date.py +++ b/api/migrations/0197_country_founded_date.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0196_alter_gdacsevent_severity'), + ("api", "0196_alter_gdacsevent_severity"), ] operations = [ migrations.AddField( - model_name='country', - name='founded_date', - field=models.DateField(blank=True, null=True, verbose_name='Found date'), + model_name="country", + name="founded_date", + field=models.DateField(blank=True, null=True, verbose_name="Found date"), ), ] diff --git a/api/migrations/0198_countrysupportingpartner.py b/api/migrations/0198_countrysupportingpartner.py index 3a534ccc6..3235aa89e 100644 --- a/api/migrations/0198_countrysupportingpartner.py +++ b/api/migrations/0198_countrysupportingpartner.py @@ -1,25 +1,28 @@ # Generated by Django 3.2.23 on 2023-12-28 09:32 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0197_country_founded_date'), + ("api", "0197_country_founded_date"), ] operations = [ migrations.CreateModel( - name='CountrySupportingPartner', + name="CountrySupportingPartner", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='First Name')), - ('last_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Last Name')), - ('position', models.CharField(blank=True, max_length=255, null=True, verbose_name='Position')), - ('email', models.CharField(blank=True, max_length=255, null=True, verbose_name='Email')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("first_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="First Name")), + ("last_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="Last Name")), + ("position", models.CharField(blank=True, max_length=255, null=True, verbose_name="Position")), + ("email", models.CharField(blank=True, max_length=255, null=True, verbose_name="Email")), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="Country"), + ), ], ), ] diff --git a/api/migrations/0199_countrysupportingpartner_supporting_type.py b/api/migrations/0199_countrysupportingpartner_supporting_type.py index 535d79b5c..318522e85 100644 --- a/api/migrations/0199_countrysupportingpartner_supporting_type.py +++ b/api/migrations/0199_countrysupportingpartner_supporting_type.py @@ -6,13 +6,15 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0198_countrysupportingpartner'), + ("api", "0198_countrysupportingpartner"), ] operations = [ migrations.AddField( - model_name='countrysupportingpartner', - name='supporting_type', - field=models.IntegerField(blank=True, choices=[(0, 'Ifrc'), (1, 'International Partners')], null=True, verbose_name='Supporting Type'), + model_name="countrysupportingpartner", + name="supporting_type", + field=models.IntegerField( + blank=True, choices=[(0, "Ifrc"), (1, "International Partners")], null=True, verbose_name="Supporting Type" + ), ), ] diff --git a/api/migrations/0200_countryicrcpresence.py b/api/migrations/0200_countryicrcpresence.py index 2cd52365c..6fed6a322 100644 --- a/api/migrations/0200_countryicrcpresence.py +++ b/api/migrations/0200_countryicrcpresence.py @@ -1,25 +1,28 @@ # Generated by Django 3.2.23 on 2024-01-02 06:14 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0199_countrysupportingpartner_supporting_type'), + ("api", "0199_countrysupportingpartner_supporting_type"), ] operations = [ migrations.CreateModel( - name='CountryICRCPresence', + name="CountryICRCPresence", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('icrc_presence', models.BooleanField(blank=True, null=True, verbose_name='ICRC Presence')), - ('url', models.CharField(blank=True, max_length=255, null=True, verbose_name='Url')), - ('key_operation', models.BooleanField(blank=True, null=True, verbose_name='Key Operations')), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("icrc_presence", models.BooleanField(blank=True, null=True, verbose_name="ICRC Presence")), + ("url", models.CharField(blank=True, max_length=255, null=True, verbose_name="Url")), + ("key_operation", models.BooleanField(blank=True, null=True, verbose_name="Key Operations")), + ("description", models.TextField(blank=True, null=True, verbose_name="Description")), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="Country"), + ), ], ), ] diff --git a/api/migrations/0201_country_disaster_law_url.py b/api/migrations/0201_country_disaster_law_url.py index 2b5210a41..552fb32d4 100644 --- a/api/migrations/0201_country_disaster_law_url.py +++ b/api/migrations/0201_country_disaster_law_url.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0200_countryicrcpresence'), + ("api", "0200_countryicrcpresence"), ] operations = [ migrations.AddField( - model_name='country', - name='disaster_law_url', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Disaster law url'), + model_name="country", + name="disaster_law_url", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Disaster law url"), ), ] diff --git a/api/migrations/0202_alter_countryorganizationalcapacity_country.py b/api/migrations/0202_alter_countryorganizationalcapacity_country.py index 6cd698461..a192fabb4 100644 --- a/api/migrations/0202_alter_countryorganizationalcapacity_country.py +++ b/api/migrations/0202_alter_countryorganizationalcapacity_country.py @@ -1,19 +1,19 @@ # Generated by Django 3.2.23 on 2024-01-09 04:15 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0201_country_disaster_law_url'), + ("api", "0201_country_disaster_law_url"), ] operations = [ migrations.AlterField( - model_name='countryorganizationalcapacity', - name='country', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='Country'), + model_name="countryorganizationalcapacity", + name="country", + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="Country"), ), ] diff --git a/api/migrations/0203_alter_countryicrcpresence_country.py b/api/migrations/0203_alter_countryicrcpresence_country.py index 00cb60de9..356a352b7 100644 --- a/api/migrations/0203_alter_countryicrcpresence_country.py +++ b/api/migrations/0203_alter_countryicrcpresence_country.py @@ -1,19 +1,19 @@ # Generated by Django 3.2.23 on 2024-01-11 09:02 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0202_alter_countryorganizationalcapacity_country'), + ("api", "0202_alter_countryorganizationalcapacity_country"), ] operations = [ migrations.AlterField( - model_name='countryicrcpresence', - name='country', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='Country'), + model_name="countryicrcpresence", + name="country", + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="Country"), ), ] diff --git a/api/migrations/0204_merge_20240129_0639.py b/api/migrations/0204_merge_20240129_0639.py index 18e25f4fd..9f8ad29e2 100644 --- a/api/migrations/0204_merge_20240129_0639.py +++ b/api/migrations/0204_merge_20240129_0639.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0188_auto_20240109_0508'), - ('api', '0203_alter_countryicrcpresence_country'), + ("api", "0188_auto_20240109_0508"), + ("api", "0203_alter_countryicrcpresence_country"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0205_merge_20240227_0819.py b/api/migrations/0205_merge_20240227_0819.py index 703b41259..33376ed1b 100644 --- a/api/migrations/0205_merge_20240227_0819.py +++ b/api/migrations/0205_merge_20240227_0819.py @@ -6,10 +6,9 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0190_auto_20240220_0510'), - ('api', '0190_remove_export_selector'), - ('api', '0204_merge_20240129_0639'), + ("api", "0190_auto_20240220_0510"), + ("api", "0190_remove_export_selector"), + ("api", "0204_merge_20240129_0639"), ] - operations = [ - ] + operations = [] diff --git a/api/migrations/0206_alter_export_export_type.py b/api/migrations/0206_alter_export_export_type.py index 0fc30af41..8ce3a6d62 100644 --- a/api/migrations/0206_alter_export_export_type.py +++ b/api/migrations/0206_alter_export_export_type.py @@ -6,13 +6,22 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0205_merge_20240227_0819'), + ("api", "0205_merge_20240227_0819"), ] operations = [ migrations.AlterField( - model_name='export', - name='export_type', - field=models.CharField(choices=[('dref-applications', 'Dref Applications'), ('dref-operational-updates', 'Dref Operational Updates'), ('dref-final-reports', 'Dref Final Reports'), ('per-process', 'Per Process')], max_length=255, verbose_name='Export Type'), + model_name="export", + name="export_type", + field=models.CharField( + choices=[ + ("dref-applications", "Dref Applications"), + ("dref-operational-updates", "Dref Operational Updates"), + ("dref-final-reports", "Dref Final Reports"), + ("per-process", "Per Process"), + ], + max_length=255, + verbose_name="Export Type", + ), ), ] diff --git a/api/migrations/0207_auto_20240311_1044.py b/api/migrations/0207_auto_20240311_1044.py index 0ee044074..9bc4414cb 100644 --- a/api/migrations/0207_auto_20240311_1044.py +++ b/api/migrations/0207_auto_20240311_1044.py @@ -6,18 +6,27 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0206_alter_export_export_type'), + ("api", "0206_alter_export_export_type"), ] operations = [ migrations.AddField( - model_name='export', - name='per_country', - field=models.IntegerField(blank=True, null=True, verbose_name='Per Country Id'), + model_name="export", + name="per_country", + field=models.IntegerField(blank=True, null=True, verbose_name="Per Country Id"), ), migrations.AlterField( - model_name='export', - name='export_type', - field=models.CharField(choices=[('dref-applications', 'Dref Applications'), ('dref-operational-updates', 'Dref Operational Updates'), ('dref-final-reports', 'Dref Final Reports'), ('per', 'Per')], max_length=255, verbose_name='Export Type'), + model_name="export", + name="export_type", + field=models.CharField( + choices=[ + ("dref-applications", "Dref Applications"), + ("dref-operational-updates", "Dref Operational Updates"), + ("dref-final-reports", "Dref Final Reports"), + ("per", "Per"), + ], + max_length=255, + verbose_name="Export Type", + ), ), ] diff --git a/api/migrations/0208_auto_20240404_0518.py b/api/migrations/0208_auto_20240404_0518.py index 8e1c35a16..b7ebc665d 100644 --- a/api/migrations/0208_auto_20240404_0518.py +++ b/api/migrations/0208_auto_20240404_0518.py @@ -7,17 +7,23 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0207_auto_20240311_1044'), + ("api", "0207_auto_20240311_1044"), ] operations = [ migrations.RemoveField( - model_name='country', - name='email', + model_name="country", + name="email", ), migrations.AddField( - model_name='country', - name='emails', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Email'), blank=True, default=list, null=True, size=None), + model_name="country", + name="emails", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Email"), + blank=True, + default=list, + null=True, + size=None, + ), ), ] diff --git a/api/migrations/0209_auto_20240423_0604.py b/api/migrations/0209_auto_20240423_0604.py index 4019b4a65..b20432b04 100644 --- a/api/migrations/0209_auto_20240423_0604.py +++ b/api/migrations/0209_auto_20240423_0604.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0208_auto_20240404_0518'), + ("api", "0208_auto_20240404_0518"), ] operations = [ migrations.AddField( - model_name='countrykeydocument', - name='end_year', - field=models.DateField(blank=True, null=True, verbose_name='End Year'), + model_name="countrykeydocument", + name="end_year", + field=models.DateField(blank=True, null=True, verbose_name="End Year"), ), migrations.AddField( - model_name='countrykeydocument', - name='year_text', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Year Text'), + model_name="countrykeydocument", + name="year_text", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Year Text"), ), ] diff --git a/api/migrations/0210_profile_accepted_montandon_license_terms.py b/api/migrations/0210_profile_accepted_montandon_license_terms.py index 508b37000..5a977788e 100644 --- a/api/migrations/0210_profile_accepted_montandon_license_terms.py +++ b/api/migrations/0210_profile_accepted_montandon_license_terms.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0209_auto_20240423_0604'), + ("api", "0209_auto_20240423_0604"), ] operations = [ migrations.AddField( - model_name='profile', - name='accepted_montandon_license_terms', - field=models.BooleanField(default=False, verbose_name='has accepted montandon license terms?'), + model_name="profile", + name="accepted_montandon_license_terms", + field=models.BooleanField(default=False, verbose_name="has accepted montandon license terms?"), ), ] diff --git a/api/models.py b/api/models.py index 653226997..72157b6ff 100644 --- a/api/models.py +++ b/api/models.py @@ -1,24 +1,28 @@ -import reversion import uuid +from datetime import datetime, timedelta + +import pytz +import reversion +from django.conf import settings +from django.contrib.auth.signals import ( + user_logged_in, + user_logged_out, + user_login_failed, +) -from django.utils.translation import gettext_lazy as _ # from django.db import models from django.contrib.gis.db import models -from django.conf import settings -from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed +from django.contrib.postgres.fields import ArrayField +from django.core.validators import FileExtensionValidator, RegexValidator, validate_slug +from django.db.models import Q + # from django.db.models import Prefetch from django.dispatch import receiver from django.utils import timezone -from django.db.models import Q +from django.utils.translation import gettext_lazy as _ from tinymce.models import HTMLField -from django.core.validators import FileExtensionValidator, validate_slug, RegexValidator -from django.contrib.postgres.fields import ArrayField -from datetime import datetime, timedelta -import pytz -from .utils import ( - validate_slug_number, - # is_user_ifrc, -) + +from .utils import validate_slug_number # is_user_ifrc, # Write model properties to dictionary @@ -37,63 +41,66 @@ def to_dict(instance): class DisasterType(models.Model): - """ summary of disaster """ - name = models.CharField(verbose_name=_('name'), max_length=100) - summary = models.TextField(verbose_name=_('summary')) + """summary of disaster""" + + name = models.CharField(verbose_name=_("name"), max_length=100) + summary = models.TextField(verbose_name=_("summary")) class Meta: - ordering = ('name',) - verbose_name = _('disaster type') - verbose_name_plural = _('disaster types') + ordering = ("name",) + verbose_name = _("disaster type") + verbose_name_plural = _("disaster types") def __str__(self): return self.name class RegionName(models.IntegerChoices): - AFRICA = 0, _('Africa') - AMERICAS = 1, _('Americas') - ASIA_PACIFIC = 2, _('Asia Pacific') - EUROPE = 3, _('Europe') - MENA = 4, _('Middle East & North Africa') + AFRICA = 0, _("Africa") + AMERICAS = 1, _("Americas") + ASIA_PACIFIC = 2, _("Asia Pacific") + EUROPE = 3, _("Europe") + MENA = 4, _("Middle East & North Africa") class Region(models.Model): - """ A region """ - name = models.IntegerField(choices=RegionName.choices, default=0, verbose_name=_('name')) + """A region""" + + name = models.IntegerField(choices=RegionName.choices, default=0, verbose_name=_("name")) bbox = models.PolygonField(srid=4326, blank=True, null=True) - label = models.CharField(verbose_name=_('name of the region'), max_length=250, blank=True) - additional_tab_name = models.CharField(verbose_name='Label for Additional Tab', max_length=100, blank=True) + label = models.CharField(verbose_name=_("name of the region"), max_length=250, blank=True) + additional_tab_name = models.CharField(verbose_name="Label for Additional Tab", max_length=100, blank=True) def indexing(self): return { - 'id': self.id, - 'event_id': None, - 'type': 'region', - 'name': self.label, - 'keyword': None, - 'visibility': None, - 'ns': None, - 'body': self.label, - 'date': None + "id": self.id, + "event_id": None, + "type": "region", + "name": self.label, + "keyword": None, + "visibility": None, + "ns": None, + "body": self.label, + "date": None, } def es_id(self): - return 'region-%s' % self.id + return "region-%s" % self.id def get_national_society_count(self): - return Country.objects\ - .filter(region=self, record_type=CountryType.COUNTRY, independent=True)\ - .exclude(society_name_en='')\ + return ( + Country.objects.filter(region=self, record_type=CountryType.COUNTRY, independent=True) + .exclude(society_name_en="") .count() + ) def get_country_cluster_count(self): return Country.objects.filter(region=self, record_type=CountryType.CLUSTER).count() class Meta: - ordering = ('name',) - verbose_name = _('region') - verbose_name_plural = _('regions') + ordering = ("name",) + verbose_name = _("region") + verbose_name_plural = _("regions") def __str__(self): return self.label @@ -103,18 +110,19 @@ def region_name(self): def logo_document_path(instance, filename): - return 'logos/%s/%s' % (instance.iso, filename) + return "logos/%s/%s" % (instance.iso, filename) class CountryType(models.IntegerChoices): - ''' - We use the Country model for some things that are not "Countries". This helps classify the type. - ''' - COUNTRY = 1, _('Country') - CLUSTER = 2, _('Cluster') - REGION = 3, _('Region') - COUNTRY_OFFICE = 4, _('Country Office') - REPRESENTATIVE_OFFICE = 5, _('Representative Office') + """ + We use the Country model for some things that are not "Countries". This helps classify the type. + """ + + COUNTRY = 1, _("Country") + CLUSTER = 2, _("Cluster") + REGION = 3, _("Region") + COUNTRY_OFFICE = 4, _("Country Office") + REPRESENTATIVE_OFFICE = 5, _("Representative Office") # select name, society_name, record_type from api_country where name like '%luster%'; # select name, society_name, record_type from api_country where name like '%egion%'; @@ -125,600 +133,469 @@ class CountryType(models.IntegerChoices): @reversion.register() class Country(models.Model): - """ A country """ + """A country""" - name = models.CharField(verbose_name=_('name'), max_length=100) - record_type = models.IntegerField(choices=CountryType.choices, verbose_name=_('type'), default=1, help_text=_('Type of entity')) + name = models.CharField(verbose_name=_("name"), max_length=100) + record_type = models.IntegerField( + choices=CountryType.choices, verbose_name=_("type"), default=1, help_text=_("Type of entity") + ) iso = models.CharField( - verbose_name=_('ISO'), max_length=2, null=True, blank=True, unique=True, - validators=[RegexValidator('^[A-Z]*$', 'ISO must be uppercase')]) + verbose_name=_("ISO"), + max_length=2, + null=True, + blank=True, + unique=True, + validators=[RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + ) iso3 = models.CharField( - verbose_name=_('ISO3'), max_length=3, null=True, blank=True, unique=True, - validators=[RegexValidator('^[A-Z]*$', 'ISO must be uppercase')]) - fdrs = models.CharField(verbose_name=_('FDRS'), max_length=6, null=True, blank=True) - society_name = models.TextField(verbose_name=_('society name'), blank=True) - society_url = models.URLField(blank=True, verbose_name=_('URL - Society')) - url_ifrc = models.URLField(blank=True, verbose_name=_('URL - IFRC')) - region = models.ForeignKey(Region, verbose_name=_('region'), null=True, blank=True, on_delete=models.SET_NULL) - overview = models.TextField(verbose_name=_('overview'), blank=True, null=True) - key_priorities = models.TextField(verbose_name=_('key priorities'), blank=True, null=True) - inform_score = models.DecimalField(verbose_name=_('inform score'), blank=True, null=True, decimal_places=2, max_digits=3) + verbose_name=_("ISO3"), + max_length=3, + null=True, + blank=True, + unique=True, + validators=[RegexValidator("^[A-Z]*$", "ISO must be uppercase")], + ) + fdrs = models.CharField(verbose_name=_("FDRS"), max_length=6, null=True, blank=True) + society_name = models.TextField(verbose_name=_("society name"), blank=True) + society_url = models.URLField(blank=True, verbose_name=_("URL - Society")) + url_ifrc = models.URLField(blank=True, verbose_name=_("URL - IFRC")) + region = models.ForeignKey(Region, verbose_name=_("region"), null=True, blank=True, on_delete=models.SET_NULL) + overview = models.TextField(verbose_name=_("overview"), blank=True, null=True) + key_priorities = models.TextField(verbose_name=_("key priorities"), blank=True, null=True) + inform_score = models.DecimalField(verbose_name=_("inform score"), blank=True, null=True, decimal_places=2, max_digits=3) logo = models.FileField( - blank=True, null=True, verbose_name=_('logo'), upload_to=logo_document_path, - validators=[FileExtensionValidator(allowed_extensions=['png', 'jpg', 'gif'])] + blank=True, + null=True, + verbose_name=_("logo"), + upload_to=logo_document_path, + validators=[FileExtensionValidator(allowed_extensions=["png", "jpg", "gif"])], ) centroid = models.PointField(srid=4326, blank=True, null=True) bbox = models.PolygonField(srid=4326, blank=True, null=True) - independent = models.BooleanField( - default=None, null=True, help_text=_('Is this an independent country?') - ) - is_deprecated = models.BooleanField( - default=False, help_text=_('Is this an active, valid country?') - ) + independent = models.BooleanField(default=None, null=True, help_text=_("Is this an independent country?")) + is_deprecated = models.BooleanField(default=False, help_text=_("Is this an active, valid country?")) sovereign_state = models.ForeignKey( - 'self', verbose_name=_('Country ID of the Sovereign State'), - null=True, blank=True, default=None, on_delete=models.SET_NULL + "self", + verbose_name=_("Country ID of the Sovereign State"), + null=True, + blank=True, + default=None, + on_delete=models.SET_NULL, ) - disputed = models.BooleanField(help_text=_('Is this country disputed?'), default=False) + disputed = models.BooleanField(help_text=_("Is this country disputed?"), default=False) # Population Data From WB API wb_population = models.PositiveIntegerField( - verbose_name=_('WB population'), null=True, blank=True, help_text=_('population data from WB API') + verbose_name=_("WB population"), null=True, blank=True, help_text=_("population data from WB API") ) wb_year = models.CharField( - verbose_name=_('WB Year'), max_length=4, null=True, blank=True, help_text=_('population data year from WB API') + verbose_name=_("WB Year"), max_length=4, null=True, blank=True, help_text=_("population data year from WB API") ) - additional_tab_name = models.CharField(verbose_name=_('Label for Additional Tab'), max_length=100, blank=True) + additional_tab_name = models.CharField(verbose_name=_("Label for Additional Tab"), max_length=100, blank=True) # Additional NS Indicator fields - nsi_income = models.IntegerField(verbose_name=_('Income (CHF)'), blank=True, null=True) - nsi_expenditures = models.IntegerField(verbose_name=_('Expenditures (CHF)'), blank=True, null=True) - nsi_branches = models.IntegerField(verbose_name=_('Branches'), blank=True, null=True) - nsi_staff = models.IntegerField(verbose_name=_('Staff'), blank=True, null=True) - nsi_volunteers = models.IntegerField(verbose_name=_('Volunteers'), blank=True, null=True) - nsi_youth = models.IntegerField(verbose_name=_('Youth - 6-19 Yrs'), blank=True, null=True) - nsi_trained_in_first_aid = models.IntegerField(verbose_name=_('Trained in First Aid'), blank=True, null=True) - nsi_gov_financial_support = models.BooleanField(verbose_name=_('Gov Financial Support'), blank=True, null=True) + nsi_income = models.IntegerField(verbose_name=_("Income (CHF)"), blank=True, null=True) + nsi_expenditures = models.IntegerField(verbose_name=_("Expenditures (CHF)"), blank=True, null=True) + nsi_branches = models.IntegerField(verbose_name=_("Branches"), blank=True, null=True) + nsi_staff = models.IntegerField(verbose_name=_("Staff"), blank=True, null=True) + nsi_volunteers = models.IntegerField(verbose_name=_("Volunteers"), blank=True, null=True) + nsi_youth = models.IntegerField(verbose_name=_("Youth - 6-19 Yrs"), blank=True, null=True) + nsi_trained_in_first_aid = models.IntegerField(verbose_name=_("Trained in First Aid"), blank=True, null=True) + nsi_gov_financial_support = models.BooleanField(verbose_name=_("Gov Financial Support"), blank=True, null=True) nsi_domestically_generated_income = models.BooleanField( - verbose_name=_('>50% Domestically Generated Income'), blank=True, null=True) - nsi_annual_fdrs_reporting = models.BooleanField(verbose_name=_('Annual Reporting to FDRS'), blank=True, null=True) + verbose_name=_(">50% Domestically Generated Income"), blank=True, null=True + ) + nsi_annual_fdrs_reporting = models.BooleanField(verbose_name=_("Annual Reporting to FDRS"), blank=True, null=True) nsi_policy_implementation = models.BooleanField( - verbose_name=_('Your Policy / Programme Implementation'), blank=True, null=True) - nsi_risk_management_framework = models.BooleanField(verbose_name=_('Risk Management Framework'), blank=True, null=True) - nsi_cmc_dashboard_compliance = models.BooleanField(verbose_name=_('Complying with CMC Dashboard'), blank=True, null=True) + verbose_name=_("Your Policy / Programme Implementation"), blank=True, null=True + ) + nsi_risk_management_framework = models.BooleanField(verbose_name=_("Risk Management Framework"), blank=True, null=True) + nsi_cmc_dashboard_compliance = models.BooleanField(verbose_name=_("Complying with CMC Dashboard"), blank=True, null=True) # WASH Capacity Indicators - wash_total_staff = models.IntegerField(verbose_name=_('Total WASH Staff'), null=True, blank=True) - wash_kit2 = models.IntegerField(verbose_name=_('WASH Kit2'), null=True, blank=True) - wash_kit5 = models.IntegerField(verbose_name=_('WASH Kit5'), null=True, blank=True) - wash_kit10 = models.IntegerField(verbose_name=_('WASH Kit10'), null=True, blank=True) - wash_staff_at_hq = models.IntegerField(verbose_name=_('WASH Staff at HQ'), null=True, blank=True) - wash_staff_at_branch = models.IntegerField(verbose_name=_('WASH Staff at Branch'), null=True, blank=True) - wash_ndrt_trained = models.IntegerField(verbose_name=_('NDRT Trained'), null=True, blank=True) - wash_rdrt_trained = models.IntegerField(verbose_name=_('RDRT Trained'), null=True, blank=True) - - in_search = models.BooleanField(verbose_name=_('Include in Search'), default=True) + wash_total_staff = models.IntegerField(verbose_name=_("Total WASH Staff"), null=True, blank=True) + wash_kit2 = models.IntegerField(verbose_name=_("WASH Kit2"), null=True, blank=True) + wash_kit5 = models.IntegerField(verbose_name=_("WASH Kit5"), null=True, blank=True) + wash_kit10 = models.IntegerField(verbose_name=_("WASH Kit10"), null=True, blank=True) + wash_staff_at_hq = models.IntegerField(verbose_name=_("WASH Staff at HQ"), null=True, blank=True) + wash_staff_at_branch = models.IntegerField(verbose_name=_("WASH Staff at Branch"), null=True, blank=True) + wash_ndrt_trained = models.IntegerField(verbose_name=_("NDRT Trained"), null=True, blank=True) + wash_rdrt_trained = models.IntegerField(verbose_name=_("RDRT Trained"), null=True, blank=True) + + in_search = models.BooleanField(verbose_name=_("Include in Search"), default=True) # Used in Emergency Project average_household_size = models.DecimalField( - verbose_name=_('Average Household Size'), - null=True, blank=True, - max_digits=5, decimal_places=2 - ) - address_1 = models.CharField( - verbose_name=_('Address 1'), - null=True, blank=True, - max_length=255 - ) - address_2 = models.CharField( - verbose_name=_('Address 2'), - null=True, blank=True, - max_length=255 - ) - city_code = models.CharField( - verbose_name=_('City Code'), - null=True, blank=True, - max_length=255 - ) - phone = models.CharField( - verbose_name=_('Phone'), - null=True, blank=True, - max_length=255 - ) - website = models.CharField( - verbose_name=_('Website'), - null=True, blank=True, - max_length=255 + verbose_name=_("Average Household Size"), null=True, blank=True, max_digits=5, decimal_places=2 ) + address_1 = models.CharField(verbose_name=_("Address 1"), null=True, blank=True, max_length=255) + address_2 = models.CharField(verbose_name=_("Address 2"), null=True, blank=True, max_length=255) + city_code = models.CharField(verbose_name=_("City Code"), null=True, blank=True, max_length=255) + phone = models.CharField(verbose_name=_("Phone"), null=True, blank=True, max_length=255) + website = models.CharField(verbose_name=_("Website"), null=True, blank=True, max_length=255) emails = ArrayField( models.CharField( - verbose_name=_('Email'), - null=True, blank=True, + verbose_name=_("Email"), + null=True, + blank=True, max_length=255, ), default=list, - null=True, blank=True - ) - founded_date = models.DateField( - verbose_name=_('Found date'), - null=True, blank=True + null=True, + blank=True, ) + founded_date = models.DateField(verbose_name=_("Found date"), null=True, blank=True) # disaster law url - disaster_law_url = models.CharField( - verbose_name=_('Disaster law url'), - null=True, blank=True, - max_length=255 - ) + disaster_law_url = models.CharField(verbose_name=_("Disaster law url"), null=True, blank=True, max_length=255) def indexing(self): return { - 'id': self.id, - 'event_id': None, - 'type': 'country', - 'name': self.name, - 'keyword': None, - 'visibility': None, - 'ns': None, - 'body': '%s %s' % ( + "id": self.id, + "event_id": None, + "type": "country", + "name": self.name, + "keyword": None, + "visibility": None, + "ns": None, + "body": "%s %s" + % ( self.name, self.society_name, ), - 'date': None + "date": None, } def es_id(self): - return 'country-%s' % self.id + return "country-%s" % self.id class Meta: - ordering = ('name',) - verbose_name = _('country') - verbose_name_plural = _('countries') + ordering = ("name",) + verbose_name = _("country") + verbose_name_plural = _("countries") def __str__(self): return self.name class District(models.Model): - """ Admin level 1 field """ + """Admin level 1 field""" - name = models.CharField(verbose_name=_('name'), max_length=100) - code = models.CharField(verbose_name=_('code'), max_length=10) - country = models.ForeignKey(Country, verbose_name=_('country'), null=True, on_delete=models.SET_NULL) + name = models.CharField(verbose_name=_("name"), max_length=100) + code = models.CharField(verbose_name=_("code"), max_length=10) + country = models.ForeignKey(Country, verbose_name=_("country"), null=True, on_delete=models.SET_NULL) is_enclave = models.BooleanField( - verbose_name=_('is enclave?'), default=False, help_text=_('Is it an enclave away from parent country?') + verbose_name=_("is enclave?"), default=False, help_text=_("Is it an enclave away from parent country?") ) # used to mark if the district is far away from the country centroid = models.PointField(srid=4326, blank=True, null=True) bbox = models.PolygonField(srid=4326, blank=True, null=True) - is_deprecated = models.BooleanField( - default=False, help_text=_('Is this an active, valid district?') - ) + is_deprecated = models.BooleanField(default=False, help_text=_("Is this an active, valid district?")) # Population Data From WB API wb_population = models.PositiveIntegerField( - verbose_name=_('WB population'), null=True, blank=True, help_text=_('population data from WB API') + verbose_name=_("WB population"), null=True, blank=True, help_text=_("population data from WB API") ) wb_year = models.CharField( - verbose_name=_('WB year'), max_length=4, null=True, blank=True, help_text=_('population data year from WB API') + verbose_name=_("WB year"), max_length=4, null=True, blank=True, help_text=_("population data year from WB API") ) class Meta: - ordering = ('code',) - verbose_name = _('district') - verbose_name_plural = _('districts') + ordering = ("code",) + verbose_name = _("district") + verbose_name_plural = _("districts") def __str__(self): - country_name = self.country.name if self.country else '' - suffix = ' ⚡' if self.is_deprecated else '' - return f'{country_name} - {self.name}{suffix}' + country_name = self.country.name if self.country else "" + suffix = " ⚡" if self.is_deprecated else "" + return f"{country_name} - {self.name}{suffix}" class CountryDirectory(models.Model): - country = models.ForeignKey( - Country, - verbose_name=_('Country'), - on_delete=models.CASCADE - ) - first_name = models.CharField( - verbose_name=_('First Name'), - max_length=255, - null=True, blank=True - ) - last_name = models.CharField( - verbose_name=_('Last Name'), - max_length=255, - null=True, blank=True - ) - position = models.CharField( - verbose_name=_('Position'), - max_length=255, - null=True, blank=True - ) + country = models.ForeignKey(Country, verbose_name=_("Country"), on_delete=models.CASCADE) + first_name = models.CharField(verbose_name=_("First Name"), max_length=255, null=True, blank=True) + last_name = models.CharField(verbose_name=_("Last Name"), max_length=255, null=True, blank=True) + position = models.CharField(verbose_name=_("Position"), max_length=255, null=True, blank=True) def __str__(self): - return f'{self.country.name} - {self.first_name}' + return f"{self.country.name} - {self.first_name}" class CountrySupportingPartner(models.Model): class SupportingPartnerType(models.IntegerChoices): - IFRC = 0, _('Ifrc') - INTERNATIONAL_PARTNERS = 1, _('International Partners') - - country = models.ForeignKey( - Country, - verbose_name=_('Country'), - on_delete=models.CASCADE - ) - first_name = models.CharField( - verbose_name=_('First Name'), - max_length=255, - null=True, blank=True - ) - last_name = models.CharField( - verbose_name=_('Last Name'), - max_length=255, - null=True, blank=True - ) - position = models.CharField( - verbose_name=_('Position'), - max_length=255, - null=True, blank=True - ) - email = models.CharField( - verbose_name=_('Email'), - max_length=255, - null=True, blank=True - ) + IFRC = 0, _("Ifrc") + INTERNATIONAL_PARTNERS = 1, _("International Partners") + + country = models.ForeignKey(Country, verbose_name=_("Country"), on_delete=models.CASCADE) + first_name = models.CharField(verbose_name=_("First Name"), max_length=255, null=True, blank=True) + last_name = models.CharField(verbose_name=_("Last Name"), max_length=255, null=True, blank=True) + position = models.CharField(verbose_name=_("Position"), max_length=255, null=True, blank=True) + email = models.CharField(verbose_name=_("Email"), max_length=255, null=True, blank=True) supporting_type = models.IntegerField( - choices=SupportingPartnerType.choices, - verbose_name=_('Supporting Type'), - null=True, blank=True + choices=SupportingPartnerType.choices, verbose_name=_("Supporting Type"), null=True, blank=True ) def __str__(self): - return f'{self.country.name} - {self.first_name} - {self.last_name}' + return f"{self.country.name} - {self.first_name} - {self.last_name}" class CountryKeyDocument(models.Model): - country = models.ForeignKey( - Country, - verbose_name=_('Country'), - on_delete=models.CASCADE - ) + country = models.ForeignKey(Country, verbose_name=_("Country"), on_delete=models.CASCADE) name = models.CharField( - verbose_name=_('Name'), + verbose_name=_("Name"), max_length=255, ) - url = models.CharField( - verbose_name=_('Url'), - max_length=255 - ) - thumbnail = models.CharField( - verbose_name=_('Thumbnail'), - max_length=255 - ) - document_type = models.CharField( - verbose_name=_('Document Type'), - max_length=255 - ) - year = models.DateField( - verbose_name=_('Year') - ) - end_year = models.DateField( - verbose_name=_('End Year'), - null=True, blank=True - ) - year_text = models.CharField( - verbose_name=_('Year Text'), - max_length=255, - null=True, blank=True - ) + url = models.CharField(verbose_name=_("Url"), max_length=255) + thumbnail = models.CharField(verbose_name=_("Thumbnail"), max_length=255) + document_type = models.CharField(verbose_name=_("Document Type"), max_length=255) + year = models.DateField(verbose_name=_("Year")) + end_year = models.DateField(verbose_name=_("End Year"), null=True, blank=True) + year_text = models.CharField(verbose_name=_("Year Text"), max_length=255, null=True, blank=True) def __str__(self): - return f'{self.country.name} - {self.name}' + return f"{self.country.name} - {self.name}" class CountryCapacityStrengthening(models.Model): class AssessmentType(models.IntegerChoices): - OCAC = 0, _('Ocac') - BOCA = 1, _('Boca') + OCAC = 0, _("Ocac") + BOCA = 1, _("Boca") - country = models.ForeignKey( - Country, - verbose_name=_('Country'), - on_delete=models.CASCADE - ) - assessment_code = models.CharField( - verbose_name=_('Assessment Code'), - max_length=255 - ) - year = models.CharField( - verbose_name=_('Year of Assessment'), - max_length=25 - ) - submission_date = models.DateTimeField( - verbose_name=_('Submission Date') - ) + country = models.ForeignKey(Country, verbose_name=_("Country"), on_delete=models.CASCADE) + assessment_code = models.CharField(verbose_name=_("Assessment Code"), max_length=255) + year = models.CharField(verbose_name=_("Year of Assessment"), max_length=25) + submission_date = models.DateTimeField(verbose_name=_("Submission Date")) url = models.CharField( - verbose_name=_('Url'), - max_length=255, - ) - assessment_type = models.IntegerField( - verbose_name=_('Country Assessment Type'), - choices=AssessmentType.choices - ) - branch_name = models.CharField( - verbose_name=_('Branch Name'), + verbose_name=_("Url"), max_length=255, - null=True, - blank=True ) + assessment_type = models.IntegerField(verbose_name=_("Country Assessment Type"), choices=AssessmentType.choices) + branch_name = models.CharField(verbose_name=_("Branch Name"), max_length=255, null=True, blank=True) def __str__(self): - return f'{self.country.name} - {self.assessment_code} - {self.year}' + return f"{self.country.name} - {self.assessment_code} - {self.year}" class CountryOrganizationalCapacity(models.Model): - country = models.OneToOneField( - Country, - verbose_name=_('Country'), - on_delete=models.CASCADE - ) - leadership_capacity = models.TextField( - verbose_name=_('Leadership Capacity'), - null=True, blank=True - ) - youth_capacity = models.TextField( - verbose_name=_('Youth Capacity'), - null=True, blank=True - ) - volunteer_capacity = models.TextField( - verbose_name=_('Volunteer Capacity'), - null=True, blank=True - ) - financial_capacity = models.TextField( - verbose_name=_('Financial Capacity'), - null=True, blank=True - ) + country = models.OneToOneField(Country, verbose_name=_("Country"), on_delete=models.CASCADE) + leadership_capacity = models.TextField(verbose_name=_("Leadership Capacity"), null=True, blank=True) + youth_capacity = models.TextField(verbose_name=_("Youth Capacity"), null=True, blank=True) + volunteer_capacity = models.TextField(verbose_name=_("Volunteer Capacity"), null=True, blank=True) + financial_capacity = models.TextField(verbose_name=_("Financial Capacity"), null=True, blank=True) class NSDInitiatives(models.Model): - country = models.ForeignKey( - Country, - verbose_name=_('Country'), - on_delete=models.CASCADE - ) - title = models.CharField( - verbose_name=_('Title'), - max_length=255 - ) - fund_type = models.CharField( - verbose_name=_('Fund Type'), - max_length=255 - ) - allocation = models.IntegerField( - verbose_name=_('Allocation in CHF') - ) - year = models.CharField( - verbose_name=_('Year'), - max_length=20 - ) - funding_period = models.IntegerField( - verbose_name=_('Funding Period in Month') - ) - categories = ArrayField( - models.CharField(max_length=255), - verbose_name=_('Funding categories'), default=list, - null=True - ) + country = models.ForeignKey(Country, verbose_name=_("Country"), on_delete=models.CASCADE) + title = models.CharField(verbose_name=_("Title"), max_length=255) + fund_type = models.CharField(verbose_name=_("Fund Type"), max_length=255) + allocation = models.IntegerField(verbose_name=_("Allocation in CHF")) + year = models.CharField(verbose_name=_("Year"), max_length=20) + funding_period = models.IntegerField(verbose_name=_("Funding Period in Month")) + categories = ArrayField(models.CharField(max_length=255), verbose_name=_("Funding categories"), default=list, null=True) def __str__(self): - return f'{self.country.name} - {self.title}' + return f"{self.country.name} - {self.title}" class CountryICRCPresence(models.Model): - country = models.OneToOneField( - Country, - verbose_name=_('Country'), - on_delete=models.CASCADE - ) - icrc_presence = models.BooleanField( - verbose_name=_('ICRC Presence'), - null=True, blank=True - ) - url = models.CharField( - verbose_name=_('Url'), - null=True, blank=True, - max_length=255 - ) - key_operation = models.BooleanField( - verbose_name=_('Key Operations'), - null=True, blank=True - ) - description = models.TextField( - verbose_name=_('Description'), - null=True, blank=True - ) + country = models.OneToOneField(Country, verbose_name=_("Country"), on_delete=models.CASCADE) + icrc_presence = models.BooleanField(verbose_name=_("ICRC Presence"), null=True, blank=True) + url = models.CharField(verbose_name=_("Url"), null=True, blank=True, max_length=255) + key_operation = models.BooleanField(verbose_name=_("Key Operations"), null=True, blank=True) + description = models.TextField(verbose_name=_("Description"), null=True, blank=True) def __str__(self): - return f'{self.country.name} - {self.url}' + return f"{self.country.name} - {self.url}" class Admin2(models.Model): - """ Used for admin2, District refers to admin1 """ - admin1 = models.ForeignKey(District, verbose_name=_('Admin 1'), on_delete=models.PROTECT) - name = models.CharField(verbose_name=_('name'), max_length=100) - code = models.CharField(verbose_name=_('code'), max_length=64, unique=True) + """Used for admin2, District refers to admin1""" + + admin1 = models.ForeignKey(District, verbose_name=_("Admin 1"), on_delete=models.PROTECT) + name = models.CharField(verbose_name=_("name"), max_length=100) + code = models.CharField(verbose_name=_("code"), max_length=64, unique=True) centroid = models.PointField(srid=4326, blank=True, null=True) bbox = models.PolygonField(srid=4326, blank=True, null=True) - local_name = models.CharField(verbose_name=_('Local Name'), max_length=100, blank=True, null=True) - local_name_code = models.CharField(verbose_name=_('Local Name Language Code'), max_length=10, blank=True, null=True) - alternate_name = models.CharField(verbose_name=_('Alternate Name'), max_length=100, blank=True, null=True) - alternate_name_code = models.CharField(verbose_name=_('Alternate Name Language Code'), max_length=10, blank=True, null=True) - is_deprecated = models.BooleanField(default=False, help_text=_('Is this a deprecated area?')) - created_at = models.DateTimeField(verbose_name=_('Created at'), auto_now_add=True) + local_name = models.CharField(verbose_name=_("Local Name"), max_length=100, blank=True, null=True) + local_name_code = models.CharField(verbose_name=_("Local Name Language Code"), max_length=10, blank=True, null=True) + alternate_name = models.CharField(verbose_name=_("Alternate Name"), max_length=100, blank=True, null=True) + alternate_name_code = models.CharField(verbose_name=_("Alternate Name Language Code"), max_length=10, blank=True, null=True) + is_deprecated = models.BooleanField(default=False, help_text=_("Is this a deprecated area?")) + created_at = models.DateTimeField(verbose_name=_("Created at"), auto_now_add=True) class Meta: - verbose_name = _('admin2') - verbose_name_plural = _('admin2s') - ordering = ('code',) + verbose_name = _("admin2") + verbose_name_plural = _("admin2s") + ordering = ("code",) def __str__(self): - return f'{self.admin1} - {self.name}' + return f"{self.admin1} - {self.name}" class CountryGeoms(models.Model): - """ Admin0 geometries """ + """Admin0 geometries""" + geom = models.MultiPolygonField(srid=4326, blank=True, null=True) - country = models.OneToOneField(Country, verbose_name=_('country'), on_delete=models.DO_NOTHING, primary_key=True) + country = models.OneToOneField(Country, verbose_name=_("country"), on_delete=models.DO_NOTHING, primary_key=True) class DistrictGeoms(models.Model): - """ Admin1 geometries """ + """Admin1 geometries""" + geom = models.MultiPolygonField(srid=4326, blank=True, null=True) - district = models.OneToOneField(District, verbose_name=_('district'), on_delete=models.DO_NOTHING, primary_key=True) + district = models.OneToOneField(District, verbose_name=_("district"), on_delete=models.DO_NOTHING, primary_key=True) class Admin2Geoms(models.Model): - """ Admin2 geometries """ + """Admin2 geometries""" + geom = models.GeometryField(srid=4326, blank=True, null=True) - admin2 = models.OneToOneField(Admin2, verbose_name=_('admin2'), on_delete=models.DO_NOTHING, primary_key=True) + admin2 = models.OneToOneField(Admin2, verbose_name=_("admin2"), on_delete=models.DO_NOTHING, primary_key=True) class VisibilityChoices(models.IntegerChoices): - MEMBERSHIP = 1, _('RCRC Movement') - IFRC = 2, _('IFRC Secretariat') - PUBLIC = 3, _('Public') - IFRC_NS = 4, _('IFRC and NS') + MEMBERSHIP = 1, _("RCRC Movement") + IFRC = 2, _("IFRC Secretariat") + PUBLIC = 3, _("Public") + IFRC_NS = 4, _("IFRC and NS") class VisibilityCharChoices(models.TextChoices): """Same as VisibilityChoices but using char instead of Enum""" - MEMBERSHIP = 'logged_in_user', _('RCRC Movement') - IFRC = 'ifrc_only', _('IFRC Secretariat') - PUBLIC = 'public', _('Public') - IFRC_NS = 'ifrc_ns', _('IFRC and NS') + + MEMBERSHIP = "logged_in_user", _("RCRC Movement") + IFRC = "ifrc_only", _("IFRC Secretariat") + PUBLIC = "public", _("Public") + IFRC_NS = "ifrc_ns", _("IFRC and NS") # Common parent class for key figures. # Country/region variants inherit from this. @reversion.register() class AdminKeyFigure(models.Model): - figure = models.CharField(verbose_name=_('figure'), max_length=100) - deck = models.CharField(verbose_name=_('deck'), max_length=50) - source = models.CharField(verbose_name=_('source'), max_length=256) - visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=3) + figure = models.CharField(verbose_name=_("figure"), max_length=100) + deck = models.CharField(verbose_name=_("deck"), max_length=50) + source = models.CharField(verbose_name=_("source"), max_length=256) + visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=3) class Meta: - ordering = ('source',) - verbose_name = _('admin key figure') - verbose_name_plural = _('admin key figures') + ordering = ("source",) + verbose_name = _("admin key figure") + verbose_name_plural = _("admin key figures") def __str__(self): return self.source class RegionKeyFigure(AdminKeyFigure): - region = models.ForeignKey(Region, verbose_name=_('region'), related_name='key_figures', on_delete=models.CASCADE) + region = models.ForeignKey(Region, verbose_name=_("region"), related_name="key_figures", on_delete=models.CASCADE) class Meta: - verbose_name = _('region key figure') - verbose_name_plural = _('region key figures') + verbose_name = _("region key figure") + verbose_name_plural = _("region key figures") class CountryKeyFigure(AdminKeyFigure): - country = models.ForeignKey(Country, verbose_name=_('country'), related_name='key_figures', on_delete=models.CASCADE) + country = models.ForeignKey(Country, verbose_name=_("country"), related_name="key_figures", on_delete=models.CASCADE) class Meta: - verbose_name = _('country key figure') - verbose_name_plural = _('country key figures') + verbose_name = _("country key figure") + verbose_name_plural = _("country key figures") class PositionType(models.IntegerChoices): - TOP = 1, _('Top') - HIGH = 2, _('High') - MIDDLE = 3, _('Middle') - LOW = 4, _('Low') - BOTTOM = 5, _('Bottom') + TOP = 1, _("Top") + HIGH = 2, _("High") + MIDDLE = 3, _("Middle") + LOW = 4, _("Low") + BOTTOM = 5, _("Bottom") class TabNumber(models.IntegerChoices): - TAB_1 = 1, _('Tab 1') - TAB_2 = 2, _('Tab 2') - TAB_3 = 3, _('Tab 3') + TAB_1 = 1, _("Tab 1") + TAB_2 = 2, _("Tab 2") + TAB_3 = 3, _("Tab 3") -@reversion.register(follow=('region',)) +@reversion.register(follow=("region",)) class RegionSnippet(models.Model): - region = models.ForeignKey(Region, verbose_name=_('region'), related_name='snippets', on_delete=models.CASCADE) - snippet = HTMLField(verbose_name=_('snippet'), null=True, blank=True) - image = models.ImageField(verbose_name=_('image'), null=True, blank=True, upload_to='regions/%Y/%m/%d/') - visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=3) - position = models.IntegerField(choices=PositionType.choices, verbose_name=_('position'), default=3) + region = models.ForeignKey(Region, verbose_name=_("region"), related_name="snippets", on_delete=models.CASCADE) + snippet = HTMLField(verbose_name=_("snippet"), null=True, blank=True) + image = models.ImageField(verbose_name=_("image"), null=True, blank=True, upload_to="regions/%Y/%m/%d/") + visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=3) + position = models.IntegerField(choices=PositionType.choices, verbose_name=_("position"), default=3) class Meta: - ordering = ('position', 'id',) - verbose_name = _('region snippet') - verbose_name_plural = _('region snippets') + ordering = ( + "position", + "id", + ) + verbose_name = _("region snippet") + verbose_name_plural = _("region snippets") def __str__(self): - return ( - self.snippet[:80] if self.snippet else None - ) or ( - self.image.url - if getattr(self, 'image', None) and self.image.url - else '' + return (self.snippet[:80] if self.snippet else None) or ( + self.image.url if getattr(self, "image", None) and self.image.url else "" ) -@reversion.register(follow=('region',)) +@reversion.register(follow=("region",)) class RegionEmergencySnippet(models.Model): - region = models.ForeignKey(Region, verbose_name=_('region'), related_name='emergency_snippets', on_delete=models.CASCADE) + region = models.ForeignKey(Region, verbose_name=_("region"), related_name="emergency_snippets", on_delete=models.CASCADE) title = models.CharField(max_length=255, blank=True) - snippet = HTMLField(verbose_name=_('snippet'), null=True, blank=True) + snippet = HTMLField(verbose_name=_("snippet"), null=True, blank=True) # visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=3) - position = models.IntegerField(choices=PositionType.choices, verbose_name=_('position'), default=3) + position = models.IntegerField(choices=PositionType.choices, verbose_name=_("position"), default=3) class Meta: - ordering = ('position', 'id',) - verbose_name = _('region emergencies snippet') - verbose_name_plural = _('region emergencies snippets') + ordering = ( + "position", + "id", + ) + verbose_name = _("region emergencies snippet") + verbose_name_plural = _("region emergencies snippets") def __str__(self): - return (self.snippet[:80] if self.snippet else None) or self.title or '' + return (self.snippet[:80] if self.snippet else None) or self.title or "" -@reversion.register(follow=('region',)) +@reversion.register(follow=("region",)) class RegionPreparednessSnippet(models.Model): - region = models.ForeignKey(Region, verbose_name=_('region'), related_name='preparedness_snippets', on_delete=models.CASCADE) + region = models.ForeignKey(Region, verbose_name=_("region"), related_name="preparedness_snippets", on_delete=models.CASCADE) title = models.CharField(max_length=255, blank=True) - snippet = HTMLField(verbose_name=_('snippet'), null=True, blank=True) + snippet = HTMLField(verbose_name=_("snippet"), null=True, blank=True) # visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=3) - position = models.IntegerField(choices=PositionType.choices, verbose_name=_('position'), default=3) + position = models.IntegerField(choices=PositionType.choices, verbose_name=_("position"), default=3) class Meta: - ordering = ('position', 'id',) - verbose_name = _('region preparedness snippet') - verbose_name_plural = _('region preparedness snippets') + ordering = ( + "position", + "id", + ) + verbose_name = _("region preparedness snippet") + verbose_name_plural = _("region preparedness snippets") def __str__(self): - return (self.snippet[:80] if self.snippet else None) or self.title or '' + return (self.snippet[:80] if self.snippet else None) or self.title or "" -@reversion.register(follow=('region',)) +@reversion.register(follow=("region",)) class RegionProfileSnippet(models.Model): - region = models.ForeignKey(Region, verbose_name=_('region'), related_name='profile_snippets', on_delete=models.CASCADE) + region = models.ForeignKey(Region, verbose_name=_("region"), related_name="profile_snippets", on_delete=models.CASCADE) title = models.CharField(max_length=255, blank=True) - snippet = HTMLField(verbose_name=_('snippet'), null=True, blank=True) + snippet = HTMLField(verbose_name=_("snippet"), null=True, blank=True) # visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=3) - position = models.IntegerField(choices=PositionType.choices, verbose_name=_('position'), default=3) + position = models.IntegerField(choices=PositionType.choices, verbose_name=_("position"), default=3) class Meta: - ordering = ('position', 'id',) - verbose_name = _('region profile snippet') - verbose_name_plural = _('region profile snippets') + ordering = ( + "position", + "id", + ) + verbose_name = _("region profile snippet") + verbose_name_plural = _("region profile snippets") def __str__(self): - return (self.snippet[:80] if self.snippet else None) or self.title or '' + return (self.snippet[:80] if self.snippet else None) or self.title or "" + # class RegionAdditionalLink(models.Model): # region = models.ForeignKey(Region, related_name='additional_links', on_delete=models.CASCADE) @@ -730,178 +607,187 @@ def __str__(self): # return self.title -@reversion.register(follow=('country',)) +@reversion.register(follow=("country",)) class CountrySnippet(models.Model): - country = models.ForeignKey(Country, verbose_name=_('country'), related_name='snippets', on_delete=models.CASCADE) - snippet = HTMLField(verbose_name=_('snippet'), null=True, blank=True) - image = models.ImageField(verbose_name=_('image'), null=True, blank=True, upload_to='countries/%Y/%m/%d/') - visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=3) - position = models.IntegerField(choices=PositionType.choices, verbose_name=_('position'), default=3) + country = models.ForeignKey(Country, verbose_name=_("country"), related_name="snippets", on_delete=models.CASCADE) + snippet = HTMLField(verbose_name=_("snippet"), null=True, blank=True) + image = models.ImageField(verbose_name=_("image"), null=True, blank=True, upload_to="countries/%Y/%m/%d/") + visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=3) + position = models.IntegerField(choices=PositionType.choices, verbose_name=_("position"), default=3) class Meta: - ordering = ('position', 'id',) - verbose_name = _('country snippet') - verbose_name_plural = _('country snippets') + ordering = ( + "position", + "id", + ) + verbose_name = _("country snippet") + verbose_name_plural = _("country snippets") def __str__(self): - return ( - self.snippet[:80] if self.snippet else None - ) or ( - self.image.url - if getattr(self, 'image', None) and self.image.url - else '' + return (self.snippet[:80] if self.snippet else None) or ( + self.image.url if getattr(self, "image", None) and self.image.url else "" ) @reversion.register() class AdminLink(models.Model): - title = models.CharField(verbose_name=_('title'), max_length=100) - url = models.URLField(verbose_name=_('url'), max_length=300) + title = models.CharField(verbose_name=_("title"), max_length=100) + url = models.URLField(verbose_name=_("url"), max_length=300) class Meta: - verbose_name = _('admin link') - verbose_name_plural = _('admin links') + verbose_name = _("admin link") + verbose_name_plural = _("admin links") class RegionLink(AdminLink): - region = models.ForeignKey(Region, verbose_name=_('region'), related_name='links', on_delete=models.CASCADE) - show_in_go = models.BooleanField(default=False, help_text='Show link contents within GO') + region = models.ForeignKey(Region, verbose_name=_("region"), related_name="links", on_delete=models.CASCADE) + show_in_go = models.BooleanField(default=False, help_text="Show link contents within GO") class Meta: - verbose_name = _('region link') - verbose_name_plural = _('region links') + verbose_name = _("region link") + verbose_name_plural = _("region links") class CountryLink(AdminLink): - country = models.ForeignKey(Country, verbose_name=_('country'), related_name='links', on_delete=models.CASCADE) + country = models.ForeignKey(Country, verbose_name=_("country"), related_name="links", on_delete=models.CASCADE) class Meta: - verbose_name = _('country link') - verbose_name_plural = _('country links') + verbose_name = _("country link") + verbose_name_plural = _("country links") @reversion.register() class AdminContact(models.Model): - ctype = models.CharField(verbose_name=_('type'), max_length=100, blank=True) - name = models.CharField(verbose_name=_('name'), max_length=100) - title = models.CharField(verbose_name=_('title'), max_length=300) - email = models.CharField(verbose_name=_('email'), max_length=300) + ctype = models.CharField(verbose_name=_("type"), max_length=100, blank=True) + name = models.CharField(verbose_name=_("name"), max_length=100) + title = models.CharField(verbose_name=_("title"), max_length=300) + email = models.CharField(verbose_name=_("email"), max_length=300) class Meta: - verbose_name = _('admin contact') - verbose_name_plural = _('admin contacts') + verbose_name = _("admin contact") + verbose_name_plural = _("admin contacts") def __str__(self): return self.name class RegionContact(AdminContact): - region = models.ForeignKey(Region, verbose_name=_('region'), related_name='contacts', on_delete=models.CASCADE) + region = models.ForeignKey(Region, verbose_name=_("region"), related_name="contacts", on_delete=models.CASCADE) class Meta: - verbose_name = _('region contact') - verbose_name_plural = _('region contacts') + verbose_name = _("region contact") + verbose_name_plural = _("region contacts") class CountryContact(AdminContact): - country = models.ForeignKey(Country, verbose_name=_('country'), related_name='contacts', on_delete=models.CASCADE) + country = models.ForeignKey(Country, verbose_name=_("country"), related_name="contacts", on_delete=models.CASCADE) class Meta: - verbose_name = _('country contact') - verbose_name_plural = _('country contacts') + verbose_name = _("country contact") + verbose_name_plural = _("country contacts") class AlertLevel(models.IntegerChoices): - YELLOW = 0, _('Yellow') - ORANGE = 1, _('Orange') - RED = 2, _('Red') + YELLOW = 0, _("Yellow") + ORANGE = 1, _("Orange") + RED = 2, _("Red") def snippet_image_path(instance, filename): - return 'emergencies/%s/%s' % (instance.id, filename) + return "emergencies/%s/%s" % (instance.id, filename) @reversion.register() class Event(models.Model): - """ A disaster, which could cover multiple countries """ + """A disaster, which could cover multiple countries""" - name = models.CharField(verbose_name=_('name'), max_length=256) + name = models.CharField(verbose_name=_("name"), max_length=256) # Obsolete: slug is not editable until we resolve https://github.com/IFRCGo/go-frontend/issues/1013 slug = models.CharField( - verbose_name=_('slug'), max_length=50, editable=True, default=None, unique=True, null=True, blank=True, + verbose_name=_("slug"), + max_length=50, + editable=True, + default=None, + unique=True, + null=True, + blank=True, validators=[validate_slug, validate_slug_number], help_text=_( - 'Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019.' - ' The string cannot start with a number and is forced to be lowercase.' - ' Recommend using hyphens over underscores. Special characters like # is not allowed.' - ) + "Optional string for a clean URL. For example, go.ifrc.org/emergency/hurricane-katrina-2019." + " The string cannot start with a number and is forced to be lowercase." + " Recommend using hyphens over underscores. Special characters like # is not allowed." + ), ) - dtype = models.ForeignKey(DisasterType, verbose_name=_('disaster type'), null=True, on_delete=models.SET_NULL) - districts = models.ManyToManyField(District, verbose_name=_('districts'), blank=True) - countries = models.ManyToManyField(Country, verbose_name=_('countries')) + dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, on_delete=models.SET_NULL) + districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True) + countries = models.ManyToManyField(Country, verbose_name=_("countries")) countries_for_preview = models.ManyToManyField( - Country, verbose_name=_('countries for preview'), - blank=True, related_name='countries_for_preview' + Country, verbose_name=_("countries for preview"), blank=True, related_name="countries_for_preview" ) - regions = models.ManyToManyField(Region, verbose_name=_('regions')) + regions = models.ManyToManyField(Region, verbose_name=_("regions")) parent_event = models.ForeignKey( - 'self', null=True, blank=True, verbose_name=_('Parent Emergency'), on_delete=models.SET_NULL, + "self", + null=True, + blank=True, + verbose_name=_("Parent Emergency"), + on_delete=models.SET_NULL, help_text=_( - 'If needed, you have to change the connected Appeals\', Field Reports\',' - ' etc to point to the parent Emergency manually.' - ) + "If needed, you have to change the connected Appeals', Field Reports'," + " etc to point to the parent Emergency manually." + ), ) - image = models.ImageField(verbose_name=_('image'), null=True, blank=True, upload_to=snippet_image_path) - summary = HTMLField(verbose_name=_('summary'), blank=True, default='') + image = models.ImageField(verbose_name=_("image"), null=True, blank=True, upload_to=snippet_image_path) + summary = HTMLField(verbose_name=_("summary"), blank=True, default="") - num_injured = models.IntegerField(verbose_name=_('number of injured'), null=True, blank=True) - num_dead = models.IntegerField(verbose_name=_('number of dead'), null=True, blank=True) - num_missing = models.IntegerField(verbose_name=_('number of missing'), null=True, blank=True) - num_affected = models.IntegerField(verbose_name=_('number of affected'), null=True, blank=True) - num_displaced = models.IntegerField(verbose_name=_('number of displaced'), null=True, blank=True) + num_injured = models.IntegerField(verbose_name=_("number of injured"), null=True, blank=True) + num_dead = models.IntegerField(verbose_name=_("number of dead"), null=True, blank=True) + num_missing = models.IntegerField(verbose_name=_("number of missing"), null=True, blank=True) + num_affected = models.IntegerField(verbose_name=_("number of affected"), null=True, blank=True) + num_displaced = models.IntegerField(verbose_name=_("number of displaced"), null=True, blank=True) - ifrc_severity_level = models.IntegerField(choices=AlertLevel.choices, default=0, verbose_name=_('IFRC Severity level')) - glide = models.CharField(verbose_name=_('glide'), max_length=18, blank=True) + ifrc_severity_level = models.IntegerField(choices=AlertLevel.choices, default=0, verbose_name=_("IFRC Severity level")) + glide = models.CharField(verbose_name=_("glide"), max_length=18, blank=True) - disaster_start_date = models.DateTimeField(verbose_name=_('disaster start date')) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - updated_at = models.DateTimeField(verbose_name=_('updated at'), auto_now=True) - previous_update = models.DateTimeField(verbose_name=_('previous update'), null=True, blank=True) + disaster_start_date = models.DateTimeField(verbose_name=_("disaster start date")) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + updated_at = models.DateTimeField(verbose_name=_("updated at"), auto_now=True) + previous_update = models.DateTimeField(verbose_name=_("previous update"), null=True, blank=True) - auto_generated = models.BooleanField(verbose_name=_('auto generated'), default=False, editable=False) + auto_generated = models.BooleanField(verbose_name=_("auto generated"), default=False, editable=False) auto_generated_source = models.CharField( - verbose_name=_('auto generated source'), max_length=50, null=True, blank=True, editable=False + verbose_name=_("auto generated source"), max_length=50, null=True, blank=True, editable=False ) # Meant to give the organization a way of highlighting certain, important events. - is_featured = models.BooleanField(default=False, verbose_name=_('is featured on home page')) + is_featured = models.BooleanField(default=False, verbose_name=_("is featured on home page")) # Allows admins to feature the Event on the region page. - is_featured_region = models.BooleanField(default=False, verbose_name=_('is featured on region page')) + is_featured_region = models.BooleanField(default=False, verbose_name=_("is featured on region page")) - hide_attached_field_reports = models.BooleanField(verbose_name=_('hide field report numeric details'), default=False) + hide_attached_field_reports = models.BooleanField(verbose_name=_("hide field report numeric details"), default=False) - hide_field_report_map = models.BooleanField(verbose_name=_('hide field report map'), default=False) + hide_field_report_map = models.BooleanField(verbose_name=_("hide field report map"), default=False) # Tabs. Events can have upto 3 tabs to organize snippets. tab_one_title = models.CharField( - verbose_name=_('tab one title'), max_length=50, null=False, blank=True, default='Additional Information' + verbose_name=_("tab one title"), max_length=50, null=False, blank=True, default="Additional Information" ) - tab_two_title = models.CharField(verbose_name=_('tab two title'), max_length=50, null=True, blank=True) - tab_three_title = models.CharField(verbose_name=_('tab three title'), max_length=50, null=True, blank=True) + tab_two_title = models.CharField(verbose_name=_("tab two title"), max_length=50, null=True, blank=True) + tab_three_title = models.CharField(verbose_name=_("tab three title"), max_length=50, null=True, blank=True) # visibility - visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=1) + visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1) emergency_response_contact_email = models.CharField( - verbose_name=_('emergency response contact email'), - null=True, blank=True, - max_length=255 + verbose_name=_("emergency response contact email"), null=True, blank=True, max_length=255 ) class Meta: - ordering = ('-disaster_start_date', 'id',) - verbose_name = _('emergency') - verbose_name_plural = _('emergencies') + ordering = ( + "-disaster_start_date", + "id", + ) + verbose_name = _("emergency") + verbose_name_plural = _("emergencies") # @staticmethod # def get_for(user): @@ -909,38 +795,39 @@ class Meta: # return Event.objects.prefetch_related(field_report_pretech) def start_date(self): - """ Get start date of first appeal """ - start_dates = [getattr(a, 'start_date') for a in self.appeals.all()] + """Get start date of first appeal""" + start_dates = [getattr(a, "start_date") for a in self.appeals.all()] return min(start_dates) if len(start_dates) else None def end_date(self): - """ Get latest end date of all appeals """ - end_dates = [getattr(a, 'end_date') for a in self.appeals.all()] + """Get latest end date of all appeals""" + end_dates = [getattr(a, "end_date") for a in self.appeals.all()] return max(end_dates) if len(end_dates) else None def indexing(self): countries = [c.name for c in self.countries.all()] - ns = [c.id for c in self.countries.all()] + ns = [c.id for c in self.countries.all()] return { - 'id': self.id, - 'event_id': self.id, - 'type': 'event', - 'name': self.name, - 'keyword': None, - 'visibility': self.visibility, - 'ns': ' '.join(map(str, ns)) if len(ns) else None, - 'body': '%s %s' % ( + "id": self.id, + "event_id": self.id, + "type": "event", + "name": self.name, + "keyword": None, + "visibility": self.visibility, + "ns": " ".join(map(str, ns)) if len(ns) else None, + "body": "%s %s" + % ( self.name, - ' '.join(map(str, countries)) if len(countries) else None, + " ".join(map(str, countries)) if len(countries) else None, ), - 'date': self.disaster_start_date, + "date": self.disaster_start_date, } def es_id(self): - return 'event-%s' % self.id + return "event-%s" % self.id def record_type(self): - return 'EVENT' + return "EVENT" def to_dict(self): return to_dict(self) @@ -965,19 +852,21 @@ def __str__(self): class EventFeaturedDocument(models.Model): event = models.ForeignKey( Event, - verbose_name=_('event'), + verbose_name=_("event"), on_delete=models.CASCADE, related_name="featured_documents", related_query_name="featured_document", ) - title = models.CharField(verbose_name=_('title'), max_length=200) - description = models.TextField(verbose_name=_('description')) + title = models.CharField(verbose_name=_("title"), max_length=200) + description = models.TextField(verbose_name=_("description")) thumbnail = models.ImageField( - verbose_name=_('thumbnail'), upload_to='event-featured-documents/thumbnail/', - help_text=_('Image should be portrait (3:4 aspect ratio) and scaled down to as close to 96x128 as the image size'), + verbose_name=_("thumbnail"), + upload_to="event-featured-documents/thumbnail/", + help_text=_("Image should be portrait (3:4 aspect ratio) and scaled down to as close to 96x128 as the image size"), ) file = models.FileField( - verbose_name=_('file'), upload_to='event-featured-documents/file/', + verbose_name=_("file"), + upload_to="event-featured-documents/file/", ) @@ -986,211 +875,219 @@ class EventLink(models.Model): """ Used in emergency overview. """ + event = models.ForeignKey( Event, - verbose_name=_('event'), + verbose_name=_("event"), on_delete=models.CASCADE, related_name="links", related_query_name="link", ) - title = models.CharField(verbose_name=_('title'), max_length=200) - description = models.TextField(verbose_name=_('description')) - url = models.URLField(verbose_name=_('url')) + title = models.CharField(verbose_name=_("title"), max_length=200) + description = models.TextField(verbose_name=_("description")) + url = models.URLField(verbose_name=_("url")) @reversion.register() class EventContact(models.Model): - """ Contact for event """ + """Contact for event""" - ctype = models.CharField(verbose_name=_('type'), max_length=100, blank=True) - name = models.CharField(verbose_name=_('name'), max_length=100) - title = models.CharField(verbose_name=_('title'), max_length=300) - email = models.CharField(verbose_name=_('email'), max_length=300) - phone = models.CharField(verbose_name=_('phone'), max_length=100, blank=True, null=True) - event = models.ForeignKey(Event, verbose_name=_('event'), related_name='contacts', on_delete=models.CASCADE) + ctype = models.CharField(verbose_name=_("type"), max_length=100, blank=True) + name = models.CharField(verbose_name=_("name"), max_length=100) + title = models.CharField(verbose_name=_("title"), max_length=300) + email = models.CharField(verbose_name=_("email"), max_length=300) + phone = models.CharField(verbose_name=_("phone"), max_length=100, blank=True, null=True) + event = models.ForeignKey(Event, verbose_name=_("event"), related_name="contacts", on_delete=models.CASCADE) class Meta: - verbose_name = _('event contact') - verbose_name_plural = _('event contacts') + verbose_name = _("event contact") + verbose_name_plural = _("event contacts") def __str__(self): - return '%s: %s' % (self.name, self.title) + return "%s: %s" % (self.name, self.title) @reversion.register() class KeyFigure(models.Model): - event = models.ForeignKey(Event, verbose_name=_('event'), related_name='key_figures', on_delete=models.CASCADE) - number = models.CharField(verbose_name=_('number'), max_length=100, help_text=_('key figure metric')) - deck = models.CharField(verbose_name=_('deck'), max_length=50, help_text=_('key figure units')) - source = models.CharField(verbose_name=_('source'), max_length=256, help_text=_('key figure website link, publication')) + event = models.ForeignKey(Event, verbose_name=_("event"), related_name="key_figures", on_delete=models.CASCADE) + number = models.CharField(verbose_name=_("number"), max_length=100, help_text=_("key figure metric")) + deck = models.CharField(verbose_name=_("deck"), max_length=50, help_text=_("key figure units")) + source = models.CharField(verbose_name=_("source"), max_length=256, help_text=_("key figure website link, publication")) class Meta: - verbose_name = _('key figure') - verbose_name_plural = _('key figures') - ordering = ('id',) + verbose_name = _("key figure") + verbose_name_plural = _("key figures") + ordering = ("id",) -@reversion.register(follow=('event',)) +@reversion.register(follow=("event",)) class Snippet(models.Model): - """ Snippet of text """ - snippet = HTMLField(verbose_name=_('snippet'), null=True, blank=True) - image = models.ImageField(verbose_name=_('image'), null=True, blank=True, upload_to=snippet_image_path) - event = models.ForeignKey(Event, verbose_name=_('event'), related_name='snippets', on_delete=models.CASCADE) - visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=3) - position = models.IntegerField(choices=PositionType.choices, verbose_name=_('position'), default=3) - tab = models.IntegerField(choices=TabNumber.choices, verbose_name=_('tab'), default=1) + """Snippet of text""" + + snippet = HTMLField(verbose_name=_("snippet"), null=True, blank=True) + image = models.ImageField(verbose_name=_("image"), null=True, blank=True, upload_to=snippet_image_path) + event = models.ForeignKey(Event, verbose_name=_("event"), related_name="snippets", on_delete=models.CASCADE) + visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=3) + position = models.IntegerField(choices=PositionType.choices, verbose_name=_("position"), default=3) + tab = models.IntegerField(choices=TabNumber.choices, verbose_name=_("tab"), default=1) class Meta: - ordering = ('position', 'id',) - verbose_name = _('snippet') - verbose_name_plural = _('snippets') + ordering = ( + "position", + "id", + ) + verbose_name = _("snippet") + verbose_name_plural = _("snippets") def __str__(self): - return ( - self.snippet[:80] if self.snippet else None - ) or ( - self.image.url - if getattr(self, 'image', None) and self.image.url - else '' + return (self.snippet[:80] if self.snippet else None) or ( + self.image.url if getattr(self, "image", None) and self.image.url else "" ) class SituationReportType(models.Model): - """ Document type, to be able to filter Situation Reports """ - type = models.CharField(verbose_name=_('type'), max_length=150) + """Document type, to be able to filter Situation Reports""" + + type = models.CharField(verbose_name=_("type"), max_length=150) is_primary = models.BooleanField( - verbose_name=_('is primary?'), default=False, editable=False, - help_text=_('Ensure this type gets precedence over others that are empty') + verbose_name=_("is primary?"), + default=False, + editable=False, + help_text=_("Ensure this type gets precedence over others that are empty"), ) class Meta: - verbose_name = _('situation report type') - verbose_name_plural = _('situation report types') + verbose_name = _("situation report type") + verbose_name_plural = _("situation report types") def __str__(self): return self.type def sitrep_document_path(instance, filename): - return 'sitreps/%s/%s' % (instance.event.id, filename) + return "sitreps/%s/%s" % (instance.event.id, filename) -@reversion.register(follow=('event',)) +@reversion.register(follow=("event",)) class SituationReport(models.Model): - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - name = models.CharField(verbose_name=_('name'), max_length=100) - document = models.FileField(verbose_name=_('document'), null=True, blank=True, upload_to=sitrep_document_path) - document_url = models.URLField(verbose_name=_('document url'), blank=True) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + name = models.CharField(verbose_name=_("name"), max_length=100) + document = models.FileField(verbose_name=_("document"), null=True, blank=True, upload_to=sitrep_document_path) + document_url = models.URLField(verbose_name=_("document url"), blank=True) - event = models.ForeignKey(Event, verbose_name=_('event'), on_delete=models.CASCADE) + event = models.ForeignKey(Event, verbose_name=_("event"), on_delete=models.CASCADE) type = models.ForeignKey( - SituationReportType, verbose_name=_('type'), related_name='situation_reports', null=True, on_delete=models.SET_NULL + SituationReportType, verbose_name=_("type"), related_name="situation_reports", null=True, on_delete=models.SET_NULL + ) + visibility = models.IntegerField( + choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=VisibilityChoices.MEMBERSHIP ) - visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=VisibilityChoices.MEMBERSHIP) - is_pinned = models.BooleanField(verbose_name=_('is pinned?'), default=False, help_text=_('pin this report at the top')) + is_pinned = models.BooleanField(verbose_name=_("is pinned?"), default=False, help_text=_("pin this report at the top")) class Meta: - verbose_name = _('situation report') - verbose_name_plural = _('situation reports') + verbose_name = _("situation report") + verbose_name_plural = _("situation reports") def __str__(self): - return '%s - %s' % (self.event, self.name) + return "%s - %s" % (self.event, self.name) class GDACSEvent(models.Model): - """ A GDACS type event, from alerts """ - - eventid = models.CharField(verbose_name=_('event id'), max_length=12) - title = models.TextField(verbose_name=_('title')) - description = models.TextField(verbose_name=_('description')) - image = models.URLField(verbose_name=_('image'), null=True) - report = models.URLField(verbose_name=_('report'), null=True) - publication_date = models.DateTimeField(verbose_name=_('publication date')) - year = models.IntegerField(verbose_name=_('year')) - lat = models.FloatField(verbose_name=_('latitude')) - lon = models.FloatField(verbose_name=_('longitude')) + """A GDACS type event, from alerts""" + + eventid = models.CharField(verbose_name=_("event id"), max_length=12) + title = models.TextField(verbose_name=_("title")) + description = models.TextField(verbose_name=_("description")) + image = models.URLField(verbose_name=_("image"), null=True) + report = models.URLField(verbose_name=_("report"), null=True) + publication_date = models.DateTimeField(verbose_name=_("publication date")) + year = models.IntegerField(verbose_name=_("year")) + lat = models.FloatField(verbose_name=_("latitude")) + lon = models.FloatField(verbose_name=_("longitude")) # TODO: Remove `event_type` - event_type = models.CharField(verbose_name=_('event type'), max_length=16) - disaster_type = models.ForeignKey(DisasterType, verbose_name=('disaster type'), on_delete=models.PROTECT, null=True) - alert_level = models.IntegerField(choices=AlertLevel.choices, verbose_name=_('alert level'), default=0) - alert_score = models.CharField(verbose_name=_('alert score'), max_length=16, null=True) - severity = models.TextField(verbose_name=_('severity'), null=True, blank=True) - severity_unit = models.CharField(verbose_name=_('severity unit'), max_length=16) - severity_value = models.CharField(verbose_name=_('severity value'), max_length=16) - population_unit = models.CharField(verbose_name=_('population unit'), max_length=16) - population_value = models.CharField(verbose_name=_('population value'), max_length=16) - vulnerability = models.FloatField(verbose_name=_('vulnerability')) - countries = models.ManyToManyField(Country, verbose_name=_('countries')) - country_text = models.TextField(verbose_name=_('country text')) + event_type = models.CharField(verbose_name=_("event type"), max_length=16) + disaster_type = models.ForeignKey(DisasterType, verbose_name=("disaster type"), on_delete=models.PROTECT, null=True) + alert_level = models.IntegerField(choices=AlertLevel.choices, verbose_name=_("alert level"), default=0) + alert_score = models.CharField(verbose_name=_("alert score"), max_length=16, null=True) + severity = models.TextField(verbose_name=_("severity"), null=True, blank=True) + severity_unit = models.CharField(verbose_name=_("severity unit"), max_length=16) + severity_value = models.CharField(verbose_name=_("severity value"), max_length=16) + population_unit = models.CharField(verbose_name=_("population unit"), max_length=16) + population_value = models.CharField(verbose_name=_("population value"), max_length=16) + vulnerability = models.FloatField(verbose_name=_("vulnerability")) + countries = models.ManyToManyField(Country, verbose_name=_("countries")) + country_text = models.TextField(verbose_name=_("country text")) class Meta: - verbose_name = _('gdacs event') - verbose_name_plural = _('gdacs events') + verbose_name = _("gdacs event") + verbose_name_plural = _("gdacs events") def __str__(self): return self.title class AppealDocumentType(models.Model): - """ types of PublicSite / FedNet appeal docs """ - name = models.CharField(verbose_name=_('name'), max_length=100) - public_site_or_fednet = models.BooleanField(verbose_name=_('Sourced by FedNet?'), default=False) + """types of PublicSite / FedNet appeal docs""" + + name = models.CharField(verbose_name=_("name"), max_length=100) + public_site_or_fednet = models.BooleanField(verbose_name=_("Sourced by FedNet?"), default=False) class Meta: - ordering = ('name',) - verbose_name = _('appeal document type') - verbose_name_plural = _('appeal document types') + ordering = ("name",) + verbose_name = _("appeal document type") + verbose_name_plural = _("appeal document types") def __str__(self): return self.name class AppealType(models.IntegerChoices): - """ summary of appeals """ - DREF = 0, _('DREF') - APPEAL = 1, _('Emergency Appeal') - INTL = 2, _('International Appeal') - FBA = 3, _('Forecast Based Action') + """summary of appeals""" + + DREF = 0, _("DREF") + APPEAL = 1, _("Emergency Appeal") + INTL = 2, _("International Appeal") + FBA = 3, _("Forecast Based Action") class AppealStatus(models.IntegerChoices): - ACTIVE = 0, _('Active') - CLOSED = 1, _('Closed') - FROZEN = 2, _('Frozen') - ARCHIVED = 3, _('Archived') + ACTIVE = 0, _("Active") + CLOSED = 1, _("Closed") + FROZEN = 2, _("Frozen") + ARCHIVED = 3, _("Archived") @reversion.register() class Appeal(models.Model): - """ An appeal for a disaster and country, containing documents """ + """An appeal for a disaster and country, containing documents""" # appeal ID, assigned by creator - aid = models.CharField(verbose_name=_('appeal ID'), max_length=20) - name = models.CharField(verbose_name=_('name'), max_length=100) - dtype = models.ForeignKey(DisasterType, verbose_name=_('disaster type'), null=True, on_delete=models.SET_NULL) - atype = models.IntegerField(choices=AppealType.choices, verbose_name=_('appeal type'), default=0) - - status = models.IntegerField(choices=AppealStatus.choices, verbose_name=_('status'), default=0) - code = models.CharField(verbose_name=_('code'), max_length=20, null=True, unique=True) - sector = models.CharField(verbose_name=_('sector'), max_length=100, blank=True) - - num_beneficiaries = models.IntegerField(verbose_name=_('number of beneficiaries'), default=0) - amount_requested = models.FloatField(verbose_name=_('amount requested'), default=0.00) - amount_funded = models.FloatField(verbose_name=_('amount funded'), default=0.00) - - start_date = models.DateTimeField(verbose_name=_('start date'), null=True) - end_date = models.DateTimeField(verbose_name=_('end date'), null=True) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - modified_at = models.DateTimeField(verbose_name=_('modified at'), auto_now=True) - previous_update = models.DateTimeField(verbose_name=_('previous update'), null=True, blank=True) - real_data_update = models.DateTimeField(verbose_name=_('real data update'), null=True, blank=True) + aid = models.CharField(verbose_name=_("appeal ID"), max_length=20) + name = models.CharField(verbose_name=_("name"), max_length=100) + dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, on_delete=models.SET_NULL) + atype = models.IntegerField(choices=AppealType.choices, verbose_name=_("appeal type"), default=0) + + status = models.IntegerField(choices=AppealStatus.choices, verbose_name=_("status"), default=0) + code = models.CharField(verbose_name=_("code"), max_length=20, null=True, unique=True) + sector = models.CharField(verbose_name=_("sector"), max_length=100, blank=True) + + num_beneficiaries = models.IntegerField(verbose_name=_("number of beneficiaries"), default=0) + amount_requested = models.FloatField(verbose_name=_("amount requested"), default=0.00) + amount_funded = models.FloatField(verbose_name=_("amount funded"), default=0.00) + + start_date = models.DateTimeField(verbose_name=_("start date"), null=True) + end_date = models.DateTimeField(verbose_name=_("end date"), null=True) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + modified_at = models.DateTimeField(verbose_name=_("modified at"), auto_now=True) + previous_update = models.DateTimeField(verbose_name=_("previous update"), null=True, blank=True) + real_data_update = models.DateTimeField(verbose_name=_("real data update"), null=True, blank=True) event = models.ForeignKey( - Event, verbose_name=_('event'), related_name='appeals', null=True, blank=True, on_delete=models.SET_NULL + Event, verbose_name=_("event"), related_name="appeals", null=True, blank=True, on_delete=models.SET_NULL ) - needs_confirmation = models.BooleanField(verbose_name=_('needs confirmation?'), default=False) - country = models.ForeignKey(Country, verbose_name=_('country'), on_delete=models.CASCADE) - region = models.ForeignKey(Region, verbose_name=_('region'), null=True, on_delete=models.SET_NULL) + needs_confirmation = models.BooleanField(verbose_name=_("needs confirmation?"), default=False) + country = models.ForeignKey(Country, verbose_name=_("country"), on_delete=models.CASCADE) + region = models.ForeignKey(Region, verbose_name=_("region"), null=True, on_delete=models.SET_NULL) # NOTE: This field doesn't exists (No translation added) # Supplementary fields @@ -1231,7 +1128,7 @@ class Appeal(models.Model): # deleted_at = models.DateTimeField(verbose_name=_('deleted at'), null=True, blank=True) triggering_amount = models.DecimalField( - verbose_name=_('triggering amount'), + verbose_name=_("triggering amount"), max_digits=12, decimal_places=2, default=0.00, @@ -1239,36 +1136,36 @@ class Appeal(models.Model): ) class Meta: - ordering = ('-start_date', '-end_date',) - verbose_name = _('appeal') - verbose_name_plural = _('appeals') + ordering = ( + "-start_date", + "-end_date", + ) + verbose_name = _("appeal") + verbose_name_plural = _("appeals") def indexing(self): return { - 'id': self.id, - 'event_id': self.event_id, - 'type': 'appeal', - 'name': self.name, - 'keyword': self.code, - 'visibility': self.event.visibility if self.event else None, - 'ns': self.country_id if self.country else None, - 'body': '%s %s' % ( - self.name, - getattr(self.country, 'name', None) - ), - 'date': self.start_date, + "id": self.id, + "event_id": self.event_id, + "type": "appeal", + "name": self.name, + "keyword": self.code, + "visibility": self.event.visibility if self.event else None, + "ns": self.country_id if self.country else None, + "body": "%s %s" % (self.name, getattr(self.country, "name", None)), + "date": self.start_date, } def es_id(self): - return 'appeal-%s' % self.id + return "appeal-%s" % self.id def record_type(self): - return 'APPEAL' + return "APPEAL" def to_dict(self): data = to_dict(self) - data['atype'] = self.get_atype_display() - data['country'] = self.country.name + data["atype"] = self.get_atype_display() + data["country"] = self.country.name return data def __str__(self): @@ -1276,31 +1173,32 @@ def __str__(self): def appeal_document_path(instance, filename): - return 'appeals/%s/%s' % (instance.appeal, filename) + return "appeals/%s/%s" % (instance.appeal, filename) class AppealHistory(models.Model): - """ AppealHistory results """ - num_beneficiaries = models.IntegerField(verbose_name=_('number of beneficiaries'), default=0) - amount_requested = models.FloatField(verbose_name=_('amount requested'), default=0.00) - amount_funded = models.FloatField(verbose_name=_('amount funded'), default=0.00) - valid_from = models.DateTimeField(verbose_name=_('valid_from'), null=True) - valid_to = models.DateTimeField(verbose_name=_('valid_to'), null=True) - aid = models.CharField(verbose_name=_('appeal ID'), max_length=20) - start_date = models.DateTimeField(verbose_name=_('start date'), null=True) - end_date = models.DateTimeField(verbose_name=_('end date'), null=True) - appeal = models.ForeignKey(Appeal, verbose_name=_('appeal'), null=True, on_delete=models.SET_NULL) - atype = models.IntegerField(choices=AppealType.choices, verbose_name=_('appeal type'), default=0) + """AppealHistory results""" + + num_beneficiaries = models.IntegerField(verbose_name=_("number of beneficiaries"), default=0) + amount_requested = models.FloatField(verbose_name=_("amount requested"), default=0.00) + amount_funded = models.FloatField(verbose_name=_("amount funded"), default=0.00) + valid_from = models.DateTimeField(verbose_name=_("valid_from"), null=True) + valid_to = models.DateTimeField(verbose_name=_("valid_to"), null=True) + aid = models.CharField(verbose_name=_("appeal ID"), max_length=20) + start_date = models.DateTimeField(verbose_name=_("start date"), null=True) + end_date = models.DateTimeField(verbose_name=_("end date"), null=True) + appeal = models.ForeignKey(Appeal, verbose_name=_("appeal"), null=True, on_delete=models.SET_NULL) + atype = models.IntegerField(choices=AppealType.choices, verbose_name=_("appeal type"), default=0) # name = models.CharField(verbose_name=_('name'), max_length=100) - country = models.ForeignKey(Country, verbose_name=_('country'), on_delete=models.CASCADE) - region = models.ForeignKey(Region, verbose_name=_('region'), null=True, on_delete=models.SET_NULL) - dtype = models.ForeignKey(DisasterType, verbose_name=_('disaster type'), null=True, on_delete=models.SET_NULL) - needs_confirmation = models.BooleanField(verbose_name=_('needs confirmation?'), default=False) - status = models.IntegerField(choices=AppealStatus.choices, verbose_name=_('status'), default=0) - code = models.CharField(verbose_name=_('code'), max_length=20, null=True) + country = models.ForeignKey(Country, verbose_name=_("country"), on_delete=models.CASCADE) + region = models.ForeignKey(Region, verbose_name=_("region"), null=True, on_delete=models.SET_NULL) + dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, on_delete=models.SET_NULL) + needs_confirmation = models.BooleanField(verbose_name=_("needs confirmation?"), default=False) + status = models.IntegerField(choices=AppealStatus.choices, verbose_name=_("status"), default=0) + code = models.CharField(verbose_name=_("code"), max_length=20, null=True) # deleted_at = models.DateTimeField(verbose_name=_('deleted at'), null=True, blank=True) triggering_amount = models.DecimalField( - verbose_name=_('triggering amount'), + verbose_name=_("triggering amount"), max_digits=12, decimal_places=2, default=0.00, @@ -1308,12 +1206,15 @@ class AppealHistory(models.Model): ) class Meta: - ordering = ('-start_date', '-end_date',) - verbose_name = _('appealhistory') - verbose_name_plural = _('appealhistories') + ordering = ( + "-start_date", + "-end_date", + ) + verbose_name = _("appealhistory") + verbose_name_plural = _("appealhistories") def record_type(self): - return 'APPEALHISTORY' + return "APPEALHISTORY" def __str__(self): return self.aid @@ -1322,18 +1223,20 @@ def __str__(self): @reversion.register() class AppealDocument(models.Model): # Don't set `auto_now_add` so we can modify it on save - created_at = models.DateTimeField(verbose_name=_('created at')) - name = models.CharField(verbose_name=_('name'), max_length=100) - document = models.FileField(verbose_name=_('document'), null=True, blank=True, upload_to=appeal_document_path) - document_url = models.URLField(verbose_name=_('document url'), blank=True) - appeal = models.ForeignKey(Appeal, verbose_name=_('appeal'), on_delete=models.CASCADE) - type = models.ForeignKey(AppealDocumentType, verbose_name=_('type'), null=True, on_delete=models.SET_NULL) - description = models.CharField(verbose_name=_('description'), max_length=200, null=True, blank=True) - iso = models.ForeignKey(Country, to_field="iso", db_column="iso", verbose_name=_('location'), null=True, on_delete=models.SET_NULL) + created_at = models.DateTimeField(verbose_name=_("created at")) + name = models.CharField(verbose_name=_("name"), max_length=100) + document = models.FileField(verbose_name=_("document"), null=True, blank=True, upload_to=appeal_document_path) + document_url = models.URLField(verbose_name=_("document url"), blank=True) + appeal = models.ForeignKey(Appeal, verbose_name=_("appeal"), on_delete=models.CASCADE) + type = models.ForeignKey(AppealDocumentType, verbose_name=_("type"), null=True, on_delete=models.SET_NULL) + description = models.CharField(verbose_name=_("description"), max_length=200, null=True, blank=True) + iso = models.ForeignKey( + Country, to_field="iso", db_column="iso", verbose_name=_("location"), null=True, on_delete=models.SET_NULL + ) class Meta: - verbose_name = _('appeal document') - verbose_name_plural = _('appeal documents') + verbose_name = _("appeal document") + verbose_name_plural = _("appeal documents") def save(self, *args, **kwargs): # On save, if `created` is not set, make it the current time @@ -1342,37 +1245,37 @@ def save(self, *args, **kwargs): return super(AppealDocument, self).save(*args, **kwargs) def __str__(self): - return '%s - %s' % (self.appeal, self.name) + return "%s - %s" % (self.appeal, self.name) @reversion.register() class AppealFilter(models.Model): - name = models.CharField(verbose_name=_('name'), max_length=100) - value = models.CharField(verbose_name=_('value'), max_length=1000) - notes = models.TextField(verbose_name=_('notes'), null=True, blank=True) + name = models.CharField(verbose_name=_("name"), max_length=100) + value = models.CharField(verbose_name=_("value"), max_length=1000) + notes = models.TextField(verbose_name=_("notes"), null=True, blank=True) class Meta: - verbose_name = _('appeal filter') - verbose_name_plural = _('appeal filters') + verbose_name = _("appeal filter") + verbose_name_plural = _("appeal filters") def __str__(self): return self.name def general_document_path(instance, filename): - return ('documents/%s/%s' % (instance.name, filename)).replace(' ', '_') + return ("documents/%s/%s" % (instance.name, filename)).replace(" ", "_") class GeneralDocument(models.Model): - name = models.CharField(verbose_name=_('name'), max_length=100) + name = models.CharField(verbose_name=_("name"), max_length=100) # Don't set `auto_now_add` so we can modify it on save - created_at = models.DateTimeField(verbose_name=_('created at'), blank=True) - document = models.FileField(verbose_name=_('document'), null=True, blank=True, upload_to=general_document_path) - document_url = models.URLField(verbose_name=_('document url'), blank=True) + created_at = models.DateTimeField(verbose_name=_("created at"), blank=True) + document = models.FileField(verbose_name=_("document"), null=True, blank=True, upload_to=general_document_path) + document_url = models.URLField(verbose_name=_("document url"), blank=True) class Meta: - verbose_name = _('general document') - verbose_name_plural = _('general documents') + verbose_name = _("general document") + verbose_name_plural = _("general documents") def save(self, *args, **kwargs): # On save, if `created` is not set, make it the current time @@ -1382,65 +1285,69 @@ def save(self, *args, **kwargs): def __str__(self): if self.document_url: - return ('%s' % self.document_url)[8:] # 8 = len('https://') - return ('%s' % self.document)[10:] # 10 = len('documents/') + return ("%s" % self.document_url)[8:] # 8 = len('https://') + return ("%s" % self.document)[10:] # 10 = len('documents/') class RequestChoices(models.IntegerChoices): - NO = 0, _('No') - REQUESTED = 1, _('Requested') - PLANNED = 2, _('Planned') - COMPLETE = 3, _('Completed') + NO = 0, _("No") + REQUESTED = 1, _("Requested") + PLANNED = 2, _("Planned") + COMPLETE = 3, _("Completed") class EPISourceChoices(models.IntegerChoices): - MINISTRY_OF_HEALTH = 0, _('Ministry of health') - WHO = 1, _('WHO') - OTHER = 2, _('OTHER') + MINISTRY_OF_HEALTH = 0, _("Ministry of health") + WHO = 1, _("WHO") + OTHER = 2, _("OTHER") @reversion.register() class ExternalPartner(models.Model): - ''' Dropdown items for COVID Field Reports ''' + """Dropdown items for COVID Field Reports""" - name = models.CharField(verbose_name=_('name'), max_length=200) + name = models.CharField(verbose_name=_("name"), max_length=200) class Meta: - verbose_name = _('external partner') - verbose_name_plural = _('external partners') + verbose_name = _("external partner") + verbose_name_plural = _("external partners") def __str__(self): return self.name class SupportedActivity(models.Model): - ''' Supported/partnered activities for COVID Field Reports ''' + """Supported/partnered activities for COVID Field Reports""" - name = models.CharField(verbose_name=_('name'), max_length=200) + name = models.CharField(verbose_name=_("name"), max_length=200) class Meta: - verbose_name = _('supported activity') - verbose_name_plural = _('supported activities') + verbose_name = _("supported activity") + verbose_name_plural = _("supported activities") def __str__(self): return self.name class UserCountry(models.Model): - """ Connects User, role and Country """ + """Connects User, role and Country""" user = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('user'), related_name='userName', - null=True, blank=True, on_delete=models.SET_NULL, + settings.AUTH_USER_MODEL, + verbose_name=_("user"), + related_name="userName", + null=True, + blank=True, + on_delete=models.SET_NULL, ) - country = models.ForeignKey(Country, verbose_name=_('country'), null=True, on_delete=models.CASCADE) + country = models.ForeignKey(Country, verbose_name=_("country"), null=True, on_delete=models.CASCADE) # countries = models.ManyToManyField(Country, verbose_name=_('countries')) # role = models.IntegerField(verbose_name=_('role')) class Meta: - verbose_name = _('User Country') - verbose_name_plural = _('User Countries') + verbose_name = _("User Country") + verbose_name_plural = _("User Countries") def __str__(self): # import pdb; pdb.set_trace(); @@ -1448,20 +1355,24 @@ def __str__(self): class UserRegion(models.Model): - """ Connects User, role and Country """ + """Connects User, role and Country""" user = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('user'), related_name='userRegionName', - null=True, blank=True, on_delete=models.SET_NULL, + settings.AUTH_USER_MODEL, + verbose_name=_("user"), + related_name="userRegionName", + null=True, + blank=True, + on_delete=models.SET_NULL, ) - region = models.ForeignKey(Region, verbose_name=_('region'), null=True, on_delete=models.CASCADE) + region = models.ForeignKey(Region, verbose_name=_("region"), null=True, on_delete=models.CASCADE) # countries = models.ManyToManyField(Country, verbose_name=_('countries')) # role = models.IntegerField(verbose_name=_('role')) class Meta: - verbose_name = _('Regional Admin') - verbose_name_plural = _('Regional Admins') + verbose_name = _("Regional Admin") + verbose_name_plural = _("Regional Admins") def __str__(self): # import pdb; pdb.set_trace(); @@ -1470,275 +1381,243 @@ def __str__(self): @reversion.register() class FieldReport(models.Model): - """ A field report for a disaster and country, containing documents """ + """A field report for a disaster and country, containing documents""" class Status(models.IntegerChoices): - UNKNOWN = 0, _('Unknown') - TWO = 2, _('Two') # legacy usage - THREE = 3, _('Three') # legacy usage - EW = 8, _('Early Warning / Early Action') - EVT = 9, _('Event') - TEN = 10, _('Ten') # legacy usage. Covid? + UNKNOWN = 0, _("Unknown") + TWO = 2, _("Two") # legacy usage + THREE = 3, _("Three") # legacy usage + EW = 8, _("Early Warning / Early Action") + EVT = 9, _("Event") + TEN = 10, _("Ten") # legacy usage. Covid? class RecentAffected(models.IntegerChoices): - UNKNOWN = 0, _('Unknown') - RCRC = 1, _('Red Cross / Red Crescent') - GOVERNMENT = 2, _('Government') - OTHER = 3, _('Other') - RCRC_POTENTIALLY = 4, _('Red Cross / Red Crescent, potentially') - GOVERNMENT_POTENTIALLY = 5, _('Government, potentially') - OTHER_POTENTIALLY = 6, _('Other, potentially') + UNKNOWN = 0, _("Unknown") + RCRC = 1, _("Red Cross / Red Crescent") + GOVERNMENT = 2, _("Government") + OTHER = 3, _("Other") + RCRC_POTENTIALLY = 4, _("Red Cross / Red Crescent, potentially") + GOVERNMENT_POTENTIALLY = 5, _("Government, potentially") + OTHER_POTENTIALLY = 6, _("Other, potentially") # Take care of these values – see (¤) in other code parts user = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('user'), related_name='user', - null=True, blank=True, on_delete=models.SET_NULL, + settings.AUTH_USER_MODEL, + verbose_name=_("user"), + related_name="user", + null=True, + blank=True, + on_delete=models.SET_NULL, ) is_covid_report = models.BooleanField( - verbose_name=_('is covid report?'), + verbose_name=_("is covid report?"), default=False, - help_text=_('Is this a Field Report specific to the COVID-19 emergency?') + help_text=_("Is this a Field Report specific to the COVID-19 emergency?"), ) # Used to differentiate reports that have and have not been synced from DMIS - rid = models.CharField(verbose_name=_('r id'), max_length=100, null=True, blank=True, editable=False) - summary = models.TextField(verbose_name=_('summary'), blank=True) - description = HTMLField(verbose_name=_('description'), blank=True, default='') - dtype = models.ForeignKey(DisasterType, verbose_name=_('disaster type'), on_delete=models.PROTECT) + rid = models.CharField(verbose_name=_("r id"), max_length=100, null=True, blank=True, editable=False) + summary = models.TextField(verbose_name=_("summary"), blank=True) + description = HTMLField(verbose_name=_("description"), blank=True, default="") + dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), on_delete=models.PROTECT) event = models.ForeignKey( - Event, verbose_name=_('event'), - related_name='field_reports', - null=True, blank=True, - on_delete=models.SET_NULL - ) - districts = models.ManyToManyField(District, verbose_name=_('districts'), blank=True) - countries = models.ManyToManyField(Country, verbose_name=_('countries')) - regions = models.ManyToManyField(Region, verbose_name=_('regions'), blank=True) + Event, verbose_name=_("event"), related_name="field_reports", null=True, blank=True, on_delete=models.SET_NULL + ) + districts = models.ManyToManyField(District, verbose_name=_("districts"), blank=True) + countries = models.ManyToManyField(Country, verbose_name=_("countries")) + regions = models.ManyToManyField(Region, verbose_name=_("regions"), blank=True) # This entity is more a type than a status, so let's label it this way on admin page: status = models.IntegerField( - choices=Status.choices, verbose_name=_('type'), default=0, - help_text='Key/value pairs' - ) - request_assistance = models.BooleanField(verbose_name=_('request assistance'), default=None, null=True, blank=True) - ns_request_assistance = models.BooleanField(verbose_name=_('NS request assistance'), default=None, null=True, blank=True) - - num_injured = models.IntegerField(verbose_name=_('number of injured'), null=True, blank=True) - num_dead = models.IntegerField(verbose_name=_('number of dead'), null=True, blank=True) - num_missing = models.IntegerField(verbose_name=_('number of missing'), null=True, blank=True) - num_affected = models.IntegerField(verbose_name=_('number of affected'), null=True, blank=True) - num_displaced = models.IntegerField(verbose_name=_('number of displaced'), null=True, blank=True) - num_assisted = models.IntegerField(verbose_name=_('number of assisted'), null=True, blank=True) - num_localstaff = models.IntegerField(verbose_name=_('number of localstaff'), null=True, blank=True) - num_volunteers = models.IntegerField(verbose_name=_('number of volunteers'), null=True, blank=True) - num_expats_delegates = models.IntegerField(verbose_name=_('number of expatriate delegates'), null=True, blank=True) + choices=Status.choices, + verbose_name=_("type"), + default=0, + help_text='Key/value pairs', + ) + request_assistance = models.BooleanField(verbose_name=_("request assistance"), default=None, null=True, blank=True) + ns_request_assistance = models.BooleanField(verbose_name=_("NS request assistance"), default=None, null=True, blank=True) + + num_injured = models.IntegerField(verbose_name=_("number of injured"), null=True, blank=True) + num_dead = models.IntegerField(verbose_name=_("number of dead"), null=True, blank=True) + num_missing = models.IntegerField(verbose_name=_("number of missing"), null=True, blank=True) + num_affected = models.IntegerField(verbose_name=_("number of affected"), null=True, blank=True) + num_displaced = models.IntegerField(verbose_name=_("number of displaced"), null=True, blank=True) + num_assisted = models.IntegerField(verbose_name=_("number of assisted"), null=True, blank=True) + num_localstaff = models.IntegerField(verbose_name=_("number of localstaff"), null=True, blank=True) + num_volunteers = models.IntegerField(verbose_name=_("number of volunteers"), null=True, blank=True) + num_expats_delegates = models.IntegerField(verbose_name=_("number of expatriate delegates"), null=True, blank=True) # Early Warning fields - num_potentially_affected = models.IntegerField(verbose_name=_('number of potentially affected'), null=True, blank=True) - num_highest_risk = models.IntegerField(verbose_name=_('number of highest risk'), null=True, blank=True) - affected_pop_centres = models.CharField(verbose_name=_('affected population centres'), max_length=512, blank=True, null=True) + num_potentially_affected = models.IntegerField(verbose_name=_("number of potentially affected"), null=True, blank=True) + num_highest_risk = models.IntegerField(verbose_name=_("number of highest risk"), null=True, blank=True) + affected_pop_centres = models.CharField(verbose_name=_("affected population centres"), max_length=512, blank=True, null=True) - gov_num_injured = models.IntegerField(verbose_name=_('number of injured (government)'), null=True, blank=True) - gov_num_dead = models.IntegerField(verbose_name=_('number of dead (government)'), null=True, blank=True) - gov_num_missing = models.IntegerField(verbose_name=_('number of missing (government)'), null=True, blank=True) - gov_num_affected = models.IntegerField(verbose_name=_('number of affected (government)'), null=True, blank=True) - gov_num_displaced = models.IntegerField(verbose_name=_('number of displaced (government)'), null=True, blank=True) - gov_num_assisted = models.IntegerField(verbose_name=_('number of assisted (government)'), null=True, blank=True) + gov_num_injured = models.IntegerField(verbose_name=_("number of injured (government)"), null=True, blank=True) + gov_num_dead = models.IntegerField(verbose_name=_("number of dead (government)"), null=True, blank=True) + gov_num_missing = models.IntegerField(verbose_name=_("number of missing (government)"), null=True, blank=True) + gov_num_affected = models.IntegerField(verbose_name=_("number of affected (government)"), null=True, blank=True) + gov_num_displaced = models.IntegerField(verbose_name=_("number of displaced (government)"), null=True, blank=True) + gov_num_assisted = models.IntegerField(verbose_name=_("number of assisted (government)"), null=True, blank=True) # Epidemic fields - epi_cases = models.IntegerField(verbose_name=_('number of cases (epidemic)'), null=True, blank=True) - epi_suspected_cases = models.IntegerField(verbose_name=_('number of suspected cases (epidemic)'), null=True, blank=True) - epi_probable_cases = models.IntegerField(verbose_name=_('number of probable cases (epidemic)'), null=True, blank=True) - epi_confirmed_cases = models.IntegerField(verbose_name=_('number of confirmed cases (epidemic)'), null=True, blank=True) - epi_num_dead = models.IntegerField(verbose_name=_('number of dead (epidemic)'), null=True, blank=True) + epi_cases = models.IntegerField(verbose_name=_("number of cases (epidemic)"), null=True, blank=True) + epi_suspected_cases = models.IntegerField(verbose_name=_("number of suspected cases (epidemic)"), null=True, blank=True) + epi_probable_cases = models.IntegerField(verbose_name=_("number of probable cases (epidemic)"), null=True, blank=True) + epi_confirmed_cases = models.IntegerField(verbose_name=_("number of confirmed cases (epidemic)"), null=True, blank=True) + epi_num_dead = models.IntegerField(verbose_name=_("number of dead (epidemic)"), null=True, blank=True) epi_figures_source = models.IntegerField( - choices=EPISourceChoices.choices, verbose_name=_('figures source (epidemic)'), null=True, blank=True + choices=EPISourceChoices.choices, verbose_name=_("figures source (epidemic)"), null=True, blank=True ) epi_cases_since_last_fr = models.IntegerField( - verbose_name=_('number of new cases since the last field report'), null=True, blank=True + verbose_name=_("number of new cases since the last field report"), null=True, blank=True ) epi_deaths_since_last_fr = models.IntegerField( - verbose_name=_('number of new deaths since last field report'), null=True, blank=True + verbose_name=_("number of new deaths since last field report"), null=True, blank=True ) - epi_notes_since_last_fr = models.TextField(verbose_name=_('notes'), null=True, blank=True) + epi_notes_since_last_fr = models.TextField(verbose_name=_("notes"), null=True, blank=True) who_num_assisted = models.IntegerField( - verbose_name=_('number of assisted (who)'), - null=True, blank=True, - help_text=_('not used any more') + verbose_name=_("number of assisted (who)"), null=True, blank=True, help_text=_("not used any more") ) health_min_num_assisted = models.IntegerField( - verbose_name=_('number of assisted (ministry of health)'), - null=True, blank=True, - help_text=_('not used any more') + verbose_name=_("number of assisted (ministry of health)"), null=True, blank=True, help_text=_("not used any more") ) # Early Warning fields - gov_num_potentially_affected = models.IntegerField( - verbose_name=_('potentially affected (government)'), - null=True, blank=True - ) - gov_num_highest_risk = models.IntegerField( - verbose_name=_('people at highest risk (government)'), - null=True, blank=True - ) + gov_num_potentially_affected = models.IntegerField(verbose_name=_("potentially affected (government)"), null=True, blank=True) + gov_num_highest_risk = models.IntegerField(verbose_name=_("people at highest risk (government)"), null=True, blank=True) gov_affected_pop_centres = models.CharField( - verbose_name=_('affected population centres (government)'), - max_length=512, blank=True, null=True + verbose_name=_("affected population centres (government)"), max_length=512, blank=True, null=True ) - other_num_injured = models.IntegerField(verbose_name=_('number of injured (other)'), null=True, blank=True) - other_num_dead = models.IntegerField(verbose_name=_('number of dead (other)'), null=True, blank=True) - other_num_missing = models.IntegerField(verbose_name=_('number of missing (other)'), null=True, blank=True) - other_num_affected = models.IntegerField(verbose_name=_('number of affected (other)'), null=True, blank=True) - other_num_displaced = models.IntegerField(verbose_name=_('number of displace (other)'), null=True, blank=True) - other_num_assisted = models.IntegerField(verbose_name=_('number of assisted (other)'), null=True, blank=True) + other_num_injured = models.IntegerField(verbose_name=_("number of injured (other)"), null=True, blank=True) + other_num_dead = models.IntegerField(verbose_name=_("number of dead (other)"), null=True, blank=True) + other_num_missing = models.IntegerField(verbose_name=_("number of missing (other)"), null=True, blank=True) + other_num_affected = models.IntegerField(verbose_name=_("number of affected (other)"), null=True, blank=True) + other_num_displaced = models.IntegerField(verbose_name=_("number of displace (other)"), null=True, blank=True) + other_num_assisted = models.IntegerField(verbose_name=_("number of assisted (other)"), null=True, blank=True) # Early Warning fields other_num_potentially_affected = models.IntegerField( - verbose_name=_('number of potentially affected (other)'), null=True, blank=True) - other_num_highest_risk = models.IntegerField(verbose_name=_('number of highest risk (other)'), null=True, blank=True) + verbose_name=_("number of potentially affected (other)"), null=True, blank=True + ) + other_num_highest_risk = models.IntegerField(verbose_name=_("number of highest risk (other)"), null=True, blank=True) other_affected_pop_centres = models.CharField( - verbose_name=_('number of affected population centres (other)'), - max_length=512, - blank=True, null=True + verbose_name=_("number of affected population centres (other)"), max_length=512, blank=True, null=True ) # Date of data for situation fields - sit_fields_date = models.DateTimeField(verbose_name=_('situation fields date'), blank=True, null=True) + sit_fields_date = models.DateTimeField(verbose_name=_("situation fields date"), blank=True, null=True) # Text field for users to specify sources for where they have marked 'Other' as source. - other_sources = models.TextField(verbose_name=_('sources (other)'), blank=True, default='') + other_sources = models.TextField(verbose_name=_("sources (other)"), blank=True, default="") # actions taken - actions_others = models.TextField(verbose_name=_('actions taken (others)'), null=True, blank=True) + actions_others = models.TextField(verbose_name=_("actions taken (others)"), null=True, blank=True) # visibility - visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_('visibility'), default=1) + visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=1) # information - bulletin = models.IntegerField( - choices=RequestChoices.choices, - verbose_name=_('bulletin'), - default=0, - null=True - ) - dref = models.IntegerField( - choices=RequestChoices.choices, - verbose_name=_('DREF'), - default=0, - null=True - ) - dref_amount = models.IntegerField(verbose_name=_('DREF amount'), null=True, blank=True) - appeal = models.IntegerField( - choices=RequestChoices.choices, - verbose_name=_('appeal'), - default=0, - null=True - ) - appeal_amount = models.IntegerField(verbose_name=_('appeal amount'), null=True, blank=True) + bulletin = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("bulletin"), default=0, null=True) + dref = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("DREF"), default=0, null=True) + dref_amount = models.IntegerField(verbose_name=_("DREF amount"), null=True, blank=True) + appeal = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("appeal"), default=0, null=True) + appeal_amount = models.IntegerField(verbose_name=_("appeal amount"), null=True, blank=True) imminent_dref = models.IntegerField( - choices=RequestChoices.choices, - verbose_name=_('imminent dref'), - default=0, - null=True - ) # only EW - imminent_dref_amount = models.IntegerField( - null=True, - verbose_name=_('imminent dref amount'), - blank=True + choices=RequestChoices.choices, verbose_name=_("imminent dref"), default=0, null=True ) # only EW + imminent_dref_amount = models.IntegerField(null=True, verbose_name=_("imminent dref amount"), blank=True) # only EW forecast_based_action = models.IntegerField( - choices=RequestChoices.choices, - verbose_name=_('forecast based action'), - default=0, - null=True + choices=RequestChoices.choices, verbose_name=_("forecast based action"), default=0, null=True ) # only EW forecast_based_action_amount = models.IntegerField( - verbose_name=_('forecast based action amount'), null=True, blank=True) # only EW + verbose_name=_("forecast based action amount"), null=True, blank=True + ) # only EW # disaster response - rdrt = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('RDRT'), default=0) - num_rdrt = models.IntegerField(verbose_name=_('number of RDRT'), null=True, blank=True) - fact = models.IntegerField( - choices=RequestChoices.choices, - verbose_name=_('fact'), - default=0, - null=True - ) - num_fact = models.IntegerField(verbose_name=_('number of fact'), null=True, blank=True) - ifrc_staff = models.IntegerField( - choices=RequestChoices.choices, - verbose_name=_('IFRC staff'), - default=0, - null=True - ) - num_ifrc_staff = models.IntegerField(verbose_name=_('number of IFRC staff'), null=True, blank=True) + rdrt = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("RDRT"), default=0) + num_rdrt = models.IntegerField(verbose_name=_("number of RDRT"), null=True, blank=True) + fact = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("fact"), default=0, null=True) + num_fact = models.IntegerField(verbose_name=_("number of fact"), null=True, blank=True) + ifrc_staff = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("IFRC staff"), default=0, null=True) + num_ifrc_staff = models.IntegerField(verbose_name=_("number of IFRC staff"), null=True, blank=True) # ERU units - eru_base_camp = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU base camp'), default=0) - eru_base_camp_units = models.IntegerField(verbose_name=_('ERU base camp units'), null=True, blank=True) + eru_base_camp = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("ERU base camp"), default=0) + eru_base_camp_units = models.IntegerField(verbose_name=_("ERU base camp units"), null=True, blank=True) - eru_basic_health_care = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU basic health care'), default=0) - eru_basic_health_care_units = models.IntegerField(null=True, verbose_name=_('ERU basic health units'), blank=True) + eru_basic_health_care = models.IntegerField( + choices=RequestChoices.choices, verbose_name=_("ERU basic health care"), default=0 + ) + eru_basic_health_care_units = models.IntegerField(null=True, verbose_name=_("ERU basic health units"), blank=True) - eru_it_telecom = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU IT telecom'), default=0) - eru_it_telecom_units = models.IntegerField(verbose_name=_('ERU IT telecom units'), null=True, blank=True) + eru_it_telecom = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("ERU IT telecom"), default=0) + eru_it_telecom_units = models.IntegerField(verbose_name=_("ERU IT telecom units"), null=True, blank=True) - eru_logistics = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU logistics'), default=0) - eru_logistics_units = models.IntegerField(verbose_name=_('ERU logistics units'), null=True, blank=True) + eru_logistics = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("ERU logistics"), default=0) + eru_logistics_units = models.IntegerField(verbose_name=_("ERU logistics units"), null=True, blank=True) - eru_deployment_hospital = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU deployment hospital'), default=0) - eru_deployment_hospital_units = models.IntegerField(verbose_name=_('ERU deployment hospital units'), null=True, blank=True) + eru_deployment_hospital = models.IntegerField( + choices=RequestChoices.choices, verbose_name=_("ERU deployment hospital"), default=0 + ) + eru_deployment_hospital_units = models.IntegerField(verbose_name=_("ERU deployment hospital units"), null=True, blank=True) - eru_referral_hospital = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU referral hospital'), default=0) - eru_referral_hospital_units = models.IntegerField(verbose_name=_('ERU referral hospital units'), null=True, blank=True) + eru_referral_hospital = models.IntegerField( + choices=RequestChoices.choices, verbose_name=_("ERU referral hospital"), default=0 + ) + eru_referral_hospital_units = models.IntegerField(verbose_name=_("ERU referral hospital units"), null=True, blank=True) - eru_relief = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU relief'), default=0) - eru_relief_units = models.IntegerField(null=True, verbose_name=_('ERU relief units'), blank=True) + eru_relief = models.IntegerField(choices=RequestChoices.choices, verbose_name=_("ERU relief"), default=0) + eru_relief_units = models.IntegerField(null=True, verbose_name=_("ERU relief units"), blank=True) - eru_water_sanitation_15 = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU water sanitation M15'), default=0) - eru_water_sanitation_15_units = models.IntegerField(verbose_name=_('ERU water sanitation M15 units'), null=True, blank=True) + eru_water_sanitation_15 = models.IntegerField( + choices=RequestChoices.choices, verbose_name=_("ERU water sanitation M15"), default=0 + ) + eru_water_sanitation_15_units = models.IntegerField(verbose_name=_("ERU water sanitation M15 units"), null=True, blank=True) - eru_water_sanitation_40 = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU water sanitation M40'), default=0) - eru_water_sanitation_40_units = models.IntegerField(verbose_name=_('ERU water sanitation M40 units'), null=True, blank=True) + eru_water_sanitation_40 = models.IntegerField( + choices=RequestChoices.choices, verbose_name=_("ERU water sanitation M40"), default=0 + ) + eru_water_sanitation_40_units = models.IntegerField(verbose_name=_("ERU water sanitation M40 units"), null=True, blank=True) - eru_water_sanitation_20 = models.IntegerField(choices=RequestChoices.choices, verbose_name=_('ERU water sanitation MSM20'), default=0) - eru_water_sanitation_20_units = models.IntegerField(verbose_name=_('ERU water sanitation MSM20 units'), null=True, blank=True) + eru_water_sanitation_20 = models.IntegerField( + choices=RequestChoices.choices, verbose_name=_("ERU water sanitation MSM20"), default=0 + ) + eru_water_sanitation_20_units = models.IntegerField(verbose_name=_("ERU water sanitation MSM20 units"), null=True, blank=True) # Ugly solution to a design problem with handling Actions - notes_health = models.TextField(verbose_name=_('Description (Health)'), null=True, blank=True) - notes_ns = models.TextField(verbose_name=_('Description (NS Institutional Strengthening)'), null=True, blank=True) - notes_socioeco = models.TextField(verbose_name=_('Description (Socioeconomic Interventions)'), null=True, blank=True) + notes_health = models.TextField(verbose_name=_("Description (Health)"), null=True, blank=True) + notes_ns = models.TextField(verbose_name=_("Description (NS Institutional Strengthening)"), null=True, blank=True) + notes_socioeco = models.TextField(verbose_name=_("Description (Socioeconomic Interventions)"), null=True, blank=True) - external_partners = models.ManyToManyField( - ExternalPartner, verbose_name=_('external partners'), blank=True - ) - supported_activities = models.ManyToManyField( - SupportedActivity, verbose_name=_('supported activities'), blank=True - ) + external_partners = models.ManyToManyField(ExternalPartner, verbose_name=_("external partners"), blank=True) + supported_activities = models.ManyToManyField(SupportedActivity, verbose_name=_("supported activities"), blank=True) recent_affected = models.IntegerField( choices=RecentAffected.choices, - verbose_name=_('recent source of affected people'), + verbose_name=_("recent source of affected people"), default=0, - help_text='Key/value pairs' + help_text='Key/value pairs', ) # start_date is now what the user explicitly sets while filling the Field Report form. - start_date = models.DateTimeField(verbose_name=_('start date'), blank=True, null=True) + start_date = models.DateTimeField(verbose_name=_("start date"), blank=True, null=True) # Created, updated at correspond to when the report entered this system. # Report date is when historical reports were created. # For reports that are not historical, it will be equal to created_at. - report_date = models.DateTimeField(verbose_name=_('report date'), null=True, editable=False) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - updated_at = models.DateTimeField(verbose_name=_('updated at'), auto_now=True) - previous_update = models.DateTimeField(verbose_name=_('previous updated at'), null=True, blank=True) + report_date = models.DateTimeField(verbose_name=_("report date"), null=True, editable=False) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + updated_at = models.DateTimeField(verbose_name=_("updated at"), auto_now=True) + previous_update = models.DateTimeField(verbose_name=_("previous updated at"), null=True, blank=True) class Meta: - ordering = ('-created_at', '-updated_at',) - verbose_name = _('field report') - verbose_name_plural = _('field reports') + ordering = ( + "-created_at", + "-updated_at", + ) + verbose_name = _("field report") + verbose_name_plural = _("field reports") # @staticmethod # def get_for(user): @@ -1761,25 +1640,22 @@ def indexing(self): countries = [c.name for c in self.countries.all()] ns = [c.id for c in self.countries.all()] return { - 'id': self.id, - 'event_id': self.event_id, - 'type': 'report', - 'name': self.summary, - 'keyword': None, - 'visibility': self.visibility, - 'ns': ' '.join(map(str, ns)) if len(ns) else None, - 'body': '%s %s' % ( - self.summary, - ' '.join(map(str, countries)) if len(countries) else None - ), - 'date': self.created_at, + "id": self.id, + "event_id": self.event_id, + "type": "report", + "name": self.summary, + "keyword": None, + "visibility": self.visibility, + "ns": " ".join(map(str, ns)) if len(ns) else None, + "body": "%s %s" % (self.summary, " ".join(map(str, countries)) if len(countries) else None), + "date": self.created_at, } def es_id(self): - return 'fieldreport-%s' % self.id + return "fieldreport-%s" % self.id def record_type(self): - return 'FIELD_REPORT' + return "FIELD_REPORT" def to_dict(self): return to_dict(self) @@ -1794,83 +1670,79 @@ def to_dict(self): @staticmethod def get_for(user, queryset=None): countries_qs = ( - UserCountry.objects.filter(user=user) - .values("country") - .union(Profile.objects.filter(user=user).values("country")) - ) - return queryset.exclude( - Q(visibility=VisibilityChoices.IFRC_NS) & - ~Q(countries__in=countries_qs) + UserCountry.objects.filter(user=user).values("country").union(Profile.objects.filter(user=user).values("country")) ) + return queryset.exclude(Q(visibility=VisibilityChoices.IFRC_NS) & ~Q(countries__in=countries_qs)) def __str__(self): - summary = self.summary if self.summary is not None else 'Summary not available' - return '%s - %s' % (self.id, summary) + summary = self.summary if self.summary is not None else "Summary not available" + return "%s - %s" % (self.id, summary) @reversion.register() class FieldReportContact(models.Model): - """ Contact for field report """ + """Contact for field report""" - ctype = models.CharField(verbose_name=_('type'), max_length=100, blank=True) - name = models.CharField(verbose_name=_('name'), max_length=100) - title = models.CharField(verbose_name=_('title'), max_length=300) - email = models.CharField(verbose_name=_('email'), max_length=300) - phone = models.CharField(verbose_name=_('phone'), max_length=50, blank=True) + ctype = models.CharField(verbose_name=_("type"), max_length=100, blank=True) + name = models.CharField(verbose_name=_("name"), max_length=100) + title = models.CharField(verbose_name=_("title"), max_length=300) + email = models.CharField(verbose_name=_("email"), max_length=300) + phone = models.CharField(verbose_name=_("phone"), max_length=50, blank=True) field_report = models.ForeignKey( - FieldReport, verbose_name=_('field report'), related_name='contacts', on_delete=models.CASCADE + FieldReport, verbose_name=_("field report"), related_name="contacts", on_delete=models.CASCADE ) class Meta: - verbose_name = _('field report contacts') - verbose_name_plural = _('field report contacts') + verbose_name = _("field report contacts") + verbose_name_plural = _("field report contacts") def __str__(self): - return '%s: %s' % (self.name, self.title) + return "%s: %s" % (self.name, self.title) class ActionOrg(models.TextChoices): - NATIONAL_SOCIETY = 'NTLS', _('National Society') - FOREIGN_SOCIETY = 'PNS', _('RCRC') - FEDERATION = 'FDRN', _('Federation') - GOVERNMENT = 'GOV', _('Government') + NATIONAL_SOCIETY = "NTLS", _("National Society") + FOREIGN_SOCIETY = "PNS", _("RCRC") + FEDERATION = "FDRN", _("Federation") + GOVERNMENT = "GOV", _("Government") class ActionType(models.TextChoices): - EVENT = 'EVT', _('Event') - EARLY_WARNING = 'EW', _('Early Warning') - EPIDEMIC = 'EPI', _('Epidemic') - COVID = 'COVID', _('COVID-19') + EVENT = "EVT", _("Event") + EARLY_WARNING = "EW", _("Early Warning") + EPIDEMIC = "EPI", _("Epidemic") + COVID = "COVID", _("COVID-19") class ActionCategory(models.TextChoices): - GENERAL = 'General', _('General') - HEALTH = 'Health', _('Health') - NS_INSTITUTIONAL_STRENGTHENING = 'NS Institutional Strengthening', _('NS Institutional Strengthening') - SOCIO_ECONOMIC_IMPACTS = 'Socioeconomic Interventions', _('Socioeconomic Interventions') + GENERAL = "General", _("General") + HEALTH = "Health", _("Health") + NS_INSTITUTIONAL_STRENGTHENING = "NS Institutional Strengthening", _("NS Institutional Strengthening") + SOCIO_ECONOMIC_IMPACTS = "Socioeconomic Interventions", _("Socioeconomic Interventions") @reversion.register() class Action(models.Model): - """ Action taken """ - name = models.CharField(verbose_name=_('name'), max_length=400) + """Action taken""" + + name = models.CharField(verbose_name=_("name"), max_length=400) organizations = ArrayField( - models.CharField(choices=ActionOrg.choices, max_length=4), - verbose_name=_('organizations'), default=list, blank=True + models.CharField(choices=ActionOrg.choices, max_length=4), verbose_name=_("organizations"), default=list, blank=True ) field_report_types = ArrayField( models.CharField(choices=ActionType.choices, max_length=16), - verbose_name=_('field report types'), default=list, + verbose_name=_("field report types"), + default=list, ) category = models.CharField( - max_length=255, verbose_name=_('category'), choices=ActionCategory.choices, default=ActionCategory.GENERAL + max_length=255, verbose_name=_("category"), choices=ActionCategory.choices, default=ActionCategory.GENERAL ) - is_disabled = models.BooleanField(verbose_name=_('is disabled?'), default=False, help_text=_('Disable in form')) - tooltip_text = models.TextField(verbose_name=_('tooltip text'), null=True, blank='true') + is_disabled = models.BooleanField(verbose_name=_("is disabled?"), default=False, help_text=_("Disable in form")) + tooltip_text = models.TextField(verbose_name=_("tooltip text"), null=True, blank="true") class Meta: - verbose_name = _('action') - verbose_name_plural = _('actions') + verbose_name = _("action") + verbose_name_plural = _("actions") def __str__(self): return self.name @@ -1878,33 +1750,35 @@ def __str__(self): @reversion.register() class ActionsTaken(models.Model): - """ All the actions taken by an organization """ + """All the actions taken by an organization""" organization = models.CharField( choices=ActionOrg.choices, - verbose_name=_('organization'), max_length=16, + verbose_name=_("organization"), + max_length=16, ) - actions = models.ManyToManyField(Action, verbose_name=_('actions'), blank=True) - summary = models.TextField(verbose_name=_('summary'), blank=True) + actions = models.ManyToManyField(Action, verbose_name=_("actions"), blank=True) + summary = models.TextField(verbose_name=_("summary"), blank=True) field_report = models.ForeignKey( - FieldReport, verbose_name=_('field report'), related_name='actions_taken', on_delete=models.CASCADE + FieldReport, verbose_name=_("field report"), related_name="actions_taken", on_delete=models.CASCADE ) class Meta: - verbose_name = _('actions taken') - verbose_name_plural = _('all actions taken') + verbose_name = _("actions taken") + verbose_name_plural = _("all actions taken") def __str__(self): - return '%s: %s' % (self.get_organization_display(), self.summary) + return "%s: %s" % (self.get_organization_display(), self.summary) class SourceType(models.Model): - """ Types of sources """ - name = models.CharField(verbose_name=_('name'), max_length=40) + """Types of sources""" + + name = models.CharField(verbose_name=_("name"), max_length=40) class Meta: - verbose_name = _('source type') - verbose_name_plural = _('source types') + verbose_name = _("source type") + verbose_name_plural = _("source types") def __str__(self): return self.name @@ -1912,56 +1786,60 @@ def __str__(self): @reversion.register() class Source(models.Model): - """ Source of information """ - stype = models.ForeignKey(SourceType, verbose_name=_('type'), on_delete=models.PROTECT) - spec = models.TextField(verbose_name=_('spec'), blank=True) + """Source of information""" + + stype = models.ForeignKey(SourceType, verbose_name=_("type"), on_delete=models.PROTECT) + spec = models.TextField(verbose_name=_("spec"), blank=True) field_report = models.ForeignKey( - FieldReport, verbose_name=_('field report'), related_name='sources', on_delete=models.CASCADE + FieldReport, verbose_name=_("field report"), related_name="sources", on_delete=models.CASCADE ) class Meta: - verbose_name = _('source') - verbose_name_plural = _('sources') + verbose_name = _("source") + verbose_name_plural = _("sources") def __str__(self): - return '%s: %s' % (self.stype.name, self.spec) + return "%s: %s" % (self.stype.name, self.spec) @reversion.register() class Profile(models.Model): - """ Holds location and identifying information about users """ + """Holds location and identifying information about users""" + class OrgTypes(models.TextChoices): - NTLS = 'NTLS', _('National Society') - DLGN = 'DLGN', _('Delegation') - SCRT = 'SCRT', _('Secretariat') - ICRC = 'ICRC', _('ICRC') - OTHR = 'OTHR', _('Other') + NTLS = "NTLS", _("National Society") + DLGN = "DLGN", _("Delegation") + SCRT = "SCRT", _("Secretariat") + ICRC = "ICRC", _("ICRC") + OTHR = "OTHR", _("Other") user = models.OneToOneField( settings.AUTH_USER_MODEL, - verbose_name=_('user'), + verbose_name=_("user"), on_delete=models.CASCADE, - related_name='profile', + related_name="profile", primary_key=True, editable=False, ) - country = models.ForeignKey(Country, verbose_name=_('country'), null=True, on_delete=models.SET_NULL) + country = models.ForeignKey(Country, verbose_name=_("country"), null=True, on_delete=models.SET_NULL) # TODO org should also be discreet choices from this list # https://drive.google.com/drive/u/1/folders/1auXpAPhOh4YROnKxOfFy5-T7Ki96aIb6k - org = models.CharField(verbose_name=_('organization'), blank=True, max_length=100) - org_type = models.CharField(choices=OrgTypes.choices, default=OrgTypes.OTHR, verbose_name=_('organization type'), max_length=4, blank=True) - city = models.CharField(verbose_name=_('city'), blank=True, null=True, max_length=100) - department = models.CharField(verbose_name=_('department'), blank=True, null=True, max_length=100) - position = models.CharField(verbose_name=_('position'), blank=True, null=True, max_length=100) - phone_number = models.CharField(verbose_name=_('phone number'), blank=True, null=True, max_length=100) - last_frontend_login = models.DateTimeField(verbose_name=_('last frontend login'), null=True, blank=True) - accepted_montandon_license_terms = models.BooleanField(verbose_name=_('has accepted montandon license terms?'), default=False) + org = models.CharField(verbose_name=_("organization"), blank=True, max_length=100) + org_type = models.CharField( + choices=OrgTypes.choices, default=OrgTypes.OTHR, verbose_name=_("organization type"), max_length=4, blank=True + ) + city = models.CharField(verbose_name=_("city"), blank=True, null=True, max_length=100) + department = models.CharField(verbose_name=_("department"), blank=True, null=True, max_length=100) + position = models.CharField(verbose_name=_("position"), blank=True, null=True, max_length=100) + phone_number = models.CharField(verbose_name=_("phone number"), blank=True, null=True, max_length=100) + last_frontend_login = models.DateTimeField(verbose_name=_("last frontend login"), null=True, blank=True) + accepted_montandon_license_terms = models.BooleanField(verbose_name=_("has accepted montandon license terms?"), default=False) class Meta: - verbose_name = _('user profile') - verbose_name_plural = _('user profiles') + verbose_name = _("user profile") + verbose_name_plural = _("user profiles") def __str__(self): return self.user.username @@ -1970,161 +1848,193 @@ def __str__(self): @reversion.register() class EmergencyOperationsBase(models.Model): """Common fields used by EmergencyOperations* Tables""" + is_validated = models.BooleanField( - verbose_name=_('is validated?'), default=False, help_text=_('Did anyone check the editable data?') + verbose_name=_("is validated?"), default=False, help_text=_("Did anyone check the editable data?") ) - created_at = models.DateTimeField(verbose_name=_('created_at'), auto_now_add=True) - modified_at = models.DateTimeField(verbose_name=_('modified_at'), auto_now=True) + created_at = models.DateTimeField(verbose_name=_("created_at"), auto_now_add=True) + modified_at = models.DateTimeField(verbose_name=_("modified_at"), auto_now=True) # Raw data from the scraper raw_file_name = models.TextField(null=True, blank=True) raw_file_url = models.TextField(null=True, blank=True) - raw_appeal_number = models.TextField(verbose_name=_('appeal number (raw)'), null=True, blank=True) - raw_date_of_issue = models.TextField(verbose_name=_('date of issue (raw)'), null=True, blank=True) - raw_glide_number = models.TextField(verbose_name=_('glide number (raw)'), null=True, blank=True) + raw_appeal_number = models.TextField(verbose_name=_("appeal number (raw)"), null=True, blank=True) + raw_date_of_issue = models.TextField(verbose_name=_("date of issue (raw)"), null=True, blank=True) + raw_glide_number = models.TextField(verbose_name=_("glide number (raw)"), null=True, blank=True) raw_num_of_people_to_be_assisted = models.TextField( - verbose_name=_('number of people to be assisted (raw)'), null=True, blank=True) - raw_num_of_people_affected = models.TextField( - verbose_name=_('number of people affected (raw)'), - null=True, blank=True + verbose_name=_("number of people to be assisted (raw)"), null=True, blank=True ) + raw_num_of_people_affected = models.TextField(verbose_name=_("number of people affected (raw)"), null=True, blank=True) raw_operation_start_date = models.TextField(null=True, blank=True) raw_dref_allocated = models.TextField(null=True, blank=True) raw_disaster_risk_reduction_female = models.TextField( - verbose_name=_('number of disaster risk reduction female (raw)'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction female (raw)"), null=True, blank=True + ) raw_disaster_risk_reduction_male = models.TextField( - verbose_name=_('number of disaster risk reduction male (raw)'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction male (raw)"), null=True, blank=True + ) raw_disaster_risk_reduction_people_reached = models.TextField( - verbose_name=_('number of disaster risk reduction people reached (raw)'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction people reached (raw)"), null=True, blank=True + ) raw_disaster_risk_reduction_people_targeted = models.TextField( - verbose_name=_('number of disaster risk reduction people targeted (raw)'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction people targeted (raw)"), null=True, blank=True + ) raw_disaster_risk_reduction_requirements = models.TextField( - verbose_name=_('number of disaster risk reduction requirements (raw)'), null=True, blank=True) - raw_health_female = models.TextField(verbose_name=_('health female (raw)'), null=True, blank=True) - raw_health_male = models.TextField(verbose_name=_('health male (raw)'), null=True, blank=True) - raw_health_people_reached = models.TextField(verbose_name=_('health people reached (raw)'), null=True, blank=True) - raw_health_people_targeted = models.TextField(verbose_name=_('health people targeted (raw)'), null=True, blank=True) - raw_health_requirements = models.TextField(verbose_name=_('health requirements (raw)'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction requirements (raw)"), null=True, blank=True + ) + raw_health_female = models.TextField(verbose_name=_("health female (raw)"), null=True, blank=True) + raw_health_male = models.TextField(verbose_name=_("health male (raw)"), null=True, blank=True) + raw_health_people_reached = models.TextField(verbose_name=_("health people reached (raw)"), null=True, blank=True) + raw_health_people_targeted = models.TextField(verbose_name=_("health people targeted (raw)"), null=True, blank=True) + raw_health_requirements = models.TextField(verbose_name=_("health requirements (raw)"), null=True, blank=True) raw_livelihoods_and_basic_needs_female = models.TextField( - verbose_name=_('number of livelihoods and basic needs female (raw)'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic needs female (raw)"), null=True, blank=True + ) raw_livelihoods_and_basic_needs_male = models.TextField( - verbose_name=_('number of livelihoods and basic needs male (raw)'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic needs male (raw)"), null=True, blank=True + ) raw_livelihoods_and_basic_needs_people_reached = models.TextField( - verbose_name=_('number of livelihoods and basic needs people reached (raw)'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic needs people reached (raw)"), null=True, blank=True + ) raw_livelihoods_and_basic_needs_people_targeted = models.TextField( - verbose_name=_('number of livelihoods and basic needs people targeted (raw)'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic needs people targeted (raw)"), null=True, blank=True + ) raw_livelihoods_and_basic_needs_requirements = models.TextField( - verbose_name=_('number of livelihoods and basic needs requirements (raw)'), null=True, blank=True) - raw_migration_female = models.TextField(verbose_name=_('number of migration female (raw)'), null=True, blank=True) - raw_migration_male = models.TextField(verbose_name=_('number of migration male (raw)'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic needs requirements (raw)"), null=True, blank=True + ) + raw_migration_female = models.TextField(verbose_name=_("number of migration female (raw)"), null=True, blank=True) + raw_migration_male = models.TextField(verbose_name=_("number of migration male (raw)"), null=True, blank=True) raw_migration_people_reached = models.TextField( - verbose_name=_('number of migration people reached (raw)'), null=True, blank=True) + verbose_name=_("number of migration people reached (raw)"), null=True, blank=True + ) raw_migration_people_targeted = models.TextField( - verbose_name=_('number of migration people targeted (raw)'), null=True, blank=True) - raw_migration_requirements = models.TextField(verbose_name=_('number of migration requirements (raw)'), null=True, blank=True) + verbose_name=_("number of migration people targeted (raw)"), null=True, blank=True + ) + raw_migration_requirements = models.TextField(verbose_name=_("number of migration requirements (raw)"), null=True, blank=True) raw_protection_gender_and_inclusion_female = models.TextField( - verbose_name=_('number of protection gender and inclusion female (raw)'), null=True, blank=True) + verbose_name=_("number of protection gender and inclusion female (raw)"), null=True, blank=True + ) raw_protection_gender_and_inclusion_male = models.TextField( - verbose_name=_('number of protection gender and inclusion male (raw)'), null=True, blank=True) + verbose_name=_("number of protection gender and inclusion male (raw)"), null=True, blank=True + ) raw_protection_gender_and_inclusion_people_reached = models.TextField( - verbose_name=_('number of protection gender and inclusion people reached (raw)'), null=True, blank=True) + verbose_name=_("number of protection gender and inclusion people reached (raw)"), null=True, blank=True + ) raw_protection_gender_and_inclusion_people_targeted = models.TextField( - verbose_name=_('number of protection gender and inclusion people targeted (raw)'), null=True, blank=True) + verbose_name=_("number of protection gender and inclusion people targeted (raw)"), null=True, blank=True + ) raw_protection_gender_and_inclusion_requirements = models.TextField( - verbose_name=_('number of protection gender and inclusion requirements (raw)'), null=True, blank=True) - raw_shelter_female = models.TextField(verbose_name=_('number of shelter female (raw)'), null=True, blank=True) - raw_shelter_male = models.TextField(verbose_name=_('number of shelter male (raw)'), null=True, blank=True) - raw_shelter_people_reached = models.TextField( - verbose_name=_('number of shelter people reached (raw)'), - null=True, blank=True + verbose_name=_("number of protection gender and inclusion requirements (raw)"), null=True, blank=True ) + raw_shelter_female = models.TextField(verbose_name=_("number of shelter female (raw)"), null=True, blank=True) + raw_shelter_male = models.TextField(verbose_name=_("number of shelter male (raw)"), null=True, blank=True) + raw_shelter_people_reached = models.TextField(verbose_name=_("number of shelter people reached (raw)"), null=True, blank=True) raw_shelter_people_targeted = models.TextField( - verbose_name=_('number of shelter people targeted (raw)'), null=True, blank=True) - raw_shelter_requirements = models.TextField(verbose_name=_('number of shelter requirements (raw)'), null=True, blank=True) + verbose_name=_("number of shelter people targeted (raw)"), null=True, blank=True + ) + raw_shelter_requirements = models.TextField(verbose_name=_("number of shelter requirements (raw)"), null=True, blank=True) raw_water_sanitation_and_hygiene_female = models.TextField( - verbose_name=_('number of water sanitation and hygiene female (raw)'), null=True, blank=True) + verbose_name=_("number of water sanitation and hygiene female (raw)"), null=True, blank=True + ) raw_water_sanitation_and_hygiene_male = models.TextField( - verbose_name=_('number of water sanitation and hygiene male (raw)'), null=True, blank=True) + verbose_name=_("number of water sanitation and hygiene male (raw)"), null=True, blank=True + ) raw_water_sanitation_and_hygiene_people_reached = models.TextField( - verbose_name=_('number of water sanitation and hygiene people reached (raw)'), null=True, blank=True) + verbose_name=_("number of water sanitation and hygiene people reached (raw)"), null=True, blank=True + ) raw_water_sanitation_and_hygiene_people_targeted = models.TextField( - verbose_name=_('number of water sanitation and hygiene people targeted (raw)'), null=True, blank=True) + verbose_name=_("number of water sanitation and hygiene people targeted (raw)"), null=True, blank=True + ) raw_water_sanitation_and_hygiene_requirements = models.TextField( - verbose_name=_('number of water sanitation and hygiene requirements (raw)'), null=True, blank=True) + verbose_name=_("number of water sanitation and hygiene requirements (raw)"), null=True, blank=True + ) # Fields for the cleaned data file_name = models.CharField(max_length=200, null=True, blank=True) - appeal_number = models.CharField(verbose_name=_('appeal number'), max_length=20, null=True, blank=True) - date_of_issue = models.DateField(verbose_name=_('date of issue'), null=True, blank=True) - glide_number = models.CharField(verbose_name=_('glide number'), max_length=18, null=True, blank=True) - num_of_people_affected = models.IntegerField(verbose_name=_('number of people affected'), null=True, blank=True) - num_of_people_to_be_assisted = models.IntegerField( - verbose_name=_('number of people to be assisted'), - null=True, blank=True - ) - operation_start_date = models.DateField(verbose_name=_('operation start date'), null=True, blank=True) - - dref_allocated = models.IntegerField(verbose_name=_('DREF allocated'), null=True, blank=True) + appeal_number = models.CharField(verbose_name=_("appeal number"), max_length=20, null=True, blank=True) + date_of_issue = models.DateField(verbose_name=_("date of issue"), null=True, blank=True) + glide_number = models.CharField(verbose_name=_("glide number"), max_length=18, null=True, blank=True) + num_of_people_affected = models.IntegerField(verbose_name=_("number of people affected"), null=True, blank=True) + num_of_people_to_be_assisted = models.IntegerField(verbose_name=_("number of people to be assisted"), null=True, blank=True) + operation_start_date = models.DateField(verbose_name=_("operation start date"), null=True, blank=True) + + dref_allocated = models.IntegerField(verbose_name=_("DREF allocated"), null=True, blank=True) disaster_risk_reduction_female = models.IntegerField( - verbose_name=_('number of disaster risk reduction female'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction female"), null=True, blank=True + ) disaster_risk_reduction_male = models.IntegerField( - verbose_name=_('number of disaster risk reduction male'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction male"), null=True, blank=True + ) disaster_risk_reduction_people_reached = models.IntegerField( - verbose_name=_('number of disaster risk reduction people reached'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction people reached"), null=True, blank=True + ) disaster_risk_reduction_people_targeted = models.IntegerField( - verbose_name=_('number of disaster risk reduction people targeted'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction people targeted"), null=True, blank=True + ) disaster_risk_reduction_requirements = models.IntegerField( - verbose_name=_('number of disaster risk reduction people requirements'), null=True, blank=True) - health_female = models.IntegerField(verbose_name=_('number of health female'), null=True, blank=True) - health_male = models.IntegerField(verbose_name=_('number of health male'), null=True, blank=True) - health_people_reached = models.IntegerField(verbose_name=_('number of health people reached'), null=True, blank=True) - health_people_targeted = models.IntegerField(verbose_name=_('number of health people targeted'), null=True, blank=True) - health_requirements = models.IntegerField(verbose_name=_('number of health requirements'), null=True, blank=True) + verbose_name=_("number of disaster risk reduction people requirements"), null=True, blank=True + ) + health_female = models.IntegerField(verbose_name=_("number of health female"), null=True, blank=True) + health_male = models.IntegerField(verbose_name=_("number of health male"), null=True, blank=True) + health_people_reached = models.IntegerField(verbose_name=_("number of health people reached"), null=True, blank=True) + health_people_targeted = models.IntegerField(verbose_name=_("number of health people targeted"), null=True, blank=True) + health_requirements = models.IntegerField(verbose_name=_("number of health requirements"), null=True, blank=True) livelihoods_and_basic_needs_female = models.IntegerField( - verbose_name=_('number of livelihoods and basic needs female'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic needs female"), null=True, blank=True + ) livelihoods_and_basic_needs_male = models.IntegerField( - verbose_name=_('number of livelihoods and basic needs male'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic needs male"), null=True, blank=True + ) livelihoods_and_basic_needs_people_reached = models.IntegerField( - verbose_name=_('number of livelihoods and basic people reached'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic people reached"), null=True, blank=True + ) livelihoods_and_basic_needs_people_targeted = models.IntegerField( - verbose_name=_('number of livelihoods and basic people targeted'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic people targeted"), null=True, blank=True + ) livelihoods_and_basic_needs_requirements = models.IntegerField( - verbose_name=_('number of livelihoods and basic needs requirements'), null=True, blank=True) - migration_female = models.IntegerField(verbose_name=_('number of migration female'), null=True, blank=True) - migration_male = models.IntegerField(verbose_name=_('number of migration male'), null=True, blank=True) - migration_people_reached = models.IntegerField(verbose_name=_('number of migration people reached'), null=True, blank=True) - migration_people_targeted = models.IntegerField(verbose_name=_('number of migration people targeted'), null=True, blank=True) - migration_requirements = models.IntegerField(verbose_name=_('number of migration requirements'), null=True, blank=True) + verbose_name=_("number of livelihoods and basic needs requirements"), null=True, blank=True + ) + migration_female = models.IntegerField(verbose_name=_("number of migration female"), null=True, blank=True) + migration_male = models.IntegerField(verbose_name=_("number of migration male"), null=True, blank=True) + migration_people_reached = models.IntegerField(verbose_name=_("number of migration people reached"), null=True, blank=True) + migration_people_targeted = models.IntegerField(verbose_name=_("number of migration people targeted"), null=True, blank=True) + migration_requirements = models.IntegerField(verbose_name=_("number of migration requirements"), null=True, blank=True) protection_gender_and_inclusion_female = models.IntegerField( - verbose_name=_('number of protection gender and inclusion female'), null=True, blank=True) + verbose_name=_("number of protection gender and inclusion female"), null=True, blank=True + ) protection_gender_and_inclusion_male = models.IntegerField( - verbose_name=_('number of protection gender and inclusion male'), null=True, blank=True) + verbose_name=_("number of protection gender and inclusion male"), null=True, blank=True + ) protection_gender_and_inclusion_people_reached = models.IntegerField( - verbose_name=_('number of protection gender and inclusion people reached'), null=True, blank=True) + verbose_name=_("number of protection gender and inclusion people reached"), null=True, blank=True + ) protection_gender_and_inclusion_people_targeted = models.IntegerField( - verbose_name=_('number of protection gender and inclusion people targeted'), null=True, blank=True) - protection_gender_and_inclusion_requirements = models.IntegerField( - verbose_name=_('number of protection gender and inclusion requirements'), null=True, blank=True) - shelter_female = models.IntegerField(verbose_name=_('number of shelter female'), null=True, blank=True) - shelter_male = models.IntegerField(verbose_name=_('number of shelter male'), null=True, blank=True) - shelter_people_reached = models.IntegerField( - verbose_name=_('number of shelter people reached'), null=True, blank=True + verbose_name=_("number of protection gender and inclusion people targeted"), null=True, blank=True ) - shelter_people_targeted = models.IntegerField( - verbose_name=_('number of shelter people targeted'), null=True, blank=True + protection_gender_and_inclusion_requirements = models.IntegerField( + verbose_name=_("number of protection gender and inclusion requirements"), null=True, blank=True ) - shelter_requirements = models.IntegerField(verbose_name=_('number of shelter people requirements'), null=True, blank=True) + shelter_female = models.IntegerField(verbose_name=_("number of shelter female"), null=True, blank=True) + shelter_male = models.IntegerField(verbose_name=_("number of shelter male"), null=True, blank=True) + shelter_people_reached = models.IntegerField(verbose_name=_("number of shelter people reached"), null=True, blank=True) + shelter_people_targeted = models.IntegerField(verbose_name=_("number of shelter people targeted"), null=True, blank=True) + shelter_requirements = models.IntegerField(verbose_name=_("number of shelter people requirements"), null=True, blank=True) water_sanitation_and_hygiene_female = models.IntegerField( - verbose_name=_('water sanitation and hygiene female'), null=True, blank=True) + verbose_name=_("water sanitation and hygiene female"), null=True, blank=True + ) water_sanitation_and_hygiene_male = models.IntegerField( - verbose_name=_('water sanitation and hygiene male'), null=True, blank=True) + verbose_name=_("water sanitation and hygiene male"), null=True, blank=True + ) water_sanitation_and_hygiene_people_reached = models.IntegerField( - verbose_name=_('water sanitation and hygiene people reached'), null=True, blank=True) + verbose_name=_("water sanitation and hygiene people reached"), null=True, blank=True + ) water_sanitation_and_hygiene_people_targeted = models.IntegerField( - verbose_name=_('water sanitation and hygiene people targeted'), null=True, blank=True) + verbose_name=_("water sanitation and hygiene people targeted"), null=True, blank=True + ) water_sanitation_and_hygiene_requirements = models.IntegerField( - verbose_name=_('water sanitation and hygiene requirements'), null=True, blank=True) + verbose_name=_("water sanitation and hygiene requirements"), null=True, blank=True + ) class Meta: abstract = True @@ -2132,40 +2042,42 @@ class Meta: class EmergencyOperationsDataset(EmergencyOperationsBase): # Raw data from the scraper - raw_appeal_launch_date = models.TextField(verbose_name=_('appeal launch date (raw)'), null=True, blank=True) - raw_category_allocated = models.TextField(verbose_name=_('category allocated (raw)'), null=True, blank=True) - raw_expected_end_date = models.TextField(verbose_name=_('expected end date (raw)'), null=True, blank=True) - raw_expected_time_frame = models.TextField(verbose_name=_('expected time frame (raw)'), null=True, blank=True) + raw_appeal_launch_date = models.TextField(verbose_name=_("appeal launch date (raw)"), null=True, blank=True) + raw_category_allocated = models.TextField(verbose_name=_("category allocated (raw)"), null=True, blank=True) + raw_expected_end_date = models.TextField(verbose_name=_("expected end date (raw)"), null=True, blank=True) + raw_expected_time_frame = models.TextField(verbose_name=_("expected time frame (raw)"), null=True, blank=True) - raw_education_female = models.TextField(verbose_name=_('number of eduction female (raw)'), null=True, blank=True) - raw_education_male = models.TextField(verbose_name=_('number of eduction male (raw)'), null=True, blank=True) + raw_education_female = models.TextField(verbose_name=_("number of eduction female (raw)"), null=True, blank=True) + raw_education_male = models.TextField(verbose_name=_("number of eduction male (raw)"), null=True, blank=True) raw_education_people_reached = models.TextField( - verbose_name=_('number of eduction people reached (raw)'), null=True, blank=True) + verbose_name=_("number of eduction people reached (raw)"), null=True, blank=True + ) raw_education_people_targeted = models.TextField( - verbose_name=_('number of eduction people targeted (raw)'), null=True, blank=True) - raw_education_requirements = models.TextField(verbose_name=_('number of eduction requirements (raw)'), null=True, blank=True) + verbose_name=_("number of eduction people targeted (raw)"), null=True, blank=True + ) + raw_education_requirements = models.TextField(verbose_name=_("number of eduction requirements (raw)"), null=True, blank=True) # Raw: Remove fields from mixin raw_operation_start_date = None # Fields for the cleaned data - appeal_launch_date = models.DateField(verbose_name=_('appeal launch date'), null=True, blank=True) - category_allocated = models.CharField(verbose_name=_('category allocated'), max_length=100, null=True, blank=True) - expected_end_date = models.DateField(verbose_name=_('expected end date'), null=True, blank=True) - expected_time_frame = models.IntegerField(verbose_name=_('expected time frame'), null=True, blank=True) + appeal_launch_date = models.DateField(verbose_name=_("appeal launch date"), null=True, blank=True) + category_allocated = models.CharField(verbose_name=_("category allocated"), max_length=100, null=True, blank=True) + expected_end_date = models.DateField(verbose_name=_("expected end date"), null=True, blank=True) + expected_time_frame = models.IntegerField(verbose_name=_("expected time frame"), null=True, blank=True) - education_female = models.IntegerField(verbose_name=_('number of eduction female'), null=True, blank=True) - education_male = models.IntegerField(verbose_name=_('number of eduction male'), null=True, blank=True) - education_people_reached = models.IntegerField(verbose_name=_('number of eduction people reached'), null=True, blank=True) - education_people_targeted = models.IntegerField(verbose_name=_('number of eduction people targeted'), null=True, blank=True) - education_requirements = models.IntegerField(verbose_name=_('number of eduction requirements'), null=True, blank=True) + education_female = models.IntegerField(verbose_name=_("number of eduction female"), null=True, blank=True) + education_male = models.IntegerField(verbose_name=_("number of eduction male"), null=True, blank=True) + education_people_reached = models.IntegerField(verbose_name=_("number of eduction people reached"), null=True, blank=True) + education_people_targeted = models.IntegerField(verbose_name=_("number of eduction people targeted"), null=True, blank=True) + education_requirements = models.IntegerField(verbose_name=_("number of eduction requirements"), null=True, blank=True) # Clean data: Remove fields from mixin operation_start_date = None class Meta: - verbose_name = _('emergency operations dataset') - verbose_name_plural = _('emergency operations datasets') + verbose_name = _("emergency operations dataset") + verbose_name_plural = _("emergency operations datasets") def __str__(self): return self.raw_file_name @@ -2173,10 +2085,11 @@ def __str__(self): class EmergencyOperationsPeopleReached(EmergencyOperationsBase): # Raw data from the scraper - raw_epoa_update_num = models.TextField(verbose_name=_('EPOA update number (raw)'), null=True, blank=True) - raw_operation_timeframe = models.TextField(verbose_name=_('operation timeframe (raw)'), null=True, blank=True) + raw_epoa_update_num = models.TextField(verbose_name=_("EPOA update number (raw)"), null=True, blank=True) + raw_operation_timeframe = models.TextField(verbose_name=_("operation timeframe (raw)"), null=True, blank=True) raw_time_frame_covered_by_update = models.TextField( - verbose_name=_('time frame covered by update (raw)'), null=True, blank=True) + verbose_name=_("time frame covered by update (raw)"), null=True, blank=True + ) # Raw: Remove fields from mixin raw_dref_allocated = None @@ -2191,10 +2104,11 @@ class EmergencyOperationsPeopleReached(EmergencyOperationsBase): raw_water_sanitation_and_hygiene_people_targeted = None # Fields for the cleaned data - epoa_update_num = models.IntegerField(verbose_name=_('EPOA update number'), null=True, blank=True) - operation_timeframe = models.CharField(verbose_name=_('operation timeframe'), max_length=200, null=True, blank=True) + epoa_update_num = models.IntegerField(verbose_name=_("EPOA update number"), null=True, blank=True) + operation_timeframe = models.CharField(verbose_name=_("operation timeframe"), max_length=200, null=True, blank=True) time_frame_covered_by_update = models.CharField( - verbose_name=_('time frame covered by update'), max_length=200, null=True, blank=True) + verbose_name=_("time frame covered by update"), max_length=200, null=True, blank=True + ) # Clean data: Remove fields from mixin dref_allocated = None @@ -2209,17 +2123,17 @@ class EmergencyOperationsPeopleReached(EmergencyOperationsBase): water_sanitation_and_hygiene_people_targeted = None class Meta: - verbose_name = _('emergency operations people reached') - verbose_name_plural = _('emergency operations people reached') + verbose_name = _("emergency operations people reached") + verbose_name_plural = _("emergency operations people reached") def __str__(self): return self.raw_file_name class EmergencyOperationsEA(EmergencyOperationsBase): - raw_appeal_ends = models.TextField(verbose_name=_('appeal ends (raw)'), null=True, blank=True) - raw_appeal_launch_date = models.TextField(verbose_name=_('appeal launch date (raw)'), null=True, blank=True) - raw_current_operation_budget = models.TextField(verbose_name=_('current operation budget (raw)'), null=True, blank=True) + raw_appeal_ends = models.TextField(verbose_name=_("appeal ends (raw)"), null=True, blank=True) + raw_appeal_launch_date = models.TextField(verbose_name=_("appeal launch date (raw)"), null=True, blank=True) + raw_current_operation_budget = models.TextField(verbose_name=_("current operation budget (raw)"), null=True, blank=True) # Raw: Remove fields from mixin raw_date_of_issue = None @@ -2227,9 +2141,9 @@ class EmergencyOperationsEA(EmergencyOperationsBase): raw_operation_start_date = None # Fields for the cleaned data - appeal_ends = models.DateField(verbose_name=_('appeal ends'), null=True, blank=True) - appeal_launch_date = models.DateField(verbose_name=_('appeal launch date'), null=True, blank=True) - current_operation_budget = models.IntegerField(verbose_name=_('current operation budget'), null=True, blank=True) + appeal_ends = models.DateField(verbose_name=_("appeal ends"), null=True, blank=True) + appeal_launch_date = models.DateField(verbose_name=_("appeal launch date"), null=True, blank=True) + current_operation_budget = models.IntegerField(verbose_name=_("current operation budget"), null=True, blank=True) # Clean data: Remove fields from mixin date_of_issue = None @@ -2237,21 +2151,23 @@ class EmergencyOperationsEA(EmergencyOperationsBase): operation_start_date = None class Meta: - verbose_name = _('emergency operations emergency appeal') - verbose_name_plural = _('emergency operations emergency appeals') + verbose_name = _("emergency operations emergency appeal") + verbose_name_plural = _("emergency operations emergency appeals") def __str__(self): return self.raw_file_name class EmergencyOperationsFR(EmergencyOperationsBase): - raw_date_of_disaster = models.TextField(verbose_name=_('date of disaster (raw)'), null=True, blank=True) + raw_date_of_disaster = models.TextField(verbose_name=_("date of disaster (raw)"), null=True, blank=True) raw_num_of_other_partner_involved = models.TextField( - verbose_name=_('number of other partner involved (raw)'), null=True, blank=True) + verbose_name=_("number of other partner involved (raw)"), null=True, blank=True + ) raw_num_of_partner_ns_involved = models.TextField( - verbose_name=_('number of NS partner involved (raw)'), null=True, blank=True) - raw_operation_end_date = models.TextField(verbose_name=_('operation end date (raw)'), null=True, blank=True) - raw_overall_operation_budget = models.TextField(verbose_name=_('overall operation budget (raw)'), null=True, blank=True) + verbose_name=_("number of NS partner involved (raw)"), null=True, blank=True + ) + raw_operation_end_date = models.TextField(verbose_name=_("operation end date (raw)"), null=True, blank=True) + raw_overall_operation_budget = models.TextField(verbose_name=_("overall operation budget (raw)"), null=True, blank=True) # Raw: Remove fields from mixin raw_dref_allocated = None @@ -2264,12 +2180,12 @@ class EmergencyOperationsFR(EmergencyOperationsBase): raw_water_sanitation_and_hygiene_people_targeted = None # Fields for the cleaned data - date_of_disaster = models.DateField(verbose_name=_('date of disaster'), null=True, blank=True) - num_of_other_partner_involved = models.TextField(verbose_name=_('number of other partner involved'), null=True, blank=True) - num_of_partner_ns_involved = models.TextField(verbose_name=_('number of NS partner involved'), null=True, blank=True) - operation_end_date = models.DateField(verbose_name=_('operation end date'), null=True, blank=True) - operation_start_date = models.DateField(verbose_name=_('operation start date'), null=True, blank=True) - overall_operation_budget = models.IntegerField(verbose_name=_('overall operation budget'), null=True, blank=True) + date_of_disaster = models.DateField(verbose_name=_("date of disaster"), null=True, blank=True) + num_of_other_partner_involved = models.TextField(verbose_name=_("number of other partner involved"), null=True, blank=True) + num_of_partner_ns_involved = models.TextField(verbose_name=_("number of NS partner involved"), null=True, blank=True) + operation_end_date = models.DateField(verbose_name=_("operation end date"), null=True, blank=True) + operation_start_date = models.DateField(verbose_name=_("operation start date"), null=True, blank=True) + overall_operation_budget = models.IntegerField(verbose_name=_("overall operation budget"), null=True, blank=True) # Clean data: Remove fields from mixin dref_allocated = None @@ -2282,8 +2198,8 @@ class EmergencyOperationsFR(EmergencyOperationsBase): water_sanitation_and_hygiene_people_targeted = None class Meta: - verbose_name = _('emergency operations final report') - verbose_name_plural = _('emergency operations final reports') + verbose_name = _("emergency operations final report") + verbose_name_plural = _("emergency operations final reports") def __str__(self): return self.raw_file_name @@ -2291,186 +2207,189 @@ def __str__(self): @reversion.register() class MainContact(models.Model): - ''' Contacts on the Resources page ''' - extent = models.CharField(verbose_name=_('extent'), max_length=300) - name = models.CharField(verbose_name=_('name'), max_length=300) - email = models.CharField(verbose_name=_('email'), max_length=300) + """Contacts on the Resources page""" + + extent = models.CharField(verbose_name=_("extent"), max_length=300) + name = models.CharField(verbose_name=_("name"), max_length=300) + email = models.CharField(verbose_name=_("email"), max_length=300) class Meta: - verbose_name = _('main contact') - verbose_name_plural = _('main contacts') + verbose_name = _("main contact") + verbose_name_plural = _("main contacts") def __str__(self): - return f'{self.extent} - {self.name} - {self.email}' + return f"{self.extent} - {self.name} - {self.email}" class CronJobStatus(models.IntegerChoices): - ACKNOWLEDGED = -2, _('Acknowledged') - NEVER_RUN = -1, _('Never run') - SUCCESSFUL = 0, _('Successful') - WARNED = 1, _('Warned') - ERRONEOUS = 2, _('Erroneous') + ACKNOWLEDGED = -2, _("Acknowledged") + NEVER_RUN = -1, _("Never run") + SUCCESSFUL = 0, _("Successful") + WARNED = 1, _("Warned") + ERRONEOUS = 2, _("Erroneous") @reversion.register() class CronJob(models.Model): - """ CronJob log row about jobs results """ - name = models.CharField(verbose_name=_('name'), max_length=100, default='') - status = models.IntegerField(choices=CronJobStatus.choices, verbose_name=_('status'), default=-1) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - message = models.TextField(verbose_name=_('message'), null=True, blank=True) - num_result = models.IntegerField(verbose_name=_('number of results'), default=0) - storing_days = models.IntegerField(verbose_name=_('storing days'), default=3) + """CronJob log row about jobs results""" + + name = models.CharField(verbose_name=_("name"), max_length=100, default="") + status = models.IntegerField(choices=CronJobStatus.choices, verbose_name=_("status"), default=-1) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + message = models.TextField(verbose_name=_("message"), null=True, blank=True) + num_result = models.IntegerField(verbose_name=_("number of results"), default=0) + storing_days = models.IntegerField(verbose_name=_("storing days"), default=3) backend_side = models.BooleanField( - verbose_name=_('backend side'), default=True, + verbose_name=_("backend side"), + default=True, ) # We could keep backend/frontend ingest results here also class Meta: - verbose_name = _('cronjob log record') - verbose_name_plural = _('cronjob log records') + verbose_name = _("cronjob log record") + verbose_name_plural = _("cronjob log records") def __str__(self): if self.num_result: - return '%s | %s : %s | %s' % (self.name, self.get_status_display(), str(self.num_result), str(self.created_at)[5:16]) + return "%s | %s : %s | %s" % (self.name, self.get_status_display(), str(self.num_result), str(self.created_at)[5:16]) else: - return '%s | %s | %s' % (self.name, self.get_status_display(), str(self.created_at)[5:16]) # omit irrelevant 0 + return "%s | %s | %s" % (self.name, self.get_status_display(), str(self.created_at)[5:16]) # omit irrelevant 0 # Given a request containing new CronJob log row, validate and add the CronJob log row. @staticmethod def sync_cron(body): new = [] errors = [] - fields = {'name': body['name'], 'message': body['message']} + fields = {"name": body["name"], "message": body["message"]} error = None - status = int(body['status']) + status = int(body["status"]) if status in [CronJobStatus.SUCCESSFUL, CronJobStatus.WARNED, CronJobStatus.ERRONEOUS]: - fields['status'] = status + fields["status"] = status else: - error = 'Status is not valid', + error = ("Status is not valid",) - if 'num_result' in body: - if body['num_result'] >= 0: - fields['num_result'] = body['num_result'] + if "num_result" in body: + if body["num_result"] >= 0: + fields["num_result"] = body["num_result"] else: - error = 'Num_result is not valid', + error = ("Num_result is not valid",) - if 'storing_days' in body: - if body['storing_days'] > 0: - fields['storing_days'] = body['storing_days'] - store_me = body['storing_days'] + if "storing_days" in body: + if body["storing_days"] > 0: + fields["storing_days"] = body["storing_days"] + store_me = body["storing_days"] else: - error = 'Storing_days is not valid', + error = ("Storing_days is not valid",) else: store_me = 3 # default storing days - if 'backend_side' in body: - fields['backend_side'] = True if body['backend_side'] else False + if "backend_side" in body: + fields["backend_side"] = True if body["backend_side"] else False if error is not None: - errors.append({ - 'error': error, - 'record': body, - }) + errors.append( + { + "error": error, + "record": body, + } + ) else: new.append(CronJob(**fields)) if not len(errors): CronJob.objects.filter( - name=body['name'], created_at__lt=datetime.now( - pytz.timezone('UTC')) - timedelta(days=store_me) + name=body["name"], created_at__lt=datetime.now(pytz.timezone("UTC")) - timedelta(days=store_me) ).delete() # Delete old ones, "log-rotate" CronJob.objects.bulk_create(new) return errors, new + # To find related scripts from go-api root dir: # grep -rl CronJob --exclude-dir=__pycache__ --exclude-dir=main --exclude-dir=migrations --exclude=CHANGELOG.md * class AuthLog(models.Model): - action = models.CharField(verbose_name=_('action'), max_length=64) - username = models.CharField(verbose_name=_('username'), max_length=256, null=True) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) + action = models.CharField(verbose_name=_("action"), max_length=64) + username = models.CharField(verbose_name=_("username"), max_length=256, null=True) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) # ip = models.GenericIPAddressField(verbose_name=_('IP'), null=True) class Meta: - verbose_name = _('auth log') - verbose_name_plural = _('auth logs') + verbose_name = _("auth log") + verbose_name_plural = _("auth logs") def __unicode__(self): - return '{0} - {1}'.format(self.action, self.username) + return "{0} - {1}".format(self.action, self.username) def __str__(self): - return '{0} - {1}'.format(self.action, self.username) + return "{0} - {1}".format(self.action, self.username) class ReversionDifferenceLog(models.Model): - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - action = models.CharField(verbose_name=_('action'), max_length=64) # Added, Changed, etc - username = models.CharField(verbose_name=_('username'), max_length=256, null=True) - object_id = models.CharField(verbose_name=_('object id'), max_length=191, blank=True) - object_name = models.TextField(verbose_name=_('object name'), null=True, blank=True) # the name of the record - object_type = models.CharField(verbose_name=_('object type'), max_length=50, blank=True) # Emergency, Appeal, etc + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + action = models.CharField(verbose_name=_("action"), max_length=64) # Added, Changed, etc + username = models.CharField(verbose_name=_("username"), max_length=256, null=True) + object_id = models.CharField(verbose_name=_("object id"), max_length=191, blank=True) + object_name = models.TextField(verbose_name=_("object name"), null=True, blank=True) # the name of the record + object_type = models.CharField(verbose_name=_("object type"), max_length=50, blank=True) # Emergency, Appeal, etc changed_from = ArrayField( - models.TextField(null=True, blank=True), - verbose_name=_('changed from'), default=list, null=True, blank=True + models.TextField(null=True, blank=True), verbose_name=_("changed from"), default=list, null=True, blank=True ) changed_to = ArrayField( - models.TextField(null=True, blank=True), - verbose_name=_('changed to'), default=list, null=True, blank=True + models.TextField(null=True, blank=True), verbose_name=_("changed to"), default=list, null=True, blank=True ) class Meta: - verbose_name = _('reversion difference log') - verbose_name_plural = _('reversion difference logs') + verbose_name = _("reversion difference log") + verbose_name_plural = _("reversion difference logs") def __unicode__(self): - return '{0} - {1} - {2} - {3}'.format(self.username, self.action, self.object_type, self.object_id) + return "{0} - {1} - {2} - {3}".format(self.username, self.action, self.object_type, self.object_id) def __str__(self): - return '{0} - {1} - {2} - {3}'.format(self.username, self.action, self.object_type, self.object_id) + return "{0} - {1} - {2} - {3}".format(self.username, self.action, self.object_type, self.object_id) @receiver(user_logged_in) def user_logged_in_callback(sender, request, user, **kwargs): # ip = request.META.get('REMOTE_ADDR') if user: - AuthLog.objects.create(action='user_logged_in', username=user.username) + AuthLog.objects.create(action="user_logged_in", username=user.username) @receiver(user_logged_out) def user_logged_out_callback(sender, request, user, **kwargs): # ip = request.META.get('REMOTE_ADDR') if user: - AuthLog.objects.create(action='user_logged_out', username=user.username) + AuthLog.objects.create(action="user_logged_out", username=user.username) @receiver(user_login_failed) def user_login_failed_callback(sender, credentials, **kwargs): - AuthLog.objects.create(action='user_login_failed', username=credentials.get('username', None)) + AuthLog.objects.create(action="user_login_failed", username=credentials.get("username", None)) from .triggers import * # noqa: E402 F403 F401 class GECCode(models.Model): - code = models.CharField(verbose_name=_('3 letter GEC code'), max_length=3) - country = models.ForeignKey(Country, verbose_name=_('country'), on_delete=models.CASCADE) + code = models.CharField(verbose_name=_("3 letter GEC code"), max_length=3) + country = models.ForeignKey(Country, verbose_name=_("country"), on_delete=models.CASCADE) class ERPGUID(models.Model): - """ GUIDs stored from ERP POST responses, to be able to GET if info is needed """ + """GUIDs stored from ERP POST responses, to be able to GET if info is needed""" + created_at = models.DateTimeField(auto_now_add=True) api_guid = models.CharField( - max_length=200, - help_text='Can be used to do a GET request to check on the microservice API side.' + max_length=200, help_text="Can be used to do a GET request to check on the microservice API side." ) - field_report = models.ForeignKey(FieldReport, verbose_name=_('field report'), on_delete=models.CASCADE) + field_report = models.ForeignKey(FieldReport, verbose_name=_("field report"), on_delete=models.CASCADE) class CountryOfFieldReportToReview(models.Model): - country = models.OneToOneField(Country, verbose_name=_('country'), on_delete=models.DO_NOTHING, primary_key=True) + country = models.OneToOneField(Country, verbose_name=_("country"), on_delete=models.DO_NOTHING, primary_key=True) class Meta: verbose_name = "Country of Field Report to review" @@ -2479,57 +2398,38 @@ class Meta: class Export(models.Model): class ExportStatus(models.IntegerChoices): - PENDING = 0, _('Pending') - COMPLETED = 1, _('Completed') - ERRORED = 2, _('Errored') + PENDING = 0, _("Pending") + COMPLETED = 1, _("Completed") + ERRORED = 2, _("Errored") class ExportType(models.TextChoices): - DREF = 'dref-applications', _('Dref Applications') - OPS_UPDATE = 'dref-operational-updates', _('Dref Operational Updates') - FINAL_REPORT = 'dref-final-reports', _('Dref Final Reports') - PER = 'per', _('Per') - - export_id = models.IntegerField(verbose_name=_('Export Id')) - export_type = models.CharField( - verbose_name=_('Export Type'), - max_length=255, - choices=ExportType.choices - ) + DREF = "dref-applications", _("Dref Applications") + OPS_UPDATE = "dref-operational-updates", _("Dref Operational Updates") + FINAL_REPORT = "dref-final-reports", _("Dref Final Reports") + PER = "per", _("Per") + + export_id = models.IntegerField(verbose_name=_("Export Id")) + export_type = models.CharField(verbose_name=_("Export Type"), max_length=255, choices=ExportType.choices) url = models.URLField(verbose_name=_("Url"), max_length=255, null=True, blank=True) - token = models.UUIDField( - default=uuid.uuid4, - editable=False, - unique=True - ) - requested_at = models.DateTimeField( - verbose_name=_('Requested At'), - null=True, blank=True - ) - completed_at = models.DateTimeField( - verbose_name=_('Completed At'), - null=True, blank=True - ) - status = models.IntegerField( - verbose_name=_('Status'), - choices=ExportStatus.choices, - default=ExportStatus.PENDING - ) + token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) + requested_at = models.DateTimeField(verbose_name=_("Requested At"), null=True, blank=True) + completed_at = models.DateTimeField(verbose_name=_("Completed At"), null=True, blank=True) + status = models.IntegerField(verbose_name=_("Status"), choices=ExportStatus.choices, default=ExportStatus.PENDING) pdf_file = models.FileField( - verbose_name=_('Pdf File'), + verbose_name=_("Pdf File"), max_length=255, - null=True, blank=True, + null=True, + blank=True, upload_to="pdf-export/", ) requested_by = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('user'), - null=True, blank=True, - on_delete=models.SET_NULL, - ) - per_country = models.IntegerField( - verbose_name=_('Per Country Id'), + settings.AUTH_USER_MODEL, + verbose_name=_("user"), null=True, - blank=True + blank=True, + on_delete=models.SET_NULL, ) + per_country = models.IntegerField(verbose_name=_("Per Country Id"), null=True, blank=True) def __str__(self): - return f'{self.url} - {self.token}' + return f"{self.url} - {self.token}" diff --git a/api/molnix_utils.py b/api/molnix_utils.py index 45fd1a5af..15110e5e3 100644 --- a/api/molnix_utils.py +++ b/api/molnix_utils.py @@ -1,29 +1,30 @@ -import requests import json +import requests + class MolnixApi: access_token = None - def __init__(self, url='https://api.ifrc-staging.rpm.molnix.com/api/', username=None, password=None): + def __init__(self, url="https://api.ifrc-staging.rpm.molnix.com/api/", username=None, password=None): if username is None or password is None: - raise Exception('username or password not supplied') + raise Exception("username or password not supplied") self.url = url self.username = username self.password = password - def call_api(self, path, method='GET', params={}): + def call_api(self, path, method="GET", params={}): url = self.url + path headers = {} if self.access_token: - headers['Authorization'] = 'Bearer %s' % self.access_token - if method == 'GET': + headers["Authorization"] = "Bearer %s" % self.access_token + if method == "GET": res = requests.get(url, params=params, headers=headers) - if method == 'POST': + if method == "POST": res = requests.post(url, json=params, headers=headers) if res.status_code > 300: - raise Exception('call to %s failed' % url) # FIXME: print msg from API + raise Exception("call to %s failed" % url) # FIXME: print msg from API return res.json() def call_api_paginated(self, path, response_key=None, params={}): @@ -31,10 +32,10 @@ def call_api_paginated(self, path, response_key=None, params={}): next_page = True results = [] while next_page: - params['page'] = page + params["page"] = page data = self.call_api(path=path, params=params) if response_key: - data = data[response_key]['data'] + data = data[response_key]["data"] results += data if len(data) == 0: next_page = False @@ -43,25 +44,22 @@ def call_api_paginated(self, path, response_key=None, params={}): return results def login(self): - params = { - 'username': self.username, - 'password': self.password - } - response = self.call_api('login', 'POST', params) - if 'access_token' not in response.keys(): - raise Exception('unexpected response to login') - self.access_token = response['access_token'] + params = {"username": self.username, "password": self.password} + response = self.call_api("login", "POST", params) + if "access_token" not in response.keys(): + raise Exception("unexpected response to login") + self.access_token = response["access_token"] return True def get_tags(self): - return self.call_api_paginated(path='tags')['tags'] + return self.call_api_paginated(path="tags")["tags"] def get_tag_groups(self, id): - return self.call_api(path='tags/edit/%d' % id)['tag']['groups'] + return self.call_api(path="tags/edit/%d" % id)["tag"]["groups"] def get_open_positions(self): # return self.call_api_paginated(path='positions', response_key='positions') - return self.call_api(path='positions/open') + return self.call_api(path="positions/open") def get_deployments(self): deployments_filter = { @@ -72,30 +70,29 @@ def get_deployments(self): "orderBy": "ID", "orderType": "DESC", "userroles": [], - "criterias": "[]" + "criterias": "[]", } - params = { - 'filter': json.dumps(deployments_filter) - } - return self.call_api_paginated(path='deployments', response_key='deployments', params=params) + params = {"filter": json.dumps(deployments_filter)} + return self.call_api_paginated(path="deployments", response_key="deployments", params=params) - ''' + """ WARNING: If position is not found or generates an error, we return None - ''' + """ + def get_position(self, id): try: - return self.call_api(path='positions/%d' % id) + return self.call_api(path="positions/%d" % id) except: return None def get_countries(self): - countries = self.call_api(path='countries') - countries_list = countries['countries'] + countries = self.call_api(path="countries") + countries_list = countries["countries"] countries_dict = {} for country in countries_list: - countries_dict[country['id']] = country['code'] + countries_dict[country["id"]] = country["code"] return countries_dict def logout(self): - self.call_api('logout') - return True \ No newline at end of file + self.call_api("logout") + return True diff --git a/api/receivers.py b/api/receivers.py index 68171f10d..eb7a2db97 100644 --- a/api/receivers.py +++ b/api/receivers.py @@ -3,56 +3,56 @@ from django.db import transaction from django.db.models import Q -from django.db.models.signals import pre_delete, pre_save, post_save, post_delete +from django.db.models.signals import post_delete, post_save, pre_delete, pre_save from django.dispatch import receiver from django.utils import timezone - from reversion.models import Version from reversion.signals import post_revision_commit -from api.models import ReversionDifferenceLog, Event, Country, FieldReport -from middlewares.middlewares import get_username -from utils.elasticsearch import create_es_index, update_es_index, delete_es_index -from utils.erp import push_fr_data + from api.logger import logger -from .models import Appeal, AppealHistory, AppealFilter +from api.models import Country, Event, FieldReport, ReversionDifferenceLog from main.suspend_receivers import suspendingreceiver +from middlewares.middlewares import get_username +from utils.elasticsearch import create_es_index, delete_es_index, update_es_index +from utils.erp import push_fr_data +from .models import Appeal, AppealFilter, AppealHistory MODEL_TYPES = { - 'api.action': 'Action', - 'api.appeal': 'Appeal', - 'api.appealdocument': 'Appeal Document', - 'api.country': 'Country', - 'api.cronjob': 'CronJob', - 'api.district': 'District', - 'api.emergencyoperationsdataset': 'Emergency Operations Dataset', - 'api.emergencyoperationsea': 'Emergency Operations Emergency Appeals', - 'api.emergencyoperationsfr': 'Emergency Operations Final Reports', - 'api.emergencyoperationspeoplereached': 'Emergency Operations People Reached', - 'api.event': 'Emergency', - 'api.fieldreport': 'Field Report', - 'api.gdacsevent': 'GDACS Event', - 'api.profile': 'User Profile', - 'api.region': 'Region', - 'api.situationreport': 'Situation Report', - 'api.situationreporttype': 'Situation Report Type', - 'deployments.eruowner': 'ERU Owner', - 'deployments.erureadiness': 'ERU Readiness', - 'deployments.partnersocietyactivities': 'Partner society activity', - 'deployments.partnersocietydeployment': 'Partner society deployment', - 'deployments.personnel': 'Personnel', - 'deployments.personneldeployment': 'Personnel Deployment', - 'deployments.project': 'Project', - 'deployments.regionalproject': 'Regional project', - 'notifications.subscription': 'Subscription', - 'notifications.surgealert': 'Surge alert', - 'per.form': 'PER Form', - 'per.formdata': 'PER Form Data', - 'per.nicedocument': 'PER Document', - 'per.nsphase': 'PER NS Phase', - 'per.overview': 'PER General Overview', - 'per.workplan': 'PER Work Plan', - 'registrations.pending': 'Pending registration', + "api.action": "Action", + "api.appeal": "Appeal", + "api.appealdocument": "Appeal Document", + "api.country": "Country", + "api.cronjob": "CronJob", + "api.district": "District", + "api.emergencyoperationsdataset": "Emergency Operations Dataset", + "api.emergencyoperationsea": "Emergency Operations Emergency Appeals", + "api.emergencyoperationsfr": "Emergency Operations Final Reports", + "api.emergencyoperationspeoplereached": "Emergency Operations People Reached", + "api.event": "Emergency", + "api.fieldreport": "Field Report", + "api.gdacsevent": "GDACS Event", + "api.profile": "User Profile", + "api.region": "Region", + "api.situationreport": "Situation Report", + "api.situationreporttype": "Situation Report Type", + "deployments.eruowner": "ERU Owner", + "deployments.erureadiness": "ERU Readiness", + "deployments.partnersocietyactivities": "Partner society activity", + "deployments.partnersocietydeployment": "Partner society deployment", + "deployments.personnel": "Personnel", + "deployments.personneldeployment": "Personnel Deployment", + "deployments.project": "Project", + "deployments.regionalproject": "Regional project", + "notifications.subscription": "Subscription", + "notifications.surgealert": "Surge alert", + "per.form": "PER Form", + "per.formdata": "PER Form Data", + "per.nicedocument": "PER Document", + "per.nsphase": "PER NS Phase", + "per.overview": "PER General Overview", + "per.workplan": "PER Work Plan", + "registrations.pending": "Pending registration", } @@ -60,8 +60,8 @@ def create_global_reversion_log(versions, revision): for version in versions: ver_data = json.loads(version.serialized_data) # try to map model name coming from Reversion to more readable model names (dict above) - model_name = MODEL_TYPES.get(ver_data[0]['model'], ver_data[0]['model']) - action_happened = 'Added' if 'Added' in revision.comment else 'Changed' + model_name = MODEL_TYPES.get(ver_data[0]["model"], ver_data[0]["model"]) + action_happened = "Added" if "Added" in revision.comment else "Changed" previous_version = Version.objects.filter( object_id=version.object_id, @@ -70,41 +70,41 @@ def create_global_reversion_log(versions, revision): ).first() # if the record already existed in the DB but didn't have an initial/previous reversion record - if not previous_version and action_happened == 'Added': + if not previous_version and action_happened == "Added": ReversionDifferenceLog.objects.create( action=action_happened, - username=revision.user.username if revision.user else '', + username=revision.user.username if revision.user else "", object_id=version.object_id, - object_name=str(version) if len(str(version)) <= 200 else str(version)[:200] + '...', - object_type=model_name + object_name=str(version) if len(str(version)) <= 200 else str(version)[:200] + "...", + object_type=model_name, ) elif not previous_version: ReversionDifferenceLog.objects.create( action=action_happened, - username=revision.user.username if revision.user else '', + username=revision.user.username if revision.user else "", object_id=version.object_id, - object_name=str(version) if len(str(version)) <= 200 else str(version)[:200] + '...', + object_name=str(version) if len(str(version)) <= 200 else str(version)[:200] + "...", object_type=model_name, - changed_to=revision.comment.replace('Changed ', '').replace('.', '').split(' and ') + changed_to=revision.comment.replace("Changed ", "").replace(".", "").split(" and "), ) elif previous_version._local_field_dict != version._local_field_dict: changes_from = [] changes_to = [] for key, value in version._local_field_dict.items(): if key not in previous_version._local_field_dict: - previous_version._local_field_dict[key] = '' + previous_version._local_field_dict[key] = "" if previous_version._local_field_dict[key] != value: - changes_from.append('{}: {}'.format(key, previous_version._local_field_dict[key])) - changes_to.append('{}: {}'.format(key, value)) + changes_from.append("{}: {}".format(key, previous_version._local_field_dict[key])) + changes_to.append("{}: {}".format(key, value)) ReversionDifferenceLog.objects.create( action=action_happened, - username=revision.user.username if revision.user else '', + username=revision.user.username if revision.user else "", object_id=version.object_id, - object_name=str(version) if len(str(version)) <= 200 else str(version)[:200] + '...', + object_name=str(version) if len(str(version)) <= 200 else str(version)[:200] + "...", object_type=model_name, changed_from=changes_from, - changed_to=changes_to + changed_to=changes_to, ) @@ -127,11 +127,11 @@ def log_deletion(sender, instance, using, **kwargs): # Creates a ReversionDifferenceLog record which is used for the "global" log ReversionDifferenceLog.objects.create( - action='Deleted', + action="Deleted", username=usr, object_id=instance.pk, - object_name=str(instance) if len(str(instance)) <= 200 else str(instance)[:200] + '...', - object_type=MODEL_TYPES.get(model_name, instance_type) if model_name else instance_type + object_name=str(instance) if len(str(instance)) <= 200 else str(instance)[:200] + "...", + object_type=MODEL_TYPES.get(model_name, instance_type) if model_name else instance_type, ) # ElasticSearch to also delete the index if a record was deleted @@ -141,10 +141,10 @@ def log_deletion(sender, instance, using, **kwargs): # NOTE: Adding this to disable indexing in testcases @suspendingreceiver(pre_save) def remove_child_events_from_es(sender, instance, using, **kwargs): - ''' Handle Emergency Elasticsearch indexes ''' + """Handle Emergency Elasticsearch indexes""" model = instance.__class__.__name__ try: - if model == 'Event': + if model == "Event": curr_record = Event.objects.filter(id=instance.id).first() # If new record, do nothing, index_and_notify should handle it if curr_record is None: @@ -156,7 +156,7 @@ def remove_child_events_from_es(sender, instance, using, **kwargs): elif curr_record.parent_event and instance.parent_event is None: # Add back ES record if Emergency became a parent (index_elasticsearch.py) create_es_index(instance) - elif model == 'Country': + elif model == "Country": curr_record = Country.objects.filter(id=instance.id).first() if instance.in_search: if not curr_record: @@ -171,17 +171,17 @@ def remove_child_events_from_es(sender, instance, using, **kwargs): else: delete_es_index(instance) except Exception as ex: - logger.error(f'Failed to index a Country, error: {str(ex)[:512]}') + logger.error(f"Failed to index a Country, error: {str(ex)[:512]}") # Needs post_save because if a new Field Report is not mapped to an Emergency it will create one @receiver(post_save) def handle_fr_for_erp(sender, instance, using, **kwargs): - ''' + """ If a Field Report is created/updated and Request for International Assisstance is checked for any of the Event's Field Reports then update ERP with the data, calling a middleware microservice - ''' + """ if isinstance(instance, FieldReport): # TODO: maybe add a check, and only send request if anything has changed @@ -189,9 +189,7 @@ def handle_fr_for_erp(sender, instance, using, **kwargs): push_fr_data(instance) return - req_ass_exists = FieldReport.objects.filter( - Q(event_id=instance.event_id) & Q(ns_request_assistance=True) - ).exists() + req_ass_exists = FieldReport.objects.filter(Q(event_id=instance.event_id) & Q(ns_request_assistance=True)).exists() if not instance.ns_request_assistance and req_ass_exists: # If assistance request was dropped, set retired to yes push_fr_data(instance, retired=True) @@ -201,8 +199,9 @@ def handle_fr_for_erp(sender, instance, using, **kwargs): @receiver(post_save, sender=Appeal) def add_update_appeal_history(sender, instance, created, **kwargs): fields_watched = [ - field.name for field in AppealHistory._meta.get_fields() - if field.name not in ['id', 'appeal', 'valid_from', 'valid_to', 'aid', 'amount_funded'] + field.name + for field in AppealHistory._meta.get_fields() + if field.name not in ["id", "appeal", "valid_from", "valid_to", "aid", "amount_funded"] ] now = timezone.now() changed = False @@ -226,13 +225,13 @@ def add_update_appeal_history(sender, instance, created, **kwargs): needs_confirmation=instance.needs_confirmation, status=instance.status, code=instance.code, - triggering_amount=instance.triggering_amount + triggering_amount=instance.triggering_amount, ) else: # Appeal Update appeal = Appeal.objects.get(code=instance.code) - appeal_history = AppealHistory.objects.filter(aid=instance.aid).order_by('id').last() + appeal_history = AppealHistory.objects.filter(aid=instance.aid).order_by("id").last() for field in fields_watched: if appeal_history and getattr(appeal, field) != getattr(appeal_history, field): # Watched fields are not changed @@ -264,13 +263,13 @@ def add_update_appeal_history(sender, instance, created, **kwargs): needs_confirmation=instance.needs_confirmation, status=instance.status, code=instance.code, - triggering_amount=instance.triggering_amount + triggering_amount=instance.triggering_amount, ) @receiver(post_delete, sender=Appeal) def remove_appeal_filter(sender, instance, using, **kwargs): - appealFilter = AppealFilter.objects.get(name='ingestAppealFilter') + appealFilter = AppealFilter.objects.get(name="ingestAppealFilter") lstCodesToSkip = appealFilter.value.split(",") if instance.code not in lstCodesToSkip: lstCodesToSkip.append(instance.code) diff --git a/api/schema.py b/api/schema.py index 024c4c8eb..1c6858a96 100644 --- a/api/schema.py +++ b/api/schema.py @@ -1,13 +1,7 @@ import graphene from graphene_django.types import DjangoObjectType -from .models import ( - Country, - DisasterType, - ActionsTaken, - Event, - Appeal, - FieldReport, -) + +from .models import ActionsTaken, Appeal, Country, DisasterType, Event, FieldReport # GraphQL Schemas @@ -53,13 +47,13 @@ def resolve_all_disasters(self, info, **kwargs): return DisasterType.objects.all() def resolve_all_events(self, info, **kwargs): - return Event.objects.select_related('dtype').all() + return Event.objects.select_related("dtype").all() def resolve_all_appeals(self, info, **kwargs): - return Appeal.objects.select_related('event').select_related('country').all() + return Appeal.objects.select_related("event").select_related("country").all() def resolve_all_fieldreports(self, info, **kwargs): - return FieldReport.objects.select_related('dtype').select_related('event').all() + return FieldReport.objects.select_related("dtype").select_related("event").all() schema = graphene.Schema(query=Query) diff --git a/api/scrapers/cleaners.py b/api/scrapers/cleaners.py index f0c633b4f..5040e66c8 100644 --- a/api/scrapers/cleaners.py +++ b/api/scrapers/cleaners.py @@ -1,42 +1,45 @@ import re from datetime import datetime + def clean_number(num_in_str): if not num_in_str: return None - regex = '\\d{1,3}(,\\d{3})*(\\.\\d+)?' # ex.: 123,123.12 + regex = "\\d{1,3}(,\\d{3})*(\\.\\d+)?" # ex.: 123,123.12 match = re.search(regex, num_in_str) if match: try: - num = int(re.sub(',', '', match.group())) + num = int(re.sub(",", "", match.group())) return num except: return None else: return None + def clean_appeal_code(appeal_code): if not appeal_code: return None - regex = 'MDR.{5}' - match = re.search(regex, appeal_code.replace(' ','')) # elimate surplus spaces via this replace from the raw + regex = "MDR.{5}" + match = re.search(regex, appeal_code.replace(" ", "")) # elimate surplus spaces via this replace from the raw if match: return match.group()[:20] # Substring at 20 because of max_length of appeal_code else: return None + def clean_date(date_in_str): if not date_in_str: return None # could use '\\d{1,2}(st|th)?...' if needed - regex = '\\d{1,2} (January|February|March|April|May|June|July|August|September|October|November|December) \\d{4}' + regex = "\\d{1,2} (January|February|March|April|May|June|July|August|September|October|November|December) \\d{4}" match = re.search(regex, date_in_str) if match: try: - date = datetime.strptime(match.group(), '%d %B %Y') + date = datetime.strptime(match.group(), "%d %B %Y") return date except: return None diff --git a/api/scrapers/config.py b/api/scrapers/config.py index dd6a1a153..1ccb80f63 100644 --- a/api/scrapers/config.py +++ b/api/scrapers/config.py @@ -1,96 +1,104 @@ - - def return_all(text): -# return text.split(':')[0] # really the full text + # return text.split(':')[0] # really the full text return text + # META class MetaFields: - glide_number = 'glideNumber' - appeal_number = 'appealNumber' - date_of_issue = 'dateOfIssue' - date_of_disaster = 'dateOfDisaster' - appeal_launch_date = 'appealLaunchDate' - expected_time_frame = 'expectedTimeFrame' - expected_end_date = 'expectedEndDate' - category_allocated = 'categoryAllocated' - dref_allocated = 'drefAllocated' - num_of_people_affected = 'numOfPeopleAffected' - num_of_people_to_be_assisted = 'numOfPeopleToBeAssisted' - num_of_partner_ns_involved = 'numOfPartnerNsInvolved' - num_of_other_partner_involved = 'numOfOtherPartnerInvolved' - epoa_update_num = 'epoaUpdateNum' - time_frame_covered_by_update = 'timeFrameCoveredByUpdate' - appeal_ends = 'appealEnds' - operation_start_date = 'operationStartDate' - operation_end_date = 'operationEndDate' - operation_timeframe = 'operationTimeframe' - overall_operation_budget = 'overallOperationBudget' - current_operation_budget = 'currentOperationBudget' - - misc = 'misc' + glide_number = "glideNumber" + appeal_number = "appealNumber" + date_of_issue = "dateOfIssue" + date_of_disaster = "dateOfDisaster" + appeal_launch_date = "appealLaunchDate" + expected_time_frame = "expectedTimeFrame" + expected_end_date = "expectedEndDate" + category_allocated = "categoryAllocated" + dref_allocated = "drefAllocated" + num_of_people_affected = "numOfPeopleAffected" + num_of_people_to_be_assisted = "numOfPeopleToBeAssisted" + num_of_partner_ns_involved = "numOfPartnerNsInvolved" + num_of_other_partner_involved = "numOfOtherPartnerInvolved" + epoa_update_num = "epoaUpdateNum" + time_frame_covered_by_update = "timeFrameCoveredByUpdate" + appeal_ends = "appealEnds" + operation_start_date = "operationStartDate" + operation_end_date = "operationEndDate" + operation_timeframe = "operationTimeframe" + overall_operation_budget = "overallOperationBudget" + current_operation_budget = "currentOperationBudget" + + misc = "misc" _mfd = MetaFields M_KEYS = { _mfd.appeal_number: [ - 'Emergency Appeal no', 'Emergency Appeal n°', 'Emergency Appeal n o', - 'Operation no.', 'Emergency Appeal n°', 'DREF n°', 'DREF Operation:', - 'Appeal n°', + "Emergency Appeal no", + "Emergency Appeal n°", + "Emergency Appeal n o", + "Operation no.", + "Emergency Appeal n°", + "DREF n°", + "DREF Operation:", + "Appeal n°", ], - _mfd.glide_number: ['Glide n°:', 'Glide n°'], - _mfd.appeal_launch_date: ['Date of launch:', 'Appeal date of launch:'], - _mfd.date_of_issue: ['Date of issue:', 'DREF issued:', 'Issued on'], - _mfd.date_of_disaster: ['Date of disaster:'], - _mfd.expected_time_frame: ['Expected timeframe:'], - _mfd.expected_end_date: ['Expected end date:'], + _mfd.glide_number: ["Glide n°:", "Glide n°"], + _mfd.appeal_launch_date: ["Date of launch:", "Appeal date of launch:"], + _mfd.date_of_issue: ["Date of issue:", "DREF issued:", "Issued on"], + _mfd.date_of_disaster: ["Date of disaster:"], + _mfd.expected_time_frame: ["Expected timeframe:"], + _mfd.expected_end_date: ["Expected end date:"], _mfd.category_allocated: [ - 'Category allocated to the of the disaster or crisis:', + "Category allocated to the of the disaster or crisis:", ], _mfd.dref_allocated: [ - 'DREF allocated:', 'DREF allocated loan:', + "DREF allocated:", + "DREF allocated loan:", ], _mfd.num_of_people_affected: [ - 'Total number of people affected:', 'Number of people affected:', - 'N° of people affected:', + "Total number of people affected:", + "Number of people affected:", + "N° of people affected:", ], - _mfd.num_of_people_to_be_assisted: ['Number of people to be assisted:'], + _mfd.num_of_people_to_be_assisted: ["Number of people to be assisted:"], _mfd.num_of_partner_ns_involved: [ - 'Red Cross Red Crescent Movement partners actively involved in the operation:', + "Red Cross Red Crescent Movement partners actively involved in the operation:", ], _mfd.num_of_other_partner_involved: [ - 'Other partner organizations actively involved in the operation:', + "Other partner organizations actively involved in the operation:", ], _mfd.epoa_update_num: [ - 'EPoA update n°', 'DREF operation update n°', 'Operations update n°', + "EPoA update n°", + "DREF operation update n°", + "Operations update n°", ], _mfd.time_frame_covered_by_update: [ - 'Timeframe covered by this update:', 'Period covered by this update: ', + "Timeframe covered by this update:", + "Period covered by this update: ", ], - _mfd.operation_start_date: ['Operation start date:'], - _mfd.operation_end_date: ['Operation end date:'], - _mfd.operation_timeframe: ['Operation timeframe:'], - _mfd.overall_operation_budget: ['Overall operation budget:'], - _mfd.current_operation_budget: ['Appeal budget:'], - _mfd.appeal_ends: ['Completion date:'], - + _mfd.operation_start_date: ["Operation start date:"], + _mfd.operation_end_date: ["Operation end date:"], + _mfd.operation_timeframe: ["Operation timeframe:"], + _mfd.overall_operation_budget: ["Overall operation budget:"], + _mfd.current_operation_budget: ["Appeal budget:"], + _mfd.appeal_ends: ["Completion date:"], _mfd.misc: [ - 'For DREF;', - 'Start of the emergency:', - 'Emergency appeal budget 1 :', - r'Host National Society presence \(n° of volunteers, staff, branches\):', - 'Appeal budget:', - 'Host National Society:', - 'Host National Society presence:', - 'Date of disaster:', - 'Operation manager:', - 'National Society Focal Point:', - 'Amount requested for the appeal:', - 'IFRC Project Manager \(responsible for implementation, compliances, monitoring and reporting\):', # noqa - 'Period covered by this update:', + "For DREF;", + "Start of the emergency:", + "Emergency appeal budget 1 :", + r"Host National Society presence \(n° of volunteers, staff, branches\):", + "Appeal budget:", + "Host National Society:", + "Host National Society presence:", + "Date of disaster:", + "Operation manager:", + "National Society Focal Point:", + "Amount requested for the appeal:", + "IFRC Project Manager \(responsible for implementation, compliances, monitoring and reporting\):", # noqa + "Period covered by this update:", ], } @@ -130,27 +138,28 @@ def get_meta_misc_keys(fields): misc_fields.extend(M_KEYS[field]) return list(set(misc_fields)) + # SECTOR class Sectors: - health = 'health' - shelter = 'shelter' - livelihoods_and_basic_needs = 'livelihoodsAndBasicNeeds' - Water_sanitation_hygiene = 'waterSanitationAndHygiene' - disaster_Risk_reduction = 'disasterRiskReduction' - protection_gender_inclusion = 'protectionGenderAndInclusion' - migration = 'migration' + health = "health" + shelter = "shelter" + livelihoods_and_basic_needs = "livelihoodsAndBasicNeeds" + Water_sanitation_hygiene = "waterSanitationAndHygiene" + disaster_Risk_reduction = "disasterRiskReduction" + protection_gender_inclusion = "protectionGenderAndInclusion" + migration = "migration" class SectorFields: - male = 'male' - female = 'female' - requirements = 'requirements' - people_targeted = 'peopleTargeted' - people_reached = 'peopleReached' + male = "male" + female = "female" + requirements = "requirements" + people_targeted = "peopleTargeted" + people_reached = "peopleReached" - misc = 'misc' + misc = "misc" _s = Sectors @@ -158,23 +167,22 @@ class SectorFields: S_KEYS = { - _s.health: ['Health'], - _s.shelter: ['Shelter'], - _s.livelihoods_and_basic_needs: ['Livelihoods and basic needs'], - _s.Water_sanitation_hygiene: ['Water, sanitation and hygiene'], - _s.disaster_Risk_reduction: ['Disaster Risk Reduction'], - _s.protection_gender_inclusion: ['Protection, Gender and Inclusion'], - _s.migration: ['Migration'], + _s.health: ["Health"], + _s.shelter: ["Shelter"], + _s.livelihoods_and_basic_needs: ["Livelihoods and basic needs"], + _s.Water_sanitation_hygiene: ["Water, sanitation and hygiene"], + _s.disaster_Risk_reduction: ["Disaster Risk Reduction"], + _s.protection_gender_inclusion: ["Protection, Gender and Inclusion"], + _s.migration: ["Migration"], } SF_KEYS = { - _sfd.male: ['Male:'], - _sfd.female: ['Female:'], - _sfd.requirements: ['Requirements'], - _sfd.people_targeted: ['People targeted:'], - _sfd.people_reached: ['People reached:'], - + _sfd.male: ["Male:"], + _sfd.female: ["Female:"], + _sfd.requirements: ["Requirements"], + _sfd.people_targeted: ["People targeted:"], + _sfd.people_reached: ["People reached:"], _sfd.misc: [], } @@ -186,11 +194,7 @@ class SectorFields: _sfd.people_reached: return_all, } -SF_EXTRACTORS = { - '{}__{}'.format(s_key, sf_key): _SF_EXTRACTORS.get(sf_key) - for s_key in S_KEYS - for sf_key in SF_KEYS -} +SF_EXTRACTORS = {"{}__{}".format(s_key, sf_key): _SF_EXTRACTORS.get(sf_key) for s_key in S_KEYS for sf_key in SF_KEYS} def get_sector_misc_keys(fields): diff --git a/api/scrapers/extractor/__init__.py b/api/scrapers/extractor/__init__.py index e98e7c24d..e7c137da0 100644 --- a/api/scrapers/extractor/__init__.py +++ b/api/scrapers/extractor/__init__.py @@ -1,2 +1,2 @@ -from .sector_field import SectorFieldExtractor # noqa from .meta_field import MetaFieldExtractor # noqa +from .sector_field import SectorFieldExtractor # noqa diff --git a/api/scrapers/extractor/meta_field.py b/api/scrapers/extractor/meta_field.py index e47aecad7..7a6c37333 100644 --- a/api/scrapers/extractor/meta_field.py +++ b/api/scrapers/extractor/meta_field.py @@ -1,14 +1,15 @@ import re + from fuzzywuzzy import fuzz -from api.scrapers.config import ( - M_KEYS, + +from api.scrapers.config import ( # get_sector_misc_keys, M_EXTRACTORS, + M_KEYS, get_meta_misc_keys, - # get_sector_misc_keys, ) -class MetaFieldExtractor(): +class MetaFieldExtractor: def __init__(self, texts, fields): self.texts = texts self.fields = fields @@ -24,17 +25,17 @@ def find_block_for_key(self, text, index, field=None, misc=False): if search: start, end = search.span() if misc: - _field = '{}_misc'.format(key) + _field = "{}_misc".format(key) else: _field = field if self.field_meta.get(_field): continue self.field_meta[_field] = { - 'text_index': index, - 'text': text, - 'start_index': start, - 'end_index': end, - 'score': 100, + "text_index": index, + "text": text, + "start_index": start, + "end_index": end, + "score": 100, } if not self.text_meta.get(index): self.text_meta[index] = [] @@ -51,23 +52,23 @@ def _search(key): search_text = key.split() search_text_n = len(search_text) for index in range(0, len(texts) - search_text_n): - real_text = texts[index:index+search_text_n] + real_text = texts[index : index + search_text_n] new_ratio = fuzz.partial_ratio(real_text, search_text) if not new_ratio > ratio: continue try: - search = re.search(' '.join(real_text), text) + search = re.search(" ".join(real_text), text) if search: start, end = search.span() ratio = new_ratio field_meta = { - 'text_index': text_index, - 'text': text, - 'start_index': start, - 'end_index': end, - 'score': ratio, - 'real_text': real_text, - 'search_text': search_text, + "text_index": text_index, + "text": text, + "start_index": start, + "end_index": end, + "score": ratio, + "real_text": real_text, + "search_text": search_text, } except re.error: pass @@ -75,7 +76,7 @@ def _search(key): def search(key, field_meta): new_field_meta = _search(key) - if new_field_meta['score'] > field_meta.get('score', 0): + if new_field_meta["score"] > field_meta.get("score", 0): field_meta = new_field_meta return field_meta @@ -86,11 +87,11 @@ def search(key, field_meta): field_meta = {} for key in keys: field_meta = search(key, field_meta) - if field_meta.get('score') > 70: + if field_meta.get("score") > 70: self.field_meta[field] = field_meta - if not self.text_meta.get(field_meta['text_index']): - self.text_meta[field_meta['text_index']] = [] - self.text_meta[field_meta['text_index']].append(field) + if not self.text_meta.get(field_meta["text_index"]): + self.text_meta[field_meta["text_index"]] = [] + self.text_meta[field_meta["text_index"]].append(field) def pre_processing(self): for index, text in enumerate(self.texts): @@ -100,15 +101,14 @@ def pre_processing(self): self.fuzzy_find_remainig_key() def text_pre_processing(self, field, meta): - text_block = meta['text'] - text_index = meta['text_index'] - end_index = meta['end_index'] + text_block = meta["text"] + text_index = meta["text_index"] + end_index = meta["end_index"] if len(self.text_meta[text_index]) > 1: near_end_index = 10000 for field in self.text_meta[text_index]: - field_start_index = self.field_meta[field]['start_index'] - if (field_start_index > end_index) and\ - (field_start_index < near_end_index): + field_start_index = self.field_meta[field]["start_index"] + if (field_start_index > end_index) and (field_start_index < near_end_index): near_end_index = field_start_index text_block = text_block[:near_end_index] text = text_block[end_index:].strip() @@ -119,14 +119,14 @@ def extract(self): extractor = M_EXTRACTORS.get(field) if extractor: self.extracted[field] = { - 'value': extractor(self.text_pre_processing(field, meta)), - 'score': meta['score']/100, + "value": extractor(self.text_pre_processing(field, meta)), + "score": meta["score"] / 100, } def get_extracted_without_score(self): extracted = {} for field in self.extracted.keys(): - extracted[field] = self.extracted[field]['value'] + extracted[field] = self.extracted[field]["value"] return extracted def extract_fields(self): diff --git a/api/scrapers/extractor/sector_field.py b/api/scrapers/extractor/sector_field.py index 4e4aff579..eeb3cd994 100644 --- a/api/scrapers/extractor/sector_field.py +++ b/api/scrapers/extractor/sector_field.py @@ -1,15 +1,12 @@ import re + from fuzzywuzzy import fuzz + # from common import json_preety -from api.scrapers.config import ( - S_KEYS, - SF_KEYS, - # M_EXTRACTORS, - # get_sector_misc_keys, -) +from api.scrapers.config import S_KEYS, SF_KEYS # M_EXTRACTORS,; get_sector_misc_keys, -class SectorFieldExtractor(): +class SectorFieldExtractor: def __init__(self, texts, sectors, fields): self.texts = texts self.sectors = sectors @@ -29,20 +26,17 @@ def pre_processing(self): for sector_key in S_KEYS[sector]: for field in SF_KEYS: for field_key in SF_KEYS[field]: - search = re.search( - '{} {}'.format(sector_key, field_key), - text, re.IGNORECASE - ) + search = re.search("{} {}".format(sector_key, field_key), text, re.IGNORECASE) if search: start, end = search.span() if not self.sector_meta.get(sector_key): self.sector_meta[sector] = { - 'text_index': index, - 'text': text, - 'start_index': start, - 'end_index': end, - 'field': field, - 'score': 100, + "text_index": index, + "text": text, + "start_index": start, + "end_index": end, + "field": field, + "score": 100, } break if self.sector_meta.get(sector_key): @@ -58,26 +52,26 @@ def _search(key): texts = text.split() for field in SF_KEYS: for field_key in SF_KEYS[field]: - search_text = '{} {}'.format(key, field_key).split() + search_text = "{} {}".format(key, field_key).split() search_text_n = len(search_text) for index in range(0, len(texts) - search_text_n): - real_text = texts[index:index+search_text_n] + real_text = texts[index : index + search_text_n] new_ratio = fuzz.partial_ratio(real_text, search_text) if not new_ratio > ratio: continue try: - search = re.search(' '.join(real_text), text) + search = re.search(" ".join(real_text), text) if search: start, end = search.span() ratio = new_ratio sector_meta = { - 'text_index': text_index, - 'text': text, - 'start_index': start, - 'end_index': end, - 'score': ratio, - 'real_text': real_text, - 'search_text': search_text, + "text_index": text_index, + "text": text, + "start_index": start, + "end_index": end, + "score": ratio, + "real_text": real_text, + "search_text": search_text, } except re.error: pass @@ -85,7 +79,7 @@ def _search(key): def search(key, sector_meta): new_sector_meta = _search(key) - if new_sector_meta['score'] > sector_meta.get('score', 0): + if new_sector_meta["score"] > sector_meta.get("score", 0): sector_meta = new_sector_meta return sector_meta @@ -96,13 +90,13 @@ def search(key, sector_meta): sector_meta = {} for key in keys: sector_meta = search(key, sector_meta) - if sector_meta.get('score') > 90: + if sector_meta.get("score") > 90: self.sector_meta[sector] = sector_meta def post_processing(self): for sector, option in self.sector_meta.items(): - text = option['text'] - sector_score = option['score'] + text = option["text"] + sector_score = option["score"] if not self.field_meta.get(sector): self.field_meta[sector] = {} for field in SF_KEYS: @@ -112,11 +106,11 @@ def post_processing(self): start, end = search.span() if not self.field_meta.get(sector).get(field): self.field_meta[sector][field] = { - 'text': text, - 'start_index': start, - 'end_index': end, - 'score': 100, - 'sector_score': sector_score, + "text": text, + "start_index": start, + "end_index": end, + "score": 100, + "sector_score": sector_score, } break if not self.field_meta.get(sector, {}).get(field): @@ -127,47 +121,44 @@ def post_processing(self): search_text_n = len(search_text) texts = text.split() for index in range(0, len(texts) - search_text_n): - real_text = texts[index:index+search_text_n] + real_text = texts[index : index + search_text_n] new_ratio = fuzz.partial_ratio(real_text, search_text) if not new_ratio > ratio: continue try: - search = re.search(' '.join(real_text), text) + search = re.search(" ".join(real_text), text) if search: start, end = search.span() ratio = new_ratio field_meta = { - 'text': text, - 'start_index': start, - 'end_index': end, - 'score': new_ratio, - 'sector_score': sector_score, + "text": text, + "start_index": start, + "end_index": end, + "score": new_ratio, + "sector_score": sector_score, } except re.error: pass - if field_meta.get('score'): + if field_meta.get("score"): self.field_meta[sector][field] = field_meta def extract(self): for sector, fields in self.field_meta.items(): for field, option in fields.items(): near_end_index = 10000 - end_index = option['end_index'] + end_index = option["end_index"] for _field, _option in fields.items(): - field_start_index = _option['start_index'] - if (field_start_index > end_index) and\ - (field_start_index < near_end_index): + field_start_index = _option["start_index"] + if (field_start_index > end_index) and (field_start_index < near_end_index): near_end_index = field_start_index - text_block = option['text'][:near_end_index] + text_block = option["text"][:near_end_index] text = text_block[end_index:].strip() if not self.extracted.get(sector): self.extracted[sector] = {} if not self.extracted.get(sector).get(field): self.extracted[sector][field] = { - 'value': text, - 'score': '{} {}'.format( - option['sector_score']/100, option['score']/100 - ) + "value": text, + "score": "{} {}".format(option["sector_score"] / 100, option["score"] / 100), } def get_extracted_without_score(self): @@ -175,7 +166,7 @@ def get_extracted_without_score(self): for sector in self.extracted.keys(): extracted[sector] = {} for field in self.extracted[sector].keys(): - extracted[sector][field] = self.extracted[sector][field]['value'] + extracted[sector][field] = self.extracted[sector][field]["value"] return extracted def extract_fields(self): diff --git a/api/scrapers/strings.py b/api/scrapers/strings.py index 2543f35e7..28625146d 100644 --- a/api/scrapers/strings.py +++ b/api/scrapers/strings.py @@ -1,36 +1,36 @@ class Sectors: - people_targeted = 'peopleTargeted' - people_reached = 'peopleReached' - male = 'male' - female = 'female' - requirements = 'requirements' + people_targeted = "peopleTargeted" + people_reached = "peopleReached" + male = "male" + female = "female" + requirements = "requirements" class MetaFields: - operation_num = 'operationNumber' - appeal_num = 'appealNumber' - glide_num = 'glideNumber' - date_of_issue = 'dateOfIssue' - appeal_launch_date = 'appealLaunchDate' - expected_time_frame = 'expectedTimeFrame' - expected_end_date = 'expectedEndDate' - category_allocated = 'categoryAllocated' - dref_allocated = 'drefAllocated' - total_num_of_people_affected = 'totalNumberOfPeopleAffected' - num_of_people_to_be_assisted = 'numOfPeopleToBeAssisted' - epoa_update_num = 'epoaUpdateNumber' - time_frame_covered_by_update = 'timeFrameCoveredByUpdate' - operation_start_date = 'operationStartDate' - operation_end_date = 'operationEndDate' - operation_timeframe = 'operationTimeframe' - date_of_disaster = 'dateOfDisaster' - operation_budget = 'operationBudget' - num_of_people_being_affected = 'numOfPeopleBeingAffected' - num_of_people_being_assisted = 'numOfPeopleBeingAssisted' - num_of_partner_ns_involved = 'numOfPartnerNsInvolved' - num_of_other_partner_involved = 'numOfOtherPartnerInvolved' - current_appeal_budget = 'currentAppealBudget' - appeal_launch = 'appealLaunch' - appeal_end = 'appealEnd' - revision_number = 'revisionNumber' - extended_months = 'extendedMonths' + operation_num = "operationNumber" + appeal_num = "appealNumber" + glide_num = "glideNumber" + date_of_issue = "dateOfIssue" + appeal_launch_date = "appealLaunchDate" + expected_time_frame = "expectedTimeFrame" + expected_end_date = "expectedEndDate" + category_allocated = "categoryAllocated" + dref_allocated = "drefAllocated" + total_num_of_people_affected = "totalNumberOfPeopleAffected" + num_of_people_to_be_assisted = "numOfPeopleToBeAssisted" + epoa_update_num = "epoaUpdateNumber" + time_frame_covered_by_update = "timeFrameCoveredByUpdate" + operation_start_date = "operationStartDate" + operation_end_date = "operationEndDate" + operation_timeframe = "operationTimeframe" + date_of_disaster = "dateOfDisaster" + operation_budget = "operationBudget" + num_of_people_being_affected = "numOfPeopleBeingAffected" + num_of_people_being_assisted = "numOfPeopleBeingAssisted" + num_of_partner_ns_involved = "numOfPartnerNsInvolved" + num_of_other_partner_involved = "numOfOtherPartnerInvolved" + current_appeal_budget = "currentAppealBudget" + appeal_launch = "appealLaunch" + appeal_end = "appealEnd" + revision_number = "revisionNumber" + extended_months = "extendedMonths" diff --git a/api/search_indexes.py b/api/search_indexes.py index 2c2357ce2..7166740d6 100644 --- a/api/search_indexes.py +++ b/api/search_indexes.py @@ -1,18 +1,11 @@ from haystack import indexes -from api.models import ( - Country, - Event, - Appeal, - FieldReport, - Region, - District, -) +from api.models import Appeal, Country, District, Event, FieldReport, Region class RegionIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='get_name_display') + name = indexes.EdgeNgramField(model_attr="get_name_display") def get_model(self): return Region @@ -23,11 +16,11 @@ def index_queryset(self, using=None): class CountryIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='name') - society_name = indexes.CharField(model_attr='society_name', null=True) - independent = indexes.BooleanField(model_attr='independent', null=True) - is_deprecated = indexes.BooleanField(model_attr='is_deprecated', null=True) - iso3 = indexes.CharField(model_attr='iso3', null=True) + name = indexes.EdgeNgramField(model_attr="name") + society_name = indexes.CharField(model_attr="society_name", null=True) + independent = indexes.BooleanField(model_attr="independent", null=True) + is_deprecated = indexes.BooleanField(model_attr="is_deprecated", null=True) + iso3 = indexes.CharField(model_attr="iso3", null=True) def get_model(self): return Country @@ -38,10 +31,10 @@ def index_queryset(self, using=None): class DistrictIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='name') - country_name = indexes.CharField(model_attr='country__name', null=True) - country_id = indexes.CharField(model_attr='country__id', null=True) - iso3 = indexes.CharField(model_attr='country__iso3', null=True) + name = indexes.EdgeNgramField(model_attr="name") + country_name = indexes.CharField(model_attr="country__name", null=True) + country_id = indexes.CharField(model_attr="country__id", null=True) + iso3 = indexes.CharField(model_attr="country__iso3", null=True) def get_model(self): return District @@ -52,17 +45,17 @@ def index_queryset(self, using=None): class AppealIndex(indexes.Indexable, indexes.SearchIndex): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='name') - visibility = indexes.CharField(model_attr='event__visibility', null=True) - appeal_type = indexes.CharField(model_attr='get_atype_display') - code = indexes.CharField(model_attr='code') - event_name = indexes.CharField(model_attr='event__name', null=True) - country_name = indexes.CharField(model_attr='country__name') - start_date = indexes.DateTimeField(model_attr='start_date', null=True) - country_id = indexes.IntegerField(model_attr='country__id') - event_id = indexes.IntegerField(model_attr='event__id', null=True) - iso3 = indexes.CharField(model_attr='country__iso3', null=True) - visibility = indexes.CharField(model_attr='event__get_visibility_display', null=True) + name = indexes.EdgeNgramField(model_attr="name") + visibility = indexes.CharField(model_attr="event__visibility", null=True) + appeal_type = indexes.CharField(model_attr="get_atype_display") + code = indexes.CharField(model_attr="code") + event_name = indexes.CharField(model_attr="event__name", null=True) + country_name = indexes.CharField(model_attr="country__name") + start_date = indexes.DateTimeField(model_attr="start_date", null=True) + country_id = indexes.IntegerField(model_attr="country__id") + event_id = indexes.IntegerField(model_attr="event__id", null=True) + iso3 = indexes.CharField(model_attr="country__iso3", null=True) + visibility = indexes.CharField(model_attr="event__get_visibility_display", null=True) def get_model(self): return Appeal @@ -73,19 +66,23 @@ def index_queryset(self, using=None): class EmergenciesIndex(indexes.Indexable, indexes.SearchIndex): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='name') - visibility = indexes.CharField(model_attr='visibility', null=True) - countries = indexes.MultiValueField(null=True,) - disaster_start_date = indexes.DateTimeField(model_attr='disaster_start_date', null=True) - amount_requested = indexes.CharField(model_attr='appeals__amount_requested', null=True) - amount_funded = indexes.CharField(model_attr='appeals__amount_funded', null=True) - disaster_type = indexes.CharField(model_attr='dtype__name', null=True) - countries_id = indexes.MultiValueField(null=True,) - appeal_type = indexes.CharField(model_attr='appeals__get_atype_display', null=True) - crisis_categorization = indexes.CharField(model_attr='get_ifrc_severity_level_display', null=True) + name = indexes.EdgeNgramField(model_attr="name") + visibility = indexes.CharField(model_attr="visibility", null=True) + countries = indexes.MultiValueField( + null=True, + ) + disaster_start_date = indexes.DateTimeField(model_attr="disaster_start_date", null=True) + amount_requested = indexes.CharField(model_attr="appeals__amount_requested", null=True) + amount_funded = indexes.CharField(model_attr="appeals__amount_funded", null=True) + disaster_type = indexes.CharField(model_attr="dtype__name", null=True) + countries_id = indexes.MultiValueField( + null=True, + ) + appeal_type = indexes.CharField(model_attr="appeals__get_atype_display", null=True) + crisis_categorization = indexes.CharField(model_attr="get_ifrc_severity_level_display", null=True) iso3 = indexes.MultiValueField(null=True) - visibility = indexes.CharField(model_attr='get_visibility_display', null=True) - severity_level = indexes.IntegerField(model_attr='ifrc_severity_level', null=True) + visibility = indexes.CharField(model_attr="get_visibility_display", null=True) + severity_level = indexes.IntegerField(model_attr="ifrc_severity_level", null=True) def get_model(self): return Event @@ -105,15 +102,17 @@ def index_queryset(self, using=None): class FieldReportIndex(indexes.Indexable, indexes.SearchIndex): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='summary') - visibility = indexes.CharField(model_attr='visibility', null=True) + name = indexes.EdgeNgramField(model_attr="summary") + visibility = indexes.CharField(model_attr="visibility", null=True) countries = indexes.MultiValueField(null=True) - event_name = indexes.CharField(model_attr='event__name', null=True) - created_at = indexes.DateTimeField(model_attr='created_at') - event_id = indexes.IntegerField(model_attr='event__id', null=True) - countries_id = indexes.MultiValueField(null=True,) + event_name = indexes.CharField(model_attr="event__name", null=True) + created_at = indexes.DateTimeField(model_attr="created_at") + event_id = indexes.IntegerField(model_attr="event__id", null=True) + countries_id = indexes.MultiValueField( + null=True, + ) iso3 = indexes.MultiValueField(null=True) - visibility = indexes.CharField(model_attr='get_visibility_display', null=True) + visibility = indexes.CharField(model_attr="get_visibility_display", null=True) def get_model(self): return FieldReport diff --git a/api/serializers.py b/api/serializers.py index 8f27d4ce7..1f6c66eeb 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -1,84 +1,78 @@ import json -from typing import Union, List +from typing import List, Union -from django.utils import timezone -from rest_framework import serializers -from django.contrib.auth.models import User from django.conf import settings -from django.db import transaction -from django.db import models -from django.contrib.auth.models import Permission +from django.contrib.auth.models import Permission, User +from django.db import models, transaction +from django.utils import timezone from django.utils.translation import get_language as django_get_language +from drf_spectacular.utils import extend_schema_field +from rest_framework import serializers -from main.utils import get_merged_items_by_fields -from lang.serializers import ModelSerializer +# from api.utils import pdf_exporter +from api.tasks import generate_url +from deployments.models import EmergencyProject, Personnel +from dref.models import Dref, DrefFinalReport, DrefOperationalUpdate from lang.models import String -from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin +from lang.serializers import ModelSerializer +from local_units.models import DelegationOffice +from local_units.serializers import MiniDelegationOfficeSerializer from main.translation import TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME +from main.utils import get_merged_items_by_fields +from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin +from notifications.models import Subscription +from per.models import Overview +from utils.file_check import validate_file_type + from .event_sources import SOURCES from .models import ( - DisasterType, - ExternalPartner, - SupportedActivity, - Region, - Country, - District, + Action, + ActionsTaken, Admin2, + Appeal, + AppealDocument, + AppealHistory, + Country, + CountryCapacityStrengthening, + CountryContact, + CountryDirectory, + CountryICRCPresence, + CountryKeyDocument, CountryKeyFigure, - RegionKeyFigure, - CountrySnippet, - RegionSnippet, - RegionEmergencySnippet, - RegionProfileSnippet, - RegionPreparednessSnippet, CountryLink, - RegionLink, - CountryContact, - RegionContact, - KeyFigure, - Snippet, - EventContact, + CountryOfFieldReportToReview, + CountryOrganizationalCapacity, + CountrySnippet, + CountrySupportingPartner, + DisasterType, + District, Event, - SituationReportType, - SituationReport, + EventContact, EventFeaturedDocument, EventLink, - Appeal, - AppealDocument, - AppealHistory, - Profile, - FieldReportContact, - ActionsTaken, - Action, - Source, + Export, + ExternalPartner, FieldReport, + FieldReportContact, + KeyFigure, MainContact, - CountryOfFieldReportToReview, - Export, - UserCountry, - CountryDirectory, - CountryKeyDocument, NSDInitiatives, - CountryCapacityStrengthening, - CountryOrganizationalCapacity, - CountrySupportingPartner, - CountryICRCPresence, -) -from notifications.models import Subscription -from deployments.models import EmergencyProject, Personnel -from per.models import Overview - -# from api.utils import pdf_exporter -from api.tasks import generate_url -from drf_spectacular.utils import extend_schema_field -from dref.models import( - Dref, - DrefOperationalUpdate, - DrefFinalReport + Profile, + Region, + RegionContact, + RegionEmergencySnippet, + RegionKeyFigure, + RegionLink, + RegionPreparednessSnippet, + RegionProfileSnippet, + RegionSnippet, + SituationReport, + SituationReportType, + Snippet, + Source, + SupportedActivity, + UserCountry, ) -from local_units.serializers import MiniDelegationOfficeSerializer -from local_units.models import DelegationOffice -from utils.file_check import validate_file_type class GeoSerializerMixin: @@ -248,7 +242,7 @@ class Meta: "city_code", "phone", "website", - "emails" + "emails", ) @@ -339,17 +333,7 @@ class DistrictSerializer(ModelSerializer): class Meta: model = District - fields = ( - "name", - "code", - "country", - "id", - "is_deprecated", - "bbox", - "centroid", - "wb_population", - "wb_year" - ) + fields = ("name", "code", "country", "id", "is_deprecated", "bbox", "centroid", "wb_population", "wb_year") @staticmethod def get_bbox(district) -> dict: @@ -433,7 +417,7 @@ class Meta: "centroid", "is_deprecated", "wb_population", - "wb_year" + "wb_year", ) @@ -612,7 +596,7 @@ class RegionRelationSerializer(ModelSerializer): country_cluster_count = serializers.SerializerMethodField() country_plan_count = serializers.IntegerField(read_only=True) bbox = serializers.SerializerMethodField() - #centroid = serializers.SerializerMethodField() + # centroid = serializers.SerializerMethodField() class Meta: model = Region @@ -646,15 +630,11 @@ def get_country_cluster_count(obj) -> int: def get_bbox(region) -> dict: return region.bbox and json.loads(region.bbox.geojson) + class CountryDirectorySerializer(ModelSerializer): class Meta: model = CountryDirectory - fields = ( - "id", - "first_name", - "last_name", - "position" - ) + fields = ("id", "first_name", "last_name", "position") class NSDInitiativesSerialzier(ModelSerializer): @@ -664,20 +644,17 @@ class Meta: class CountryCapacityStrengtheningSerializer(ModelSerializer): - assessment_type_display = serializers.CharField( - read_only=True, - source='get_assessment_type_display' - ) + assessment_type_display = serializers.CharField(read_only=True, source="get_assessment_type_display") class Meta: model = CountryCapacityStrengthening - fields = '__all__' + fields = "__all__" class CountryOrganizationalCapacitySerializer(ModelSerializer): class Meta: model = CountryOrganizationalCapacity - fields = '__all__' + fields = "__all__" class CountryICRCPresenceSerializer(ModelSerializer): @@ -692,16 +669,12 @@ class CountryRelationSerializer(ModelSerializer): has_country_plan = serializers.BooleanField(read_only=True) bbox = serializers.SerializerMethodField() centroid = serializers.SerializerMethodField() - regions_details = RegionSerializer(source='region', read_only=True) - directory = CountryDirectorySerializer(source='countrydirectory_set', read_only=True, many=True) - initiatives = NSDInitiativesSerialzier(source='nsdinitiatives_set', read_only=True, many=True) - capacity = CountryCapacityStrengtheningSerializer( - source='countrycapacitystrengthening_set', - read_only=True, - many=True - ) + regions_details = RegionSerializer(source="region", read_only=True) + directory = CountryDirectorySerializer(source="countrydirectory_set", read_only=True, many=True) + initiatives = NSDInitiativesSerialzier(source="nsdinitiatives_set", read_only=True, many=True) + capacity = CountryCapacityStrengtheningSerializer(source="countrycapacitystrengthening_set", read_only=True, many=True) organizational_capacity = CountryOrganizationalCapacitySerializer( - source='countryorganizationalcapacity', + source="countryorganizationalcapacity", read_only=True, ) icrc_presence = CountryICRCPresenceSerializer( @@ -775,26 +748,27 @@ def get_bbox(country) -> dict: def get_centroid(country) -> dict: return country.centroid and json.loads(country.centroid.geojson) - @extend_schema_field( - MiniDelegationOfficeSerializer(many=True) - ) + @extend_schema_field(MiniDelegationOfficeSerializer(many=True)) def get_country_delegation(self, country): - return DelegationOffice.objects.filter( - country=country, - ).values( - 'hod_first_name', - 'hod_last_name', - 'hod_mobile_number', - 'hod_email', - 'city', - 'address', - ).annotate( - dotype_name=models.F('dotype__name') - ).distinct() + return ( + DelegationOffice.objects.filter( + country=country, + ) + .values( + "hod_first_name", + "hod_last_name", + "hod_mobile_number", + "hod_email", + "city", + "address", + ) + .annotate(dotype_name=models.F("dotype__name")) + .distinct() + ) class CountryKeyDocumentSerializer(ModelSerializer): - country_details = MiniCountrySerializer(source='country', read_only=True) + country_details = MiniCountrySerializer(source="country", read_only=True) class Meta: model = CountryKeyDocument @@ -1001,7 +975,7 @@ class Meta: "emergency_response_contact_email", "countries_for_preview", "start_date", - "dtype_details" + "dtype_details", ) @@ -1627,7 +1601,16 @@ class ProfileSerializer(ModelSerializer): class Meta: model = Profile - fields = ("country", "org", "org_type", "city", "department", "position", "phone_number", "accepted_montandon_license_terms") + fields = ( + "country", + "org", + "org_type", + "city", + "department", + "position", + "phone_number", + "accepted_montandon_license_terms", + ) class MiniSubscriptionSerializer(ModelSerializer): @@ -1709,12 +1692,7 @@ class UserCountryCountrySerializer(serializers.ModelSerializer): class Meta: model = Country - fields = ( - "id", - "name", - "region", - "region_details" - ) + fields = ("id", "name", "region", "region_details") class UserCountrySerializer(serializers.ModelSerializer): @@ -1745,7 +1723,7 @@ class Meta: "is_dref_coordinator_for_regions", "is_per_admin_for_regions", "is_per_admin_for_countries", - "user_countries_regions" + "user_countries_regions", ) @staticmethod @@ -1775,10 +1753,9 @@ def get_lang_permissions(user) -> dict: @staticmethod def get_is_dref_coordinator_for_regions(user) -> List[int]: data = list( - Permission.objects.filter( - codename__startswith="dref_region_admin_", - group__user=user - ).values_list("codename", flat=True) + Permission.objects.filter(codename__startswith="dref_region_admin_", group__user=user).values_list( + "codename", flat=True + ) ) regions = [] for d in data: @@ -1788,20 +1765,18 @@ def get_is_dref_coordinator_for_regions(user) -> List[int]: @staticmethod def get_is_per_admin_for_regions(user) -> List[int]: - permission_codenames = Permission.objects.filter( - codename__startswith="per_region_admin", - group__user=user - ).values_list("codename", flat=True) + permission_codenames = Permission.objects.filter(codename__startswith="per_region_admin", group__user=user).values_list( + "codename", flat=True + ) regions = {int(code.split("_")[-1]) for code in permission_codenames} return list(regions) @staticmethod def get_is_per_admin_for_countries(user) -> List[int]: - permission_codenames = Permission.objects.filter( - codename__startswith="per_country_admin", - group__user=user - ).values_list("codename", flat=True) + permission_codenames = Permission.objects.filter(codename__startswith="per_country_admin", group__user=user).values_list( + "codename", flat=True + ) countries = {int(code.split("_")[-1]) for code in permission_codenames} return list(countries) @@ -2010,13 +1985,7 @@ class Meta: class FieldReportMiniUserSerializer(ModelSerializer): class Meta: model = User - fields = ( - "id", - "username", - "email", - "first_name", - "last_name" - ) + fields = ("id", "username", "email", "first_name", "last_name") class FieldReportSerializer( @@ -2335,11 +2304,13 @@ class AggregateByDtypeSerializer(serializers.Serializer): dtype = serializers.IntegerField() count = serializers.IntegerField() + class CountryKeyFigureInputSerializer(serializers.Serializer): start_date = serializers.DateField(required=False) end_date = serializers.DateField(required=False) dtype = serializers.IntegerField(required=False) + class CountryKeyClimateInputSerializer(serializers.Serializer): year = serializers.IntegerField(required=False) @@ -2381,15 +2352,7 @@ class ExportSerializer(serializers.ModelSerializer): class Meta: model = Export fields = "__all__" - read_only_fields = ( - "pdf_file", - "token", - "requested_at", - "completed_at", - "status", - "requested_by", - "url" - ) + read_only_fields = ("pdf_file", "token", "requested_at", "completed_at", "status", "requested_by", "url") def validate_pdf_file(self, pdf_file): validate_file_type(pdf_file) @@ -2400,39 +2363,29 @@ def create(self, validated_data): export_type = validated_data.get("export_type") country_id = validated_data.get("per_country") if export_type == Export.ExportType.DREF: - title = Dref.objects.filter( - id=export_id - ).first().title + title = Dref.objects.filter(id=export_id).first().title elif export_type == Export.ExportType.OPS_UPDATE: - title = DrefOperationalUpdate.objects.filter( - id=export_id - ).first().title + title = DrefOperationalUpdate.objects.filter(id=export_id).first().title elif export_type == Export.ExportType.FINAL_REPORT: - title = DrefFinalReport.objects.filter( - id=export_id - ).first().title + title = DrefFinalReport.objects.filter(id=export_id).first().title elif export_type == Export.ExportType.PER: - overview = Overview.objects.filter( - id=export_id - ).first() - title = f'{overview.country.name}-preparedness-{overview.get_phase_display()}' + overview = Overview.objects.filter(id=export_id).first() + title = f"{overview.country.name}-preparedness-{overview.get_phase_display()}" else: title = "Export" - user = self.context['request'].user + user = self.context["request"].user if export_type == Export.ExportType.PER: - validated_data['url'] = f'https://{settings.FRONTEND_URL}/countries/{country_id}/{export_type}/{export_id}/export/' + validated_data["url"] = f"https://{settings.FRONTEND_URL}/countries/{country_id}/{export_type}/{export_id}/export/" else: - validated_data['url'] = f'https://{settings.FRONTEND_URL}/{export_type}/{export_id}/export/' - validated_data['requested_by'] = user + validated_data["url"] = f"https://{settings.FRONTEND_URL}/{export_type}/{export_id}/export/" + validated_data["requested_by"] = user export = super().create(validated_data) if export.url: export.status = Export.ExportStatus.PENDING export.requested_at = timezone.now() - export.save(update_fields=['status', 'requested_at']) + export.save(update_fields=["status", "requested_at"]) - transaction.on_commit( - lambda: generate_url.delay(export.url, export.id, user.id, title) - ) + transaction.on_commit(lambda: generate_url.delay(export.url, export.id, user.id, title)) return export def update(self, instance, validated_data): @@ -2440,10 +2393,7 @@ def update(self, instance, validated_data): class CountrySupportingPartnerSerializer(serializers.ModelSerializer): - supporting_type_display = serializers.CharField( - source="get_supporting_type_display", - read_only=True - ) + supporting_type_display = serializers.CharField(source="get_supporting_type_display", read_only=True) class Meta: model = CountrySupportingPartner diff --git a/api/snapshots/snap_test_views.py b/api/snapshots/snap_test_views.py index 006cdb72c..4f1e4fc52 100644 --- a/api/snapshots/snap_test_views.py +++ b/api/snapshots/snap_test_views.py @@ -4,169 +4,152 @@ from snapshottest import Snapshot - snapshots = Snapshot() -snapshots['EventSnaphostTest::test_event_featured_document_api 1'] = { - 'active_deployments': 0, - 'appeals': [ - ], - 'auto_generated': True, - 'contacts': [ - ], - 'countries': [ - ], - 'countries_for_preview': [ - ], - 'created_at': '2008-01-01T00:00:00.123456Z', - 'disaster_start_date': '2015-04-21T17:45:23.476445Z', - 'districts': [ - ], - 'dtype': 1, - 'emergency_response_contact_email': None, - 'featured_documents': [ +snapshots["EventSnaphostTest::test_event_featured_document_api 1"] = { + "active_deployments": 0, + "appeals": [], + "auto_generated": True, + "contacts": [], + "countries": [], + "countries_for_preview": [], + "created_at": "2008-01-01T00:00:00.123456Z", + "disaster_start_date": "2015-04-21T17:45:23.476445Z", + "districts": [], + "dtype": 1, + "emergency_response_contact_email": None, + "featured_documents": [ { - 'description': 'event-featured-document-description-LEkHOUNXyjRpcKShmbCuAjASnAGXNEVUdTiHnJuQEHyulDIvIwRXURPZSqNEmprJtotXsTnSTFuEwJYUrshKRIyzwXZjscsTfwCP', - 'file': None, - 'id': 1, - 'thumbnail': None, - 'title': 'event-featured-document-title-ZEHDjMGiuNukzNVtLvGGIFTKtEbxvRhALtYUSObMEqPYXLKoUd' + "description": "event-featured-document-description-LEkHOUNXyjRpcKShmbCuAjASnAGXNEVUdTiHnJuQEHyulDIvIwRXURPZSqNEmprJtotXsTnSTFuEwJYUrshKRIyzwXZjscsTfwCP", + "file": None, + "id": 1, + "thumbnail": None, + "title": "event-featured-document-title-ZEHDjMGiuNukzNVtLvGGIFTKtEbxvRhALtYUSObMEqPYXLKoUd", }, { - 'description': 'event-featured-document-description-PKoIVUclAlczYFlVscatKMgvsDPIHFiGDrmZhvkUDPqTlaVvYsKRWmlNOzBGufzQgliEupaqypCWrvtLUKaqPxSpdQhDtkzRGTXt', - 'file': None, - 'id': 2, - 'thumbnail': None, - 'title': 'event-featured-document-title-qVEnmIrJSrigNVLppdQHoOodgAvTEgRXiaJkAPEEPmWsusPdXf' + "description": "event-featured-document-description-PKoIVUclAlczYFlVscatKMgvsDPIHFiGDrmZhvkUDPqTlaVvYsKRWmlNOzBGufzQgliEupaqypCWrvtLUKaqPxSpdQhDtkzRGTXt", + "file": None, + "id": 2, + "thumbnail": None, + "title": "event-featured-document-title-qVEnmIrJSrigNVLppdQHoOodgAvTEgRXiaJkAPEEPmWsusPdXf", }, { - 'description': 'event-featured-document-description-hRnTLFfGCZdDiGADKdJDRZtUbzqaVnLecBwSeIdeEcsAlXiXPUPAxyCyyfRQIiPwhlIzHiUoaWbtDRUIBIyopDwjrmUWhcZQANXb', - 'file': None, - 'id': 3, - 'thumbnail': None, - 'title': 'event-featured-document-title-ShOsxNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHC' + "description": "event-featured-document-description-hRnTLFfGCZdDiGADKdJDRZtUbzqaVnLecBwSeIdeEcsAlXiXPUPAxyCyyfRQIiPwhlIzHiUoaWbtDRUIBIyopDwjrmUWhcZQANXb", + "file": None, + "id": 3, + "thumbnail": None, + "title": "event-featured-document-title-ShOsxNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHC", }, { - 'description': 'event-featured-document-description-BJFdwPQyYHuSAAjtylWIEpotTjZDdJAAJHiypqnvPfCxfIUmdryRMMcemZWLUQJnEnvtanmVhVWEpSMTnzpJuXsyDIPwtqxGFDgZ', - 'file': None, - 'id': 4, - 'thumbnail': None, - 'title': 'event-featured-document-title-pnegMcCMRTdpVczCoInWXdiGsoUKuKMXRuptjQHoAtrdJLVlOR' + "description": "event-featured-document-description-BJFdwPQyYHuSAAjtylWIEpotTjZDdJAAJHiypqnvPfCxfIUmdryRMMcemZWLUQJnEnvtanmVhVWEpSMTnzpJuXsyDIPwtqxGFDgZ", + "file": None, + "id": 4, + "thumbnail": None, + "title": "event-featured-document-title-pnegMcCMRTdpVczCoInWXdiGsoUKuKMXRuptjQHoAtrdJLVlOR", }, { - 'description': 'event-featured-document-description-lIPdHceQdWaAiOoeTjanGDxdNOQNEQFbaIJAabHUrIsbGSRBZlggHjpmNHqwrYzfxzDKpSotRfPPWcfzyyJEdOaSkfFBPYvKgHco', - 'file': None, - 'id': 5, - 'thumbnail': None, - 'title': 'event-featured-document-title-UEWunxuAcKoVjbqJLLUAsjmvoyKpFJPRvqWFUPVFDkUYwkiUIF' - } - ], - 'field_reports': [ - ], - 'glide': 'xJKxDZJiNfetzTUEHA', - 'hide_attached_field_reports': True, - 'hide_field_report_map': True, - 'id': 2, - 'ifrc_severity_level': 0, - 'ifrc_severity_level_display': 'Yellow', - 'is_featured': False, - 'is_featured_region': True, - 'key_figures': [ - ], - 'links': [ + "description": "event-featured-document-description-lIPdHceQdWaAiOoeTjanGDxdNOQNEQFbaIJAabHUrIsbGSRBZlggHjpmNHqwrYzfxzDKpSotRfPPWcfzyyJEdOaSkfFBPYvKgHco", + "file": None, + "id": 5, + "thumbnail": None, + "title": "event-featured-document-title-UEWunxuAcKoVjbqJLLUAsjmvoyKpFJPRvqWFUPVFDkUYwkiUIF", + }, ], - 'name': 'event-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf', - 'num_affected': 0, - 'parent_event': 1, - 'response_activity_count': 0, - 'slug': 'ygwwmqzcudihyfjsonxkmtecqoxsfogyrdoxkxwnqrsrpemoki', - 'summary': 'NMGyDLJYVcCZKPmuMEGjdCgZvTfGPlcpTCCHHNkxxsyAXvRMdYOPvevgJRysqUQMjvfLQjwtPSQziMTftJyPYviQSVRHfPQBGxbxtlnvXFmoijesYgGXIVHcQvXNiMyjklSXNZkUCcAxRUpCNsWVYCoIptZYEmxRKCDXsXyGHAkmZMiqdPExJgTHhsfWkrCGjBfoCwbAdzGxpyfxobugTPvYjicsESiWTECNafbqnjJUMHBhXspthdpAOYNDehFMIbOGKpTjsBaNwpKAlQQfHxeHIGYGJbyEcOyxqVbwYewpUQOgXLVWvicwIvPlXRDSEOlZieTXDcsmcYmcutGzIEqcWPmswXdPvrhZxBzVCyvlFSFxZHrZfUBfBMlIsugfuQstCMTBkSCwCcUwNBrOYdeQOzxGZVRkbjMRYCciepXPxxyKcMjRCxxCWeKiHxzuPrphbVlFHyJhqXqTCnNsSFmhieClTCfZRuQwTeJIstkTTSOlYxGo', - 'tab_one_title': 'cPXKqPnXKANObFOIsPtEpZZRztDeSdkCAEDnvMjuTuUwziWxGJ', - 'tab_three_title': 'gBiqUxWzxczdKJmxJseyGCWJrNRNhigzxYvJxWjmMGzGccciTv', - 'tab_two_title': 'gupDhrCpjgdsyNApkuKUumWkFGDFtFbfzGDpnLwddsFMPREsIa', - 'translation_module_original_language': 'en', - 'updated_at': '2008-01-01T00:00:00.123456Z', - 'visibility': 3 + "field_reports": [], + "glide": "xJKxDZJiNfetzTUEHA", + "hide_attached_field_reports": True, + "hide_field_report_map": True, + "id": 2, + "ifrc_severity_level": 0, + "ifrc_severity_level_display": "Yellow", + "is_featured": False, + "is_featured_region": True, + "key_figures": [], + "links": [], + "name": "event-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf", + "num_affected": 0, + "parent_event": 1, + "response_activity_count": 0, + "slug": "ygwwmqzcudihyfjsonxkmtecqoxsfogyrdoxkxwnqrsrpemoki", + "summary": "NMGyDLJYVcCZKPmuMEGjdCgZvTfGPlcpTCCHHNkxxsyAXvRMdYOPvevgJRysqUQMjvfLQjwtPSQziMTftJyPYviQSVRHfPQBGxbxtlnvXFmoijesYgGXIVHcQvXNiMyjklSXNZkUCcAxRUpCNsWVYCoIptZYEmxRKCDXsXyGHAkmZMiqdPExJgTHhsfWkrCGjBfoCwbAdzGxpyfxobugTPvYjicsESiWTECNafbqnjJUMHBhXspthdpAOYNDehFMIbOGKpTjsBaNwpKAlQQfHxeHIGYGJbyEcOyxqVbwYewpUQOgXLVWvicwIvPlXRDSEOlZieTXDcsmcYmcutGzIEqcWPmswXdPvrhZxBzVCyvlFSFxZHrZfUBfBMlIsugfuQstCMTBkSCwCcUwNBrOYdeQOzxGZVRkbjMRYCciepXPxxyKcMjRCxxCWeKiHxzuPrphbVlFHyJhqXqTCnNsSFmhieClTCfZRuQwTeJIstkTTSOlYxGo", + "tab_one_title": "cPXKqPnXKANObFOIsPtEpZZRztDeSdkCAEDnvMjuTuUwziWxGJ", + "tab_three_title": "gBiqUxWzxczdKJmxJseyGCWJrNRNhigzxYvJxWjmMGzGccciTv", + "tab_two_title": "gupDhrCpjgdsyNApkuKUumWkFGDFtFbfzGDpnLwddsFMPREsIa", + "translation_module_original_language": "en", + "updated_at": "2008-01-01T00:00:00.123456Z", + "visibility": 3, } -snapshots['EventSnaphostTest::test_event_link_api 1'] = { - 'active_deployments': 0, - 'appeals': [ - ], - 'auto_generated': True, - 'contacts': [ - ], - 'countries': [ - ], - 'countries_for_preview': [ - ], - 'created_at': '2008-01-01T00:00:00.123456Z', - 'disaster_start_date': '2015-04-21T17:45:23.476445Z', - 'districts': [ - ], - 'dtype': 1, - 'emergency_response_contact_email': None, - 'featured_documents': [ - ], - 'field_reports': [ - ], - 'glide': 'xJKxDZJiNfetzTUEHA', - 'hide_attached_field_reports': True, - 'hide_field_report_map': True, - 'id': 2, - 'ifrc_severity_level': 0, - 'ifrc_severity_level_display': 'Yellow', - 'is_featured': False, - 'is_featured_region': True, - 'key_figures': [ - ], - 'links': [ +snapshots["EventSnaphostTest::test_event_link_api 1"] = { + "active_deployments": 0, + "appeals": [], + "auto_generated": True, + "contacts": [], + "countries": [], + "countries_for_preview": [], + "created_at": "2008-01-01T00:00:00.123456Z", + "disaster_start_date": "2015-04-21T17:45:23.476445Z", + "districts": [], + "dtype": 1, + "emergency_response_contact_email": None, + "featured_documents": [], + "field_reports": [], + "glide": "xJKxDZJiNfetzTUEHA", + "hide_attached_field_reports": True, + "hide_field_report_map": True, + "id": 2, + "ifrc_severity_level": 0, + "ifrc_severity_level_display": "Yellow", + "is_featured": False, + "is_featured_region": True, + "key_figures": [], + "links": [ { - 'description': 'event-link-description-LEkHOUNXyjRpcKShmbCuAjASnAGXNEVUdTiHnJuQEHyulDIvIwRXURPZSqNEmprJtotXsTnSTFuEwJYUrshKRIyzwXZjscsTfwCP', - 'id': 1, - 'title': 'event-link-title-ZEHDjMGiuNukzNVtLvGGIFTKtEbxvRhALtYUSObMEqPYXLKoUd', - 'translation_module_original_language': 'en', - 'url': '' + "description": "event-link-description-LEkHOUNXyjRpcKShmbCuAjASnAGXNEVUdTiHnJuQEHyulDIvIwRXURPZSqNEmprJtotXsTnSTFuEwJYUrshKRIyzwXZjscsTfwCP", + "id": 1, + "title": "event-link-title-ZEHDjMGiuNukzNVtLvGGIFTKtEbxvRhALtYUSObMEqPYXLKoUd", + "translation_module_original_language": "en", + "url": "", }, { - 'description': 'event-link-description-PKoIVUclAlczYFlVscatKMgvsDPIHFiGDrmZhvkUDPqTlaVvYsKRWmlNOzBGufzQgliEupaqypCWrvtLUKaqPxSpdQhDtkzRGTXt', - 'id': 2, - 'title': 'event-link-title-qVEnmIrJSrigNVLppdQHoOodgAvTEgRXiaJkAPEEPmWsusPdXf', - 'translation_module_original_language': 'en', - 'url': '' + "description": "event-link-description-PKoIVUclAlczYFlVscatKMgvsDPIHFiGDrmZhvkUDPqTlaVvYsKRWmlNOzBGufzQgliEupaqypCWrvtLUKaqPxSpdQhDtkzRGTXt", + "id": 2, + "title": "event-link-title-qVEnmIrJSrigNVLppdQHoOodgAvTEgRXiaJkAPEEPmWsusPdXf", + "translation_module_original_language": "en", + "url": "", }, { - 'description': 'event-link-description-hRnTLFfGCZdDiGADKdJDRZtUbzqaVnLecBwSeIdeEcsAlXiXPUPAxyCyyfRQIiPwhlIzHiUoaWbtDRUIBIyopDwjrmUWhcZQANXb', - 'id': 3, - 'title': 'event-link-title-ShOsxNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHC', - 'translation_module_original_language': 'en', - 'url': '' + "description": "event-link-description-hRnTLFfGCZdDiGADKdJDRZtUbzqaVnLecBwSeIdeEcsAlXiXPUPAxyCyyfRQIiPwhlIzHiUoaWbtDRUIBIyopDwjrmUWhcZQANXb", + "id": 3, + "title": "event-link-title-ShOsxNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHC", + "translation_module_original_language": "en", + "url": "", }, { - 'description': 'event-link-description-BJFdwPQyYHuSAAjtylWIEpotTjZDdJAAJHiypqnvPfCxfIUmdryRMMcemZWLUQJnEnvtanmVhVWEpSMTnzpJuXsyDIPwtqxGFDgZ', - 'id': 4, - 'title': 'event-link-title-pnegMcCMRTdpVczCoInWXdiGsoUKuKMXRuptjQHoAtrdJLVlOR', - 'translation_module_original_language': 'en', - 'url': '' + "description": "event-link-description-BJFdwPQyYHuSAAjtylWIEpotTjZDdJAAJHiypqnvPfCxfIUmdryRMMcemZWLUQJnEnvtanmVhVWEpSMTnzpJuXsyDIPwtqxGFDgZ", + "id": 4, + "title": "event-link-title-pnegMcCMRTdpVczCoInWXdiGsoUKuKMXRuptjQHoAtrdJLVlOR", + "translation_module_original_language": "en", + "url": "", }, { - 'description': 'event-link-description-lIPdHceQdWaAiOoeTjanGDxdNOQNEQFbaIJAabHUrIsbGSRBZlggHjpmNHqwrYzfxzDKpSotRfPPWcfzyyJEdOaSkfFBPYvKgHco', - 'id': 5, - 'title': 'event-link-title-UEWunxuAcKoVjbqJLLUAsjmvoyKpFJPRvqWFUPVFDkUYwkiUIF', - 'translation_module_original_language': 'en', - 'url': '' - } + "description": "event-link-description-lIPdHceQdWaAiOoeTjanGDxdNOQNEQFbaIJAabHUrIsbGSRBZlggHjpmNHqwrYzfxzDKpSotRfPPWcfzyyJEdOaSkfFBPYvKgHco", + "id": 5, + "title": "event-link-title-UEWunxuAcKoVjbqJLLUAsjmvoyKpFJPRvqWFUPVFDkUYwkiUIF", + "translation_module_original_language": "en", + "url": "", + }, ], - 'name': 'event-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf', - 'num_affected': 0, - 'parent_event': 1, - 'response_activity_count': 0, - 'slug': 'ygwwmqzcudihyfjsonxkmtecqoxsfogyrdoxkxwnqrsrpemoki', - 'summary': 'NMGyDLJYVcCZKPmuMEGjdCgZvTfGPlcpTCCHHNkxxsyAXvRMdYOPvevgJRysqUQMjvfLQjwtPSQziMTftJyPYviQSVRHfPQBGxbxtlnvXFmoijesYgGXIVHcQvXNiMyjklSXNZkUCcAxRUpCNsWVYCoIptZYEmxRKCDXsXyGHAkmZMiqdPExJgTHhsfWkrCGjBfoCwbAdzGxpyfxobugTPvYjicsESiWTECNafbqnjJUMHBhXspthdpAOYNDehFMIbOGKpTjsBaNwpKAlQQfHxeHIGYGJbyEcOyxqVbwYewpUQOgXLVWvicwIvPlXRDSEOlZieTXDcsmcYmcutGzIEqcWPmswXdPvrhZxBzVCyvlFSFxZHrZfUBfBMlIsugfuQstCMTBkSCwCcUwNBrOYdeQOzxGZVRkbjMRYCciepXPxxyKcMjRCxxCWeKiHxzuPrphbVlFHyJhqXqTCnNsSFmhieClTCfZRuQwTeJIstkTTSOlYxGo', - 'tab_one_title': 'cPXKqPnXKANObFOIsPtEpZZRztDeSdkCAEDnvMjuTuUwziWxGJ', - 'tab_three_title': 'gBiqUxWzxczdKJmxJseyGCWJrNRNhigzxYvJxWjmMGzGccciTv', - 'tab_two_title': 'gupDhrCpjgdsyNApkuKUumWkFGDFtFbfzGDpnLwddsFMPREsIa', - 'translation_module_original_language': 'en', - 'updated_at': '2008-01-01T00:00:00.123456Z', - 'visibility': 3 + "name": "event-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf", + "num_affected": 0, + "parent_event": 1, + "response_activity_count": 0, + "slug": "ygwwmqzcudihyfjsonxkmtecqoxsfogyrdoxkxwnqrsrpemoki", + "summary": "NMGyDLJYVcCZKPmuMEGjdCgZvTfGPlcpTCCHHNkxxsyAXvRMdYOPvevgJRysqUQMjvfLQjwtPSQziMTftJyPYviQSVRHfPQBGxbxtlnvXFmoijesYgGXIVHcQvXNiMyjklSXNZkUCcAxRUpCNsWVYCoIptZYEmxRKCDXsXyGHAkmZMiqdPExJgTHhsfWkrCGjBfoCwbAdzGxpyfxobugTPvYjicsESiWTECNafbqnjJUMHBhXspthdpAOYNDehFMIbOGKpTjsBaNwpKAlQQfHxeHIGYGJbyEcOyxqVbwYewpUQOgXLVWvicwIvPlXRDSEOlZieTXDcsmcYmcutGzIEqcWPmswXdPvrhZxBzVCyvlFSFxZHrZfUBfBMlIsugfuQstCMTBkSCwCcUwNBrOYdeQOzxGZVRkbjMRYCciepXPxxyKcMjRCxxCWeKiHxzuPrphbVlFHyJhqXqTCnNsSFmhieClTCfZRuQwTeJIstkTTSOlYxGo", + "tab_one_title": "cPXKqPnXKANObFOIsPtEpZZRztDeSdkCAEDnvMjuTuUwziWxGJ", + "tab_three_title": "gBiqUxWzxczdKJmxJseyGCWJrNRNhigzxYvJxWjmMGzGccciTv", + "tab_two_title": "gupDhrCpjgdsyNApkuKUumWkFGDFtFbfzGDpnLwddsFMPREsIa", + "translation_module_original_language": "en", + "updated_at": "2008-01-01T00:00:00.123456Z", + "visibility": 3, } diff --git a/api/storage.py b/api/storage.py index 8f2e1aed7..8dbd668a0 100644 --- a/api/storage.py +++ b/api/storage.py @@ -1,12 +1,11 @@ -import mimetypes import datetime +import mimetypes from azure.common import AzureMissingResourceHttpError from azure.storage.blob import BlockBlobService from azure.storage.blob.models import ContentSettings - -from django.core.files.storage import Storage from django.conf import settings +from django.core.files.storage import Storage from django.utils.deconstruct import deconstructible @@ -24,11 +23,11 @@ class AzureStorage(Storage): def __init__( self, - account_name=settings.AZURE_STORAGE['ACCOUNT_NAME'], - account_key=settings.AZURE_STORAGE['ACCOUNT_KEY'], - container=settings.AZURE_STORAGE['CONTAINER'], - use_ssl=settings.AZURE_STORAGE['USE_SSL'], - cdn_host=settings.AZURE_STORAGE['CDN_HOST'], + account_name=settings.AZURE_STORAGE["ACCOUNT_NAME"], + account_key=settings.AZURE_STORAGE["ACCOUNT_KEY"], + container=settings.AZURE_STORAGE["CONTAINER"], + use_ssl=settings.AZURE_STORAGE["USE_SSL"], + cdn_host=settings.AZURE_STORAGE["CDN_HOST"], ): self.account_name = account_name self.account_key = account_key @@ -42,36 +41,28 @@ def __getstate__(self): account_key=self.account_key, container=self.container, cdn_host=self.cdn_host, - use_ssl=self.use_ssl + use_ssl=self.use_ssl, ) def _get_service(self): - if not hasattr(self, '_blob_service'): + if not hasattr(self, "_blob_service"): self._blob_service = BlockBlobService( - account_name=self.account_name, - account_key=self.account_key, - protocol='https' if self.use_ssl else 'http' + account_name=self.account_name, account_key=self.account_key, protocol="https" if self.use_ssl else "http" ) return self._blob_service def _get_properties(self, name): - return self._get_service().get_blob_properties( - container_name=self.container, - blob_name=name - ) + return self._get_service().get_blob_properties(container_name=self.container, blob_name=name) - def _open(self, name, mode='rb'): + def _open(self, name, mode="rb"): """ Return the AzureStorageFile. """ from django.core.files.base import ContentFile - contents = self._get_service().get_blob_to_bytes( - container_name=self.container, - blob_name=name - ) + contents = self._get_service().get_blob_to_bytes(container_name=self.container, blob_name=name) return ContentFile(contents.content) @@ -85,16 +76,12 @@ def _save(self, name, content): content_type = None - if hasattr(content.file, 'content_type'): + if hasattr(content.file, "content_type"): content_type = content.file.content_type else: content_type = mimetypes.guess_type(name)[0] - cache_control = self.get_cache_control( - self.container, - name, - content_type - ) + cache_control = self.get_cache_control(self.container, name, content_type) self._get_service().create_blob_from_stream( container_name=self.container, @@ -118,8 +105,8 @@ def listdir(self, path): files = [] - if path and not path.endswith('/'): - path = '%s/' % path + if path and not path.endswith("/"): + path = "%s/" % path path_len = len(path) @@ -151,7 +138,7 @@ def delete(self, name): """ try: - print('in delete', self.container, name) + print("in delete", self.container, name) self._get_service().delete_blob(self.container, name) except AzureMissingResourceHttpError: pass @@ -173,7 +160,7 @@ def size(self, name): try: properties = self._get_properties(name) - return int(properties['content-length']) + return int(properties["content-length"]) except AzureMissingResourceHttpError: pass @@ -183,20 +170,14 @@ def url(self, name): be accessed. """ - blob_url_args = { - 'container_name': self.container, - 'blob_name': name, - 'protocol': 'https' - } + blob_url_args = {"container_name": self.container, "blob_name": name, "protocol": "https"} if self.cdn_host: # The account name should be built into the cdn hostname - blob_url_args['account_name'] = '' - blob_url_args['host_base'] = self.cdn_host + blob_url_args["account_name"] = "" + blob_url_args["host_base"] = self.cdn_host - return self._get_service().make_blob_url( - **blob_url_args - ) + return self._get_service().make_blob_url(**blob_url_args) def modified_time(self, name): """ @@ -206,10 +187,7 @@ def modified_time(self, name): try: properties = self._get_properties(name) - return datetime.datetime.strptime( - properties['last-modified'], - '%a, %d %b %Y %H:%M:%S %Z' - ) + return datetime.datetime.strptime(properties["last-modified"], "%a, %d %b %Y %H:%M:%S %Z") except AzureMissingResourceHttpError: pass diff --git a/api/t_est_cache.py b/api/t_est_cache.py index c9ba4ddb6..2a572374a 100644 --- a/api/t_est_cache.py +++ b/api/t_est_cache.py @@ -1,125 +1,121 @@ +from django.contrib.auth.models import AnonymousUser, User from django.test import override_settings -from django.contrib.auth.models import User, AnonymousUser +from api import models from main.settings import env from main.test_case import APITestCase -from api import models FAKE_REDIS_CACHE = { - 'default': { - 'BACKEND': 'django_redis.cache.RedisCache', - 'LOCATION': env('CACHE_TEST_REDIS_URL'), - 'OPTIONS': { - 'CLIENT_CLASS': 'django_redis.client.DefaultClient', - } + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": env("CACHE_TEST_REDIS_URL"), + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + }, } } class CacheForUserMiddlewareTest(APITestCase): - fixtures = ['DisasterTypes', 'Actions'] + fixtures = ["DisasterTypes", "Actions"] @override_settings(CACHES=FAKE_REDIS_CACHE) def test_caches_for_user(self): - user = User.objects.create(username='jo') + user = User.objects.create(username="jo") region = models.Region.objects.create(name=1) - country1 = models.Country.objects.create(name='abc', region=region) - country2 = models.Country.objects.create(name='xyz') + country1 = models.Country.objects.create(name="abc", region=region) + country2 = models.Country.objects.create(name="xyz") body = { - 'countries': [country1.id, country2.id], - 'dtype': 7, - 'summary': 'test', - 'description': 'this is a test description', - 'bulletin': '3', - 'num_assisted': 100, - 'visibility': models.VisibilityChoices.PUBLIC, - 'sources': [ - {'stype': 'Government', 'spec': 'A source'}, - {'stype': 'Other', 'spec': 'Another source'}, + "countries": [country1.id, country2.id], + "dtype": 7, + "summary": "test", + "description": "this is a test description", + "bulletin": "3", + "num_assisted": 100, + "visibility": models.VisibilityChoices.PUBLIC, + "sources": [ + {"stype": "Government", "spec": "A source"}, + {"stype": "Other", "spec": "Another source"}, ], - 'actions_taken': [ - {'organization': 'NTLS', 'summary': 'actions taken', 'actions': ['37', '30', '39']}, + "actions_taken": [ + {"organization": "NTLS", "summary": "actions taken", "actions": ["37", "30", "39"]}, ], - 'dref': '2', - 'appeal': '1', - 'contacts': [ - {'ctype': 'Originator', 'name': 'jo', 'title': 'head', 'email': '123'} - ], - 'user': user.id, + "dref": "2", + "appeal": "1", + "contacts": [{"ctype": "Originator", "name": "jo", "title": "head", "email": "123"}], + "user": user.id, } self.client.force_authenticate(user=user) with self.capture_on_commit_callbacks(execute=True): - self.client.post('/api/v2/create_field_report/', body, format='json').json() + self.client.post("/api/v2/create_field_report/", body, format="json").json() - response = self.client.get('/api/v2/field_report/', HTTP_ACCEPT_LANGUAGE='en') + response = self.client.get("/api/v2/field_report/", HTTP_ACCEPT_LANGUAGE="en") response_json = response.json() self.assert_200(response) - self.assertEquals(response_json['count'], 1) + self.assertEquals(response_json["count"], 1) # Create a new object with self.capture_on_commit_callbacks(execute=True): - self.client.post('/api/v2/create_field_report/', body, format='json').json() + self.client.post("/api/v2/create_field_report/", body, format="json").json() # The result should be cached, the user only sees one object - response = self.client.get('/api/v2/field_report/', HTTP_ACCEPT_LANGUAGE='en') + response = self.client.get("/api/v2/field_report/", HTTP_ACCEPT_LANGUAGE="en") response_json = response.json() self.assert_200(response) - self.assertEquals(response_json['count'], 1) + self.assertEquals(response_json["count"], 1) # A different user, accessing for the first time should see both items - user2 = User.objects.create(username='john') + user2 = User.objects.create(username="john") self.client.force_authenticate(user=user2) - response = self.client.get('/api/v2/field_report/', HTTP_ACCEPT_LANGUAGE='en') + response = self.client.get("/api/v2/field_report/", HTTP_ACCEPT_LANGUAGE="en") response_json = response.json() self.assert_200(response) - self.assertEquals(response_json['count'], 2) + self.assertEquals(response_json["count"], 2) @override_settings(CACHES=FAKE_REDIS_CACHE) def test_caches_for_anonymous_user(self): - user = User.objects.create(username='jo') + user = User.objects.create(username="jo") region = models.Region.objects.create(name=1) - country1 = models.Country.objects.create(name='abc', region=region) - country2 = models.Country.objects.create(name='xyz') + country1 = models.Country.objects.create(name="abc", region=region) + country2 = models.Country.objects.create(name="xyz") body = { - 'countries': [country1.id, country2.id], - 'dtype': 7, - 'summary': 'test', - 'description': 'this is a test description', - 'bulletin': '3', - 'num_assisted': 100, - 'visibility': models.VisibilityChoices.PUBLIC, - 'sources': [ - {'stype': 'Government', 'spec': 'A source'}, - {'stype': 'Other', 'spec': 'Another source'}, - ], - 'actions_taken': [ - {'organization': 'NTLS', 'summary': 'actions taken', 'actions': ['37', '30', '39']}, + "countries": [country1.id, country2.id], + "dtype": 7, + "summary": "test", + "description": "this is a test description", + "bulletin": "3", + "num_assisted": 100, + "visibility": models.VisibilityChoices.PUBLIC, + "sources": [ + {"stype": "Government", "spec": "A source"}, + {"stype": "Other", "spec": "Another source"}, ], - 'dref': '2', - 'appeal': '1', - 'contacts': [ - {'ctype': 'Originator', 'name': 'jo', 'title': 'head', 'email': '123'} + "actions_taken": [ + {"organization": "NTLS", "summary": "actions taken", "actions": ["37", "30", "39"]}, ], - 'user': user.id, + "dref": "2", + "appeal": "1", + "contacts": [{"ctype": "Originator", "name": "jo", "title": "head", "email": "123"}], + "user": user.id, } self.client.force_authenticate(user=user) with self.capture_on_commit_callbacks(execute=True): - self.client.post('/api/v2/create_field_report/', body, format='json').json() + self.client.post("/api/v2/create_field_report/", body, format="json").json() self.client.force_authenticate(user=AnonymousUser()) - response = self.client.get('/api/v2/field_report/', HTTP_ACCEPT_LANGUAGE='en') + response = self.client.get("/api/v2/field_report/", HTTP_ACCEPT_LANGUAGE="en") response_json = response.json() self.assert_200(response) - self.assertEquals(response_json['count'], 1) + self.assertEquals(response_json["count"], 1) # Create a new object self.client.force_authenticate(user=user) with self.capture_on_commit_callbacks(execute=True): - self.client.post('/api/v2/create_field_report/', body, format='json').json() + self.client.post("/api/v2/create_field_report/", body, format="json").json() # The result should be cached, the user only sees one object self.client.force_authenticate(user=AnonymousUser()) - response = self.client.get('/api/v2/field_report/', HTTP_ACCEPT_LANGUAGE='en') + response = self.client.get("/api/v2/field_report/", HTTP_ACCEPT_LANGUAGE="en") response_json = response.json() self.assert_200(response) - self.assertEquals(response_json['count'], 1) + self.assertEquals(response_json["count"], 1) diff --git a/api/tasks.py b/api/tasks.py index caabf75d6..70010362b 100644 --- a/api/tasks.py +++ b/api/tasks.py @@ -1,20 +1,20 @@ -from datetime import datetime -import time +import json import pathlib import tempfile -import json +import time +from datetime import datetime from celery import shared_task -from playwright.sync_api import sync_playwright - +from django.conf import settings +from django.contrib.auth.models import User from django.core.files.base import ContentFile from django.utils import timezone -from django.contrib.auth.models import User -from django.conf import settings +from playwright.sync_api import sync_playwright +from rest_framework.authtoken.models import Token from api.models import Export + from .logger import logger -from rest_framework.authtoken.models import Token def build_storage_state(tmp_dir, user, token): diff --git a/api/test_models.py b/api/test_models.py index 3999d5e3c..f63d3355c 100644 --- a/api/test_models.py +++ b/api/test_models.py @@ -1,18 +1,19 @@ -from django.test import TestCase +from unittest.mock import patch + from django.contrib.auth.models import User +from django.test import TestCase from rest_framework.test import APITestCase -from main.mock import erp_request_side_effect_mock -from unittest.mock import patch import api.models as models from api.factories import country as countryFactory from api.factories import event as eventFactory from api.factories import field_report as fieldReportFactory +from main.mock import erp_request_side_effect_mock class DisasterTypeTest(TestCase): - fixtures = ['DisasterTypes'] + fixtures = ["DisasterTypes"] def test_disaster_type_data(self): objs = models.DisasterType.objects.all() @@ -21,30 +22,30 @@ def test_disaster_type_data(self): class EventTest(TestCase): - fixtures = ['DisasterTypes'] + fixtures = ["DisasterTypes"] def setUp(self): dtype = models.DisasterType.objects.get(pk=1) - models.Event.objects.create(name='disaster1', summary='test disaster', dtype=dtype) - event = models.Event.objects.create(name='disaster2', summary='another test disaster', dtype=dtype) - models.KeyFigure.objects.create(event=event, number=7, deck='things', source='website') - models.Snippet.objects.create(event=event, snippet='this is a snippet') + models.Event.objects.create(name="disaster1", summary="test disaster", dtype=dtype) + event = models.Event.objects.create(name="disaster2", summary="another test disaster", dtype=dtype) + models.KeyFigure.objects.create(event=event, number=7, deck="things", source="website") + models.Snippet.objects.create(event=event, snippet="this is a snippet") def test_disaster_create(self): - obj1 = models.Event.objects.get(name='disaster1') - obj2 = models.Event.objects.get(name='disaster2') - self.assertEqual(obj1.summary, 'test disaster') - self.assertEqual(obj2.summary, 'another test disaster') + obj1 = models.Event.objects.get(name="disaster1") + obj2 = models.Event.objects.get(name="disaster2") + self.assertEqual(obj1.summary, "test disaster") + self.assertEqual(obj2.summary, "another test disaster") keyfig = obj2.key_figures.all() - self.assertEqual(keyfig[0].deck, 'things') - self.assertEqual(keyfig[0].number, '7') + self.assertEqual(keyfig[0].deck, "things") + self.assertEqual(keyfig[0].number, "7") snippet = obj2.snippets.all() - self.assertEqual(snippet[0].snippet, 'this is a snippet') + self.assertEqual(snippet[0].snippet, "this is a snippet") class CountryTest(TestCase): - fixtures = ['Regions', 'Countries'] + fixtures = ["Regions", "Countries"] def test_country_data(self): regions = models.Region.objects.all() @@ -55,73 +56,75 @@ def test_country_data(self): class ProfileTest(TestCase): def setUp(self): - user = User.objects.create(username='username', first_name='pat', last_name='smith', password='password') - user.profile.org = 'org' + user = User.objects.create(username="username", first_name="pat", last_name="smith", password="password") + user.profile.org = "org" user.profile.save() def test_profile_create(self): - profile = models.Profile.objects.get(user__username='username') - self.assertEqual(profile.org, 'org') + profile = models.Profile.objects.get(user__username="username") + self.assertEqual(profile.org, "org") class AppealTest(APITestCase): def setUp(self): # An appeal with needs_confirmation=True should not return the event in the API response. - event = models.Event.objects.create(name='associated event', summary='foo') - country = models.Country.objects.create(name='country') - models.Appeal.objects.create(aid='test1', name='appeal', atype=1, code='abc', needs_confirmation=True, event=event, country=country) + event = models.Event.objects.create(name="associated event", summary="foo") + country = models.Country.objects.create(name="country") + models.Appeal.objects.create( + aid="test1", name="appeal", atype=1, code="abc", needs_confirmation=True, event=event, country=country + ) def test_unconfirmed_event(self): - response = self.client.get('/api/v2/appeal/?code=abc') - response = dict(dict(response.data)['results'][0]) - self.assertIsNone(response['event']) - self.assertIsNotNone(response['country']) + response = self.client.get("/api/v2/appeal/?code=abc") + response = dict(dict(response.data)["results"][0]) + self.assertIsNone(response["event"]) + self.assertIsNotNone(response["country"]) class FieldReportTest(TestCase): - fixtures = ['DisasterTypes'] + fixtures = ["DisasterTypes"] def setUp(self): dtype = models.DisasterType.objects.get(pk=1) - event = models.Event.objects.create(name='disaster1', summary='test disaster', dtype=dtype) - country = models.Country.objects.create(name='country') - report = models.FieldReport.objects.create(rid='test1', event=event, dtype=dtype) + event = models.Event.objects.create(name="disaster1", summary="test disaster", dtype=dtype) + country = models.Country.objects.create(name="country") + report = models.FieldReport.objects.create(rid="test1", event=event, dtype=dtype) report.countries.add(country) def test_field_report_create(self): - event = models.Event.objects.get(name='disaster1') - country = models.Country.objects.get(name='country') + event = models.Event.objects.get(name="disaster1") + country = models.Country.objects.get(name="country") self.assertEqual(event.field_reports.all()[0].countries.all()[0], country) - obj = models.FieldReport.objects.get(rid='test1') - self.assertEqual(obj.rid, 'test1') + obj = models.FieldReport.objects.get(rid="test1") + self.assertEqual(obj.rid, "test1") self.assertEqual(obj.countries.all()[0], country) self.assertEqual(obj.event, event) self.assertIsNotNone(obj.report_date) - @patch('requests.post', side_effect=erp_request_side_effect_mock) + @patch("requests.post", side_effect=erp_request_side_effect_mock) def test_ERP_related_field_report(self, mocked_requests_post): dtype = models.DisasterType.objects.get(pk=1) country = countryFactory.CountryFactory() - event = eventFactory.EventFactory(name='disaster2', summary='test disaster 2', dtype=dtype) + event = eventFactory.EventFactory(name="disaster2", summary="test disaster 2", dtype=dtype) event.countries.set([country]) report = fieldReportFactory.FieldReportFactory.create( - rid='test2', + rid="test2", event=event, dtype=dtype, ns_request_assistance=True, ) - ERP = models.ERPGUID.objects.get(api_guid='FindThisGUID') + ERP = models.ERPGUID.objects.get(api_guid="FindThisGUID") self.assertEqual(ERP.field_report_id, report.id) self.assertEqual(mocked_requests_post.called, True) class ProfileTestDepartment(TestCase): def setUp(self): - user = User.objects.create(username='test1', password='12345678!') - user.profile.department = 'testdepartment' + user = User.objects.create(username="test1", password="12345678!") + user.profile.department = "testdepartment" user.save() def test_profile_create(self): - obj = models.Profile.objects.get(user__username='test1') - self.assertEqual(obj.department, 'testdepartment') + obj = models.Profile.objects.get(user__username="test1") + self.assertEqual(obj.department, "testdepartment") diff --git a/api/test_scrapers.py b/api/test_scrapers.py index 0c813b0f8..c9971f09d 100644 --- a/api/test_scrapers.py +++ b/api/test_scrapers.py @@ -1,28 +1,38 @@ import time from datetime import timedelta -from django.test import TestCase + from django.contrib.auth.models import User +from django.test import TestCase from django.utils.crypto import get_random_string -from notifications.models import Country, Region, DisasterType, RecordType, SubscriptionType, Subscription -from .models import Appeal, Event, FieldReport + from api.management.commands.index_and_notify import Command as Notify +from notifications.models import ( + Country, + DisasterType, + RecordType, + Region, + Subscription, + SubscriptionType, +) + +from .models import Appeal, Event, FieldReport def get_user(): user_number = get_random_string(8) - username = 'user%s' % user_number - email = '%s@email.com' % username - return User.objects.create(username=username, password='12345678', email=email) + username = "user%s" % user_number + email = "%s@email.com" % username + return User.objects.create(username=username, password="12345678", email=email) class FieldReportNotificationTest(TestCase): def setUp(self): region = Region.objects.create(name=1) - country1 = Country.objects.create(name='c1', region=region) - country2 = Country.objects.create(name='c2') - dtype = DisasterType.objects.create(name='d1', summary='foo') + country1 = Country.objects.create(name="c1", region=region) + country2 = Country.objects.create(name="c2") + dtype = DisasterType.objects.create(name="d1", summary="foo") report = FieldReport.objects.create( - rid='test', + rid="test", dtype=dtype, ) report.countries.add(country1) @@ -48,11 +58,11 @@ def test_new_record_subscription(self): def test_country_subscription(self): # Subscription to a country user = get_user() - c = Country.objects.get(name='c2') + c = Country.objects.get(name="c2") Subscription.objects.create( user=user, country=c, - lookup_id='c%s' % c.id, + lookup_id="c%s" % c.id, ) notify = Notify() emails = notify.gather_subscribers( @@ -70,7 +80,7 @@ def test_region_subscription(self): Subscription.objects.create( user=user, region=r, - lookup_id='r%s' % r.id, + lookup_id="r%s" % r.id, ) notify = Notify() emails = notify.gather_subscribers( @@ -84,11 +94,11 @@ def test_region_subscription(self): def test_dtype_subscription(self): # Subscription to a disaster type user = get_user() - d = DisasterType.objects.get(name='d1') + d = DisasterType.objects.get(name="d1") Subscription.objects.create( user=user, dtype=d, - lookup_id='d%s' % d.id, + lookup_id="d%s" % d.id, ) notify = Notify() emails = notify.gather_subscribers( @@ -103,27 +113,27 @@ def test_multiple_subscription(self): user1 = get_user() user2 = get_user() - d = DisasterType.objects.get(name='d1') + d = DisasterType.objects.get(name="d1") r = Region.objects.get(name=1) # User 1: Disaster type subscription Subscription.objects.create( user=user1, dtype=d, - lookup_id='d%s' % d.id, + lookup_id="d%s" % d.id, ) # User 1: Region subscription Subscription.objects.create( user=user1, region=r, - lookup_id='r%s' % r.id, + lookup_id="r%s" % r.id, ) # User 2: NEW_EMERGENCIES subscription (instead of the original New field report subscription) Subscription.objects.create( user=user2, - rtype=RecordType.NEW_EMERGENCIES, #FIELD_REPORT, + rtype=RecordType.NEW_EMERGENCIES, # FIELD_REPORT, stype=SubscriptionType.NEW, ) @@ -139,39 +149,21 @@ def test_multiple_subscription(self): class AppealNotificationTest(TestCase): def setUp(self): - region = Region.objects.create(name='1') - country1 = Country.objects.create(name='1', region=region) - country2 = Country.objects.create(name='2', region=region) - dtype = DisasterType.objects.create(name='1') + region = Region.objects.create(name="1") + country1 = Country.objects.create(name="1", region=region) + country2 = Country.objects.create(name="2", region=region) + dtype = DisasterType.objects.create(name="1") # Country 1 appeal - Appeal.objects.create( - aid='test1', - name='appeal', - atype=1, - code='1', - dtype=dtype, - country=country1 - ) + Appeal.objects.create(aid="test1", name="appeal", atype=1, code="1", dtype=dtype, country=country1) # Country 2 appeal - Appeal.objects.create( - aid='test2', - name='appeal', - atype=2, - code='2', - dtype=dtype, - country=country2 - ) + Appeal.objects.create(aid="test2", name="appeal", atype=2, code="2", dtype=dtype, country=country2) def test_region_subscription(self): user = get_user() - r = Region.objects.get(name='1') - Subscription.objects.create( - user=user, - region=r, - lookup_id='r%s' % r.id - ) + r = Region.objects.get(name="1") + Subscription.objects.create(user=user, region=r, lookup_id="r%s" % r.id) notify = Notify() emails = notify.gather_subscribers( Appeal.objects.filter(created_at__gte=notify.diff_5_minutes()), @@ -183,18 +175,10 @@ def test_region_subscription(self): def test_region_and_country_subscription(self): user = get_user() - r = Region.objects.get(name='1') - c = Country.objects.get(name='2') - Subscription.objects.create( - user=user, - region=r, - lookup_id='r%s' % r.id - ) - Subscription.objects.create( - user=user, - country=c, - lookup_id='c%s' % c.id - ) + r = Region.objects.get(name="1") + c = Country.objects.get(name="2") + Subscription.objects.create(user=user, region=r, lookup_id="r%s" % r.id) + Subscription.objects.create(user=user, country=c, lookup_id="c%s" % c.id) notify = Notify() emails = notify.gather_subscribers( Appeal.objects.filter(created_at__gte=notify.diff_5_minutes()), @@ -208,29 +192,17 @@ def test_region_and_country_subscription(self): class FilterJustCreatedTest(TestCase): def setUp(self): # create two appeals, modify one 2 seconds later. - region = Region.objects.create(name='1') - country1 = Country.objects.create(name='1', region=region) - country2 = Country.objects.create(name='2', region=region) - appeal1 = Appeal.objects.create( - aid='test1', - name='appeal', - atype=2, - code='1', - country=country1 - ) - appeal2 = Appeal.objects.create( - aid='test2', - name='appeal', - atype=2, - code='2', - country=country2 - ) + region = Region.objects.create(name="1") + country1 = Country.objects.create(name="1", region=region) + country2 = Country.objects.create(name="2", region=region) + appeal1 = Appeal.objects.create(aid="test1", name="appeal", atype=2, code="1", country=country1) + appeal2 = Appeal.objects.create(aid="test2", name="appeal", atype=2, code="2", country=country2) time.sleep(1) - appeal1.name = 'something new' + appeal1.name = "something new" appeal1.save() def test_filter_just_created(self): notify = Notify() filtered = notify.filter_just_created(Appeal.objects.filter(created_at__gte=notify.diff_5_minutes())) self.assertEqual(len(filtered), 1) - self.assertEqual(filtered[0].aid, 'test2') + self.assertEqual(filtered[0].aid, "test2") diff --git a/api/test_views.py b/api/test_views.py index e64474e8f..44b639a00 100644 --- a/api/test_views.py +++ b/api/test_views.py @@ -2,115 +2,112 @@ from django.contrib.auth.models import User -from main.test_case import APITestCase, SnapshotTestCase import api.models as models - from api.factories.event import ( - EventFactory, - EventFeaturedDocumentFactory, - EventLinkFactory, AppealFactory, AppealHistoryFactory, AppealType, + EventFactory, + EventFeaturedDocumentFactory, + EventLinkFactory, ) +from main.test_case import APITestCase, SnapshotTestCase class AuthTokenTest(APITestCase): def setUp(self): - user = User.objects.create(username='jo') - user.set_password('12345678') + user = User.objects.create(username="jo") + user.set_password("12345678") user.save() def test_get_auth(self): body = { - 'username': 'jo', - 'password': '12345678', + "username": "jo", + "password": "12345678", } - headers = {'CONTENT_TYPE': 'application/json'} - response = self.client.post('/get_auth_token', body, format='json', headers=headers).json() - self.assertIsNotNone(response.get('token')) - self.assertIsNotNone(response.get('expires')) + headers = {"CONTENT_TYPE": "application/json"} + response = self.client.post("/get_auth_token", body, format="json", headers=headers).json() + self.assertIsNotNone(response.get("token")) + self.assertIsNotNone(response.get("expires")) class EventSnaphostTest(SnapshotTestCase): def test_event_featured_document_api(self): event = EventFactory() EventFeaturedDocumentFactory.create_batch(5, event=event) - resp = self.client.get(f'/api/v2/event/{event.id}/') + resp = self.client.get(f"/api/v2/event/{event.id}/") self.assertEqual(resp.status_code, 200) self.assertMatchSnapshot(json.loads(resp.content)) def test_event_link_api(self): event = EventFactory() EventLinkFactory.create_batch(5, event=event) - resp = self.client.get(f'/api/v2/event/{event.id}/') + resp = self.client.get(f"/api/v2/event/{event.id}/") self.assertEqual(resp.status_code, 200) self.assertMatchSnapshot(json.loads(resp.content)) class SituationReportTypeTest(APITestCase): - fixtures = ['DisasterTypes'] + fixtures = ["DisasterTypes"] def test_sit_rep_types(self): - type1 = models.SituationReportType.objects.create(type='Lyric') - type2 = models.SituationReportType.objects.create(type='Epic') + type1 = models.SituationReportType.objects.create(type="Lyric") + type2 = models.SituationReportType.objects.create(type="Epic") dtype1 = models.DisasterType.objects.get(pk=1) - event1 = models.Event.objects.create(name='disaster1', summary='test disaster1', dtype=dtype1) + event1 = models.Event.objects.create(name="disaster1", summary="test disaster1", dtype=dtype1) - models.SituationReport.objects.create(name='test1', event=event1, type=type1, visibility=3) - models.SituationReport.objects.create(name='test2', event=event1, type=type2, visibility=3) - models.SituationReport.objects.create(name='test3', event=event1, type=type2, visibility=3) + models.SituationReport.objects.create(name="test1", event=event1, type=type1, visibility=3) + models.SituationReport.objects.create(name="test2", event=event1, type=type2, visibility=3) + models.SituationReport.objects.create(name="test3", event=event1, type=type2, visibility=3) # Filter by event - response = self.client.get('/api/v2/situation_report/?limit=100&event=%s' % event1.id) + response = self.client.get("/api/v2/situation_report/?limit=100&event=%s" % event1.id) self.assertEqual(response.status_code, 200) - count = response.json()['count'] + count = response.json()["count"] self.assertEqual(count, 3) # Filter by event and type - response = self.client.get('/api/v2/situation_report/?limit=100&event=%s&type=%s' % (event1.id, type2.id)) + response = self.client.get("/api/v2/situation_report/?limit=100&event=%s&type=%s" % (event1.id, type2.id)) self.assertEqual(response.status_code, 200) - count = response.json()['count'] + count = response.json()["count"] self.assertEqual(count, 2) class FieldReportTest(APITestCase): - fixtures = ['DisasterTypes', 'Actions'] + fixtures = ["DisasterTypes", "Actions"] def test_create_and_update(self): - user = User.objects.create(username='jo') + user = User.objects.create(username="jo") region = models.Region.objects.create(name=1) - country1 = models.Country.objects.create(name='abc', region=region) - country2 = models.Country.objects.create(name='xyz') + country1 = models.Country.objects.create(name="abc", region=region) + country2 = models.Country.objects.create(name="xyz") source1 = models.SourceType.objects.create(name="source1") source2 = models.SourceType.objects.create(name="source2") body = { - 'countries': [country1.id, country2.id], - 'dtype': 7, - 'summary': 'test', - 'description': 'this is a test description', - 'bulletin': '3', - 'num_assisted': 100, - 'visibility': models.VisibilityChoices.IFRC, - 'sources': [ - {'stype': source1.id, 'spec': 'A source'}, - {'stype': source2.id, 'spec': 'Another source'}, + "countries": [country1.id, country2.id], + "dtype": 7, + "summary": "test", + "description": "this is a test description", + "bulletin": "3", + "num_assisted": 100, + "visibility": models.VisibilityChoices.IFRC, + "sources": [ + {"stype": source1.id, "spec": "A source"}, + {"stype": source2.id, "spec": "Another source"}, ], - 'actions_taken': [ - {'organization': 'NTLS', 'summary': 'actions taken', 'actions': ['37', '30', '39']}, + "actions_taken": [ + {"organization": "NTLS", "summary": "actions taken", "actions": ["37", "30", "39"]}, ], - 'dref': '2', - 'appeal': '1', - 'contacts': [ - {'ctype': 'Originator', 'name': 'jo', 'title': 'head', 'email': '123'} - ], - 'user': user.id, + "dref": "2", + "appeal": "1", + "contacts": [{"ctype": "Originator", "name": "jo", "title": "head", "email": "123"}], + "user": user.id, } self.client.force_authenticate(user=user) - response = self.client.post('/api/v2/field-report/', body, format='json').json() - old_respone_id = response['id'] + response = self.client.post("/api/v2/field-report/", body, format="json").json() + old_respone_id = response["id"] created = models.FieldReport.objects.get(pk=old_respone_id) self.assertEqual(created.countries.count(), 2) @@ -119,8 +116,8 @@ def test_create_and_update(self): self.assertEqual(created.sources.count(), 2) source_types = list([source.stype.name for source in created.sources.all()]) - self.assertTrue('source1' in source_types) - self.assertTrue('source2' in source_types) + self.assertTrue("source1" in source_types) + self.assertTrue("source2" in source_types) self.assertEqual(created.actions_taken.count(), 1) actions = list([action.id for action in created.actions_taken.first().actions.all()]) @@ -131,12 +128,12 @@ def test_create_and_update(self): self.assertEqual(created.contacts.count(), 1) self.assertEqual(created.visibility, models.VisibilityChoices.IFRC) self.assertEqual(created.dtype.id, 7) - self.assertEqual(created.summary, 'test') + self.assertEqual(created.summary, "test") # Translated field test - self.assertEqual(created.summary_en, 'test') + self.assertEqual(created.summary_en, "test") # created an emergency automatically - self.assertEqual(created.event.name, 'test') + self.assertEqual(created.event.name, "test") # event_pk = created.event.id # body['countries'] = [country2.id] @@ -199,33 +196,33 @@ def test_create_and_update(self): class VisibilityTest(APITestCase): def test_country_snippet_visibility(self): - country = models.Country.objects.create(name='1') + country = models.Country.objects.create(name="1") # create membership and IFRC snippets models.CountrySnippet.objects.create(country=country, visibility=models.VisibilityChoices.MEMBERSHIP) models.CountrySnippet.objects.create(country=country, visibility=models.VisibilityChoices.IFRC) - response = self.client.get('/api/v2/country_snippet/').json() + response = self.client.get("/api/v2/country_snippet/").json() # no snippets available to anonymous user - self.assertEqual(response['count'], 0) + self.assertEqual(response["count"], 0) # perform the request with an authenticated user - user = User.objects.create(username='foo') + user = User.objects.create(username="foo") self.client.force_authenticate(user=user) - response = self.client.get('/api/v2/country_snippet/').json() + response = self.client.get("/api/v2/country_snippet/").json() # one snippets available to anonymous user - self.assertEqual(response['count'], 1) + self.assertEqual(response["count"], 1) # perform the request with an ifrc user - user2 = User.objects.create(username='bar') + user2 = User.objects.create(username="bar") user2.user_permissions.add(self.ifrc_permission) self.client.force_authenticate(user=user2) - response = self.client.get('/api/v2/country_snippet/').json() - self.assertEqual(response['count'], 2) + response = self.client.get("/api/v2/country_snippet/").json() + self.assertEqual(response["count"], 2) # perform the request with a superuser - super_user = User.objects.create_superuser(username='baz', email='foo@baz.com', password='12345678') + super_user = User.objects.create_superuser(username="baz", email="foo@baz.com", password="12345678") self.client.force_authenticate(user=super_user) - response = self.client.get('/api/v2/country_snippet/').json() - self.assertEqual(response['count'], 2) + response = self.client.get("/api/v2/country_snippet/").json() + self.assertEqual(response["count"], 2) self.client.force_authenticate(user=None) @@ -302,162 +299,121 @@ def test_action_api(self): NTLS = models.ActionOrg.NATIONAL_SOCIETY PNS = models.ActionOrg.FOREIGN_SOCIETY - models.Action.objects.create( - name='Test1', - field_report_types=[EVENT, EARLY_WARNING], - organizations=[ - NTLS, - PNS - ] - ) - models.Action.objects.create( - name='Test2', - field_report_types=[EARLY_WARNING], - organizations=[] - ) - response = self.client.get('/api/v2/action/').json() - self.assertEqual(response['count'], 2) - res1 = response['results'][0] - self.assertEqual(res1['name'], 'Test1') - self.assertEqual(res1['field_report_types'], [EVENT, EARLY_WARNING]) - self.assertEqual(res1['organizations'], [NTLS, PNS]) - res2 = response['results'][1] - self.assertEqual(res2['organizations'], []) - self.assertEqual(res2['field_report_types'], [EARLY_WARNING]) + models.Action.objects.create(name="Test1", field_report_types=[EVENT, EARLY_WARNING], organizations=[NTLS, PNS]) + models.Action.objects.create(name="Test2", field_report_types=[EARLY_WARNING], organizations=[]) + response = self.client.get("/api/v2/action/").json() + self.assertEqual(response["count"], 2) + res1 = response["results"][0] + self.assertEqual(res1["name"], "Test1") + self.assertEqual(res1["field_report_types"], [EVENT, EARLY_WARNING]) + self.assertEqual(res1["organizations"], [NTLS, PNS]) + res2 = response["results"][1] + self.assertEqual(res2["organizations"], []) + self.assertEqual(res2["field_report_types"], [EARLY_WARNING]) class HistoricalEventTest(APITestCase): - fixtures = ['DisasterTypes'] + fixtures = ["DisasterTypes"] def test_historical_events(self): region1 = models.Region.objects.create(name=1) region2 = models.Region.objects.create(name=2) - country1 = models.Country.objects.create(name='Nepal', iso3='NPL', region=region1) - country2 = models.Country.objects.create(name='India', iso3='IND', region=region2) + country1 = models.Country.objects.create(name="Nepal", iso3="NPL", region=region1) + country2 = models.Country.objects.create(name="India", iso3="IND", region=region2) dtype1 = models.DisasterType.objects.get(pk=1) dtype2 = models.DisasterType.objects.get(pk=2) EventFactory.create( - name='test1', + name="test1", dtype=dtype1, ) - event1 = EventFactory.create( - name='test0', - dtype=dtype1, - num_affected=10000, - countries=[country1] - ) - event2 = EventFactory.create( - name='test2', - dtype=dtype2, - num_affected=99999, - countries=[country2] - ) - event3 = EventFactory.create( - name='test2', - dtype=dtype2, - num_affected=None, - countries=[country2] - ) + event1 = EventFactory.create(name="test0", dtype=dtype1, num_affected=10000, countries=[country1]) + event2 = EventFactory.create(name="test2", dtype=dtype2, num_affected=99999, countries=[country2]) + event3 = EventFactory.create(name="test2", dtype=dtype2, num_affected=None, countries=[country2]) appeal1 = AppealFactory.create( - event=event1, - dtype=dtype1, - num_beneficiaries=9000, - amount_requested=10000, - amount_funded=1899999 + event=event1, dtype=dtype1, num_beneficiaries=9000, amount_requested=10000, amount_funded=1899999 ) appeal2 = AppealFactory.create( - event=event2, - dtype=dtype2, - num_beneficiaries=90023, - amount_requested=100440, - amount_funded=12299999 + event=event2, dtype=dtype2, num_beneficiaries=90023, amount_requested=100440, amount_funded=12299999 ) appeal2 = AppealFactory.create( - event=event3, - dtype=dtype2, - num_beneficiaries=91000, - amount_requested=10000888, - amount_funded=678888 - ) - response = self.client.get('/api/v2/go-historical/').json() - self.assertEqual(response['count'], 3) # should give event that have appeal associated with and num_affected=null - self.assertEqual( - sorted([event1.id, event2.id, event3.id]), - sorted([data['id'] for data in response['results']]) + event=event3, dtype=dtype2, num_beneficiaries=91000, amount_requested=10000888, amount_funded=678888 ) + response = self.client.get("/api/v2/go-historical/").json() + self.assertEqual(response["count"], 3) # should give event that have appeal associated with and num_affected=null + self.assertEqual(sorted([event1.id, event2.id, event3.id]), sorted([data["id"] for data in response["results"]])) # test for filter by country iso3 - response = self.client.get(f'/api/v2/go-historical/?iso3={country1.iso3}').json() - self.assertEqual(response['count'], 1) - self.assertEqual(response['results'][0]['id'], event1.id) - self.assertEqual(response['results'][0]['appeals'][0]['id'], appeal1.id) + response = self.client.get(f"/api/v2/go-historical/?iso3={country1.iso3}").json() + self.assertEqual(response["count"], 1) + self.assertEqual(response["results"][0]["id"], event1.id) + self.assertEqual(response["results"][0]["appeals"][0]["id"], appeal1.id) # test for region filter by - response = self.client.get(f'/api/v2/go-historical/?region={region1.id}').json() - self.assertEqual(response['count'], 1) - self.assertEqual(response['results'][0]['id'], event1.id) + response = self.client.get(f"/api/v2/go-historical/?region={region1.id}").json() + self.assertEqual(response["count"], 1) + self.assertEqual(response["results"][0]["id"], event1.id) class Admin2Test(APITestCase): def test_admin2_api(self): region = models.Region.objects.create(name=1) - country = models.Country.objects.create(name='Nepal', iso3='NPL', region=region) - admin1_1 = models.District.objects.create(name='admin1 1', code='NPL01', country=country) - admin1_2 = models.District.objects.create(name='admin1 2', code='NPL02', country=country) - admin2_1 = models.Admin2.objects.create(name='test 1', admin1=admin1_1, code='1') - admin2_2 = models.Admin2.objects.create(name='test 2', admin1=admin1_2, code='2') + country = models.Country.objects.create(name="Nepal", iso3="NPL", region=region) + admin1_1 = models.District.objects.create(name="admin1 1", code="NPL01", country=country) + admin1_2 = models.District.objects.create(name="admin1 2", code="NPL02", country=country) + admin2_1 = models.Admin2.objects.create(name="test 1", admin1=admin1_1, code="1") + admin2_2 = models.Admin2.objects.create(name="test 2", admin1=admin1_2, code="2") # test fetching all admin2-s - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 2) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 2) # test filtering by district - response = self.client.get(f'/api/v2/admin2/?admin1={admin1_1.id}').json() - self.assertEqual(response['count'], 1) - self.assertEqual(response['results'][0]['name'], 'test 1') + response = self.client.get(f"/api/v2/admin2/?admin1={admin1_1.id}").json() + self.assertEqual(response["count"], 1) + self.assertEqual(response["results"][0]["name"], "test 1") def test_admin2_deprecation(self): region = models.Region.objects.create(name=1) - country = models.Country.objects.create(name='Nepal', iso3='NPL', region=region) - admin1_1 = models.District.objects.create(name='admin1 1', code='NPL01', country=country) - admin1_2 = models.District.objects.create(name='admin1 2', code='NPL02', country=country) - admin2_1 = models.Admin2.objects.create(name='test 1', admin1=admin1_1, code='1') - admin2_2 = models.Admin2.objects.create(name='test 2', admin1=admin1_2, code='2') - admin2_3 = models.Admin2.objects.create(name='test 3', admin1=admin1_2, code='3') + country = models.Country.objects.create(name="Nepal", iso3="NPL", region=region) + admin1_1 = models.District.objects.create(name="admin1 1", code="NPL01", country=country) + admin1_2 = models.District.objects.create(name="admin1 2", code="NPL02", country=country) + admin2_1 = models.Admin2.objects.create(name="test 1", admin1=admin1_1, code="1") + admin2_2 = models.Admin2.objects.create(name="test 2", admin1=admin1_2, code="2") + admin2_3 = models.Admin2.objects.create(name="test 3", admin1=admin1_2, code="3") # test fetching all admin2-s - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 3) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 3) admin2_2.is_deprecated = True admin2_2.save() - response = self.client.get('/api/v2/admin2/').json() + response = self.client.get("/api/v2/admin2/").json() # 2 instead of 3, because 1 admin2 area became deprecated: api does not show it. - self.assertEqual(response['count'], 2) + self.assertEqual(response["count"], 2) # Tear down admin2_2.is_deprecated = False admin2_2.save() - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 3) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 3) admin2_1.is_deprecated = True admin2_2.is_deprecated = True admin2_1.save() admin2_2.save() # 2 admin2-s are deprecated, so 3-2 = 1 - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 1) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 1) # Tear down admin2_1.is_deprecated = False admin2_2.is_deprecated = False admin2_1.save() admin2_2.save() - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 3) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 3) admin2_1.is_deprecated = True admin2_2.is_deprecated = True @@ -466,8 +422,8 @@ def test_admin2_deprecation(self): admin2_2.save() admin2_3.save() # All admin2-s are deprecated - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 0) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 0) # Tear down admin2_1.is_deprecated = False @@ -476,154 +432,129 @@ def test_admin2_deprecation(self): admin2_1.save() admin2_2.save() admin2_3.save() - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 3) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 3) admin1_2.is_deprecated = True admin1_2.save() - response = self.client.get('/api/v2/admin2/').json() + response = self.client.get("/api/v2/admin2/").json() # There are 2 admin2-s in this district, so 3-2 = 1 - self.assertEqual(response['count'], 1) + self.assertEqual(response["count"], 1) # Tear down admin1_2.is_deprecated = False admin1_2.save() - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 3) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 3) admin1_1.is_deprecated = True admin1_1.save() - response = self.client.get('/api/v2/admin2/').json() + response = self.client.get("/api/v2/admin2/").json() # There is only 1 admin2-s in this district, so 3-1 = 2 - self.assertEqual(response['count'], 2) + self.assertEqual(response["count"], 2) # Tear down admin1_1.is_deprecated = False admin1_1.save() - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 3) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 3) country.is_deprecated = True country.save() - response = self.client.get('/api/v2/admin2/').json() + response = self.client.get("/api/v2/admin2/").json() # There are 3 admin2-s in this country, so 3-3 = 0 - self.assertEqual(response['count'], 0) + self.assertEqual(response["count"], 0) # Tear down country.is_deprecated = False country.save() - response = self.client.get('/api/v2/admin2/').json() - self.assertEqual(response['count'], 3) + response = self.client.get("/api/v2/admin2/").json() + self.assertEqual(response["count"], 3) class DistrictTest(APITestCase): def test_district_deprecation(self): region = models.Region.objects.create(name=1) - country = models.Country.objects.create(name='Nepal', iso3='NPL', region=region) - admin1_1 = models.District.objects.create(name='admin1 1', code='NPL01', country=country) - admin1_2 = models.District.objects.create(name='admin1 2', code='NPL02', country=country) + country = models.Country.objects.create(name="Nepal", iso3="NPL", region=region) + admin1_1 = models.District.objects.create(name="admin1 1", code="NPL01", country=country) + admin1_2 = models.District.objects.create(name="admin1 2", code="NPL02", country=country) # test fetching all districts - response = self.client.get('/api/v2/district/').json() - self.assertEqual(response['count'], 2) + response = self.client.get("/api/v2/district/").json() + self.assertEqual(response["count"], 2) admin1_2.is_deprecated = True admin1_2.save() - response = self.client.get('/api/v2/district/').json() + response = self.client.get("/api/v2/district/").json() # one district deprecated, 2-1 = 1 - self.assertEqual(response['count'], 1) + self.assertEqual(response["count"], 1) # Tear down admin1_2.is_deprecated = False admin1_2.save() - response = self.client.get('/api/v2/district/').json() - self.assertEqual(response['count'], 2) + response = self.client.get("/api/v2/district/").json() + self.assertEqual(response["count"], 2) admin1_1.is_deprecated = True admin1_2.is_deprecated = True admin1_1.save() admin1_2.save() - response = self.client.get('/api/v2/district/').json() + response = self.client.get("/api/v2/district/").json() # two districts deprecated, 2-2 = 0 - self.assertEqual(response['count'], 0) + self.assertEqual(response["count"], 0) # Tear down admin1_1.is_deprecated = False admin1_2.is_deprecated = False admin1_1.save() admin1_2.save() - response = self.client.get('/api/v2/district/').json() - self.assertEqual(response['count'], 2) + response = self.client.get("/api/v2/district/").json() + self.assertEqual(response["count"], 2) country.is_deprecated = True country.save() - response = self.client.get('/api/v2/district/').json() + response = self.client.get("/api/v2/district/").json() # There are 2 districts in this country, so 2-2 = 0 - self.assertEqual(response['count'], 0) + self.assertEqual(response["count"], 0) # Tear down country.is_deprecated = False country.save() - response = self.client.get('/api/v2/district/').json() - self.assertEqual(response['count'], 2) + response = self.client.get("/api/v2/district/").json() + self.assertEqual(response["count"], 2) class GlobalEnumEndpointTest(APITestCase): def test_200_response(self): - response = self.client.get('/api/v2/global-enums/') + response = self.client.get("/api/v2/global-enums/") self.assert_200(response) self.assertIsNotNone(response.json()) class AppealTest(APITestCase): - fixtures = ['DisasterTypes'] + fixtures = ["DisasterTypes"] def test_appeal_key_figure(self): region1 = models.Region.objects.create(name=1) region2 = models.Region.objects.create(name=2) - country1 = models.Country.objects.create(name='Nepal', iso3='NPL', region=region1) - country2 = models.Country.objects.create(name='India', iso3='IND', region=region2) + country1 = models.Country.objects.create(name="Nepal", iso3="NPL", region=region1) + country2 = models.Country.objects.create(name="India", iso3="IND", region=region2) dtype1 = models.DisasterType.objects.get(pk=1) dtype2 = models.DisasterType.objects.get(pk=2) event1 = EventFactory.create( - name='test1', - dtype=dtype1, - ) - event2 = EventFactory.create( - name='test0', + name="test1", dtype=dtype1, - num_affected=10000, - countries=[country1] - ) - event3 = EventFactory.create( - name='test2', - dtype=dtype2, - num_affected=99999, - countries=[country2] ) + event2 = EventFactory.create(name="test0", dtype=dtype1, num_affected=10000, countries=[country1]) + event3 = EventFactory.create(name="test2", dtype=dtype2, num_affected=99999, countries=[country2]) appeal1 = AppealFactory.create( - event=event1, - dtype=dtype1, - num_beneficiaries=9000, - amount_requested=10000, - amount_funded=1899999, - code=12 + event=event1, dtype=dtype1, num_beneficiaries=9000, amount_requested=10000, amount_funded=1899999, code=12 ) appeal2 = AppealFactory.create( - event=event2, - dtype=dtype2, - num_beneficiaries=90023, - amount_requested=100440, - amount_funded=12299999, - code=123 + event=event2, dtype=dtype2, num_beneficiaries=90023, amount_requested=100440, amount_funded=12299999, code=123 ) appeal3 = AppealFactory.create( - event=event3, - dtype=dtype2, - num_beneficiaries=91000, - amount_requested=10000888, - amount_funded=678888, - code=1234 + event=event3, dtype=dtype2, num_beneficiaries=91000, amount_requested=10000888, amount_funded=678888, code=1234 ) AppealHistoryFactory.create( appeal=appeal1, @@ -633,8 +564,8 @@ def test_appeal_key_figure(self): amount_funded=1899999, country=country1, atype=AppealType.APPEAL, - start_date='2024-1-1', - end_date='2024-1-1', + start_date="2024-1-1", + end_date="2024-1-1", ) AppealHistoryFactory.create( appeal=appeal2, @@ -644,8 +575,8 @@ def test_appeal_key_figure(self): amount_funded=1, country=country1, atype=AppealType.DREF, - start_date='2024-2-2', - end_date='2024-2-2', + start_date="2024-2-2", + end_date="2024-2-2", ) AppealHistoryFactory.create( appeal=appeal3, @@ -655,8 +586,8 @@ def test_appeal_key_figure(self): amount_funded=1, country=country1, atype=AppealType.APPEAL, - start_date='2024-3-3', - end_date='2024-3-3', + start_date="2024-3-3", + end_date="2024-3-3", ) AppealHistoryFactory.create( appeal=appeal3, @@ -666,13 +597,13 @@ def test_appeal_key_figure(self): amount_funded=1, country=country1, atype=AppealType.APPEAL, - start_date='2024-4-4', - end_date='2024-4-4', + start_date="2024-4-4", + end_date="2024-4-4", ) - url = f'/api/v2/country/{country1.id}/figure/' + url = f"/api/v2/country/{country1.id}/figure/" self.client.force_authenticate(self.user) response = self.client.get(url) self.assert_200(response) self.assertIsNotNone(response.json()) - self.assertEqual(response.data['active_drefs'], 1) - self.assertEqual(response.data['active_appeals'], 3) + self.assertEqual(response.data["active_drefs"], 1) + self.assertEqual(response.data["active_appeals"], 3) diff --git a/api/translation.py b/api/translation.py index 444fd86f8..44007ead5 100644 --- a/api/translation.py +++ b/api/translation.py @@ -1,165 +1,176 @@ -from modeltranslation.translator import register, TranslationOptions +from modeltranslation.translator import TranslationOptions, register + from .models import ( Action, ActionsTaken, + AdminKeyFigure, Appeal, AppealDocument, - GeneralDocument, Country, + CountryKeyFigure, CountrySnippet, DisasterType, Event, + EventLink, ExternalPartner, FieldReport, GDACSEvent, + GeneralDocument, + KeyFigure, MainContact, Region, - RegionSnippet, RegionEmergencySnippet, - RegionProfileSnippet, + RegionKeyFigure, RegionPreparednessSnippet, + RegionProfileSnippet, + RegionSnippet, SituationReportType, Snippet, - SupportedActivity, - EventLink, - FieldReport, Source, - CountryKeyFigure, - RegionKeyFigure, - KeyFigure, - AdminKeyFigure + SupportedActivity, ) @register(Action) class ActionTO(TranslationOptions): - fields = ('name', 'tooltip_text') + fields = ("name", "tooltip_text") @register(ActionsTaken) class ActionsTakenTO(TranslationOptions): - fields = ('summary',) + fields = ("summary",) @register(Appeal) class AppealTO(TranslationOptions): - fields = ('name',) + fields = ("name",) @register(AppealDocument) class AppealDocumentTO(TranslationOptions): - fields = ('name',) + fields = ("name",) @register(GeneralDocument) class GeneralDocumentTO(TranslationOptions): - fields = ('name',) + fields = ("name",) @register(Country) class CountryTO(TranslationOptions): - fields = ('name', 'society_name', 'overview', 'additional_tab_name',) + fields = ( + "name", + "society_name", + "overview", + "additional_tab_name", + ) @register(CountrySnippet) class CountrySnippetTO(TranslationOptions): - fields = ('snippet',) + fields = ("snippet",) @register(DisasterType) class DisasterTypeTO(TranslationOptions): - fields = ('name', 'summary') + fields = ("name", "summary") @register(Event) class EventTO(TranslationOptions): - fields = ('name', 'summary') + fields = ("name", "summary") @register(ExternalPartner) class ExternalPartnerTO(TranslationOptions): - fields = ('name',) + fields = ("name",) @register(FieldReport) class FieldReportTO(TranslationOptions): - fields = ('summary', 'description', 'actions_others', 'other_sources') + fields = ("summary", "description", "actions_others", "other_sources") @register(GDACSEvent) class GDACSEventTO(TranslationOptions): - fields = ('title', 'description', 'country_text') + fields = ("title", "description", "country_text") @register(MainContact) class MainContactTO(TranslationOptions): - fields = ('extent',) + fields = ("extent",) @register(Region) class RegionTO(TranslationOptions): - fields = ('label', 'additional_tab_name',) + fields = ( + "label", + "additional_tab_name", + ) @register(RegionSnippet) class RegionSnippetTO(TranslationOptions): - fields = ('snippet',) + fields = ("snippet",) @register(RegionEmergencySnippet) class RegionEmergencySnippetTO(TranslationOptions): - fields = ('title', 'snippet',) + fields = ( + "title", + "snippet", + ) @register(RegionProfileSnippet) class RegionProfileSnippetTO(TranslationOptions): - fields = ('title', 'snippet',) + fields = ( + "title", + "snippet", + ) @register(RegionPreparednessSnippet) class RegionPreparednessSnippetTO(TranslationOptions): - fields = ('title', 'snippet',) + fields = ( + "title", + "snippet", + ) @register(SituationReportType) class SituationReportTypeTO(TranslationOptions): - fields = ('type',) + fields = ("type",) @register(Snippet) class SnippetTO(TranslationOptions): - fields = ('snippet',) + fields = ("snippet",) @register(SupportedActivity) class SupportedActivityTO(TranslationOptions): - fields = ('name',) + fields = ("name",) @register(EventLink) class EventLinkTO(TranslationOptions): - fields = ('title', 'description') + fields = ("title", "description") @register(Source) class SourceTO(TranslationOptions): - fields = ( - 'spec', - ) + fields = ("spec",) @register(KeyFigure) class KeyFigureTo(TranslationOptions): - fields = ( - 'deck', - ) + fields = ("deck",) @register(AdminKeyFigure) class AdminKeyFigureTo(TranslationOptions): - fields = ( - 'deck', - ) + fields = ("deck",) @register(CountryKeyFigure) diff --git a/api/triggers.py b/api/triggers.py index a9111a8e7..c2e46da10 100644 --- a/api/triggers.py +++ b/api/triggers.py @@ -1,5 +1,6 @@ -from django.db.models.signals import post_save from django.contrib.auth.models import User +from django.db.models.signals import post_save + from .models import Profile diff --git a/api/utils.py b/api/utils.py index 6af908b47..7f08982b9 100644 --- a/api/utils.py +++ b/api/utils.py @@ -1,50 +1,45 @@ import base64 -from django.utils.translation import gettext from django.core.exceptions import ValidationError from django.http import JsonResponse +from django.utils.translation import gettext def pretty_request(request): - headers = '' + headers = "" for header, value in request.META.items(): - if not header.startswith('HTTP'): + if not header.startswith("HTTP"): continue - header = '-'.join([h.capitalize() for h in header[5:].lower().split('_')]) - headers += '{}: {}\n'.format(header, value) + header = "-".join([h.capitalize() for h in header[5:].lower().split("_")]) + headers += "{}: {}\n".format(header, value) return ( - '{method} HTTP/1.1\n' - 'Content-Length: {content_length}\n' - 'Content-Type: {content_type}\n' - '{headers}\n\n' - '{body}' + "{method} HTTP/1.1\n" "Content-Length: {content_length}\n" "Content-Type: {content_type}\n" "{headers}\n\n" "{body}" ).format( method=request.method, - content_length=request.META['CONTENT_LENGTH'], - content_type=request.META['CONTENT_TYPE'], + content_length=request.META["CONTENT_LENGTH"], + content_type=request.META["CONTENT_TYPE"], headers=headers, body=request.body, ) def base64_encode(string): - return base64.urlsafe_b64encode( - string.encode('UTF-8') - ).decode('ascii') + return base64.urlsafe_b64encode(string.encode("UTF-8")).decode("ascii") def validate_slug_number(value): if value[0].isdigit(): - raise ValidationError(gettext('slug should not start with a number')) + raise ValidationError(gettext("slug should not start with a number")) def is_user_ifrc(user): - """ Checks if the user has IFRC Admin or superuser permissions """ - if user.has_perm('api.ifrc_admin') or user.is_superuser: + """Checks if the user has IFRC Admin or superuser permissions""" + if user.has_perm("api.ifrc_admin") or user.is_superuser: return True return False + # FIXME: not usable because of circular dependency # def filter_visibility_by_auth(user, visibility_model_class): # if user.is_authenticated: @@ -56,17 +51,18 @@ def is_user_ifrc(user): def get_model_name(model): - return f'{model._meta.app_label}.{model.__name__}' + return f"{model._meta.app_label}.{model.__name__}" class Echo: """An object that implements just the write method of the file-like interface. """ + def write(self, value): """Write the value by returning it, instead of storing in a buffer.""" return value def bad_request(message): - return JsonResponse({"statusCode": 400, "error_message": message}, status=400) \ No newline at end of file + return JsonResponse({"statusCode": 400, "error_message": message}, status=400) diff --git a/api/view_filters.py b/api/view_filters.py index 1016b0941..c13b79044 100644 --- a/api/view_filters.py +++ b/api/view_filters.py @@ -9,10 +9,10 @@ def __init__(self, filter_value=lambda x: x, **kwargs): self.filter_value_fn = filter_value def sanitize(self, value_list): - return [v for v in value_list if v != u''] + return [v for v in value_list if v != ""] def filter(self, qs, value): - values = value.split(u",") if value is not None else [] + values = value.split(",") if value is not None else [] values = self.sanitize(values) values = map(self.filter_value_fn, values) f = Q() diff --git a/api/views.py b/api/views.py index f2b9d07fc..a5d2baac8 100644 --- a/api/views.py +++ b/api/views.py @@ -1,65 +1,70 @@ import json from datetime import datetime, timedelta -from django.http import JsonResponse, HttpResponse +from django.conf import settings from django.contrib.auth import authenticate from django.contrib.auth.models import User -from django.conf import settings -from django.views import View -from django.db.models.functions import TruncMonth, TruncYear, Coalesce -from django.db.models.fields import IntegerField from django.db import models -from django.db.models import ( - Count, - Sum, - Q, - F, - Case, - When, - Subquery, - OuterRef, - Avg -) +from django.db.models import Avg, Case, Count, F, OuterRef, Q, Subquery, Sum, When +from django.db.models.fields import IntegerField +from django.db.models.functions import Coalesce, TruncMonth, TruncYear +from django.http import HttpResponse, JsonResponse +from django.template.loader import render_to_string from django.utils import timezone from django.utils.crypto import get_random_string -from django.template.loader import render_to_string +from django.views import View +from drf_spectacular.utils import extend_schema, extend_schema_view +from haystack.query import SQ, SearchQuerySet +from rest_framework import authentication, permissions from rest_framework.authtoken.models import Token -from rest_framework.views import APIView from rest_framework.response import Response -from rest_framework import authentication, permissions -from drf_spectacular.utils import extend_schema, extend_schema_view - -from deployments.models import Heop, ERUType, Sector, SectorTag, Statuses -from notifications.models import Subscription, SurgeAlert -from notifications.notification import send_notification -from registrations.models import Recovery, Pending -from deployments.models import Project, ERU, Personnel -from flash_update.models import FlashUpdate +from rest_framework.views import APIView -from .esconnection import ES_CLIENT -from .models import Appeal, AppealHistory, AppealType, CronJob, Event, FieldReport, Snippet -from .indexes import ES_PAGE_NAME -from .logger import logger -from haystack.query import SearchQuerySet -from api.models import Country, Region, District -from haystack.query import SQ -from .utils import is_user_ifrc +from api.models import Country, District, Region from api.serializers import ( - AggregateHeaderFiguresSerializer, - SearchSerializer, - ProjectPrimarySectorsSerializer, - ProjectSecondarySectorsSerializer, - AggregateByTimeSeriesSerializer, - AreaAggregateSerializer, AggregateByDtypeSerializer, AggregateByTimeSeriesInputSerializer, - SearchInputSerializer, + AggregateByTimeSeriesSerializer, AggregateHeaderFiguresInputSerializer, - CountryKeyFigureInputSerializer, - CountryKeyFigureSerializer, + AggregateHeaderFiguresSerializer, + AreaAggregateSerializer, CountryDisasterTypeCountSerializer, CountryDisasterTypeMonthlySerializer, + CountryKeyFigureInputSerializer, + CountryKeyFigureSerializer, + ProjectPrimarySectorsSerializer, + ProjectSecondarySectorsSerializer, + SearchInputSerializer, + SearchSerializer, +) +from deployments.models import ( + ERU, + ERUType, + Heop, + Personnel, + Project, + Sector, + SectorTag, + Statuses, ) +from flash_update.models import FlashUpdate +from notifications.models import Subscription, SurgeAlert +from notifications.notification import send_notification +from registrations.models import Pending, Recovery + +from .esconnection import ES_CLIENT +from .indexes import ES_PAGE_NAME +from .logger import logger +from .models import ( + Appeal, + AppealHistory, + AppealType, + CronJob, + Event, + FieldReport, + Snippet, +) +from .utils import is_user_ifrc def bad_request(message): @@ -137,12 +142,7 @@ def get(self, request): return JsonResponse(results["hits"]) -@extend_schema_view( - get=extend_schema( - parameters=[SearchInputSerializer], - responses=SearchSerializer - ) -) +@extend_schema_view(get=extend_schema(parameters=[SearchInputSerializer], responses=SearchSerializer)) class HayStackSearch(APIView): def get(self, request): @@ -182,9 +182,11 @@ def get(self, request): SearchQuerySet() .models(Personnel) .filter( - (SQ(deploying_country_name__contains=phrase) - | SQ(deployed_to_country_name__contains=phrase) - | SQ(event_name__content=phrase)) + ( + SQ(deploying_country_name__contains=phrase) + | SQ(deployed_to_country_name__contains=phrase) + | SQ(event_name__content=phrase) + ) & SQ(end_date__gt=datetime.now()) ) .order_by("-_score") @@ -194,7 +196,7 @@ def get(self, request): .models(SurgeAlert) .filter( (SQ(event_name__content=phrase) | SQ(country_name__contains=phrase) | SQ(iso3__contains=phrase)) - & ~SQ(status='archived') + & ~SQ(status="archived") ) .order_by("-_score") ) @@ -250,7 +252,7 @@ def get(self, request): .filter( (SQ(event_name__content=phrase) | SQ(country_name__contains=phrase) | SQ(iso3__contains=phrase)) & ~SQ(visibility="IFRC Only") - & ~SQ(status='archived') + & ~SQ(status="archived") ) .order_by("-_score") ) @@ -307,7 +309,7 @@ def get(self, request): .filter( (SQ(event_name__content=phrase) | SQ(country_name__contains=phrase) | SQ(iso3__contains=phrase)) & SQ(visibility="Public") - & ~SQ(status='archived') + & ~SQ(status="archived") ) .order_by("-_score") ) @@ -573,9 +575,7 @@ def get(cls, request): keys_labels = [ {"key": s.id, "label": s.title, "color": s.color, "is_deprecated": s.is_deprecated} for s in Sector.objects.all() ] - return Response( - ProjectPrimarySectorsSerializer(keys_labels, many=True).data - ) + return Response(ProjectPrimarySectorsSerializer(keys_labels, many=True).data) class ProjectSecondarySectors(APIView): @@ -586,12 +586,9 @@ class ProjectSecondarySectors(APIView): ) def get(cls, request): keys_labels = [ - {"key": s.id, "label": s.title, "color": s.color, "is_deprecated": s.is_deprecated} - for s in SectorTag.objects.all() + {"key": s.id, "label": s.title, "color": s.color, "is_deprecated": s.is_deprecated} for s in SectorTag.objects.all() ] - return Response( - ProjectSecondarySectorsSerializer(keys_labels, many=True).data - ) + return Response(ProjectSecondarySectorsSerializer(keys_labels, many=True).data) class ProjectStatuses(APIView): @@ -602,15 +599,13 @@ def get(cls, request): @extend_schema_view( - get=extend_schema( - parameters=[AggregateHeaderFiguresInputSerializer], - responses=AggregateHeaderFiguresSerializer - ) + get=extend_schema(parameters=[AggregateHeaderFiguresInputSerializer], responses=AggregateHeaderFiguresSerializer) ) class AggregateHeaderFigures(APIView): """ - Used mainly for the key-figures header and by FDRS + Used mainly for the key-figures header and by FDRS """ + def get(self, request): iso3 = request.GET.get("iso3", None) country = request.GET.get("country", None) @@ -644,9 +639,7 @@ def get(self, request): # Active Appeals with type Emergency Appeal or International Appeal acta=Count(Case(When(appeal_conditions, then=1), output_field=IntegerField())), # Total Appeals count which are not DREF - tota=Count( - Case(When(Q(atype=AppealType.APPEAL) | Q(atype=AppealType.INTL), then=1), output_field=IntegerField()) - ), + tota=Count(Case(When(Q(atype=AppealType.APPEAL) | Q(atype=AppealType.INTL), then=1), output_field=IntegerField())), # Active Appeals' target population tarp=Sum( Case( @@ -671,18 +664,11 @@ def get(self, request): amount_funded=Sum("amof"), ) - return Response( - AggregateHeaderFiguresSerializer( - appeals_aggregated - ).data - ) + return Response(AggregateHeaderFiguresSerializer(appeals_aggregated).data) class AreaAggregate(APIView): - @extend_schema( - request=None, - responses=AreaAggregateSerializer - ) + @extend_schema(request=None, responses=AreaAggregateSerializer) def get(self, request): region_type = request.GET.get("type", None) region_id = request.GET.get("id", None) @@ -699,13 +685,11 @@ def get(self, request): num_beneficiaries=Sum("num_beneficiaries"), amount_requested=Sum("amount_requested"), amount_funded=Sum("amount_funded"), - count=Sum("count_id") + count=Sum("count_id"), ) ) - return Response( - AreaAggregateSerializer(aggregate).data - ) + return Response(AreaAggregateSerializer(aggregate).data) class AggregateByDtype(APIView): @@ -726,24 +710,13 @@ def get(self, request): return bad_request("Must specify an `model_type` that is `heop`, `appeal`, `event`, or `fieldreport`") model = models[mtype] - aggregate = model.objects.values( - "dtype" - ).annotate( - count=Count("id") - ).order_by( - "count" - ).values("dtype", "count") - - return Response( - AggregateByDtypeSerializer(aggregate, many=True).data - ) + aggregate = model.objects.values("dtype").annotate(count=Count("id")).order_by("count").values("dtype", "count") + + return Response(AggregateByDtypeSerializer(aggregate, many=True).data) @extend_schema_view( - get=extend_schema( - parameters=[AggregateByTimeSeriesInputSerializer], - responses=AggregateByTimeSeriesSerializer(many=True) - ) + get=extend_schema(parameters=[AggregateByTimeSeriesInputSerializer], responses=AggregateByTimeSeriesSerializer(many=True)) ) class AggregateByTime(APIView): @@ -824,9 +797,7 @@ def get(self, request): .values(*output_values) ) - return Response( - AggregateByTimeSeriesSerializer(aggregate, many=True).data - ) + return Response(AggregateByTimeSeriesSerializer(aggregate, many=True).data) class GetAuthToken(APIView): diff --git a/api/visibility_class.py b/api/visibility_class.py index c3ac29507..f5ac0ac07 100644 --- a/api/visibility_class.py +++ b/api/visibility_class.py @@ -1,9 +1,10 @@ +from django.db.models import Q from rest_framework import viewsets from deployments.models import Project -from .models import VisibilityChoices, VisibilityCharChoices, UserCountry, Profile + +from .models import Profile, UserCountry, VisibilityCharChoices, VisibilityChoices from .utils import is_user_ifrc # filter_visibility_by_auth (would be better) -from django.db.models import Q class ReadOnlyVisibilityViewsetMixin: @@ -40,8 +41,8 @@ def get_queryset(self): else: if self.visibility_model_class.__name__ == "FieldReport" or self.visibility_model_class.__name__ == "Event": return self.visibility_model_class.objects.exclude(visibility=VisibilityChoices.IFRC).exclude( - Q(visibility=VisibilityChoices.IFRC_NS) & - ~Q( + Q(visibility=VisibilityChoices.IFRC_NS) + & ~Q( countries__id__in=UserCountry.objects.filter(user=self.request.user.id) .values_list("country", flat=True) .union(Profile.objects.filter(user=self.request.user.id).values_list("country", flat=True)) diff --git a/country_plan/admin.py b/country_plan/admin.py index 211bc8537..c4de0c051 100644 --- a/country_plan/admin.py +++ b/country_plan/admin.py @@ -3,14 +3,14 @@ from country_plan.models import ( CountryPlan, DataImport, + MembershipCoordination, StrategicPriority, - MembershipCoordination ) @admin.register(DataImport) class DataImportAdmin(admin.ModelAdmin): - readonly_fields = ('errors',) + readonly_fields = ("errors",) change_form_template = "admin/countryplan_change_form.html" change_list_template = "admin/countryplan_change_list.html" @@ -18,9 +18,9 @@ class DataImportAdmin(admin.ModelAdmin): @admin.register(CountryPlan) class CountryPlanAdmin(admin.ModelAdmin): - autocomplete_fields = ('country',) - search_fields = ('country__name',) - list_filter = ('is_publish',) + autocomplete_fields = ("country",) + search_fields = ("country__name",) + list_filter = ("is_publish",) change_form_template = "admin/countryplan_change_form.html" change_list_template = "admin/countryplan_change_list.html" @@ -28,12 +28,12 @@ class CountryPlanAdmin(admin.ModelAdmin): @admin.register(StrategicPriority) class StrategicPriorityAdmin(admin.ModelAdmin): - list_display = ('country_plan', 'type', 'people_targeted') - autocomplete_fields = ('country_plan',) + list_display = ("country_plan", "type", "people_targeted") + autocomplete_fields = ("country_plan",) @admin.register(MembershipCoordination) class MembershipCoordinationAdmin(admin.ModelAdmin): - list_display = ('country_plan', 'national_society', 'sector') - search_fields = ('sector',) - autocomplete_fields = ('national_society', 'country_plan') + list_display = ("country_plan", "national_society", "sector") + search_fields = ("sector",) + autocomplete_fields = ("national_society", "country_plan") diff --git a/country_plan/apps.py b/country_plan/apps.py index fc07cb07d..dde6e4908 100644 --- a/country_plan/apps.py +++ b/country_plan/apps.py @@ -2,5 +2,5 @@ class CountryPlanConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'country_plan' + default_auto_field = "django.db.models.BigAutoField" + name = "country_plan" diff --git a/country_plan/drf_views.py b/country_plan/drf_views.py index ae6b73bc2..5c3d952de 100644 --- a/country_plan/drf_views.py +++ b/country_plan/drf_views.py @@ -1,5 +1,5 @@ -from rest_framework import mixins, viewsets from django.db import models +from rest_framework import mixins, viewsets from .models import CountryPlan, MembershipCoordination from .serializers import CountryPlanSerializer @@ -8,11 +8,11 @@ class CountryPlanViewset(mixins.RetrieveModelMixin, viewsets.GenericViewSet): serializer_class = CountryPlanSerializer queryset = CountryPlan.objects.prefetch_related( - 'country_plan_sp', + "country_plan_sp", models.Prefetch( - 'country_plan_mc', + "country_plan_mc", queryset=MembershipCoordination.objects.annotate( - national_society_name=models.F('national_society__society_name'), + national_society_name=models.F("national_society__society_name"), ), ), ).filter(is_publish=True) diff --git a/country_plan/management/commands/ingest_country_plan_file.py b/country_plan/management/commands/ingest_country_plan_file.py index 0cb44d961..51de2371d 100644 --- a/country_plan/management/commands/ingest_country_plan_file.py +++ b/country_plan/management/commands/ingest_country_plan_file.py @@ -1,25 +1,26 @@ import logging -import requests -from typing import Union, Optional, Tuple from datetime import datetime -from django.utils.timezone import make_aware -from django.core.management.base import BaseCommand -from django.core.files.base import File +from typing import Optional, Tuple, Union + +import requests from django.conf import settings +from django.core.files.base import File +from django.core.management.base import BaseCommand from django.db import models +from django.utils.timezone import make_aware from sentry_sdk.crons import monitor -from main.sentry import SentryMonitor -from main.utils import DownloadFileManager from api.models import Country from country_plan.models import CountryPlan +from main.sentry import SentryMonitor +from main.utils import DownloadFileManager logger = logging.getLogger(__name__) # Ref: https://github.com/IFRCGo/go-api/issues/1614 -PUBLIC_SOURCE = 'https://go-api.ifrc.org/api/publicsiteappeals?AppealsTypeID=1851&Hidden=false' +PUBLIC_SOURCE = "https://go-api.ifrc.org/api/publicsiteappeals?AppealsTypeID=1851&Hidden=false" # Ref: https://github.com/IFRCGo/go-api/issues/1648 -INTERNAL_SOURCE = 'https://go-api.ifrc.org/Api/FedNetAppeals?AppealsTypeId=1844&Hidden=false' +INTERNAL_SOURCE = "https://go-api.ifrc.org/Api/FedNetAppeals?AppealsTypeId=1844&Hidden=false" def parse_date(text: Optional[str]) -> Optional[datetime]: @@ -33,7 +34,7 @@ def parse_date(text: Optional[str]) -> Optional[datetime]: if text: return make_aware( # NOTE: Format is assumed by looking at the data from Appeal API - datetime.strptime(text, '%Y-%m-%dT%H:%M:%S') + datetime.strptime(text, "%Y-%m-%dT%H:%M:%S") ) @@ -41,16 +42,18 @@ def get_meta_from_url(url) -> Tuple[Optional[str], str]: """ Fetch url headers and return content-type and filename """ + def _get_filename_from_headers(resp): try: # Eg: Content-Disposition: 'attachment;filename=UP_Botswana_2023.pdf' - return resp.headers.get('Content-Disposition').split(';')[1].split('=')[1] + return resp.headers.get("Content-Disposition").split(";")[1].split("=")[1] except Exception: - return 'document.pdf' + return "document.pdf" # Check if it is a pdf file resp = requests.head(url) - return resp.headers.get('Content-Type'), _get_filename_from_headers(resp) + return resp.headers.get("Content-Type"), _get_filename_from_headers(resp) + @monitor(monitor_slug=SentryMonitor.INGEST_COUNTRY_PLAN_FILE) class Command(BaseCommand): @@ -59,33 +62,26 @@ def load_file_to_country_plan(country_plan: CountryPlan, url: str, filename: str """ Fetch file using url and save to country_plan """ - with DownloadFileManager(url, suffix='.pdf') as f: + with DownloadFileManager(url, suffix=".pdf") as f: getattr(country_plan, field_name).save( filename, File(f), ) def load_for_country(self, country_data: dict, file_field: str, field_inserted_date_field: str): - country_iso2 = country_data.get('LocationCountryCode') - country_name = country_data.get('LocationCountryName') - plan_url = country_data['BaseDirectory'] + country_data['BaseFileName'] - inserted_date = parse_date(country_data.get('Inserted')) - if ( - (country_iso2 is None and country_name is None) or - plan_url is None or - inserted_date is None - ): + country_iso2 = country_data.get("LocationCountryCode") + country_name = country_data.get("LocationCountryName") + plan_url = country_data["BaseDirectory"] + country_data["BaseFileName"] + inserted_date = parse_date(country_data.get("Inserted")) + if (country_iso2 is None and country_name is None) or plan_url is None or inserted_date is None: return - country_qs = Country.objects.filter( - models.Q(iso__iexact=country_iso2) | - models.Q(name__iexact=country_name) - ) + country_qs = Country.objects.filter(models.Q(iso__iexact=country_iso2) | models.Q(name__iexact=country_name)) country_plan = CountryPlan.objects.filter(country__in=country_qs).first() if country_plan is None: country = country_qs.first() # If there is no country as well, show warning and return if not country: - logger.warning(f'{file_field} No country found for: {(country_iso2, country_name)}') + logger.warning(f"{file_field} No country found for: {(country_iso2, country_name)}") return # Else create one and continue country_plan = CountryPlan(country=country) @@ -94,11 +90,11 @@ def load_for_country(self, country_data: dict, file_field: str, field_inserted_d # No need to do anything here return content_type, content_name = get_meta_from_url(plan_url) - self.stdout.write(f'- Checking plan file for country:: {country_plan.country.name}') - if content_type != 'application/pdf': + self.stdout.write(f"- Checking plan file for country:: {country_plan.country.name}") + if content_type != "application/pdf": # Only looking for PDFs return - self.stdout.write(' - Saving data') + self.stdout.write(" - Saving data") setattr(country_plan, field_inserted_date_field, inserted_date) self.load_file_to_country_plan( country_plan, @@ -112,23 +108,23 @@ def load_for_country(self, country_data: dict, file_field: str, field_inserted_d update_fields=( field_inserted_date_field, file_field, # By load_file_to_country_plan - 'is_publish', + "is_publish", ) ) def load(self, url: str, file_field: str, field_inserted_date_field: str): auth = (settings.APPEALS_USER, settings.APPEALS_PASS) - results = requests.get(url, auth=auth, headers={'Accept': 'application/json'}).json() + results = requests.get(url, auth=auth, headers={"Accept": "application/json"}).json() for result in results: try: self.load_for_country(result, file_field, field_inserted_date_field) except Exception: - logger.error('Could not update countries plan', exc_info=True) + logger.error("Could not update countries plan", exc_info=True) def handle(self, **_): # Public - self.stdout.write('Fetching data for country plans:: PUBLIC') - self.load(PUBLIC_SOURCE, 'public_plan_file', 'public_plan_inserted_date') + self.stdout.write("Fetching data for country plans:: PUBLIC") + self.load(PUBLIC_SOURCE, "public_plan_file", "public_plan_inserted_date") # Private - self.stdout.write('\nFetching data for country plans:: PRIVATE') - self.load(INTERNAL_SOURCE, 'internal_plan_file', 'internal_plan_inserted_date') + self.stdout.write("\nFetching data for country plans:: PRIVATE") + self.load(INTERNAL_SOURCE, "internal_plan_file", "internal_plan_inserted_date") diff --git a/country_plan/migrations/0001_initial.py b/country_plan/migrations/0001_initial.py index cdd022bc4..1f8d97385 100644 --- a/country_plan/migrations/0001_initial.py +++ b/country_plan/migrations/0001_initial.py @@ -1,9 +1,10 @@ # Generated by Django 3.2.16 on 2022-11-24 05:11 -import country_plan.models +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion + +import country_plan.models class Migration(migrations.Migration): @@ -11,68 +12,181 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('api', '0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940'), + ("api", "0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( - name='CountryPlan', + name="CountryPlan", fields=[ - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated at')), - ('country', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='country_plan', serialize=False, to='api.country')), - ('internal_plan_file', models.FileField(blank=True, null=True, upload_to=country_plan.models.pdf_upload_to, verbose_name='Internal Plan')), - ('public_plan_file', models.FileField(blank=True, null=True, upload_to=country_plan.models.pdf_upload_to, verbose_name='Country Plan')), - ('requested_amount', models.FloatField(blank=True, null=True, verbose_name='Requested Amount')), - ('people_targeted', models.IntegerField(blank=True, null=True, verbose_name='People Targeted')), - ('is_publish', models.BooleanField(default=False)), - ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='countryplan_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By')), - ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='countryplan_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Updated by')), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created at")), + ("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated at")), + ( + "country", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + primary_key=True, + related_name="country_plan", + serialize=False, + to="api.country", + ), + ), + ( + "internal_plan_file", + models.FileField( + blank=True, null=True, upload_to=country_plan.models.pdf_upload_to, verbose_name="Internal Plan" + ), + ), + ( + "public_plan_file", + models.FileField( + blank=True, null=True, upload_to=country_plan.models.pdf_upload_to, verbose_name="Country Plan" + ), + ), + ("requested_amount", models.FloatField(blank=True, null=True, verbose_name="Requested Amount")), + ("people_targeted", models.IntegerField(blank=True, null=True, verbose_name="People Targeted")), + ("is_publish", models.BooleanField(default=False)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="countryplan_created_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="countryplan_updated_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Updated by", + ), + ), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='DataImport', + name="DataImport", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated at')), - ('file', models.FileField(upload_to=country_plan.models.file_upload_to, verbose_name='EXCEL file')), - ('errors', models.JSONField(blank=True, null=True)), - ('created_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dataimport_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By')), - ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dataimport_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Updated by')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created at")), + ("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated at")), + ("file", models.FileField(upload_to=country_plan.models.file_upload_to, verbose_name="EXCEL file")), + ("errors", models.JSONField(blank=True, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="dataimport_created_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="dataimport_updated_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Updated by", + ), + ), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='StrategicPriority', + name="StrategicPriority", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('type', models.CharField(choices=[('climate_and_environmental_crisis', 'Climate and environmental crisis'), ('evolving_crisis_and_disasters', 'Evolving crisis and disasters'), ('growing_gaps_in_health_and_wellbeing', 'Growing gaps in health and wellbeing'), ('migration_and_identity', 'Migration and Identity'), ('value_power_and_inclusion', 'Value power and inclusion')], max_length=100, verbose_name='Type')), - ('funding_requirement', models.FloatField(blank=True, null=True, verbose_name='Funding Requirement')), - ('people_targeted', models.IntegerField(blank=True, null=True, verbose_name='People Targeted')), - ('country_plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='country_plan_sp', to='country_plan.countryplan', verbose_name='Country Plan')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "type", + models.CharField( + choices=[ + ("climate_and_environmental_crisis", "Climate and environmental crisis"), + ("evolving_crisis_and_disasters", "Evolving crisis and disasters"), + ("growing_gaps_in_health_and_wellbeing", "Growing gaps in health and wellbeing"), + ("migration_and_identity", "Migration and Identity"), + ("value_power_and_inclusion", "Value power and inclusion"), + ], + max_length=100, + verbose_name="Type", + ), + ), + ("funding_requirement", models.FloatField(blank=True, null=True, verbose_name="Funding Requirement")), + ("people_targeted", models.IntegerField(blank=True, null=True, verbose_name="People Targeted")), + ( + "country_plan", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="country_plan_sp", + to="country_plan.countryplan", + verbose_name="Country Plan", + ), + ), ], options={ - 'unique_together': {('country_plan', 'type')}, + "unique_together": {("country_plan", "type")}, }, ), migrations.CreateModel( - name='MembershipCoordination', + name="MembershipCoordination", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('sector', models.CharField(choices=[('climate', 'Climate'), ('crisis', 'Crisis'), ('health', 'Health'), ('migration', 'Migration'), ('inclusion', 'Inclusion'), ('engaged', 'Engaged'), ('accountable', 'Accountable'), ('trusted', 'Trusted')], max_length=100, verbose_name='Sector')), - ('has_coordination', models.BooleanField(default=False)), - ('country_plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='country_plan_mc', to='country_plan.countryplan', verbose_name='Country Plan')), - ('national_society', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='national_society_mc', to='api.country')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "sector", + models.CharField( + choices=[ + ("climate", "Climate"), + ("crisis", "Crisis"), + ("health", "Health"), + ("migration", "Migration"), + ("inclusion", "Inclusion"), + ("engaged", "Engaged"), + ("accountable", "Accountable"), + ("trusted", "Trusted"), + ], + max_length=100, + verbose_name="Sector", + ), + ), + ("has_coordination", models.BooleanField(default=False)), + ( + "country_plan", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="country_plan_mc", + to="country_plan.countryplan", + verbose_name="Country Plan", + ), + ), + ( + "national_society", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="national_society_mc", to="api.country" + ), + ), ], options={ - 'unique_together': {('country_plan', 'national_society', 'sector')}, + "unique_together": {("country_plan", "national_society", "sector")}, }, ), ] diff --git a/country_plan/migrations/0002_alter_countryplan_is_publish.py b/country_plan/migrations/0002_alter_countryplan_is_publish.py index eddda2a33..66a97b833 100644 --- a/country_plan/migrations/0002_alter_countryplan_is_publish.py +++ b/country_plan/migrations/0002_alter_countryplan_is_publish.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('country_plan', '0001_initial'), + ("country_plan", "0001_initial"), ] operations = [ migrations.AlterField( - model_name='countryplan', - name='is_publish', - field=models.BooleanField(default=False, verbose_name='Published'), + model_name="countryplan", + name="is_publish", + field=models.BooleanField(default=False, verbose_name="Published"), ), ] diff --git a/country_plan/migrations/0003_auto_20221128_0831.py b/country_plan/migrations/0003_auto_20221128_0831.py index 9478b4b45..e3b6e16d2 100644 --- a/country_plan/migrations/0003_auto_20221128_0831.py +++ b/country_plan/migrations/0003_auto_20221128_0831.py @@ -1,30 +1,54 @@ # Generated by Django 3.2.16 on 2022-11-28 08:31 -import country_plan.models import django.core.validators from django.db import migrations, models +import country_plan.models + class Migration(migrations.Migration): dependencies = [ - ('country_plan', '0002_alter_countryplan_is_publish'), + ("country_plan", "0002_alter_countryplan_is_publish"), ] operations = [ migrations.AlterField( - model_name='countryplan', - name='internal_plan_file', - field=models.FileField(blank=True, null=True, upload_to=country_plan.models.pdf_upload_to, validators=[django.core.validators.FileExtensionValidator(['pdf'])], verbose_name='Internal Plan'), + model_name="countryplan", + name="internal_plan_file", + field=models.FileField( + blank=True, + null=True, + upload_to=country_plan.models.pdf_upload_to, + validators=[django.core.validators.FileExtensionValidator(["pdf"])], + verbose_name="Internal Plan", + ), ), migrations.AlterField( - model_name='countryplan', - name='public_plan_file', - field=models.FileField(blank=True, null=True, upload_to=country_plan.models.pdf_upload_to, validators=[django.core.validators.FileExtensionValidator(['pdf'])], verbose_name='Country Plan'), + model_name="countryplan", + name="public_plan_file", + field=models.FileField( + blank=True, + null=True, + upload_to=country_plan.models.pdf_upload_to, + validators=[django.core.validators.FileExtensionValidator(["pdf"])], + verbose_name="Country Plan", + ), ), migrations.AlterField( - model_name='strategicpriority', - name='type', - field=models.CharField(choices=[('ongoing_emergency_operations', 'Ongoing emergency operations'), ('climate_and_environmental_crisis', 'Climate and environmental crisis'), ('evolving_crisis_and_disasters', 'Evolving crisis and disasters'), ('growing_gaps_in_health_and_wellbeing', 'Growing gaps in health and wellbeing'), ('migration_and_identity', 'Migration and Identity'), ('value_power_and_inclusion', 'Value power and inclusion')], max_length=100, verbose_name='Type'), + model_name="strategicpriority", + name="type", + field=models.CharField( + choices=[ + ("ongoing_emergency_operations", "Ongoing emergency operations"), + ("climate_and_environmental_crisis", "Climate and environmental crisis"), + ("evolving_crisis_and_disasters", "Evolving crisis and disasters"), + ("growing_gaps_in_health_and_wellbeing", "Growing gaps in health and wellbeing"), + ("migration_and_identity", "Migration and Identity"), + ("value_power_and_inclusion", "Value power and inclusion"), + ], + max_length=100, + verbose_name="Type", + ), ), ] diff --git a/country_plan/migrations/0004_countryplan_appeal_api_inserted_date.py b/country_plan/migrations/0004_countryplan_appeal_api_inserted_date.py index d6e5b87c3..002add99f 100644 --- a/country_plan/migrations/0004_countryplan_appeal_api_inserted_date.py +++ b/country_plan/migrations/0004_countryplan_appeal_api_inserted_date.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('country_plan', '0003_auto_20221128_0831'), + ("country_plan", "0003_auto_20221128_0831"), ] operations = [ migrations.AddField( - model_name='countryplan', - name='appeal_api_inserted_date', + model_name="countryplan", + name="appeal_api_inserted_date", field=models.DateTimeField(blank=True, null=True), ), ] diff --git a/country_plan/migrations/0005_auto_20230207_0840.py b/country_plan/migrations/0005_auto_20230207_0840.py index c530f40c8..4ad27a6b6 100644 --- a/country_plan/migrations/0005_auto_20230207_0840.py +++ b/country_plan/migrations/0005_auto_20230207_0840.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('country_plan', '0004_countryplan_appeal_api_inserted_date'), + ("country_plan", "0004_countryplan_appeal_api_inserted_date"), ] operations = [ migrations.RenameField( - model_name='countryplan', - old_name='appeal_api_inserted_date', - new_name='public_plan_inserted_date', + model_name="countryplan", + old_name="appeal_api_inserted_date", + new_name="public_plan_inserted_date", ), migrations.AddField( - model_name='countryplan', - name='internal_plan_inserted_date', + model_name="countryplan", + name="internal_plan_inserted_date", field=models.DateTimeField(blank=True, null=True), ), ] diff --git a/country_plan/migrations/0006_alter_countryplan_created_by_and_more.py b/country_plan/migrations/0006_alter_countryplan_created_by_and_more.py index 8e3df5730..46743e56a 100644 --- a/country_plan/migrations/0006_alter_countryplan_created_by_and_more.py +++ b/country_plan/migrations/0006_alter_countryplan_created_by_and_more.py @@ -1,36 +1,68 @@ # Generated by Django 4.2.13 on 2024-05-19 13:47 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('country_plan', '0005_auto_20230207_0840'), + ("country_plan", "0005_auto_20230207_0840"), ] operations = [ migrations.AlterField( - model_name='countryplan', - name='created_by', - field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By'), + model_name="countryplan", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), ), migrations.AlterField( - model_name='countryplan', - name='updated_by', - field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Updated by'), + model_name="countryplan", + name="updated_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Updated by", + ), ), migrations.AlterField( - model_name='dataimport', - name='created_by', - field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By'), + model_name="dataimport", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), ), migrations.AlterField( - model_name='dataimport', - name='updated_by', - field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Updated by'), + model_name="dataimport", + name="updated_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Updated by", + ), ), ] diff --git a/country_plan/models.py b/country_plan/models.py index 816b3af5f..8b78bcf37 100644 --- a/country_plan/models.py +++ b/country_plan/models.py @@ -1,50 +1,50 @@ -from django.db import models, transaction from django.contrib.auth.models import User +from django.core.validators import FileExtensionValidator +from django.db import models, transaction from django.utils import timezone from django.utils.translation import gettext_lazy as _ -from django.core.validators import FileExtensionValidator from api.models import Country def file_upload_to(instance, filename): - date_str = timezone.now().strftime('%Y-%m-%d-%H-%M-%S') - return f'country-plan-excel-files/{date_str}/{filename}' + date_str = timezone.now().strftime("%Y-%m-%d-%H-%M-%S") + return f"country-plan-excel-files/{date_str}/{filename}" def pdf_upload_to(instance, filename): - date_str = timezone.now().strftime('%Y-%m-%d-%H-%M-%S') - return f'country-plan-pdf/{date_str}/{filename}' + date_str = timezone.now().strftime("%Y-%m-%d-%H-%M-%S") + return f"country-plan-pdf/{date_str}/{filename}" class CountryPlanAbstract(models.Model): created_by = models.ForeignKey( User, - verbose_name=_('Created By'), + verbose_name=_("Created By"), blank=True, null=True, - related_name='%(class)s_created_by', + related_name="%(class)s_created_by", on_delete=models.SET_NULL, editable=False, ) - created_at = models.DateTimeField(verbose_name=_('Created at'), auto_now_add=True) + created_at = models.DateTimeField(verbose_name=_("Created at"), auto_now_add=True) updated_by = models.ForeignKey( User, - verbose_name=_('Updated by'), + verbose_name=_("Updated by"), blank=True, null=True, - related_name='%(class)s_updated_by', + related_name="%(class)s_updated_by", on_delete=models.SET_NULL, editable=False, ) - updated_at = models.DateTimeField(verbose_name=_('Updated at'), auto_now=True) + updated_at = models.DateTimeField(verbose_name=_("Updated at"), auto_now=True) class Meta: abstract = True class DataImport(CountryPlanAbstract): - file = models.FileField(verbose_name=_('EXCEL file'), upload_to=file_upload_to) + file = models.FileField(verbose_name=_("EXCEL file"), upload_to=file_upload_to) errors = models.JSONField(null=True, blank=True) def __str__(self): @@ -52,55 +52,50 @@ def __str__(self): def save(self, *args, **kwargs): from .tasks import process_data_import + new = False if self.pk is None: new = True super().save(*args, **kwargs) if new: - transaction.on_commit( - lambda: process_data_import.delay(self.pk) - ) + transaction.on_commit(lambda: process_data_import.delay(self.pk)) class CountryPlan(CountryPlanAbstract): - country = models.OneToOneField(Country, on_delete=models.CASCADE, related_name='country_plan', primary_key=True) + country = models.OneToOneField(Country, on_delete=models.CASCADE, related_name="country_plan", primary_key=True) internal_plan_file = models.FileField( - verbose_name=_('Internal Plan'), + verbose_name=_("Internal Plan"), upload_to=pdf_upload_to, - validators=[FileExtensionValidator(['pdf'])], - blank=True, null=True + validators=[FileExtensionValidator(["pdf"])], + blank=True, + null=True, ) public_plan_file = models.FileField( - verbose_name=_('Country Plan'), - validators=[FileExtensionValidator(['pdf'])], + verbose_name=_("Country Plan"), + validators=[FileExtensionValidator(["pdf"])], upload_to=pdf_upload_to, - blank=True, null=True + blank=True, + null=True, ) - requested_amount = models.FloatField(verbose_name=_('Requested Amount'), blank=True, null=True) - people_targeted = models.IntegerField(verbose_name=_('People Targeted'), blank=True, null=True) - is_publish = models.BooleanField(default=False, verbose_name=_('Published')) + requested_amount = models.FloatField(verbose_name=_("Requested Amount"), blank=True, null=True) + people_targeted = models.IntegerField(verbose_name=_("People Targeted"), blank=True, null=True) + is_publish = models.BooleanField(default=False, verbose_name=_("Published")) # NOTE: Used to sync with Appeal API (ingest_country_plan_file.py for more info) public_plan_inserted_date = models.DateTimeField(blank=True, null=True) internal_plan_inserted_date = models.DateTimeField(blank=True, null=True) def __str__(self): - return f'{self.country}' + return f"{self.country}" def full_country_plan_mc(self): all_mc = list(self.country_plan_mc.all()) - mc_by_ns_sector = { - (mc.national_society_id, mc.sector): mc - for mc in all_mc - } - ns_ids = set([ - mc.national_society_id - for mc in all_mc - ]) + mc_by_ns_sector = {(mc.national_society_id, mc.sector): mc for mc in all_mc} + ns_ids = set([mc.national_society_id for mc in all_mc]) return [ ( - mc_by_ns_sector.get((nc_id, sector)) or - MembershipCoordination( + mc_by_ns_sector.get((nc_id, sector)) + or MembershipCoordination( national_society_id=nc_id, sector=sector, ) @@ -112,52 +107,53 @@ def full_country_plan_mc(self): class StrategicPriority(models.Model): class Type(models.TextChoices): - ONGOING_EMERGENCY_OPERATIONS = 'ongoing_emergency_operations', _('Ongoing emergency operations') - CLIMATE_AND_ENVIRONMENTAL_CRISIS = 'climate_and_environmental_crisis', _('Climate and environmental crisis') - EVOLVING_CRISIS_AND_DISASTERS = 'evolving_crisis_and_disasters', _('Evolving crisis and disasters') - GROWING_GAPS_IN_HEALTH_AND_WELLBEING = 'growing_gaps_in_health_and_wellbeing', _('Growing gaps in health and wellbeing') - MIGRATION_AND_IDENTITY = 'migration_and_identity', _('Migration and Identity') - VALUE_POWER_AND_INCLUSION = 'value_power_and_inclusion', _('Value power and inclusion') + ONGOING_EMERGENCY_OPERATIONS = "ongoing_emergency_operations", _("Ongoing emergency operations") + CLIMATE_AND_ENVIRONMENTAL_CRISIS = "climate_and_environmental_crisis", _("Climate and environmental crisis") + EVOLVING_CRISIS_AND_DISASTERS = "evolving_crisis_and_disasters", _("Evolving crisis and disasters") + GROWING_GAPS_IN_HEALTH_AND_WELLBEING = "growing_gaps_in_health_and_wellbeing", _("Growing gaps in health and wellbeing") + MIGRATION_AND_IDENTITY = "migration_and_identity", _("Migration and Identity") + VALUE_POWER_AND_INCLUSION = "value_power_and_inclusion", _("Value power and inclusion") country_plan = models.ForeignKey( - CountryPlan, on_delete=models.CASCADE, - verbose_name=_('Country Plan'), - related_name='country_plan_sp', + CountryPlan, + on_delete=models.CASCADE, + verbose_name=_("Country Plan"), + related_name="country_plan_sp", ) - type = models.CharField(max_length=100, choices=Type.choices, verbose_name=_('Type')) - funding_requirement = models.FloatField(verbose_name=_('Funding Requirement'), blank=True, null=True) - people_targeted = models.IntegerField(verbose_name=_('People Targeted'), blank=True, null=True) + type = models.CharField(max_length=100, choices=Type.choices, verbose_name=_("Type")) + funding_requirement = models.FloatField(verbose_name=_("Funding Requirement"), blank=True, null=True) + people_targeted = models.IntegerField(verbose_name=_("People Targeted"), blank=True, null=True) class Meta: - unique_together = ('country_plan', 'type') + unique_together = ("country_plan", "type") def __str__(self): - return f'{self.type}' + return f"{self.type}" class MembershipCoordination(models.Model): class Sector(models.TextChoices): - CLIMATE = 'climate', _('Climate') - CRISIS = 'crisis', _('Crisis') - HEALTH = 'health', _('Health') - MIGRATION = 'migration', _('Migration') - INCLUSION = 'inclusion', _('Inclusion') - ENGAGED = 'engaged', _('Engaged') - ACCOUNTABLE = 'accountable', _('Accountable') - TRUSTED = 'trusted', _('Trusted') + CLIMATE = "climate", _("Climate") + CRISIS = "crisis", _("Crisis") + HEALTH = "health", _("Health") + MIGRATION = "migration", _("Migration") + INCLUSION = "inclusion", _("Inclusion") + ENGAGED = "engaged", _("Engaged") + ACCOUNTABLE = "accountable", _("Accountable") + TRUSTED = "trusted", _("Trusted") country_plan = models.ForeignKey( CountryPlan, on_delete=models.CASCADE, - verbose_name=_('Country Plan'), - related_name='country_plan_mc', + verbose_name=_("Country Plan"), + related_name="country_plan_mc", ) - sector = models.CharField(max_length=100, choices=Sector.choices, verbose_name=_('Sector')) - national_society = models.ForeignKey(Country, on_delete=models.CASCADE, related_name='national_society_mc') + sector = models.CharField(max_length=100, choices=Sector.choices, verbose_name=_("Sector")) + national_society = models.ForeignKey(Country, on_delete=models.CASCADE, related_name="national_society_mc") has_coordination = models.BooleanField(default=False) class Meta: - unique_together = ('country_plan', 'national_society', 'sector') + unique_together = ("country_plan", "national_society", "sector") def __str__(self): - return f'{self.national_society.iso3}-{self.sector}' + return f"{self.national_society.iso3}-{self.sector}" diff --git a/country_plan/serializers.py b/country_plan/serializers.py index 029d6018a..a87d8d65e 100644 --- a/country_plan/serializers.py +++ b/country_plan/serializers.py @@ -1,73 +1,68 @@ from rest_framework import serializers -from .models import ( - CountryPlan, - StrategicPriority, - MembershipCoordination, -) from utils.file_check import validate_file_type +from .models import CountryPlan, MembershipCoordination, StrategicPriority + class StrategicPrioritySerializer(serializers.ModelSerializer): - type_display = serializers.CharField(source='get_type_display', read_only=True) + type_display = serializers.CharField(source="get_type_display", read_only=True) class Meta: model = StrategicPriority fields = ( - 'id', - 'country_plan', - 'type', - 'type_display', - 'funding_requirement', - 'people_targeted', + "id", + "country_plan", + "type", + "type_display", + "funding_requirement", + "people_targeted", ) # NOTE: Defined to be used with CountryPlanViewset class MembershipCoordinationSerializer(serializers.ModelSerializer): - sector_display = serializers.CharField(source='get_sector_display', read_only=True) + sector_display = serializers.CharField(source="get_sector_display", read_only=True) national_society_name = serializers.CharField(read_only=True) class Meta: model = MembershipCoordination fields = ( - 'id', - 'country_plan', - 'national_society', - 'national_society_name', - 'sector', - 'sector_display', - 'has_coordination', + "id", + "country_plan", + "national_society", + "national_society_name", + "sector", + "sector_display", + "has_coordination", ) # NOTE: Defined to be used with CountryPlanViewset class CountryPlanSerializer(serializers.ModelSerializer): - strategic_priorities = StrategicPrioritySerializer(source='country_plan_sp', many=True, read_only=True) - membership_coordinations = MembershipCoordinationSerializer(source='full_country_plan_mc', many=True, read_only=True) + strategic_priorities = StrategicPrioritySerializer(source="country_plan_sp", many=True, read_only=True) + membership_coordinations = MembershipCoordinationSerializer(source="full_country_plan_mc", many=True, read_only=True) internal_plan_file = serializers.SerializerMethodField() class Meta: model = CountryPlan fields = ( - 'country', - 'internal_plan_file', - 'public_plan_file', - 'requested_amount', - 'people_targeted', - 'is_publish', + "country", + "internal_plan_file", + "public_plan_file", + "requested_amount", + "people_targeted", + "is_publish", # Manual Defined - 'strategic_priorities', - 'membership_coordinations', + "strategic_priorities", + "membership_coordinations", ) def get_internal_plan_file(self, obj): file = obj.internal_plan_file - request = self.context['request'] + request = self.context["request"] if request.user.is_authenticated and file.name: - return request.build_absolute_uri( - serializers.FileField().to_representation(file) - ) + return request.build_absolute_uri(serializers.FileField().to_representation(file)) def validate_internal_plan_file(self, internal_plan_file): validate_file_type(internal_plan_file) diff --git a/country_plan/tasks.py b/country_plan/tasks.py index 228917b65..e7e737a05 100644 --- a/country_plan/tasks.py +++ b/country_plan/tasks.py @@ -1,76 +1,68 @@ -import re import logging -import pandas as pd import operator +import re from functools import reduce +import pandas as pd from celery import shared_task -from django.db import transaction, models +from django.db import models, transaction + +from api.models import Country, CountryType -from api.models import CountryType -from .models import ( - DataImport, - CountryPlan, - StrategicPriority, - MembershipCoordination -) -from api.models import Country +from .models import CountryPlan, DataImport, MembershipCoordination, StrategicPriority logger = logging.getLogger(__name__) -class CountryPlanImporter(): +class CountryPlanImporter: CSV_COLUMN = [ - 'ISO3', - 'Country', - 'Ongoing emergency operations', - 'SP1 - Climate and environmental crisis', - 'SP2 - Evolving crises and disasters', - 'SP3 - Growing gaps in health and wellbeing', - 'SP4 - Migration and identity', - 'SP5 - Values, power, and inclusion', - 'Max of people to be reached ', - 'SP1', - 'SP2', - 'SP3', - 'SP4', - 'SP5', - 'EA1', - 'EA2', - 'EA3', - 'TOTAL\nFUNDING REQUIREMENTS', + "ISO3", + "Country", + "Ongoing emergency operations", + "SP1 - Climate and environmental crisis", + "SP2 - Evolving crises and disasters", + "SP3 - Growing gaps in health and wellbeing", + "SP4 - Migration and identity", + "SP5 - Values, power, and inclusion", + "Max of people to be reached ", + "SP1", + "SP2", + "SP3", + "SP4", + "SP5", + "EA1", + "EA2", + "EA3", + "TOTAL\nFUNDING REQUIREMENTS", ] SP_COLUMN = [ - 'SP1', - 'SP2', - 'SP3', - 'SP4', - 'SP5', - 'EA1', - 'EA2', - 'EA3', + "SP1", + "SP2", + "SP3", + "SP4", + "SP5", + "EA1", + "EA2", + "EA3", ] @staticmethod def _process_number(number): - if number in ('', None): + if number in ("", None): return None if type(number) in [float, int]: return number # Some specific cases using regex - value_search = re.search(r'(?P(\d+(?:\.\d+)?))?\s?(?P[MKB])', number) - if value_search is None or ( - value_search.group('value') is None or - value_search.group('expression') is None - ): + value_search = re.search(r"(?P(\d+(?:\.\d+)?))?\s?(?P[MKB])", number) + if value_search is None or (value_search.group("value") is None or value_search.group("expression") is None): return pd.to_numeric(number) - value = pd.to_numeric(value_search.group('value')) - expression = value_search.group('expression') + value = pd.to_numeric(value_search.group("value")) + expression = value_search.group("expression") EXPRESSION_MULTIPLIER = { - 'K': 1000, - 'M': 1000000, - 'B': 1000000000, + "K": 1000, + "M": 1000000, + "B": 1000000000, } return value * EXPRESSION_MULTIPLIER[expression] @@ -101,25 +93,18 @@ def _save_country_plan(cls, row): sp_column_ns_type_map = dict(zip(cls.SP_COLUMN, MembershipCoordination.Sector)) membership_coordination_ids = [] for sp in cls.SP_COLUMN: - national_societies_str = set([ - name.strip() - for name in str(sp_column_n_society_map[sp] or '').split(',') - if name.strip() - ]) + national_societies_str = set( + [name.strip() for name in str(sp_column_n_society_map[sp] or "").split(",") if name.strip()] + ) if not national_societies_str: continue countries_qs = Country.objects.filter( - reduce( - operator.or_, ( - models.Q(society_name__icontains=name) - for name in national_societies_str - ) - ), + reduce(operator.or_, (models.Q(society_name__icontains=name) for name in national_societies_str)), record_type=CountryType.COUNTRY, in_search=True, ) # TODO: Better error handling - missing_ns_in_db = set(national_societies_str) - set(countries_qs.values_list('society_name', flat=True)) + missing_ns_in_db = set(national_societies_str) - set(countries_qs.values_list("society_name", flat=True)) if missing_ns_in_db: raise Exception(f"Missing NS in the database: {missing_ns_in_db}") for country in countries_qs.all(): @@ -132,10 +117,9 @@ def _save_country_plan(cls, row): membership_coordination.save() membership_coordination_ids.append(membership_coordination.id) # Update dangling membership coordination - MembershipCoordination.objects\ - .filter(country_plan=country_plan)\ - .exclude(id__in=membership_coordination_ids)\ - .update(has_coordination=False) + MembershipCoordination.objects.filter(country_plan=country_plan).exclude(id__in=membership_coordination_ids).update( + has_coordination=False + ) @classmethod def process(cls, file): @@ -148,11 +132,13 @@ def process(cls, file): with transaction.atomic(): cls._save_country_plan(row) except Exception as e: - logger.error(f'Failed to import Country-Plan: iso3:{row.ISO3}', exc_info=True) - errors.append(dict( - iso3=row.ISO3, - error=str(e), - )) + logger.error(f"Failed to import Country-Plan: iso3:{row.ISO3}", exc_info=True) + errors.append( + dict( + iso3=row.ISO3, + error=str(e), + ) + ) return errors diff --git a/country_plan/tests/test_commands.py b/country_plan/tests/test_commands.py index 1c336c11d..6a01f7791 100644 --- a/country_plan/tests/test_commands.py +++ b/country_plan/tests/test_commands.py @@ -1,88 +1,92 @@ from unittest import mock + from django.core.management import call_command -from main.test_case import APITestCase from api.factories.country import CountryFactory from country_plan.factories import CountryPlanFactory +from country_plan.management.commands.ingest_country_plan_file import ( + INTERNAL_SOURCE, + PUBLIC_SOURCE, +) from country_plan.models import CountryPlan -from country_plan.management.commands.ingest_country_plan_file import PUBLIC_SOURCE, INTERNAL_SOURCE +from main.test_case import APITestCase # NOTE: Only defined used fields -FILE_BASE_DIRECTORY = 'https://example.org/Download.aspx?FileId=' +FILE_BASE_DIRECTORY = "https://example.org/Download.aspx?FileId=" PUBLIC_APPEAL_COUNTRY_PLAN_MOCK_RESPONSE = [ { - 'BaseDirectory': FILE_BASE_DIRECTORY, - 'BaseFileName': '000000', - 'Inserted': '2022-11-29T11:24:00', - 'LocationCountryCode': 'SY', - 'LocationCountryName': 'Syrian Arab Republic' + "BaseDirectory": FILE_BASE_DIRECTORY, + "BaseFileName": "000000", + "Inserted": "2022-11-29T11:24:00", + "LocationCountryCode": "SY", + "LocationCountryName": "Syrian Arab Republic", }, { - 'BaseDirectory': FILE_BASE_DIRECTORY, - 'BaseFileName': '000001', - 'Inserted': '2022-11-29T11:24:00', - 'LocationCountryCode': 'CD', - 'LocationCountryName': 'Congo, The Democratic Republic Of The' + "BaseDirectory": FILE_BASE_DIRECTORY, + "BaseFileName": "000001", + "Inserted": "2022-11-29T11:24:00", + "LocationCountryCode": "CD", + "LocationCountryName": "Congo, The Democratic Republic Of The", }, # Not included in INTERNAL { - 'BaseDirectory': FILE_BASE_DIRECTORY, - 'BaseFileName': '000002', - 'Inserted': '2022-11-29T11:24:00', - 'LocationCountryCode': 'MM', - 'LocationCountryName': 'Myanmar' + "BaseDirectory": FILE_BASE_DIRECTORY, + "BaseFileName": "000002", + "Inserted": "2022-11-29T11:24:00", + "LocationCountryCode": "MM", + "LocationCountryName": "Myanmar", }, { - 'BaseDirectory': FILE_BASE_DIRECTORY, - 'BaseFileName': '000003', - 'Inserted': '2022-11-29T11:24:00', - 'LocationCountryCode': 'TM', - 'LocationCountryName': 'Turkmenistan' + "BaseDirectory": FILE_BASE_DIRECTORY, + "BaseFileName": "000003", + "Inserted": "2022-11-29T11:24:00", + "LocationCountryCode": "TM", + "LocationCountryName": "Turkmenistan", }, { - 'BaseDirectory': FILE_BASE_DIRECTORY, - 'BaseFileName': '000004', - 'Inserted': '2022-11-29T11:24:00', - 'LocationCountryCode': 'GR', - 'LocationCountryName': 'Greece' + "BaseDirectory": FILE_BASE_DIRECTORY, + "BaseFileName": "000004", + "Inserted": "2022-11-29T11:24:00", + "LocationCountryCode": "GR", + "LocationCountryName": "Greece", }, { - 'BaseDirectory': FILE_BASE_DIRECTORY, - 'BaseFileName': 'NOOP', - 'Inserted': '2022-11-29T11:24:00', - 'LocationCountryCode': 'XY', - 'LocationCountryName': 'Myanmar' + "BaseDirectory": FILE_BASE_DIRECTORY, + "BaseFileName": "NOOP", + "Inserted": "2022-11-29T11:24:00", + "LocationCountryCode": "XY", + "LocationCountryName": "Myanmar", }, ] INTERNAL_APPEAL_COUNTRY_PLAN_MOCK_RESPONSE = [ { - 'BaseDirectory': FILE_BASE_DIRECTORY, - 'BaseFileName': '000000', - 'Inserted': '2022-11-29T11:24:00', - 'LocationCountryCode': 'SY', - 'LocationCountryName': 'Syrian Arab Republic' + "BaseDirectory": FILE_BASE_DIRECTORY, + "BaseFileName": "000000", + "Inserted": "2022-11-29T11:24:00", + "LocationCountryCode": "SY", + "LocationCountryName": "Syrian Arab Republic", }, { - 'BaseDirectory': FILE_BASE_DIRECTORY, - 'BaseFileName': '000001', - 'Inserted': '2022-11-29T11:24:00', - 'LocationCountryCode': 'CD', - 'LocationCountryName': 'Congo, The Democratic Republic Of The' + "BaseDirectory": FILE_BASE_DIRECTORY, + "BaseFileName": "000001", + "Inserted": "2022-11-29T11:24:00", + "LocationCountryCode": "CD", + "LocationCountryName": "Congo, The Democratic Republic Of The", }, # Not included in PUBLIC { - 'BaseDirectory': FILE_BASE_DIRECTORY, - 'BaseFileName': '000001', - 'Inserted': '2022-11-29T11:24:00', - 'LocationCountryCode': 'NP', - 'LocationCountryName': 'Nepal' + "BaseDirectory": FILE_BASE_DIRECTORY, + "BaseFileName": "000001", + "Inserted": "2022-11-29T11:24:00", + "LocationCountryCode": "NP", + "LocationCountryName": "Nepal", }, ] -class MockResponse(): - class FileStream(): +class MockResponse: + class FileStream: def __init__(self, stream): self.stream = stream @@ -118,52 +122,54 @@ def mock_request(url, *_, **kwargs): if url == INTERNAL_SOURCE: return MockResponse(json=INTERNAL_APPEAL_COUNTRY_PLAN_MOCK_RESPONSE) if url.startswith(FILE_BASE_DIRECTORY): - return MockResponse(stream=[b'']) + return MockResponse(stream=[b""]) def mock_request_head(url, *_, **kwargs): headers = { - 'Content-Type': 'application/pdf', - 'Content-Disposition': 'attachment;filename=Sample_document_2023.pdf', + "Content-Type": "application/pdf", + "Content-Disposition": "attachment;filename=Sample_document_2023.pdf", } - if url.endswith('NOOP'): - headers['Content-Type'] = 'html/text' - elif url.endswith('000004'): - headers['Content-Disposition'] = '' + if url.endswith("NOOP"): + headers["Content-Type"] = "html/text" + elif url.endswith("000004"): + headers["Content-Disposition"] = "" return MockResponse(headers=headers) - @mock.patch('country_plan.management.commands.ingest_country_plan_file.requests.head', side_effect=mock_request_head) - @mock.patch('country_plan.management.commands.ingest_country_plan_file.requests.get', side_effect=mock_request) - @mock.patch('main.utils.requests.get', side_effect=mock_request) + @mock.patch("country_plan.management.commands.ingest_country_plan_file.requests.head", side_effect=mock_request_head) + @mock.patch("country_plan.management.commands.ingest_country_plan_file.requests.get", side_effect=mock_request) + @mock.patch("main.utils.requests.get", side_effect=mock_request) def test_country_plan_ingest(self, *_): CountryPlanFactory.create( country=CountryFactory.create( - name='Random Country', - iso='RC', + name="Random Country", + iso="RC", ), ) EXISTING_CP = 1 - for country_iso in set([ - item['LocationCountryCode'] + for country_iso in set( + [ + item["LocationCountryCode"] for item in [ *PUBLIC_APPEAL_COUNTRY_PLAN_MOCK_RESPONSE, *INTERNAL_APPEAL_COUNTRY_PLAN_MOCK_RESPONSE, ] - ]): - if country_iso == 'CD': + ] + ): + if country_iso == "CD": # Not create country for this continue CountryFactory.create(iso=country_iso) # Before assert CountryPlan.objects.count() == EXISTING_CP assert CountryPlan.objects.filter(is_publish=True).count() == 0 - assert CountryPlan.objects.exclude(public_plan_file='').count() == 0 - call_command('ingest_country_plan_file') + assert CountryPlan.objects.exclude(public_plan_file="").count() == 0 + call_command("ingest_country_plan_file") # After assert CountryPlan.objects.count() == EXISTING_CP + 5 assert CountryPlan.objects.filter(is_publish=True).count() == 5 - assert CountryPlan.objects.exclude(public_plan_file='').count() == 4 - assert CountryPlan.objects.exclude(internal_plan_file='').count() == 2 + assert CountryPlan.objects.exclude(public_plan_file="").count() == 4 + assert CountryPlan.objects.exclude(internal_plan_file="").count() == 2 # First downloaded document. Others will have Sample_document_2023{random-chars}.pdf - assert CountryPlan.objects.filter(country__iso='SY').first().public_plan_file.name.endswith('Sample_document_2023.pdf') + assert CountryPlan.objects.filter(country__iso="SY").first().public_plan_file.name.endswith("Sample_document_2023.pdf") # Without attachment filename - assert CountryPlan.objects.filter(country__iso='GR').first().public_plan_file.name.endswith('document.pdf') + assert CountryPlan.objects.filter(country__iso="GR").first().public_plan_file.name.endswith("document.pdf") diff --git a/databank/admin.py b/databank/admin.py index a20a15af7..db26de8b9 100644 --- a/databank/admin.py +++ b/databank/admin.py @@ -3,27 +3,21 @@ from .forms import CountryOverviewForm, SeasonalCalenderForm from .models import ( + AcapsSeasonalCalender, CountryKeyClimate, - Month, CountryOverview, - - SocialEvent, - KeyClimateEvent, - SeasonalCalender, - - KeyDocumentGroup, - KeyDocument, ExternalSource, - AcapsSeasonalCalender, - FDRSIncome, FDRSAnnualIncome, + FDRSIncome, + KeyClimateEvent, + KeyDocument, + KeyDocumentGroup, + Month, + SeasonalCalender, + SocialEvent, ) - -admin.site.register([ - CountryKeyClimate, - KeyDocumentGroup -]) +admin.site.register([CountryKeyClimate, KeyDocumentGroup]) class SocialEventInline(admin.TabularInline): @@ -51,6 +45,7 @@ class ExternalSourceInine(admin.TabularInline): class AcapsSeasonalCalenderInline(admin.TabularInline): model = AcapsSeasonalCalender + class FDRSIncomeInline(admin.TabularInline): model = FDRSIncome @@ -61,9 +56,9 @@ class FDRSAnnualIncomeInline(admin.TabularInline): @admin.register(CountryOverview) class CountryOverviewAdmin(admin.ModelAdmin): - autocomplete_fields = ('country',) - search_fields = ('country__name',) - list_display = ('country',) + autocomplete_fields = ("country",) + search_fields = ("country__name",) + list_display = ("country",) inlines = [ SocialEventInline, KeyClimateEventByInline, @@ -72,25 +67,30 @@ class CountryOverviewAdmin(admin.ModelAdmin): ExternalSourceInine, AcapsSeasonalCalenderInline, FDRSIncomeInline, - FDRSAnnualIncomeInline + FDRSAnnualIncomeInline, ] form = CountryOverviewForm fieldsets = ( - (None, {'fields': ('country',)}), - (_('COUNTRY KEY INDICATORS (SOURCE: FDRS)'), { - 'fields': ( - 'population', 'urban_population', 'gdp', - 'gnipc', 'poverty', 'life_expectancy', 'literacy', - ) - }), - (_('NATIONAL SOCIETY INDICATORS (SOURCE: FDRS)'), { - 'fields': ( - 'income', - 'expenditures', - 'volunteers', - 'trained_in_first_aid', - 'branches' - ), - }), - (_('KEY CLIMATE EVENT'), {'fields': ('avg_temperature', 'avg_rainfall_precipitation', 'rainy_season')}), + (None, {"fields": ("country",)}), + ( + _("COUNTRY KEY INDICATORS (SOURCE: FDRS)"), + { + "fields": ( + "population", + "urban_population", + "gdp", + "gnipc", + "poverty", + "life_expectancy", + "literacy", + ) + }, + ), + ( + _("NATIONAL SOCIETY INDICATORS (SOURCE: FDRS)"), + { + "fields": ("income", "expenditures", "volunteers", "trained_in_first_aid", "branches"), + }, + ), + (_("KEY CLIMATE EVENT"), {"fields": ("avg_temperature", "avg_rainfall_precipitation", "rainy_season")}), ) diff --git a/databank/apps.py b/databank/apps.py index 71f17586e..b8793c15a 100644 --- a/databank/apps.py +++ b/databank/apps.py @@ -1,7 +1,7 @@ -from django.utils.translation import gettext_lazy as _ from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class DatabankConfig(AppConfig): - name = 'databank' - verbose_name = _('databank') + name = "databank" + verbose_name = _("databank") diff --git a/databank/filter_set.py b/databank/filter_set.py index e04ca81d5..2a662a91d 100644 --- a/databank/filter_set.py +++ b/databank/filter_set.py @@ -5,8 +5,14 @@ class FDRSIncomeFilter(filters.FilterSet): country = filters.NumberFilter(field_name="overview__country") - date__lte = filters.DateFilter(field_name="date", lookup_expr="lte",) - date__gte = filters.DateFilter(field_name="date", lookup_expr="gte",) + date__lte = filters.DateFilter( + field_name="date", + lookup_expr="lte", + ) + date__gte = filters.DateFilter( + field_name="date", + lookup_expr="gte", + ) class Meta: model = FDRSIncome diff --git a/databank/forms.py b/databank/forms.py index 8a5e7ac87..e5ced40b4 100644 --- a/databank/forms.py +++ b/databank/forms.py @@ -7,17 +7,17 @@ class CountryOverviewForm(forms.ModelForm): class Meta: model = CountryOverview - fields = '__all__' + fields = "__all__" class SeasonalCalenderForm(forms.ModelForm): def clean_date_end(self): - start = self.cleaned_data['date_start'] - end = self.cleaned_data['date_end'] + start = self.cleaned_data["date_start"] + end = self.cleaned_data["date_end"] if start >= end: - raise forms.ValidationError(gettext('Invalid End Date')) + raise forms.ValidationError(gettext("Invalid End Date")) return end class Meta: model = SeasonalCalender - fields = '__all__' + fields = "__all__" diff --git a/databank/management/commands/FDRS_INCOME.py b/databank/management/commands/FDRS_INCOME.py index c5535688b..e103c3b63 100644 --- a/databank/management/commands/FDRS_INCOME.py +++ b/databank/management/commands/FDRS_INCOME.py @@ -1,20 +1,16 @@ import logging -import requests +import requests from django.conf import settings from django.core.management.base import BaseCommand -from databank.models import ( - CountryOverview, - FDRSIncome, - FDRSIndicator -) +from databank.models import CountryOverview, FDRSIncome, FDRSIndicator logger = logging.getLogger(__name__) class Command(BaseCommand): - help = 'Import FDRS income data' + help = "Import FDRS income data" def handle(self, *args, **kwargs): fdrs_indicator_enum_data = { @@ -34,27 +30,27 @@ def handle(self, *args, **kwargs): "other_CHF": "Other", } FDRS_INDICATORS = [key for key in fdrs_indicator_enum_data] - map_indicators = { - indicator.title: indicator - for indicator in FDRSIndicator.objects.all() - } + map_indicators = {indicator.title: indicator for indicator in FDRSIndicator.objects.all()} for overview in CountryOverview.objects.all(): country_fdrs_code = overview.country.fdrs - FDRS_DATA_API_ENDPOINT = f'https://data-api.ifrc.org/api/data?apiKey={settings.FDRS_APIKEY}&KPI_Don_Code={country_fdrs_code}&indicator=' + ','.join(FDRS_INDICATORS) + FDRS_DATA_API_ENDPOINT = ( + f"https://data-api.ifrc.org/api/data?apiKey={settings.FDRS_APIKEY}&KPI_Don_Code={country_fdrs_code}&indicator=" + + ",".join(FDRS_INDICATORS) + ) fdrs_entities = requests.get(FDRS_DATA_API_ENDPOINT) if fdrs_entities.status_code != 200: return fdrs_entities.raise_for_status() fdrs_entities = fdrs_entities.json() - for d in fdrs_entities['data']: + for d in fdrs_entities["data"]: indicator = next(iter(d.values())) - income_list = d['data'][0]['data'] + income_list = d["data"][0]["data"] if len(income_list): for income in income_list: data = { - 'date': str(income['year']) + '-01-01', - 'value': income['value'], - 'indicator': map_indicators.get(fdrs_indicator_enum_data.get(indicator)), - 'overview': overview + "date": str(income["year"]) + "-01-01", + "value": income["value"], + "indicator": map_indicators.get(fdrs_indicator_enum_data.get(indicator)), + "overview": overview, } FDRSIncome.objects.create(**data) diff --git a/databank/management/commands/fdrs_annual_income.py b/databank/management/commands/fdrs_annual_income.py index b6d90b4fc..f17ed925f 100644 --- a/databank/management/commands/fdrs_annual_income.py +++ b/databank/management/commands/fdrs_annual_income.py @@ -1,36 +1,32 @@ import logging -import requests +import requests from django.conf import settings from django.core.management.base import BaseCommand from databank.models import CountryOverview, FDRSAnnualIncome - logger = logging.getLogger(__name__) + class Command(BaseCommand): - help = 'Import FDRS income data' + help = "Import FDRS income data" def handle(self, *args, **kwargs): for overview in CountryOverview.objects.all(): country_fdrs_code = overview.country.fdrs - fdrs_api = f'https://data-api.ifrc.org/api/data?indicator=KPI_IncomeLC_CHF&KPI_Don_Code={country_fdrs_code}&apiKey={settings.FDRS_APIKEY}' + fdrs_api = f"https://data-api.ifrc.org/api/data?indicator=KPI_IncomeLC_CHF&KPI_Don_Code={country_fdrs_code}&apiKey={settings.FDRS_APIKEY}" fdrs_entities = requests.get(fdrs_api) if fdrs_entities.status_code != 200: return fdrs_entities.raise_for_status() fdrs_entities = fdrs_entities.json() fdrs_data_count = 0 - if len(fdrs_entities['data']): - income_list = fdrs_entities['data'][0]['data'][0]['data'] + if len(fdrs_entities["data"]): + income_list = fdrs_entities["data"][0]["data"][0]["data"] if len(income_list): for income in income_list: - data = { - 'date': str(income['year']) + '-01-01', - 'value': income['value'], - 'overview': overview - } + data = {"date": str(income["year"]) + "-01-01", "value": income["value"], "overview": overview} fdrs_data_count += 1 FDRSAnnualIncome.objects.get_or_create(**data) - logger.info(f"Successfully created {fdrs_data_count} country data") \ No newline at end of file + logger.info(f"Successfully created {fdrs_data_count} country data") diff --git a/databank/management/commands/ingest_acaps.py b/databank/management/commands/ingest_acaps.py index 8f27f13ad..7ca6bfc42 100644 --- a/databank/management/commands/ingest_acaps.py +++ b/databank/management/commands/ingest_acaps.py @@ -1,49 +1,46 @@ -import requests import datetime as dt -import xmltodict -import pandas as pd import time -from dateutil.parser import parse -from django.core.management.base import BaseCommand +import pandas as pd +import requests +import xmltodict +from dateutil.parser import parse from django.conf import settings +from django.core.management.base import BaseCommand -from api.models import Country, CountryType, CronJob, CronJobStatus, DisasterType from api.logger import logger -from databank.models import CountryOverview, AcapsSeasonalCalender +from api.models import Country, CountryType, CronJob, CronJobStatus, DisasterType +from databank.models import AcapsSeasonalCalender, CountryOverview class Command(BaseCommand): - help = 'Add Acaps seasonal calender data' + help = "Add Acaps seasonal calender data" def handle(self, *args, **kwargs): - logger.info('Importing Acaps Data') - country_name = CountryOverview.objects.filter(country__record_type=CountryType.COUNTRY).values_list('country__name', flat=True) + logger.info("Importing Acaps Data") + country_name = CountryOverview.objects.filter(country__record_type=CountryType.COUNTRY).values_list( + "country__name", flat=True + ) for name in country_name: - if ',' in name: - name = name.split(',')[0] + if "," in name: + name = name.split(",")[0] SEASONAL_EVENTS_API = f"https://api.acaps.org/api/v1/seasonal-events-calendar/seasonal-calendar/?country={name}" - response = requests.get( - SEASONAL_EVENTS_API, - headers={ - "Authorization": "Token %s" % settings.ACAPS_API_TOKEN - } - ) - logger.info(f'Importing for country {name}') + response = requests.get(SEASONAL_EVENTS_API, headers={"Authorization": "Token %s" % settings.ACAPS_API_TOKEN}) + logger.info(f"Importing for country {name}") response_data = response.json() - if 'results' in response_data and len(response_data['results']): + if "results" in response_data and len(response_data["results"]): df = pd.DataFrame.from_records(response_data["results"]) for df_data in df.values.tolist(): df_country = df_data[2] if name.lower() == df_country[0].lower(): dict_data = { - 'overview': CountryOverview.objects.filter(country__name__icontains=name).first(), - 'month': df_data[6], - 'event': df_data[7], - 'event_type': df_data[8], - 'label': df_data[9], - 'source': df_data[11], - 'source_date': df_data[12] + "overview": CountryOverview.objects.filter(country__name__icontains=name).first(), + "month": df_data[6], + "event": df_data[7], + "event_type": df_data[8], + "label": df_data[9], + "source": df_data[11], + "source_date": df_data[12], } AcapsSeasonalCalender.objects.create(**dict_data) - time.sleep(5) \ No newline at end of file + time.sleep(5) diff --git a/databank/management/commands/ingest_climate.py b/databank/management/commands/ingest_climate.py index c1f30af3f..8bd433419 100644 --- a/databank/management/commands/ingest_climate.py +++ b/databank/management/commands/ingest_climate.py @@ -1,6 +1,6 @@ import logging -import requests +import requests from django.core.management.base import BaseCommand from api.models import CountryType @@ -10,48 +10,48 @@ class Command(BaseCommand): - help = 'Add minimum, maximum and Average temperature of country temperature data from source api' + help = "Add minimum, maximum and Average temperature of country temperature data from source api" def handle(self, *args, **options): for co in CountryOverview.objects.filter(country__record_type=CountryType.COUNTRY, country__iso3__isnull=False).all(): country_iso3 = co.country.iso3 if country_iso3: - response = requests.get(f'https://climateknowledgeportal.worldbank.org/api/v1/cru-x0.5_climatology_tasmin,tas,tasmax,pr_climatology_monthly_1991-2020_mean_historical_cru_ts4.07_mean/{country_iso3}?_format=json') + response = requests.get( + f"https://climateknowledgeportal.worldbank.org/api/v1/cru-x0.5_climatology_tasmin,tas,tasmax,pr_climatology_monthly_1991-2020_mean_historical_cru_ts4.07_mean/{country_iso3}?_format=json" + ) response.raise_for_status() try: response_data = response.json() - data = response_data.get('data', {}) + data = response_data.get("data", {}) if data: - precipation = data.get('pr', {}) - average_temp = data.get('tas', {}) - min_temp = data.get('tasmin', {}) - max_temp = data.get('tasmax', {}) + precipation = data.get("pr", {}) + average_temp = data.get("tas", {}) + min_temp = data.get("tasmin", {}) + max_temp = data.get("tasmax", {}) merged_data = { country: { date: ( precipation[country][date], average_temp[country][date], min_temp[country][date], - max_temp[country][date] + max_temp[country][date], ) for date in precipation[country] - } for country in precipation + } + for country in precipation } for key, value in merged_data.items(): for k, v in value.items(): - year_month = k.split('-') + year_month = k.split("-") data = { - 'year': year_month[0], - 'month': year_month[1], - 'max_temp': v[3], - 'min_temp': v[2], - 'avg_temp': v[1], - 'precipitation': v[0] + "year": year_month[0], + "month": year_month[1], + "max_temp": v[3], + "min_temp": v[2], + "avg_temp": v[1], + "precipitation": v[0], } - CountryKeyClimate.objects.create( - overview=co, - **data - ) + CountryKeyClimate.objects.create(overview=co, **data) except Exception as ex: - logger.error('Error in ingesting climate data', exc_info=True) + logger.error("Error in ingesting climate data", exc_info=True) continue diff --git a/databank/management/commands/ingest_databank.py b/databank/management/commands/ingest_databank.py index 58fe1805e..ea404bbf4 100644 --- a/databank/management/commands/ingest_databank.py +++ b/databank/management/commands/ingest_databank.py @@ -1,24 +1,18 @@ import datetime import logging + from django.core.management.base import BaseCommand from django.utils import timezone from api.models import Country, CronJob, CronJobStatus from databank.models import CountryOverview -from .sources import ( - FDRS, - FTS_HPC, - INFORM, - RELIEFWEB, - START_NETWORK, - WB, -) +from .sources import FDRS, FTS_HPC, INFORM, RELIEFWEB, START_NETWORK, WB logger = logging.getLogger(__name__) SOURCES = [ - (s, s.__name__.split('.')[-1]) + (s, s.__name__.split(".")[-1]) for s in ( FDRS, FTS_HPC, @@ -39,74 +33,82 @@ def load(self): # Prefetch Data try: - print('\nPrefetching from sources:: ') + print("\nPrefetching from sources:: ") for source, name in SOURCES: - if hasattr(source, 'prefetch'): + if hasattr(source, "prefetch"): start = datetime.datetime.now() - print(f'\t -> {name}', end='') + print(f"\t -> {name}", end="") prefetch_response = source.prefetch() if prefetch_response is not None: source_prefetch_data[source.__name__], item_count, sources = prefetch_response # Log success prefetch - CronJob.sync_cron({ - 'name': name, - 'message': f'Done querying {name}' + ( - sources and f' using sources: {sources}' - ) or '', - 'num_result': item_count, - 'status': CronJobStatus.SUCCESSFUL, - }) - print(f' [{datetime.datetime.now() - start}]') + CronJob.sync_cron( + { + "name": name, + "message": f"Done querying {name}" + (sources and f" using sources: {sources}") or "", + "num_result": item_count, + "status": CronJobStatus.SUCCESSFUL, + } + ) + print(f" [{datetime.datetime.now() - start}]") except Exception as ex: - CronJob.sync_cron({ - 'name': 'ingest_databank', - 'message': f'Could not prefetch from sources\n\nException:\n{str(ex)}', - 'status': CronJobStatus.ERRONEOUS, - }) + CronJob.sync_cron( + { + "name": "ingest_databank", + "message": f"Could not prefetch from sources\n\nException:\n{str(ex)}", + "status": CronJobStatus.ERRONEOUS, + } + ) # Load try: - print('\nLoading Sources data into GO DB:: ') + print("\nLoading Sources data into GO DB:: ") for source, name in SOURCES: - if hasattr(source, 'global_load'): - print(f'\t -> {name}', end='') + if hasattr(source, "global_load"): + print(f"\t -> {name}", end="") source.global_load(source_prefetch_data.get(source.__name__)) - print(f' [{datetime.datetime.now() - start}]') + print(f" [{datetime.datetime.now() - start}]") index, country_count = 1, Country.objects.count() - print('\nLoading Sources data for each country to GO DB:: ') - for country in Country.objects.prefetch_related('countryoverview').all(): - print(u'\t -> ({}/{}) {}'.format(index, country_count, str(country))) + print("\nLoading Sources data for each country to GO DB:: ") + for country in Country.objects.prefetch_related("countryoverview").all(): + print("\t -> ({}/{}) {}".format(index, country_count, str(country))) overview = ( - country.countryoverview if hasattr(country, 'countryoverview') else - CountryOverview.objects.create(country=country) + country.countryoverview + if hasattr(country, "countryoverview") + else CountryOverview.objects.create(country=country) ) overview.script_modified_at = timezone.now() for source, name in SOURCES: - if hasattr(source, 'load'): - print(f'\t\t -> {name}', end='') + if hasattr(source, "load"): + print(f"\t\t -> {name}", end="") # Load For each country source_data = source_prefetch_data.get(source.__name__) start = datetime.datetime.now() source.load(country, overview, source_data) - print(f' [{datetime.datetime.now() - start}]') + print(f" [{datetime.datetime.now() - start}]") overview.save() index += 1 # This source can not be checked/logged via prefetch, that is why we do it here, after the "load". - if name == 'FTS_HPC': - CronJob.sync_cron({ - 'name': name, - 'message': f'Done querying {name} data feeds', - 'num_result': index, "status": CronJobStatus.SUCCESSFUL, - }) + if name == "FTS_HPC": + CronJob.sync_cron( + { + "name": name, + "message": f"Done querying {name} data feeds", + "num_result": index, + "status": CronJobStatus.SUCCESSFUL, + } + ) except Exception as ex: - CronJob.sync_cron({ - 'name': 'ingest_databank', - 'message': f'Could not load all data\n\nException:\n{str(ex)}', - 'status': CronJobStatus.ERRONEOUS, - }) + CronJob.sync_cron( + { + "name": "ingest_databank", + "message": f"Could not load all data\n\nException:\n{str(ex)}", + "status": CronJobStatus.ERRONEOUS, + } + ) def handle(self, *args, **kwargs): start = datetime.datetime.now() self.load() - print('Total time: ', datetime.datetime.now() - start) + print("Total time: ", datetime.datetime.now() - start) diff --git a/databank/management/commands/ingest_hdr.py b/databank/management/commands/ingest_hdr.py index bf2c42713..16da085b2 100644 --- a/databank/management/commands/ingest_hdr.py +++ b/databank/management/commands/ingest_hdr.py @@ -1,24 +1,25 @@ import logging + import requests from django.core.management.base import BaseCommand -from databank.models import CountryOverview as CO +from databank.models import CountryOverview as CO logger = logging.getLogger(__name__) class Command(BaseCommand): - help = 'Add HDR GII data' + help = "Add HDR GII data" def handle(self, *args, **kwargs): for overview in CO.objects.all(): - HDR_API = f'https://api.hdrdata.org/CountryIndicators/filter?country={overview.country.iso3}&year=2021&indicator=gii' + HDR_API = f"https://api.hdrdata.org/CountryIndicators/filter?country={overview.country.iso3}&year=2021&indicator=gii" hdr_entities = requests.get(HDR_API) if hdr_entities.status_code != 200: continue hdr_entities.raise_for_status() hdr_entities = hdr_entities.json() if len(hdr_entities): - hdr_gii = hdr_entities[0]['value'] + hdr_gii = hdr_entities[0]["value"] overview.hdr_gii = hdr_gii - overview.save(update_fields=['hdr_gii']) \ No newline at end of file + overview.save(update_fields=["hdr_gii"]) diff --git a/databank/management/commands/ingest_unicef.py b/databank/management/commands/ingest_unicef.py index 3981c6fcf..e675de694 100644 --- a/databank/management/commands/ingest_unicef.py +++ b/databank/management/commands/ingest_unicef.py @@ -1,23 +1,24 @@ import logging + import requests from django.core.management.base import BaseCommand -from databank.models import CountryOverview as CO +from databank.models import CountryOverview as CO logger = logging.getLogger(__name__) class Command(BaseCommand): - help = 'Add Unicef population data' + help = "Add Unicef population data" def handle(self, *args, **kwargs): for overview in CO.objects.all(): - UNICEF_API = f'https://sdmx.data.unicef.org/ws/public/sdmxapi/rest/data/UNICEF,DM,1.0/{overview.country.iso3}.DM_POP_U18._T._T.?format=sdmx-json' + UNICEF_API = f"https://sdmx.data.unicef.org/ws/public/sdmxapi/rest/data/UNICEF,DM,1.0/{overview.country.iso3}.DM_POP_U18._T._T.?format=sdmx-json" unicef_entities = requests.get(UNICEF_API) if unicef_entities.status_code != 200: continue unicef_entities.raise_for_status() unicef_entities = unicef_entities.json() - population_under_18 = unicef_entities['data']['dataSets'][0]['series']['0:0:0:0:0']['observations']['73'][0] + population_under_18 = unicef_entities["data"]["dataSets"][0]["series"]["0:0:0:0:0"]["observations"]["73"][0] overview.unicef_population_under_18 = float(population_under_18) * 1000 - overview.save(update_fields=['unicef_population_under_18']) \ No newline at end of file + overview.save(update_fields=["unicef_population_under_18"]) diff --git a/databank/management/commands/ingest_worldbank.py b/databank/management/commands/ingest_worldbank.py index b74cb8939..b0e5d3527 100644 --- a/databank/management/commands/ingest_worldbank.py +++ b/databank/management/commands/ingest_worldbank.py @@ -1,57 +1,60 @@ +import datetime +import json import logging + import requests from django.core.management.base import BaseCommand + +from api.models import Country, CountryType from databank.models import CountryOverview as CO + from .sources.utils import catch_error, get_country_by_iso3 -from api.models import Country, CountryType -import datetime -import json logger = logging.getLogger(__name__) class Command(BaseCommand): - help = 'Add Acaps seasonal calendar data' + help = "Add Acaps seasonal calendar data" def handle(self, *args, **kwargs): world_bank_indicator_map = ( - ('SP.POP.TOTL', CO.world_bank_population), - ('SP.POP.65UP.TO', CO.world_bank_population_above_age_65), - ('SP.POP.0014.TO', CO.world_bank_population_age_14), - ('SP.URB.TOTL.IN.ZS', CO.world_bank_urban_population_percentage), - ('NY.GDP.MKTP.CD', CO.world_bank_gdp), - ('NY.GNP.MKTP.CD', CO.world_bank_gni), - ('IQ.CPA.GNDR.XQ', CO.world_bank_gender_inequality_index), - ('SP.DYN.LE00.IN', CO.world_bank_life_expectancy), - ('SE.ADT.LITR.ZS', CO.world_bank_literacy_rate), - ('SI.POV.NAHC', CO.world_bank_poverty_rate), - ('NY.GNP.PCAP.CD', CO.world_bank_gni_capita) + ("SP.POP.TOTL", CO.world_bank_population), + ("SP.POP.65UP.TO", CO.world_bank_population_above_age_65), + ("SP.POP.0014.TO", CO.world_bank_population_age_14), + ("SP.URB.TOTL.IN.ZS", CO.world_bank_urban_population_percentage), + ("NY.GDP.MKTP.CD", CO.world_bank_gdp), + ("NY.GNP.MKTP.CD", CO.world_bank_gni), + ("IQ.CPA.GNDR.XQ", CO.world_bank_gender_inequality_index), + ("SP.DYN.LE00.IN", CO.world_bank_life_expectancy), + ("SE.ADT.LITR.ZS", CO.world_bank_literacy_rate), + ("SI.POV.NAHC", CO.world_bank_poverty_rate), + ("NY.GNP.PCAP.CD", CO.world_bank_gni_capita), ) world_bank_indicators = [indicator for indicator, _ in world_bank_indicator_map] country_dict = {} now = datetime.datetime.now() - daterange = f'{now.year - 3}:{now.year - 2}' # Data of 2022 + daterange = f"{now.year - 3}:{now.year - 2}" # Data of 2022 for country in Country.objects.filter( - iso3__isnull=False, - record_type=CountryType.COUNTRY, - region__isnull=False, - independent=True + iso3__isnull=False, record_type=CountryType.COUNTRY, region__isnull=False, independent=True ).exclude(iso3__in=["COK", "BAR", "NOR"]): country_iso3 = country.iso3 - print(f'Importing country {country_iso3}') + print(f"Importing country {country_iso3}") for indicator in world_bank_indicators: page = 1 # Reset the page for each indicator while True: try: - response = requests.get(f'https://api.worldbank.org/v2/country/{country_iso3}/indicator/{indicator}?date={daterange}', params={ - 'format': 'json', - 'source': 2, - 'per_page': 5000 - 1, # World Bank throws error on 5000 - 'page': page, - }) + response = requests.get( + f"https://api.worldbank.org/v2/country/{country_iso3}/indicator/{indicator}?date={daterange}", + params={ + "format": "json", + "source": 2, + "per_page": 5000 - 1, # World Bank throws error on 5000 + "page": page, + }, + ) except requests.exceptions.HTTPError as err: continue try: @@ -63,9 +66,9 @@ def handle(self, *args, **kwargs): if data: # Check if data_list is not None and has elements for pop_data in data: - geo_code = pop_data['countryiso3code'] - pop = pop_data['value'] - year = pop_data['date'] + geo_code = pop_data["countryiso3code"] + pop = pop_data["value"] + year = pop_data["date"] if len(geo_code) == 3: pcountry = get_country_by_iso3(geo_code) @@ -78,8 +81,8 @@ def handle(self, *args, **kwargs): if existing_data is None or existing_data[1] < year: country_dict[geo_id].append((pop, year, indicator)) logger.info(json.dumps(country_dict)) - if 'pages' in response.json()[0]: - if page >= response.json()[0]['pages']: + if "pages" in response.json()[0]: + if page >= response.json()[0]["pages"]: break page += 1 @@ -99,16 +102,16 @@ def handle(self, *args, **kwargs): overview.world_bank_gni_capita = indicators[10][0] overview.save( update_fields=[ - 'world_bank_population', - 'world_bank_population_above_age_65', - 'world_bank_population_age_14', - 'world_bank_urban_population_percentage', - 'world_bank_gdp', - 'world_bank_gni', - 'world_bank_gender_inequality_index', - 'world_bank_life_expectancy', - 'world_bank_literacy_rate', - 'world_bank_poverty_rate', - 'world_bank_gni_capita', + "world_bank_population", + "world_bank_population_above_age_65", + "world_bank_population_age_14", + "world_bank_urban_population_percentage", + "world_bank_gdp", + "world_bank_gni", + "world_bank_gender_inequality_index", + "world_bank_life_expectancy", + "world_bank_literacy_rate", + "world_bank_poverty_rate", + "world_bank_gni_capita", ] ) diff --git a/databank/management/commands/sources/FDRS.py b/databank/management/commands/sources/FDRS.py index ec32410f8..7d6988c97 100644 --- a/databank/management/commands/sources/FDRS.py +++ b/databank/management/commands/sources/FDRS.py @@ -1,9 +1,10 @@ import logging -import requests +import requests from django.conf import settings from databank.models import CountryOverview as CO + from .utils import catch_error logger = logging.getLogger(__name__) @@ -12,85 +13,84 @@ FDRS_INDICATORS_FIELD_MAP = ( # INFORM API Indicator, Databank Field # Country Key Indicators - ('Population', CO.population), - ('UrbPop', CO.urban_population), - ('GDP', CO.gdp), - ('GNIPC', CO.gnipc), - ('Poverty', CO.poverty), - ('LifeExp', CO.life_expectancy), - ('Literacy', CO.literacy), - + ("Population", CO.population), + ("UrbPop", CO.urban_population), + ("GDP", CO.gdp), + ("GNIPC", CO.gnipc), + ("Poverty", CO.poverty), + ("LifeExp", CO.life_expectancy), + ("Literacy", CO.literacy), # National Society Indicators (Using Script: FDRS API) - ('KPI_IncomeLC_CHF', CO.income), - ('KPI_expenditureLC_CHF', CO.expenditures), - ('KPI_PeopleVol_Tot', CO.volunteers), - ('KPI_TrainFA_Tot', CO.trained_in_first_aid), - ('KPI_noLocalUnits', CO.branches), - + ("KPI_IncomeLC_CHF", CO.income), + ("KPI_expenditureLC_CHF", CO.expenditures), + ("KPI_PeopleVol_Tot", CO.volunteers), + ("KPI_TrainFA_Tot", CO.trained_in_first_aid), + ("KPI_noLocalUnits", CO.branches), # volunteers - ('KPI_PeopleVol_M_age_13_17', CO.male_volunteer_age_13_17), - ('KPI_PeopleVol_M_age_18_29', CO.male_volunteer_age_18_29), - ('KPI_PeopleVol_M_age_18_49', CO.male_volunteer_age_18_49), - ('KPI_PeopleVol_M_age_30_39', CO.male_volunteer_age_30_39), - ('KPI_PeopleVol_M_age_40_49', CO.male_volunteer_age_40_49), - ('KPI_PeopleVol_M_age_50_59', CO.male_volunteer_age_50_59), - ('KPI_PeopleVol_M_age_6_12', CO.male_volunteer_age_6_12), - ('KPI_PeopleVol_M_age_60_69', CO.male_volunteer_age_60_69), - ('KPI_PeopleVol_M_age_70_79', CO.male_volunteer_age_70_79), - ('KPI_PeopleVol_M_age_80', CO.male_volunteer_age_80), - ('KPI_PeopleVol_M_age_Other', CO.male_volunteer_age_other), - ('KPI_PeopleVol_Tot_M', CO.male_volunteer_total), - ('KPI_PeopleVol_F_age_13_17', CO.female_volunteer_age_13_17), - ('KPI_PeopleVol_F_age_18_29', CO.female_volunteer_age_18_29), - ('KPI_PeopleVol_F_age_18_49', CO.female_volunteer_age_18_49), - ('KPI_PeopleVol_F_age_30_39', CO.female_volunteer_age_30_39), - ('KPI_PeopleVol_F_age_40_49', CO.female_volunteer_age_40_49), - ('KPI_PeopleVol_F_age_50_59', CO.female_volunteer_age_50_59), - ('KPI_PeopleVol_F_age_6_12', CO.female_volunteer_age_6_12), - ('KPI_PeopleVol_F_age_60_69', CO.female_volunteer_age_60_69), - ('KPI_PeopleVol_F_age_70_79', CO.female_volunteer_age_70_79), - ('KPI_PeopleVol_F_age_80', CO.female_volunteer_age_80), - ('KPI_PeopleVol_F_age_Other', CO.female_volunteer_age_other), - ('KPI_PeopleVol_Tot_F', CO.female_volunteer_total), - ('KPI_PeopleVol_Tot', CO.volunteer_total), - ('KPI_PeopleVol_Tot_age_6_12', CO.volunteer_age_6_12), - ('KPI_PeopleVol_Tot_age_13_17', CO.volunteer_age_13_17), - ('KPI_PeopleVol_Tot_age_18_29', CO.volunteer_age_18_29), - + ("KPI_PeopleVol_M_age_13_17", CO.male_volunteer_age_13_17), + ("KPI_PeopleVol_M_age_18_29", CO.male_volunteer_age_18_29), + ("KPI_PeopleVol_M_age_18_49", CO.male_volunteer_age_18_49), + ("KPI_PeopleVol_M_age_30_39", CO.male_volunteer_age_30_39), + ("KPI_PeopleVol_M_age_40_49", CO.male_volunteer_age_40_49), + ("KPI_PeopleVol_M_age_50_59", CO.male_volunteer_age_50_59), + ("KPI_PeopleVol_M_age_6_12", CO.male_volunteer_age_6_12), + ("KPI_PeopleVol_M_age_60_69", CO.male_volunteer_age_60_69), + ("KPI_PeopleVol_M_age_70_79", CO.male_volunteer_age_70_79), + ("KPI_PeopleVol_M_age_80", CO.male_volunteer_age_80), + ("KPI_PeopleVol_M_age_Other", CO.male_volunteer_age_other), + ("KPI_PeopleVol_Tot_M", CO.male_volunteer_total), + ("KPI_PeopleVol_F_age_13_17", CO.female_volunteer_age_13_17), + ("KPI_PeopleVol_F_age_18_29", CO.female_volunteer_age_18_29), + ("KPI_PeopleVol_F_age_18_49", CO.female_volunteer_age_18_49), + ("KPI_PeopleVol_F_age_30_39", CO.female_volunteer_age_30_39), + ("KPI_PeopleVol_F_age_40_49", CO.female_volunteer_age_40_49), + ("KPI_PeopleVol_F_age_50_59", CO.female_volunteer_age_50_59), + ("KPI_PeopleVol_F_age_6_12", CO.female_volunteer_age_6_12), + ("KPI_PeopleVol_F_age_60_69", CO.female_volunteer_age_60_69), + ("KPI_PeopleVol_F_age_70_79", CO.female_volunteer_age_70_79), + ("KPI_PeopleVol_F_age_80", CO.female_volunteer_age_80), + ("KPI_PeopleVol_F_age_Other", CO.female_volunteer_age_other), + ("KPI_PeopleVol_Tot_F", CO.female_volunteer_total), + ("KPI_PeopleVol_Tot", CO.volunteer_total), + ("KPI_PeopleVol_Tot_age_6_12", CO.volunteer_age_6_12), + ("KPI_PeopleVol_Tot_age_13_17", CO.volunteer_age_13_17), + ("KPI_PeopleVol_Tot_age_18_29", CO.volunteer_age_18_29), # Staff - ('KPI_PStaff_M_age_18_29', CO.male_staff_age_18_29), - ('KPI_PStaff_M_age_18_49', CO.male_staff_age_18_49), - ('KPI_PStaff_M_age_30_39', CO.male_staff_age_30_39), - ('KPI_PStaff_M_age_40_49', CO.male_staff_age_40_49), - ('KPI_PStaff_M_age_50_59', CO.male_staff_age_50_59), - ('KPI_PStaff_M_age_60_69', CO.male_staff_age_60_69), - ('KPI_PStaff_M_age_70_79', CO.male_staff_age_70_79), - ('KPI_PStaff_M_age_80', CO.male_staff_age_80), - ('KPI_PStaff_M_age_Other', CO.male_staff_age_other), - ('KPI_PStaff_Tot_M', CO.male_staff_total), - ('KPI_PStaff_F_age_18_29', CO.female_staff_age_18_29), - ('KPI_PStaff_F_age_18_49', CO.female_staff_age_18_49), - ('KPI_PStaff_F_age_30_39', CO.female_staff_age_30_39), - ('KPI_PStaff_F_age_40_49', CO.female_staff_age_40_49), - ('KPI_PStaff_F_age_50_59', CO.female_staff_age_50_59), - ('KPI_PStaff_F_age_60_69', CO.female_staff_age_60_69), - ('KPI_PStaff_F_age_70_79', CO.female_staff_age_70_79), - ('KPI_PStaff_F_age_80', CO.female_staff_age_80), - ('KPI_PStaff_F_age_Other', CO.female_staff_age_other), - ('KPI_PStaff_Tot_F', CO.female_staff_total), - ('KPI_PStaff_Tot', CO.staff_total), - ('KPI_PStaff_Tot_age_18_29', CO.staff_age_18_29) + ("KPI_PStaff_M_age_18_29", CO.male_staff_age_18_29), + ("KPI_PStaff_M_age_18_49", CO.male_staff_age_18_49), + ("KPI_PStaff_M_age_30_39", CO.male_staff_age_30_39), + ("KPI_PStaff_M_age_40_49", CO.male_staff_age_40_49), + ("KPI_PStaff_M_age_50_59", CO.male_staff_age_50_59), + ("KPI_PStaff_M_age_60_69", CO.male_staff_age_60_69), + ("KPI_PStaff_M_age_70_79", CO.male_staff_age_70_79), + ("KPI_PStaff_M_age_80", CO.male_staff_age_80), + ("KPI_PStaff_M_age_Other", CO.male_staff_age_other), + ("KPI_PStaff_Tot_M", CO.male_staff_total), + ("KPI_PStaff_F_age_18_29", CO.female_staff_age_18_29), + ("KPI_PStaff_F_age_18_49", CO.female_staff_age_18_49), + ("KPI_PStaff_F_age_30_39", CO.female_staff_age_30_39), + ("KPI_PStaff_F_age_40_49", CO.female_staff_age_40_49), + ("KPI_PStaff_F_age_50_59", CO.female_staff_age_50_59), + ("KPI_PStaff_F_age_60_69", CO.female_staff_age_60_69), + ("KPI_PStaff_F_age_70_79", CO.female_staff_age_70_79), + ("KPI_PStaff_F_age_80", CO.female_staff_age_80), + ("KPI_PStaff_F_age_Other", CO.female_staff_age_other), + ("KPI_PStaff_Tot_F", CO.female_staff_total), + ("KPI_PStaff_Tot", CO.staff_total), + ("KPI_PStaff_Tot_age_18_29", CO.staff_age_18_29), ) FDRS_INDICATORS = [indicator for indicator, _ in FDRS_INDICATORS_FIELD_MAP] # To fetch NS ID -FDRS_NS_API_ENDPOINT = f'https://data-api.ifrc.org/api/entities/ns?apiKey={settings.FDRS_APIKEY}' +FDRS_NS_API_ENDPOINT = f"https://data-api.ifrc.org/api/entities/ns?apiKey={settings.FDRS_APIKEY}" # To fetch NS Data using NS ID -FDRS_DATA_API_ENDPOINT = f'https://data-api.ifrc.org/api/data?apiKey={settings.FDRS_APIKEY}&indicator=' + ','.join(FDRS_INDICATORS) +FDRS_DATA_API_ENDPOINT = f"https://data-api.ifrc.org/api/data?apiKey={settings.FDRS_APIKEY}&indicator=" + ",".join( + FDRS_INDICATORS +) -@catch_error('Error occured while fetching from FDRS API.') +@catch_error("Error occured while fetching from FDRS API.") def prefetch(): fdrs_entities = requests.get(FDRS_NS_API_ENDPOINT) if fdrs_entities.status_code != 200: @@ -100,20 +100,22 @@ def prefetch(): ns_iso_map = { # ISO3 are missing for some in FDRS & IFRC-GO only have ISO2 for countries - ns['KPI_DON_code']: ns['iso_2'] + ns["KPI_DON_code"]: ns["iso_2"] for ns in fdrs_entities } - return { - # KEY -: {year: '', value: ''} - f"{ns_iso_map[ns_data['id']].upper()}-{indicator_data['id']}": ( - ns_data['data'][-1] if ( - ns_data['data'] and len(ns_data['data']) > 0 - ) else None - ) - for indicator_data in requests.get(FDRS_DATA_API_ENDPOINT).json()['data'] - for ns_data in indicator_data['data'] - }, len(ns_iso_map), FDRS_DATA_API_ENDPOINT + return ( + { + # KEY -: {year: '', value: ''} + f"{ns_iso_map[ns_data['id']].upper()}-{indicator_data['id']}": ( + ns_data["data"][-1] if (ns_data["data"] and len(ns_data["data"]) > 0) else None + ) + for indicator_data in requests.get(FDRS_DATA_API_ENDPOINT).json()["data"] + for ns_data in indicator_data["data"] + }, + len(ns_iso_map), + FDRS_DATA_API_ENDPOINT, + ) @catch_error() @@ -121,14 +123,14 @@ def load(country, overview, fdrs_data): if country.iso is None or fdrs_data is None: return - fdrs_data_fetched_year = max(int(item['year']) for item in fdrs_data.values()) + fdrs_data_fetched_year = max(int(item["year"]) for item in fdrs_data.values()) for fdrs_indicator, field in FDRS_INDICATORS_FIELD_MAP: - value = fdrs_data.get(f'{country.iso.upper()}-{fdrs_indicator}') + value = fdrs_data.get(f"{country.iso.upper()}-{fdrs_indicator}") setattr( overview, field.field.name, - value and value.get('value'), + value and value.get("value"), ) overview.fdrs_data_fetched_year = str(fdrs_data_fetched_year) overview.save() diff --git a/databank/management/commands/sources/FTS_HPC.py b/databank/management/commands/sources/FTS_HPC.py index c2eeaacc1..27f532385 100644 --- a/databank/management/commands/sources/FTS_HPC.py +++ b/databank/management/commands/sources/FTS_HPC.py @@ -1,17 +1,18 @@ import csv -import io import datetime +import io + import requests +from .utils import catch_error, get_country_by_iso2 + # from django.conf import settings # from api.utils import base64_encode -from .utils import catch_error, get_country_by_iso2 - -FTS_URL = 'https://api.hpc.tools/v1/public/fts/flow?countryISO3={0}&groupby=year&report=3' -EMERGENCY_URL = 'https://api.hpc.tools/v1/public/emergency/country/{0}' -GOOGLE_SHEET_URL = 'https://docs.google.com/spreadsheets/d/1MArQSVdbLXLaQ8ixUKo9jIjifTCVDDxTJYbGoRuw3Vw/gviz/tq?tqx=out:csv' +FTS_URL = "https://api.hpc.tools/v1/public/fts/flow?countryISO3={0}&groupby=year&report=3" +EMERGENCY_URL = "https://api.hpc.tools/v1/public/emergency/country/{0}" +GOOGLE_SHEET_URL = "https://docs.google.com/spreadsheets/d/1MArQSVdbLXLaQ8ixUKo9jIjifTCVDDxTJYbGoRuw3Vw/gviz/tq?tqx=out:csv" HEADERS = { # TODO: USE Crendentils here @@ -28,10 +29,10 @@ def prefetch(): gho_data = { f"{d['Country #country+code'].upper()}-{d['Year #date+year']}": { - 'people_in_need': d['PIN #inneed'], - 'people_targeted': d['PT #targeted'], - 'funding_total_usd': d['Funding #value+funding+total+usd'], - 'funding_required_usd': d['Requirements #value+funding+required+usd'], + "people_in_need": d["PIN #inneed"], + "people_targeted": d["PT #targeted"], + "funding_total_usd": d["Funding #value+funding+total+usd"], + "funding_required_usd": d["Requirements #value+funding+required+usd"], } for d in g_sheet_data } @@ -58,13 +59,13 @@ def load(country, overview, gho_data): c_data = {} # fundingTotals, pledgeTotals - for fund_area, fund_area_s in [('fundingTotals', 'funding_totals'), ('pledgeTotals', 'pledge_totals')]: - fund_area_data = fts_data['data']['report3'][fund_area]['objects'] + for fund_area, fund_area_s in [("fundingTotals", "funding_totals"), ("pledgeTotals", "pledge_totals")]: + fund_area_data = fts_data["data"]["report3"][fund_area]["objects"] if len(fund_area_data) > 0: - for v in fund_area_data[0]['objectsBreakdown']: + for v in fund_area_data[0]["objectsBreakdown"]: try: - year = int(v['name']) - totalFunding = v['totalFunding'] + year = int(v["name"]) + totalFunding = v["totalFunding"] except ValueError: continue if year not in c_data: @@ -74,23 +75,23 @@ def load(country, overview, gho_data): # numActivations CronJobSum = 0 - for v in emg_data['data']: + for v in emg_data["data"]: try: year = datetime.datetime.strptime( - v['date'].split('T')[0], - '%Y-%m-%d', + v["date"].split("T")[0], + "%Y-%m-%d", ).year except ValueError: continue if year not in c_data: - c_data[year] = {'numActivations': 1} + c_data[year] = {"numActivations": 1} else: - c_data[year]['numActivations'] = c_data[year].get('numActivations', 0) + 1 - CronJobSum += c_data[year]['numActivations'] + c_data[year]["numActivations"] = c_data[year].get("numActivations", 0) + 1 + CronJobSum += c_data[year]["numActivations"] overview.fts_data = [ { - 'year': year, + "year": year, **values, **gho_data.get(f"{pcountry.alpha_3.upper()}-{year}", {}), } diff --git a/databank/management/commands/sources/INFORM.py b/databank/management/commands/sources/INFORM.py index 1f57bfd93..92ac9409b 100644 --- a/databank/management/commands/sources/INFORM.py +++ b/databank/management/commands/sources/INFORM.py @@ -4,10 +4,9 @@ from .utils import catch_error, get_country_by_iso3 - INFORM_API_ENDPOINT = ( - 'https://drmkc.jrc.ec.europa.eu/inform-index/API/InformAPI/Countries/Scores/?Workflowid=261&indicatorId={}'.format( - ','.join([indicator for indicator, _ in InformIndicator.CHOICES]) + "https://drmkc.jrc.ec.europa.eu/inform-index/API/InformAPI/Countries/Scores/?Workflowid=261&indicatorId={}".format( + ",".join([indicator for indicator, _ in InformIndicator.CHOICES]) ) ) @@ -20,21 +19,20 @@ def prefetch(): response_d = response_d.json() for index, i_data in enumerate(response_d): - iso3 = i_data['Iso3'] + iso3 = i_data["Iso3"] pcountry = get_country_by_iso3(iso3) if pcountry is None: continue - indicator_id = i_data['IndicatorId'] - score = i_data['IndicatorScore'] + indicator_id = i_data["IndicatorId"] + score = i_data["IndicatorScore"] entry = { - 'id': index + 1, - 'indicator': indicator_id, - 'group': InformIndicator.get_group(indicator_id), - 'score': score, - - 'indicator_display': str(InformIndicator.LABEL_MAP.get(indicator_id)), - 'group_display': InformIndicator.get_group_display(indicator_id), + "id": index + 1, + "indicator": indicator_id, + "group": InformIndicator.get_group(indicator_id), + "score": score, + "indicator_display": str(InformIndicator.LABEL_MAP.get(indicator_id)), + "group_display": InformIndicator.get_group_display(indicator_id), } # Assuming indicator data are unique from the API diff --git a/databank/management/commands/sources/RELIEFWEB.py b/databank/management/commands/sources/RELIEFWEB.py index 07f6bb9f6..67da81807 100644 --- a/databank/management/commands/sources/RELIEFWEB.py +++ b/databank/management/commands/sources/RELIEFWEB.py @@ -1,40 +1,42 @@ -import logging import datetime import json +import logging + import requests -from databank.models import PastCrisesEvent, PastEpidemic, Month +from databank.models import Month, PastCrisesEvent, PastEpidemic + from .utils import catch_error, get_country_by_iso3 logger = logging.getLogger(__name__) -DISASTER_API = 'https://api.reliefweb.int/v1/disasters/' -RELIEFWEB_DATETIME_FORMAT = '%Y-%m-%d' +DISASTER_API = "https://api.reliefweb.int/v1/disasters/" +RELIEFWEB_DATETIME_FORMAT = "%Y-%m-%d" def parse_date(date): # Only works for reliefweb dates # For python >= 3.7 RELIEFWEB_DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S%z' - return datetime.datetime.strptime(date.split('T')[0], RELIEFWEB_DATETIME_FORMAT) + return datetime.datetime.strptime(date.split("T")[0], RELIEFWEB_DATETIME_FORMAT) def _crises_event_prefetch(): - query_params = json.dumps({ - 'limit': 1000, - 'filter': { - 'operator': 'AND', - 'conditions': [ - { - 'field': 'primary_type.code', - 'value': [type_code for type_code, _ in PastCrisesEvent.CHOICES], - 'operator': 'OR' - } - ] - }, - 'fields': { - 'include': ['date.created', 'primary_country.iso3', 'primary_type.code'] + query_params = json.dumps( + { + "limit": 1000, + "filter": { + "operator": "AND", + "conditions": [ + { + "field": "primary_type.code", + "value": [type_code for type_code, _ in PastCrisesEvent.CHOICES], + "operator": "OR", + } + ], + }, + "fields": {"include": ["date.created", "primary_country.iso3", "primary_type.code"]}, } - }) + ) url = DISASTER_API data = {} @@ -43,46 +45,46 @@ def _crises_event_prefetch(): response.raise_for_status() response = response.json() - for disaster in response['data']: - disaster = disaster['fields'] - iso3 = disaster['primary_country']['iso3'].upper() + for disaster in response["data"]: + disaster = disaster["fields"] + iso3 = disaster["primary_country"]["iso3"].upper() pcountry = get_country_by_iso3(iso3) if pcountry is None: continue iso2 = pcountry.alpha_2 - dt = parse_date(disaster['date']['created']) + dt = parse_date(disaster["date"]["created"]) disaster_data = { - 'event': disaster['primary_type']['code'], - 'year': dt.year, - 'month': dt.month, + "event": disaster["primary_type"]["code"], + "year": dt.year, + "month": dt.month, } if data.get(iso2) is None: data[iso2] = [disaster_data] else: data[iso2].append(disaster_data) - if 'next' not in response['links']: + if "next" not in response["links"]: break - url = response['links']['next']['href'] + url = response["links"]["next"]["href"] return data def _epidemics_prefetch(): - query_params = json.dumps({ - 'limit': 1000, - 'filter': { - 'operator': 'AND', - 'conditions': [ - { - 'field': 'primary_type.code', - 'value': ['EP'], - }, - ] - }, - 'fields': { - 'include': ['name', 'date.created', 'primary_country.iso3'] + query_params = json.dumps( + { + "limit": 1000, + "filter": { + "operator": "AND", + "conditions": [ + { + "field": "primary_type.code", + "value": ["EP"], + }, + ], + }, + "fields": {"include": ["name", "date.created", "primary_country.iso3"]}, } - }) + ) url = DISASTER_API data = {} @@ -91,15 +93,15 @@ def _epidemics_prefetch(): response.raise_for_status() response = response.json() - for epidemic in response['data']: - epidemic = epidemic['fields'] - iso3 = epidemic['primary_country']['iso3'].upper() + for epidemic in response["data"]: + epidemic = epidemic["fields"] + iso3 = epidemic["primary_country"]["iso3"].upper() pcountry = get_country_by_iso3(iso3) if pcountry is None: continue iso2 = pcountry.alpha_2 - dt = parse_date(epidemic['date']['created']) - name = epidemic['name'] + dt = parse_date(epidemic["date"]["created"]) + name = epidemic["name"] selected_epidemic_type = None # Simple Text Search @@ -110,9 +112,9 @@ def _epidemics_prefetch(): continue epidemic_data = { - 'epidemic': selected_epidemic_type, - 'year': dt.year, - 'month': dt.month, + "epidemic": selected_epidemic_type, + "year": dt.year, + "month": dt.month, } if data.get(iso2) is None: @@ -120,9 +122,9 @@ def _epidemics_prefetch(): else: data[iso2].append(epidemic_data) - if 'next' not in response['links']: + if "next" not in response["links"]: break - url = response['links']['next'] + url = response["links"]["next"] return data @@ -131,10 +133,14 @@ def prefetch(): crises_event = _crises_event_prefetch() epidemics = _epidemics_prefetch() - return { - 'crises_event': crises_event, - 'epidemics': epidemics, - }, len(crises_event) + len(epidemics), DISASTER_API + return ( + { + "crises_event": crises_event, + "epidemics": epidemics, + }, + len(crises_event) + len(epidemics), + DISASTER_API, + ) @catch_error() @@ -146,25 +152,25 @@ def load(country, overview, relief_data): overview.past_crises_events = [ { - 'id': index + 1, - 'event': data['event'], - 'year': data['year'], - 'month': data['month'], - - 'month_display': str(Month.LABEL_MAP.get(data['month'])), - 'event_display': str(PastCrisesEvent.LABEL_MAP.get(data['event'])), - } for index, data in enumerate(relief_data['crises_event'].get(iso2) or []) + "id": index + 1, + "event": data["event"], + "year": data["year"], + "month": data["month"], + "month_display": str(Month.LABEL_MAP.get(data["month"])), + "event_display": str(PastCrisesEvent.LABEL_MAP.get(data["event"])), + } + for index, data in enumerate(relief_data["crises_event"].get(iso2) or []) ] overview.past_epidemics = [ { - 'id': index + 1, - 'epidemic': data['epidemic'], - 'year': data['year'], - 'month': data['month'], - - 'month_display': str(Month.LABEL_MAP.get(data['month'])), - 'event_display': str(PastEpidemic.LABEL_MAP.get(data['epidemic'])), - } for index, data in enumerate(relief_data['epidemics'].get(iso2) or []) + "id": index + 1, + "epidemic": data["epidemic"], + "year": data["year"], + "month": data["month"], + "month_display": str(Month.LABEL_MAP.get(data["month"])), + "event_display": str(PastEpidemic.LABEL_MAP.get(data["epidemic"])), + } + for index, data in enumerate(relief_data["epidemics"].get(iso2) or []) ] overview.save() diff --git a/databank/management/commands/sources/START_NETWORK.py b/databank/management/commands/sources/START_NETWORK.py index 3fb7765ab..a41c88c37 100644 --- a/databank/management/commands/sources/START_NETWORK.py +++ b/databank/management/commands/sources/START_NETWORK.py @@ -1,20 +1,17 @@ -import re +import csv import datetime +import re + import requests -import csv from .utils import catch_error, get_country_by_name - -API_ENDPOINT = 'https://startnetwork.org/api/v1/start-fund-all-alerts' -DATE_FORMATS = ( - '%d %b %Y - %H:%S', - '%m/%d/%Y %H:%M' -) +API_ENDPOINT = "https://startnetwork.org/api/v1/start-fund-all-alerts" +DATE_FORMATS = ("%d %b %Y - %H:%S", "%m/%d/%Y %H:%M") def parse_amount(amount_in_string): - c_string = re.sub('[^0-9]', '', amount_in_string).strip() + c_string = re.sub("[^0-9]", "", amount_in_string).strip() if c_string: return int(c_string) @@ -38,20 +35,20 @@ def prefetch(): CronJobSum = 0 for row in csv.DictReader(rs): - if 'Alert' not in row and 'Alert type' not in row: # without these we are poor + if "Alert" not in row and "Alert type" not in row: # without these we are poor continue # Some value are like `Congo [DRC]` - country = get_country_by_name(row['Country'].split('[')[0].strip()) - date = parse_alert_date(row['Alert date']) + country = get_country_by_name(row["Country"].split("[")[0].strip()) + date = parse_alert_date(row["Alert date"]) if country is None or date is None: continue iso2 = country.alpha_2 alert_data = { - 'date': date.isoformat(), - 'alert': row['Alert'], - 'alert_type': row['Alert type'], - 'amount_awarded': parse_amount(row['Amount Awarded']) if 'Amount Awarded' in row else 0, - 'crisis_type': row['Crisis Type'] if 'Crisis Type' in row else '', + "date": date.isoformat(), + "alert": row["Alert"], + "alert_type": row["Alert type"], + "amount_awarded": parse_amount(row["Amount Awarded"]) if "Amount Awarded" in row else 0, + "crisis_type": row["Crisis Type"] if "Crisis Type" in row else "", } if data.get(iso2) is None: diff --git a/databank/management/commands/sources/WB.py b/databank/management/commands/sources/WB.py index ee0edf8f5..cfbf2151c 100644 --- a/databank/management/commands/sources/WB.py +++ b/databank/management/commands/sources/WB.py @@ -1,14 +1,14 @@ -import requests import datetime import logging +import requests + from api.models import District from .utils import catch_error, get_country_by_iso3 - logger = logging.getLogger(__name__) -API_ENDPOINT = 'https://api.worldbank.org/v2/country/ALL/indicator/SP.POP.TOTL' +API_ENDPOINT = "https://api.worldbank.org/v2/country/ALL/indicator/SP.POP.TOTL" @catch_error() @@ -18,22 +18,25 @@ def prefetch(): url = API_ENDPOINT page = 1 now = datetime.datetime.now() - daterange = f'{now.year - 10}:{now.year}' + daterange = f"{now.year - 10}:{now.year}" while True: # TODO: lastupdated - rs = requests.get(f'{url}?date={daterange}', params={ - 'format': 'json', - 'source': 2, - 'per_page': 5000 - 1, # WD throws error on 5000 - 'page': page, - }) + rs = requests.get( + f"{url}?date={daterange}", + params={ + "format": "json", + "source": 2, + "per_page": 5000 - 1, # WD throws error on 5000 + "page": page, + }, + ) rs.raise_for_status() rs = rs.json() for pop_data in rs[1]: - geo_code = pop_data['country']['id'] - pop = pop_data['value'] - year = pop_data['date'] - if len(geo_code) == 3: # Admin Level 0 + geo_code = pop_data["country"]["id"] + pop = pop_data["value"] + year = pop_data["date"] + if len(geo_code) == 3: # Admin Level 0 pcountry = get_country_by_iso3(geo_code) if pcountry is None: continue @@ -45,13 +48,13 @@ def prefetch(): if pcountry is None: continue iso2 = pcountry.alpha_2 - geo_id = f'{iso2}{geo_code[3:]}' + geo_id = f"{iso2}{geo_code[3:]}" geo_id = geo_id.upper() if data.get(geo_id) is None or data.get(geo_id)[1] < year: data[geo_id] = (pop, year) - if page >= rs[0]['pages']: + if page >= rs[0]["pages"]: break page += 1 return data, len(data), API_ENDPOINT @@ -70,7 +73,7 @@ def global_load(wd_data): continue district.wb_population = pop district.wb_year = year - district.save(update_fields=['wb_population', 'wb_year']) + district.save(update_fields=["wb_population", "wb_year"]) @catch_error() @@ -83,4 +86,4 @@ def load(country, overview, wd_data): return country.wb_population = pop country.wb_year = year - country.save(update_fields=['wb_population', 'wb_year']) + country.save(update_fields=["wb_population", "wb_year"]) diff --git a/databank/management/commands/sources/utils.py b/databank/management/commands/sources/utils.py index a1bcfa597..403f9eb06 100644 --- a/databank/management/commands/sources/utils.py +++ b/databank/management/commands/sources/utils.py @@ -1,11 +1,11 @@ -import pycountry import logging import traceback -from api.models import Country -from api.models import CronJob, CronJobStatus +import pycountry from django.db import transaction +from api.models import Country, CronJob, CronJobStatus + logger = logging.getLogger(__name__) @@ -14,44 +14,45 @@ def catch_error(error_message=None): def _dec(func): def _caller(*args, **kwargs): - source_name = func.__module__.split('.')[-1] - country = args[0] if ( - len(args) > 0 and isinstance(args[0], Country) - ) else None + source_name = func.__module__.split(".")[-1] + country = args[0] if (len(args) > 0 and isinstance(args[0], Country)) else None try: with transaction.atomic(): return func(*args, **kwargs) except Exception as e: # Log error to cronjob - CronJob.sync_cron({ - 'name': source_name, - 'message': ( - f'Error querying {source_name}.' + - (f' For Country: {country}.' if country else '') + - f'\n\n' + traceback.format_exc() - ), - 'status': CronJobStatus.ERRONEOUS, - }) + CronJob.sync_cron( + { + "name": source_name, + "message": ( + f"Error querying {source_name}." + + (f" For Country: {country}." if country else "") + + f"\n\n" + + traceback.format_exc() + ), + "status": CronJobStatus.ERRONEOUS, + } + ) logger.error( - f"Failed to load <{source_name}:{func.__name__}>" + ( - f'For Country: {country}' if country else '' - ) + ( - f' {error_message}' if error_message else '' - ), + f"Failed to load <{source_name}:{func.__name__}>" + + (f"For Country: {country}" if country else "") + + (f" {error_message}" if error_message else ""), exc_info=True, ) + _caller.__name__ = func.__name__ _caller.__module__ = func.__module__ return _caller + return _dec PYCOUNTRY_MISSED_COUNTRY = { - 'cape verde': 'CPV', - 'syria': 'SYR', - 'gaza strip': 'GAZ', - 'north korea': 'PRK', - 'netherlands antilles': 'ANT', + "cape verde": "CPV", + "syria": "SYR", + "gaza strip": "GAZ", + "north korea": "PRK", + "netherlands antilles": "ANT", # 'south korea': 'KOR', } @@ -63,9 +64,7 @@ def get_country_by_name(name): try: return pycountry.countries.lookup(name) except LookupError: - return pycountry.countries.get( - alpha_3=PYCOUNTRY_MISSED_COUNTRY[name.lower()] - ) + return pycountry.countries.get(alpha_3=PYCOUNTRY_MISSED_COUNTRY[name.lower()]) def get_country_by_iso2(iso2): diff --git a/databank/management/commands/sources/world_bank.py b/databank/management/commands/sources/world_bank.py index 5893c742e..e8d6d7fca 100644 --- a/databank/management/commands/sources/world_bank.py +++ b/databank/management/commands/sources/world_bank.py @@ -1,32 +1,34 @@ +import datetime import logging + import requests from django.conf import settings -import datetime - -from databank.models import CountryOverview as CO from api.models import Country +from databank.models import CountryOverview as CO + from .utils import catch_error, get_country_by_iso3 logger = logging.getLogger(__name__) WORLD_BANK_INDICATOR_MAP = ( - ('SP.POP.TOTL', CO.world_bank_population), - ('SP.POP.65UP.TO', CO.world_bank_population_above_age_65), - ('SP.POP.0014.TO', CO.world_bank_population_age_14), - ('SP.URB.TOTL.IN.ZS', CO.world_bank_urban_population_percentage), - ('NY.GDP.MKTP.CD', CO.world_bank_gdp), - ('NY.GNP.MKTP.CD', CO.world_bank_gni), - ('IQ.CPA.GNDR.XQ', CO.world_bank_gender_inequality_index), - ('SP.DYN.LE00.IN', CO.world_bank_life_expectancy), - ('SE.ADT.LITR.ZS', CO.world_bank_literacy_rate), + ("SP.POP.TOTL", CO.world_bank_population), + ("SP.POP.65UP.TO", CO.world_bank_population_above_age_65), + ("SP.POP.0014.TO", CO.world_bank_population_age_14), + ("SP.URB.TOTL.IN.ZS", CO.world_bank_urban_population_percentage), + ("NY.GDP.MKTP.CD", CO.world_bank_gdp), + ("NY.GNP.MKTP.CD", CO.world_bank_gni), + ("IQ.CPA.GNDR.XQ", CO.world_bank_gender_inequality_index), + ("SP.DYN.LE00.IN", CO.world_bank_life_expectancy), + ("SE.ADT.LITR.ZS", CO.world_bank_literacy_rate), ) WORLD_BANK_INDICATORS = [indicator for indicator, _ in WORLD_BANK_INDICATOR_MAP] WORLD_BANK_API = "" + @catch_error() def prefetch(): data = {} @@ -34,26 +36,29 @@ def prefetch(): url = WORLD_BANK_API page = 1 now = datetime.datetime.now() - daterange = f'{now.year - 1}:{now.year}' + daterange = f"{now.year - 1}:{now.year}" while True: - for country_name in Country.objects.values_list('iso3', flat=True): + for country_name in Country.objects.values_list("iso3", flat=True): for indicator in WORLD_BANK_INDICATORS: print(indicator) - rs = requests.get(f'https://api.worldbank.org/v2/country/{country_name}/indicator/{indicator}?date={daterange}', params={ - 'format': 'json', - 'source': 2, - 'per_page': 5000 - 1, # WD throws error on 5000 - 'page': page, - }) + rs = requests.get( + f"https://api.worldbank.org/v2/country/{country_name}/indicator/{indicator}?date={daterange}", + params={ + "format": "json", + "source": 2, + "per_page": 5000 - 1, # WD throws error on 5000 + "page": page, + }, + ) rs.raise_for_status() rs = rs.json() print(rs) for pop_data in rs[1]: - #print(pop_data, "!!!!!!!") - geo_code = pop_data['countryiso3code'] - pop = pop_data['value'] - year = pop_data['date'] - if len(geo_code) == 3: # Admin Level 0 + # print(pop_data, "!!!!!!!") + geo_code = pop_data["countryiso3code"] + pop = pop_data["value"] + year = pop_data["date"] + if len(geo_code) == 3: # Admin Level 0 pcountry = get_country_by_iso3(geo_code) if pcountry is None: continue @@ -63,12 +68,13 @@ def prefetch(): if data.get(geo_id) is None or data.get(geo_id)[1] < year: data[geo_id] = (pop, year, indicator) - if page >= rs[0]['pages']: + if page >= rs[0]["pages"]: break page += 1 print(data) return data, len(data), WORLD_BANK_API + @catch_error() def load(country, overview, wd_data): if not country.iso or wd_data is None: @@ -79,4 +85,4 @@ def load(country, overview, wd_data): return country.wb_population = pop country.wb_year = year - country.save(update_fields=['wb_population', 'wb_year']) \ No newline at end of file + country.save(update_fields=["wb_population", "wb_year"]) diff --git a/databank/migrations/0001_initial.py b/databank/migrations/0001_initial.py index 9c4af1b51..4f8646e94 100644 --- a/databank/migrations/0001_initial.py +++ b/databank/migrations/0001_initial.py @@ -2,8 +2,8 @@ import django.contrib.postgres.fields.jsonb import django.core.validators -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): @@ -11,79 +11,131 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('api', '0036_auto_20191215_0615'), + ("api", "0036_auto_20191215_0615"), ] operations = [ migrations.CreateModel( - name='CountryOverview', + name="CountryOverview", fields=[ - ('country', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='api.Country')), - ('script_modified_at', models.DateTimeField(blank=True, null=True)), - ('population', models.IntegerField(blank=True, null=True)), - ('gdp', models.FloatField(blank=True, null=True, verbose_name='GDP')), - ('gnipc', models.IntegerField(blank=True, null=True, verbose_name='GNI/CAPITA')), - ('life_expectancy', models.IntegerField(blank=True, null=True)), - ('urban_population', models.FloatField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], verbose_name='Urban POP (%)')), - ('poverty', models.FloatField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], verbose_name='Poverty (%)')), - ('literacy', models.FloatField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], verbose_name='Literacy (%)')), - ('income', models.FloatField(blank=True, null=True, verbose_name='Income (CHF)')), - ('expenditures', models.FloatField(blank=True, null=True, verbose_name='Expenditures (CHF)')), - ('volunteers', models.IntegerField(blank=True, null=True)), - ('trained_in_first_aid', models.IntegerField(blank=True, null=True)), - ('avg_temperature', models.FloatField(blank=True, null=True)), - ('avg_rainfall_precipitation', models.FloatField(blank=True, null=True)), - ('rainy_season', models.CharField(blank=True, choices=[('active', 'Active'), ('not_active', 'Not Active')], max_length=20, null=True)), - ('fts_data', django.db.models.JSONField(default=list)), - ('start_network_data', django.db.models.JSONField(default=list)), - ('past_crises_events', django.db.models.JSONField(default=list)), - ('past_epidemics', django.db.models.JSONField(default=list)), - ('inform_indicators', django.db.models.JSONField(default=list)), + ( + "country", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to="api.Country" + ), + ), + ("script_modified_at", models.DateTimeField(blank=True, null=True)), + ("population", models.IntegerField(blank=True, null=True)), + ("gdp", models.FloatField(blank=True, null=True, verbose_name="GDP")), + ("gnipc", models.IntegerField(blank=True, null=True, verbose_name="GNI/CAPITA")), + ("life_expectancy", models.IntegerField(blank=True, null=True)), + ( + "urban_population", + models.FloatField( + blank=True, + null=True, + validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], + verbose_name="Urban POP (%)", + ), + ), + ( + "poverty", + models.FloatField( + blank=True, + null=True, + validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], + verbose_name="Poverty (%)", + ), + ), + ( + "literacy", + models.FloatField( + blank=True, + null=True, + validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], + verbose_name="Literacy (%)", + ), + ), + ("income", models.FloatField(blank=True, null=True, verbose_name="Income (CHF)")), + ("expenditures", models.FloatField(blank=True, null=True, verbose_name="Expenditures (CHF)")), + ("volunteers", models.IntegerField(blank=True, null=True)), + ("trained_in_first_aid", models.IntegerField(blank=True, null=True)), + ("avg_temperature", models.FloatField(blank=True, null=True)), + ("avg_rainfall_precipitation", models.FloatField(blank=True, null=True)), + ( + "rainy_season", + models.CharField( + blank=True, choices=[("active", "Active"), ("not_active", "Not Active")], max_length=20, null=True + ), + ), + ("fts_data", django.db.models.JSONField(default=list)), + ("start_network_data", django.db.models.JSONField(default=list)), + ("past_crises_events", django.db.models.JSONField(default=list)), + ("past_epidemics", django.db.models.JSONField(default=list)), + ("inform_indicators", django.db.models.JSONField(default=list)), ], ), migrations.CreateModel( - name='KeyClimateEvent', + name="KeyClimateEvent", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('modified_at', models.DateTimeField(auto_now=True)), - ('month', models.PositiveSmallIntegerField(choices=[(1, 'January'), (2, 'February'), (3, 'March'), (4, 'April'), (5, 'May'), (6, 'June'), (7, 'July'), (8, 'August'), (9, 'September'), (10, 'October'), (11, 'November'), (12, 'December')])), - ('avg_max_temperature', models.FloatField()), - ('avg_min_temperature', models.FloatField()), - ('avg_rainfall_precipitation', models.FloatField()), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.CountryOverview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("modified_at", models.DateTimeField(auto_now=True)), + ( + "month", + models.PositiveSmallIntegerField( + choices=[ + (1, "January"), + (2, "February"), + (3, "March"), + (4, "April"), + (5, "May"), + (6, "June"), + (7, "July"), + (8, "August"), + (9, "September"), + (10, "October"), + (11, "November"), + (12, "December"), + ] + ), + ), + ("avg_max_temperature", models.FloatField()), + ("avg_min_temperature", models.FloatField()), + ("avg_rainfall_precipitation", models.FloatField()), + ("overview", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="databank.CountryOverview")), ], ), migrations.CreateModel( - name='SeasonalCalender', + name="SeasonalCalender", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('modified_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=20)), - ('sector', models.CharField(max_length=20)), - ('date_start', models.DateField()), - ('date_end', models.DateField()), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.CountryOverview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("modified_at", models.DateTimeField(auto_now=True)), + ("title", models.CharField(max_length=20)), + ("sector", models.CharField(max_length=20)), + ("date_start", models.DateField()), + ("date_end", models.DateField()), + ("overview", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="databank.CountryOverview")), ], ), migrations.CreateModel( - name='SocialEvent', + name="SocialEvent", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('label', models.CharField(max_length=255)), - ('value', models.CharField(max_length=255)), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.CountryOverview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("label", models.CharField(max_length=255)), + ("value", models.CharField(max_length=255)), + ("overview", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="databank.CountryOverview")), ], ), migrations.AlterUniqueTogether( - name='socialevent', - unique_together={('overview', 'label')}, + name="socialevent", + unique_together={("overview", "label")}, ), migrations.AlterUniqueTogether( - name='seasonalcalender', - unique_together={('overview', 'sector', 'title')}, + name="seasonalcalender", + unique_together={("overview", "sector", "title")}, ), migrations.AlterUniqueTogether( - name='keyclimateevent', - unique_together={('overview', 'month')}, + name="keyclimateevent", + unique_together={("overview", "month")}, ), ] diff --git a/databank/migrations/0002_auto_20200603_0613.py b/databank/migrations/0002_auto_20200603_0613.py index 3860d4968..2ac2ed38e 100644 --- a/databank/migrations/0002_auto_20200603_0613.py +++ b/databank/migrations/0002_auto_20200603_0613.py @@ -6,24 +6,24 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0001_initial'), + ("databank", "0001_initial"), ] operations = [ migrations.AlterModelOptions( - name='countryoverview', - options={'verbose_name': 'Country Overview', 'verbose_name_plural': 'Countries Overview'}, + name="countryoverview", + options={"verbose_name": "Country Overview", "verbose_name_plural": "Countries Overview"}, ), migrations.AlterModelOptions( - name='keyclimateevent', - options={'verbose_name': 'Key Client Event', 'verbose_name_plural': 'Key Client Events'}, + name="keyclimateevent", + options={"verbose_name": "Key Client Event", "verbose_name_plural": "Key Client Events"}, ), migrations.AlterModelOptions( - name='seasonalcalender', - options={'verbose_name': 'Seasonal Calender Record', 'verbose_name_plural': 'Seasonal Calender Records'}, + name="seasonalcalender", + options={"verbose_name": "Seasonal Calender Record", "verbose_name_plural": "Seasonal Calender Records"}, ), migrations.AlterModelOptions( - name='socialevent', - options={'verbose_name': 'Social Event', 'verbose_name_plural': 'Social Events'}, + name="socialevent", + options={"verbose_name": "Social Event", "verbose_name_plural": "Social Events"}, ), ] diff --git a/databank/migrations/0003_auto_20200618_0904.py b/databank/migrations/0003_auto_20200618_0904.py index 5aa527866..52fe9e52d 100644 --- a/databank/migrations/0003_auto_20200618_0904.py +++ b/databank/migrations/0003_auto_20200618_0904.py @@ -2,179 +2,222 @@ import django.contrib.postgres.fields.jsonb import django.core.validators -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('databank', '0002_auto_20200603_0613'), + ("databank", "0002_auto_20200603_0613"), ] operations = [ migrations.AlterModelOptions( - name='countryoverview', - options={'verbose_name': 'country overview', 'verbose_name_plural': 'countries overview'}, + name="countryoverview", + options={"verbose_name": "country overview", "verbose_name_plural": "countries overview"}, ), migrations.AlterField( - model_name='countryoverview', - name='avg_rainfall_precipitation', - field=models.FloatField(blank=True, null=True, verbose_name='average rainfall precipitation'), + model_name="countryoverview", + name="avg_rainfall_precipitation", + field=models.FloatField(blank=True, null=True, verbose_name="average rainfall precipitation"), ), migrations.AlterField( - model_name='countryoverview', - name='avg_temperature', - field=models.FloatField(blank=True, null=True, verbose_name='average temperature'), + model_name="countryoverview", + name="avg_temperature", + field=models.FloatField(blank=True, null=True, verbose_name="average temperature"), ), migrations.AlterField( - model_name='countryoverview', - name='expenditures', - field=models.FloatField(blank=True, null=True, verbose_name='expenditures (CHF)'), + model_name="countryoverview", + name="expenditures", + field=models.FloatField(blank=True, null=True, verbose_name="expenditures (CHF)"), ), migrations.AlterField( - model_name='countryoverview', - name='fts_data', - field=django.db.models.JSONField(default=list, verbose_name='FTS data'), + model_name="countryoverview", + name="fts_data", + field=django.db.models.JSONField(default=list, verbose_name="FTS data"), ), migrations.AlterField( - model_name='countryoverview', - name='income', - field=models.FloatField(blank=True, null=True, verbose_name='income (CHF)'), + model_name="countryoverview", + name="income", + field=models.FloatField(blank=True, null=True, verbose_name="income (CHF)"), ), migrations.AlterField( - model_name='countryoverview', - name='inform_indicators', - field=django.db.models.JSONField(default=list, verbose_name='inform indicators data'), + model_name="countryoverview", + name="inform_indicators", + field=django.db.models.JSONField(default=list, verbose_name="inform indicators data"), ), migrations.AlterField( - model_name='countryoverview', - name='life_expectancy', - field=models.IntegerField(blank=True, null=True, verbose_name='life expectancy'), + model_name="countryoverview", + name="life_expectancy", + field=models.IntegerField(blank=True, null=True, verbose_name="life expectancy"), ), migrations.AlterField( - model_name='countryoverview', - name='literacy', - field=models.FloatField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], verbose_name='literacy (%)'), + model_name="countryoverview", + name="literacy", + field=models.FloatField( + blank=True, + null=True, + validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], + verbose_name="literacy (%)", + ), ), migrations.AlterField( - model_name='countryoverview', - name='past_crises_events', - field=django.db.models.JSONField(default=list, verbose_name='past crises data'), + model_name="countryoverview", + name="past_crises_events", + field=django.db.models.JSONField(default=list, verbose_name="past crises data"), ), migrations.AlterField( - model_name='countryoverview', - name='past_epidemics', - field=django.db.models.JSONField(default=list, verbose_name='past epidemics data'), + model_name="countryoverview", + name="past_epidemics", + field=django.db.models.JSONField(default=list, verbose_name="past epidemics data"), ), migrations.AlterField( - model_name='countryoverview', - name='population', - field=models.IntegerField(blank=True, null=True, verbose_name='population'), + model_name="countryoverview", + name="population", + field=models.IntegerField(blank=True, null=True, verbose_name="population"), ), migrations.AlterField( - model_name='countryoverview', - name='poverty', - field=models.FloatField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], verbose_name='poverty (%)'), + model_name="countryoverview", + name="poverty", + field=models.FloatField( + blank=True, + null=True, + validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], + verbose_name="poverty (%)", + ), ), migrations.AlterField( - model_name='countryoverview', - name='rainy_season', - field=models.CharField(blank=True, choices=[('active', 'Active'), ('not_active', 'Not Active')], max_length=20, null=True, verbose_name='rainy season'), + model_name="countryoverview", + name="rainy_season", + field=models.CharField( + blank=True, + choices=[("active", "Active"), ("not_active", "Not Active")], + max_length=20, + null=True, + verbose_name="rainy season", + ), ), migrations.AlterField( - model_name='countryoverview', - name='start_network_data', - field=django.db.models.JSONField(default=list, verbose_name='start network data'), + model_name="countryoverview", + name="start_network_data", + field=django.db.models.JSONField(default=list, verbose_name="start network data"), ), migrations.AlterField( - model_name='countryoverview', - name='trained_in_first_aid', - field=models.IntegerField(blank=True, null=True, verbose_name='trained in first aid'), + model_name="countryoverview", + name="trained_in_first_aid", + field=models.IntegerField(blank=True, null=True, verbose_name="trained in first aid"), ), migrations.AlterField( - model_name='countryoverview', - name='urban_population', - field=models.FloatField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], verbose_name='urban POP (%)'), + model_name="countryoverview", + name="urban_population", + field=models.FloatField( + blank=True, + null=True, + validators=[django.core.validators.MaxValueValidator(100), django.core.validators.MinValueValidator(0)], + verbose_name="urban POP (%)", + ), ), migrations.AlterField( - model_name='countryoverview', - name='volunteers', - field=models.IntegerField(blank=True, null=True, verbose_name='volunteers'), + model_name="countryoverview", + name="volunteers", + field=models.IntegerField(blank=True, null=True, verbose_name="volunteers"), ), migrations.AlterField( - model_name='keyclimateevent', - name='avg_max_temperature', - field=models.FloatField(verbose_name='average maximum temperature'), + model_name="keyclimateevent", + name="avg_max_temperature", + field=models.FloatField(verbose_name="average maximum temperature"), ), migrations.AlterField( - model_name='keyclimateevent', - name='avg_min_temperature', - field=models.FloatField(verbose_name='average minimum temperature'), + model_name="keyclimateevent", + name="avg_min_temperature", + field=models.FloatField(verbose_name="average minimum temperature"), ), migrations.AlterField( - model_name='keyclimateevent', - name='avg_rainfall_precipitation', - field=models.FloatField(verbose_name='average rainfall precipitation'), + model_name="keyclimateevent", + name="avg_rainfall_precipitation", + field=models.FloatField(verbose_name="average rainfall precipitation"), ), migrations.AlterField( - model_name='keyclimateevent', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), + model_name="keyclimateevent", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified at"), ), migrations.AlterField( - model_name='keyclimateevent', - name='month', - field=models.PositiveSmallIntegerField(choices=[(1, 'January'), (2, 'February'), (3, 'March'), (4, 'April'), (5, 'May'), (6, 'June'), (7, 'July'), (8, 'August'), (9, 'September'), (10, 'October'), (11, 'November'), (12, 'December')], verbose_name='month'), + model_name="keyclimateevent", + name="month", + field=models.PositiveSmallIntegerField( + choices=[ + (1, "January"), + (2, "February"), + (3, "March"), + (4, "April"), + (5, "May"), + (6, "June"), + (7, "July"), + (8, "August"), + (9, "September"), + (10, "October"), + (11, "November"), + (12, "December"), + ], + verbose_name="month", + ), ), migrations.AlterField( - model_name='keyclimateevent', - name='overview', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.CountryOverview', verbose_name='country overview'), + model_name="keyclimateevent", + name="overview", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="databank.CountryOverview", verbose_name="country overview" + ), ), migrations.AlterField( - model_name='seasonalcalender', - name='date_end', - field=models.DateField(verbose_name='date end'), + model_name="seasonalcalender", + name="date_end", + field=models.DateField(verbose_name="date end"), ), migrations.AlterField( - model_name='seasonalcalender', - name='date_start', - field=models.DateField(verbose_name='date start'), + model_name="seasonalcalender", + name="date_start", + field=models.DateField(verbose_name="date start"), ), migrations.AlterField( - model_name='seasonalcalender', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), + model_name="seasonalcalender", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified at"), ), migrations.AlterField( - model_name='seasonalcalender', - name='overview', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.CountryOverview', verbose_name='country overview'), + model_name="seasonalcalender", + name="overview", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="databank.CountryOverview", verbose_name="country overview" + ), ), migrations.AlterField( - model_name='seasonalcalender', - name='sector', - field=models.CharField(max_length=20, verbose_name='sector'), + model_name="seasonalcalender", + name="sector", + field=models.CharField(max_length=20, verbose_name="sector"), ), migrations.AlterField( - model_name='seasonalcalender', - name='title', - field=models.CharField(max_length=20, verbose_name='title'), + model_name="seasonalcalender", + name="title", + field=models.CharField(max_length=20, verbose_name="title"), ), migrations.AlterField( - model_name='socialevent', - name='label', - field=models.CharField(max_length=255, verbose_name='label'), + model_name="socialevent", + name="label", + field=models.CharField(max_length=255, verbose_name="label"), ), migrations.AlterField( - model_name='socialevent', - name='overview', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.CountryOverview', verbose_name='country overview'), + model_name="socialevent", + name="overview", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="databank.CountryOverview", verbose_name="country overview" + ), ), migrations.AlterField( - model_name='socialevent', - name='value', - field=models.CharField(max_length=255, verbose_name='value'), + model_name="socialevent", + name="value", + field=models.CharField(max_length=255, verbose_name="value"), ), ] diff --git a/databank/migrations/0004_externalsource_keydocument_keydocumentgroup.py b/databank/migrations/0004_externalsource_keydocument_keydocumentgroup.py index 2b87efe05..d0cd15cee 100644 --- a/databank/migrations/0004_externalsource_keydocument_keydocumentgroup.py +++ b/databank/migrations/0004_externalsource_keydocument_keydocumentgroup.py @@ -1,42 +1,62 @@ # Generated by Django 2.2.13 on 2020-07-21 16:11 -import databank.models -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + +import databank.models class Migration(migrations.Migration): dependencies = [ - ('databank', '0003_auto_20200618_0904'), + ("databank", "0003_auto_20200618_0904"), ] operations = [ migrations.CreateModel( - name='KeyDocumentGroup', + name="KeyDocumentGroup", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=20, verbose_name='title')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=20, verbose_name="title")), ], ), migrations.CreateModel( - name='KeyDocument', + name="KeyDocument", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=20, verbose_name='title')), - ('date', models.DateField(verbose_name='date')), - ('file', models.FileField(upload_to=databank.models.key_document_path, verbose_name='file')), - ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.KeyDocumentGroup', verbose_name='group')), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.CountryOverview', verbose_name='country overview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=20, verbose_name="title")), + ("date", models.DateField(verbose_name="date")), + ("file", models.FileField(upload_to=databank.models.key_document_path, verbose_name="file")), + ( + "group", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="databank.KeyDocumentGroup", verbose_name="group" + ), + ), + ( + "overview", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="databank.CountryOverview", + verbose_name="country overview", + ), + ), ], ), migrations.CreateModel( - name='ExternalSource', + name="ExternalSource", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=20, verbose_name='title')), - ('url', models.URLField(max_length=300, verbose_name='url')), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.CountryOverview', verbose_name='country overview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=20, verbose_name="title")), + ("url", models.URLField(max_length=300, verbose_name="url")), + ( + "overview", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="databank.CountryOverview", + verbose_name="country overview", + ), + ), ], ), ] diff --git a/databank/migrations/0005_auto_20200903_0843.py b/databank/migrations/0005_auto_20200903_0843.py index bcdab2f4a..d79af7298 100644 --- a/databank/migrations/0005_auto_20200903_0843.py +++ b/databank/migrations/0005_auto_20200903_0843.py @@ -1,19 +1,20 @@ # Generated by Django 2.2.13 on 2020-09-03 08:43 -import databank.models from django.db import migrations, models +import databank.models + class Migration(migrations.Migration): dependencies = [ - ('databank', '0004_externalsource_keydocument_keydocumentgroup'), + ("databank", "0004_externalsource_keydocument_keydocumentgroup"), ] operations = [ migrations.AlterField( - model_name='keydocument', - name='file', - field=models.FileField(upload_to=databank.models.key_document_path, verbose_name='file'), + model_name="keydocument", + name="file", + field=models.FileField(upload_to=databank.models.key_document_path, verbose_name="file"), ), ] diff --git a/databank/migrations/0006_acapsseasonalcalender.py b/databank/migrations/0006_acapsseasonalcalender.py index e1bf8179e..304371bfe 100644 --- a/databank/migrations/0006_acapsseasonalcalender.py +++ b/databank/migrations/0006_acapsseasonalcalender.py @@ -1,29 +1,56 @@ # Generated by Django 3.2.23 on 2023-12-20 08:50 import django.contrib.postgres.fields -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('databank', '0005_auto_20200903_0843'), + ("databank", "0005_auto_20200903_0843"), ] operations = [ migrations.CreateModel( - name='AcapsSeasonalCalender', + name="AcapsSeasonalCalender", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), - ('month', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), default=list, size=None, verbose_name='month')), - ('event', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), default=list, size=None, verbose_name='event')), - ('event_type', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), default=list, size=None, verbose_name='event type')), - ('label', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), default=list, size=None, verbose_name='label')), - ('source', models.CharField(blank=True, max_length=255, null=True, verbose_name='Source')), - ('source_date', models.DateField(blank=True, null=True, verbose_name='Source Date')), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.countryoverview', verbose_name='country overview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="modified at")), + ( + "month", + django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(max_length=100), default=list, size=None, verbose_name="month" + ), + ), + ( + "event", + django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(max_length=100), default=list, size=None, verbose_name="event" + ), + ), + ( + "event_type", + django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(max_length=100), default=list, size=None, verbose_name="event type" + ), + ), + ( + "label", + django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(max_length=100), default=list, size=None, verbose_name="label" + ), + ), + ("source", models.CharField(blank=True, max_length=255, null=True, verbose_name="Source")), + ("source_date", models.DateField(blank=True, null=True, verbose_name="Source Date")), + ( + "overview", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="databank.countryoverview", + verbose_name="country overview", + ), + ), ], ), ] diff --git a/databank/migrations/0007_auto_20231221_0608.py b/databank/migrations/0007_auto_20231221_0608.py index df14bf556..0e0d05e9b 100644 --- a/databank/migrations/0007_auto_20231221_0608.py +++ b/databank/migrations/0007_auto_20231221_0608.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0006_acapsseasonalcalender'), + ("databank", "0006_acapsseasonalcalender"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='people_age_13_17', - field=models.IntegerField(blank=True, null=True, verbose_name='People age 13 to 17'), + model_name="countryoverview", + name="people_age_13_17", + field=models.IntegerField(blank=True, null=True, verbose_name="People age 13 to 17"), ), migrations.AddField( - model_name='countryoverview', - name='people_age_18_29', - field=models.IntegerField(blank=True, null=True, verbose_name='People age 18 to 29'), + model_name="countryoverview", + name="people_age_18_29", + field=models.IntegerField(blank=True, null=True, verbose_name="People age 18 to 29"), ), migrations.AddField( - model_name='countryoverview', - name='people_age_6_12', - field=models.IntegerField(blank=True, null=True, verbose_name='People age 6 to 12'), + model_name="countryoverview", + name="people_age_6_12", + field=models.IntegerField(blank=True, null=True, verbose_name="People age 6 to 12"), ), ] diff --git a/databank/migrations/0008_countryoverview_branches.py b/databank/migrations/0008_countryoverview_branches.py index 9329ab5d6..d592eb21d 100644 --- a/databank/migrations/0008_countryoverview_branches.py +++ b/databank/migrations/0008_countryoverview_branches.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0007_auto_20231221_0608'), + ("databank", "0007_auto_20231221_0608"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='branches', - field=models.IntegerField(blank=True, null=True, verbose_name='Branches'), + model_name="countryoverview", + name="branches", + field=models.IntegerField(blank=True, null=True, verbose_name="Branches"), ), ] diff --git a/databank/migrations/0009_auto_20231226_0516.py b/databank/migrations/0009_auto_20231226_0516.py index 267aa0f0d..075128ef8 100644 --- a/databank/migrations/0009_auto_20231226_0516.py +++ b/databank/migrations/0009_auto_20231226_0516.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0008_countryoverview_branches'), + ("databank", "0008_countryoverview_branches"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='people_age_60_69', - field=models.IntegerField(blank=True, null=True, verbose_name='People age 60 to 69'), + model_name="countryoverview", + name="people_age_60_69", + field=models.IntegerField(blank=True, null=True, verbose_name="People age 60 to 69"), ), migrations.AddField( - model_name='countryoverview', - name='people_age_70_79', - field=models.IntegerField(blank=True, null=True, verbose_name='People age 70 to 79'), + model_name="countryoverview", + name="people_age_70_79", + field=models.IntegerField(blank=True, null=True, verbose_name="People age 70 to 79"), ), migrations.AddField( - model_name='countryoverview', - name='people_age_80', - field=models.IntegerField(blank=True, null=True, verbose_name='People age 80'), + model_name="countryoverview", + name="people_age_80", + field=models.IntegerField(blank=True, null=True, verbose_name="People age 80"), ), ] diff --git a/databank/migrations/0010_auto_20231227_0445.py b/databank/migrations/0010_auto_20231227_0445.py index ce00fcbc5..b86fb31f7 100644 --- a/databank/migrations/0010_auto_20231227_0445.py +++ b/databank/migrations/0010_auto_20231227_0445.py @@ -6,212 +6,212 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0009_auto_20231226_0516'), + ("databank", "0009_auto_20231226_0516"), ] operations = [ migrations.RemoveField( - model_name='countryoverview', - name='people_age_13_17', + model_name="countryoverview", + name="people_age_13_17", ), migrations.RemoveField( - model_name='countryoverview', - name='people_age_18_29', + model_name="countryoverview", + name="people_age_18_29", ), migrations.RemoveField( - model_name='countryoverview', - name='people_age_60_69', + model_name="countryoverview", + name="people_age_60_69", ), migrations.RemoveField( - model_name='countryoverview', - name='people_age_6_12', + model_name="countryoverview", + name="people_age_6_12", ), migrations.RemoveField( - model_name='countryoverview', - name='people_age_70_79', + model_name="countryoverview", + name="people_age_70_79", ), migrations.RemoveField( - model_name='countryoverview', - name='people_age_80', + model_name="countryoverview", + name="people_age_80", ), migrations.AddField( - model_name='countryoverview', - name='female_staff_age_18_29', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff age 18 to 29'), + model_name="countryoverview", + name="female_staff_age_18_29", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff age 18 to 29"), ), migrations.AddField( - model_name='countryoverview', - name='female_staff_age_18_49', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff age 18 to 49'), + model_name="countryoverview", + name="female_staff_age_18_49", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff age 18 to 49"), ), migrations.AddField( - model_name='countryoverview', - name='female_staff_age_30_39', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff age 30 to 39'), + model_name="countryoverview", + name="female_staff_age_30_39", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff age 30 to 39"), ), migrations.AddField( - model_name='countryoverview', - name='female_staff_age_40_49', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff age 40 to 49'), + model_name="countryoverview", + name="female_staff_age_40_49", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff age 40 to 49"), ), migrations.AddField( - model_name='countryoverview', - name='female_staff_age_50_59', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff age 50 to 59'), + model_name="countryoverview", + name="female_staff_age_50_59", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff age 50 to 59"), ), migrations.AddField( - model_name='countryoverview', - name='female_staff_age_60_69', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff age 60 to 69'), + model_name="countryoverview", + name="female_staff_age_60_69", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff age 60 to 69"), ), migrations.AddField( - model_name='countryoverview', - name='female_staff_age_70_79', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff age 70 to 79'), + model_name="countryoverview", + name="female_staff_age_70_79", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff age 70 to 79"), ), migrations.AddField( - model_name='countryoverview', - name='female_staff_age_80', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff age 80'), + model_name="countryoverview", + name="female_staff_age_80", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff age 80"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_13_17', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 13 to 17'), + model_name="countryoverview", + name="female_volunteer_age_13_17", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 13 to 17"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_18_29', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 18 to 29'), + model_name="countryoverview", + name="female_volunteer_age_18_29", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 18 to 29"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_18_49', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 18 to 49'), + model_name="countryoverview", + name="female_volunteer_age_18_49", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 18 to 49"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_30_39', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 30 to 39'), + model_name="countryoverview", + name="female_volunteer_age_30_39", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 30 to 39"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_40_49', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 40 to 49'), + model_name="countryoverview", + name="female_volunteer_age_40_49", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 40 to 49"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_50_59', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 50 to 59'), + model_name="countryoverview", + name="female_volunteer_age_50_59", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 50 to 59"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_60_69', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 60 to 69'), + model_name="countryoverview", + name="female_volunteer_age_60_69", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 60 to 69"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_6_12', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 6 to 12'), + model_name="countryoverview", + name="female_volunteer_age_6_12", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 6 to 12"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_70_79', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 70 to 79'), + model_name="countryoverview", + name="female_volunteer_age_70_79", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 70 to 79"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_80', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer age 80'), + model_name="countryoverview", + name="female_volunteer_age_80", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer age 80"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_age_18_29', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff age 18 to 29'), + model_name="countryoverview", + name="male_staff_age_18_29", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff age 18 to 29"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_age_18_49', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff age 18 to 49'), + model_name="countryoverview", + name="male_staff_age_18_49", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff age 18 to 49"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_age_30_39', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff age 30 to 39'), + model_name="countryoverview", + name="male_staff_age_30_39", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff age 30 to 39"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_age_40_49', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff age 40 to 49'), + model_name="countryoverview", + name="male_staff_age_40_49", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff age 40 to 49"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_age_50_59', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff age 50 to 59'), + model_name="countryoverview", + name="male_staff_age_50_59", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff age 50 to 59"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_age_60_69', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff age 60 to 69'), + model_name="countryoverview", + name="male_staff_age_60_69", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff age 60 to 69"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_age_70_79', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff age 70 to 79'), + model_name="countryoverview", + name="male_staff_age_70_79", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff age 70 to 79"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_age_80', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff age 80'), + model_name="countryoverview", + name="male_staff_age_80", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff age 80"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_13_17', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 13 to 17'), + model_name="countryoverview", + name="male_volunteer_age_13_17", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 13 to 17"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_18_29', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 18 to 29'), + model_name="countryoverview", + name="male_volunteer_age_18_29", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 18 to 29"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_18_49', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 18 to 49'), + model_name="countryoverview", + name="male_volunteer_age_18_49", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 18 to 49"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_30_39', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 30 to 39'), + model_name="countryoverview", + name="male_volunteer_age_30_39", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 30 to 39"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_40_49', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 40 to 49'), + model_name="countryoverview", + name="male_volunteer_age_40_49", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 40 to 49"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_50_59', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 50 to 59'), + model_name="countryoverview", + name="male_volunteer_age_50_59", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 50 to 59"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_60_69', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 60 to 69'), + model_name="countryoverview", + name="male_volunteer_age_60_69", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 60 to 69"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_6_12', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 6 to 12'), + model_name="countryoverview", + name="male_volunteer_age_6_12", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 6 to 12"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_70_79', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 70 to 79'), + model_name="countryoverview", + name="male_volunteer_age_70_79", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 70 to 79"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_80', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer age 80'), + model_name="countryoverview", + name="male_volunteer_age_80", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer age 80"), ), ] diff --git a/databank/migrations/0011_auto_20231227_0922.py b/databank/migrations/0011_auto_20231227_0922.py index 03d10ce0d..9452ff45c 100644 --- a/databank/migrations/0011_auto_20231227_0922.py +++ b/databank/migrations/0011_auto_20231227_0922.py @@ -6,48 +6,48 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0010_auto_20231227_0445'), + ("databank", "0010_auto_20231227_0445"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='female_staff_age_other', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff other'), + model_name="countryoverview", + name="female_staff_age_other", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff other"), ), migrations.AddField( - model_name='countryoverview', - name='female_staff_total', - field=models.IntegerField(blank=True, null=True, verbose_name='female staff total'), + model_name="countryoverview", + name="female_staff_total", + field=models.IntegerField(blank=True, null=True, verbose_name="female staff total"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_age_other', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer other'), + model_name="countryoverview", + name="female_volunteer_age_other", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer other"), ), migrations.AddField( - model_name='countryoverview', - name='female_volunteer_total', - field=models.IntegerField(blank=True, null=True, verbose_name='female volunteer total'), + model_name="countryoverview", + name="female_volunteer_total", + field=models.IntegerField(blank=True, null=True, verbose_name="female volunteer total"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_age_other', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff other'), + model_name="countryoverview", + name="male_staff_age_other", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff other"), ), migrations.AddField( - model_name='countryoverview', - name='male_staff_total', - field=models.IntegerField(blank=True, null=True, verbose_name='male staff total'), + model_name="countryoverview", + name="male_staff_total", + field=models.IntegerField(blank=True, null=True, verbose_name="male staff total"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_age_other', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer other'), + model_name="countryoverview", + name="male_volunteer_age_other", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer other"), ), migrations.AddField( - model_name='countryoverview', - name='male_volunteer_total', - field=models.IntegerField(blank=True, null=True, verbose_name='male volunteer total'), + model_name="countryoverview", + name="male_volunteer_total", + field=models.IntegerField(blank=True, null=True, verbose_name="male volunteer total"), ), ] diff --git a/databank/migrations/0012_auto_20231228_0623.py b/databank/migrations/0012_auto_20231228_0623.py index b6a518079..95fd6b65a 100644 --- a/databank/migrations/0012_auto_20231228_0623.py +++ b/databank/migrations/0012_auto_20231228_0623.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0011_auto_20231227_0922'), + ("databank", "0011_auto_20231227_0922"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='staff_total', - field=models.IntegerField(blank=True, null=True, verbose_name='staff total'), + model_name="countryoverview", + name="staff_total", + field=models.IntegerField(blank=True, null=True, verbose_name="staff total"), ), migrations.AddField( - model_name='countryoverview', - name='volunteer_total', - field=models.IntegerField(blank=True, null=True, verbose_name='volunteer total'), + model_name="countryoverview", + name="volunteer_total", + field=models.IntegerField(blank=True, null=True, verbose_name="volunteer total"), ), ] diff --git a/databank/migrations/0013_auto_20231228_1038.py b/databank/migrations/0013_auto_20231228_1038.py index 1e5609d36..6242d49db 100644 --- a/databank/migrations/0013_auto_20231228_1038.py +++ b/databank/migrations/0013_auto_20231228_1038.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0012_auto_20231228_0623'), + ("databank", "0012_auto_20231228_0623"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='staff_age_18_29', - field=models.IntegerField(blank=True, null=True, verbose_name='staff age 18 to 29'), + model_name="countryoverview", + name="staff_age_18_29", + field=models.IntegerField(blank=True, null=True, verbose_name="staff age 18 to 29"), ), migrations.AddField( - model_name='countryoverview', - name='volunteer_age_13_17', - field=models.IntegerField(blank=True, null=True, verbose_name='volunteer age 13 to 17'), + model_name="countryoverview", + name="volunteer_age_13_17", + field=models.IntegerField(blank=True, null=True, verbose_name="volunteer age 13 to 17"), ), migrations.AddField( - model_name='countryoverview', - name='volunteer_age_18_29', - field=models.IntegerField(blank=True, null=True, verbose_name='volunteer age 18 to 29'), + model_name="countryoverview", + name="volunteer_age_18_29", + field=models.IntegerField(blank=True, null=True, verbose_name="volunteer age 18 to 29"), ), migrations.AddField( - model_name='countryoverview', - name='volunteer_age_6_12', - field=models.IntegerField(blank=True, null=True, verbose_name='volunteer age 6 to 12'), + model_name="countryoverview", + name="volunteer_age_6_12", + field=models.IntegerField(blank=True, null=True, verbose_name="volunteer age 6 to 12"), ), ] diff --git a/databank/migrations/0014_auto_20231229_0510.py b/databank/migrations/0014_auto_20231229_0510.py index 4527240a9..a24062a1f 100644 --- a/databank/migrations/0014_auto_20231229_0510.py +++ b/databank/migrations/0014_auto_20231229_0510.py @@ -6,53 +6,53 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0013_auto_20231228_1038'), + ("databank", "0013_auto_20231228_1038"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='world_bank_gdp', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank gdp'), + model_name="countryoverview", + name="world_bank_gdp", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank gdp"), ), migrations.AddField( - model_name='countryoverview', - name='world_bank_gender_inequality_index', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank gender inequality index'), + model_name="countryoverview", + name="world_bank_gender_inequality_index", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank gender inequality index"), ), migrations.AddField( - model_name='countryoverview', - name='world_bank_gni', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank gni'), + model_name="countryoverview", + name="world_bank_gni", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank gni"), ), migrations.AddField( - model_name='countryoverview', - name='world_bank_life_expectancy', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank life expectancy'), + model_name="countryoverview", + name="world_bank_life_expectancy", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank life expectancy"), ), migrations.AddField( - model_name='countryoverview', - name='world_bank_literacy_rate', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank life expectancy'), + model_name="countryoverview", + name="world_bank_literacy_rate", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank life expectancy"), ), migrations.AddField( - model_name='countryoverview', - name='world_bank_population', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank population'), + model_name="countryoverview", + name="world_bank_population", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank population"), ), migrations.AddField( - model_name='countryoverview', - name='world_bank_population_above_age_65', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank population above age 65'), + model_name="countryoverview", + name="world_bank_population_above_age_65", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank population above age 65"), ), migrations.AddField( - model_name='countryoverview', - name='world_bank_population_age_14', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank population age 14'), + model_name="countryoverview", + name="world_bank_population_age_14", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank population age 14"), ), migrations.AddField( - model_name='countryoverview', - name='world_bank_urban_population_percentage', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank urban population percentage'), + model_name="countryoverview", + name="world_bank_urban_population_percentage", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank urban population percentage"), ), ] diff --git a/databank/migrations/0015_auto_20240111_0813.py b/databank/migrations/0015_auto_20240111_0813.py index ada33564b..aa9d88e7e 100644 --- a/databank/migrations/0015_auto_20240111_0813.py +++ b/databank/migrations/0015_auto_20240111_0813.py @@ -6,33 +6,33 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0014_auto_20231229_0510'), + ("databank", "0014_auto_20231229_0510"), ] operations = [ migrations.AlterField( - model_name='countryoverview', - name='world_bank_gdp', - field=models.FloatField(blank=True, null=True, verbose_name='world bank gdp'), + model_name="countryoverview", + name="world_bank_gdp", + field=models.FloatField(blank=True, null=True, verbose_name="world bank gdp"), ), migrations.AlterField( - model_name='countryoverview', - name='world_bank_gender_inequality_index', - field=models.FloatField(blank=True, null=True, verbose_name='world bank gender inequality index'), + model_name="countryoverview", + name="world_bank_gender_inequality_index", + field=models.FloatField(blank=True, null=True, verbose_name="world bank gender inequality index"), ), migrations.AlterField( - model_name='countryoverview', - name='world_bank_gni', - field=models.FloatField(blank=True, null=True, verbose_name='world bank gni'), + model_name="countryoverview", + name="world_bank_gni", + field=models.FloatField(blank=True, null=True, verbose_name="world bank gni"), ), migrations.AlterField( - model_name='countryoverview', - name='world_bank_literacy_rate', - field=models.FloatField(blank=True, null=True, verbose_name='world bank life expectancy'), + model_name="countryoverview", + name="world_bank_literacy_rate", + field=models.FloatField(blank=True, null=True, verbose_name="world bank life expectancy"), ), migrations.AlterField( - model_name='countryoverview', - name='world_bank_urban_population_percentage', - field=models.FloatField(blank=True, null=True, verbose_name='world bank urban population percentage'), + model_name="countryoverview", + name="world_bank_urban_population_percentage", + field=models.FloatField(blank=True, null=True, verbose_name="world bank urban population percentage"), ), ] diff --git a/databank/migrations/0016_fdrsincome.py b/databank/migrations/0016_fdrsincome.py index 8fb5ac6cb..39292cc4f 100644 --- a/databank/migrations/0016_fdrsincome.py +++ b/databank/migrations/0016_fdrsincome.py @@ -1,24 +1,53 @@ # Generated by Django 3.2.23 on 2024-01-22 05:42 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('databank', '0015_auto_20240111_0813'), + ("databank", "0015_auto_20240111_0813"), ] operations = [ migrations.CreateModel( - name='FDRSIncome', + name="FDRSIncome", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(verbose_name='date')), - ('indicator', models.CharField(choices=[('h_gov_CHF', 'Home Government'), ('f_gov_CHF', 'Foreign Government'), ('ind_CHF', 'Individual'), ('corp_CHF', 'Corporation'), ('found_CHF', 'Foundation'), ('un_CHF', 'UN Agencies'), ('pooled_f_CHF', 'Pooled funds'), ('ngo_CHF', 'Non Governmental Organization'), ('si_CHF', 'Service Income'), ('iga_CHF', 'Income Generating Activity'), ('KPI_incomeFromNSsLC_CHF', 'Other National Society'), ('ifrc_CHF', 'Ifrc'), ('icrc_CHF', 'Icrc'), ('other_CHF', 'Other Source')], max_length=255, verbose_name='indicator')), - ('value', models.FloatField(blank=True, null=True, verbose_name='value')), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.countryoverview', verbose_name='country overview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("date", models.DateField(verbose_name="date")), + ( + "indicator", + models.CharField( + choices=[ + ("h_gov_CHF", "Home Government"), + ("f_gov_CHF", "Foreign Government"), + ("ind_CHF", "Individual"), + ("corp_CHF", "Corporation"), + ("found_CHF", "Foundation"), + ("un_CHF", "UN Agencies"), + ("pooled_f_CHF", "Pooled funds"), + ("ngo_CHF", "Non Governmental Organization"), + ("si_CHF", "Service Income"), + ("iga_CHF", "Income Generating Activity"), + ("KPI_incomeFromNSsLC_CHF", "Other National Society"), + ("ifrc_CHF", "Ifrc"), + ("icrc_CHF", "Icrc"), + ("other_CHF", "Other Source"), + ], + max_length=255, + verbose_name="indicator", + ), + ), + ("value", models.FloatField(blank=True, null=True, verbose_name="value")), + ( + "overview", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="databank.countryoverview", + verbose_name="country overview", + ), + ), ], ), ] diff --git a/databank/migrations/0017_countryoverview_world_bank_poverty_rate.py b/databank/migrations/0017_countryoverview_world_bank_poverty_rate.py index cc107d05c..448c1be42 100644 --- a/databank/migrations/0017_countryoverview_world_bank_poverty_rate.py +++ b/databank/migrations/0017_countryoverview_world_bank_poverty_rate.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0016_fdrsincome'), + ("databank", "0016_fdrsincome"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='world_bank_poverty_rate', - field=models.FloatField(blank=True, null=True, verbose_name='world bank poverty rate'), + model_name="countryoverview", + name="world_bank_poverty_rate", + field=models.FloatField(blank=True, null=True, verbose_name="world bank poverty rate"), ), ] diff --git a/databank/migrations/0018_countryoverview_unicef_population_under_18.py b/databank/migrations/0018_countryoverview_unicef_population_under_18.py index a7dae39da..414dcb5ab 100644 --- a/databank/migrations/0018_countryoverview_unicef_population_under_18.py +++ b/databank/migrations/0018_countryoverview_unicef_population_under_18.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0017_countryoverview_world_bank_poverty_rate'), + ("databank", "0017_countryoverview_world_bank_poverty_rate"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='unicef_population_under_18', - field=models.IntegerField(blank=True, null=True, verbose_name='Unicef population under 18'), + model_name="countryoverview", + name="unicef_population_under_18", + field=models.IntegerField(blank=True, null=True, verbose_name="Unicef population under 18"), ), ] diff --git a/databank/migrations/0019_countryoverview_hdr_gii.py b/databank/migrations/0019_countryoverview_hdr_gii.py index b73072fa8..68f596ed8 100644 --- a/databank/migrations/0019_countryoverview_hdr_gii.py +++ b/databank/migrations/0019_countryoverview_hdr_gii.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0018_countryoverview_unicef_population_under_18'), + ("databank", "0018_countryoverview_unicef_population_under_18"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='hdr_gii', - field=models.FloatField(blank=True, null=True, verbose_name='HDR GII'), + model_name="countryoverview", + name="hdr_gii", + field=models.FloatField(blank=True, null=True, verbose_name="HDR GII"), ), ] diff --git a/databank/migrations/0020_fdrsannualincome.py b/databank/migrations/0020_fdrsannualincome.py index 7184cb923..ef7dfd73e 100644 --- a/databank/migrations/0020_fdrsannualincome.py +++ b/databank/migrations/0020_fdrsannualincome.py @@ -1,23 +1,30 @@ # Generated by Django 3.2.23 on 2024-02-02 04:13 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('databank', '0019_countryoverview_hdr_gii'), + ("databank", "0019_countryoverview_hdr_gii"), ] operations = [ migrations.CreateModel( - name='FDRSAnnualIncome', + name="FDRSAnnualIncome", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(verbose_name='date')), - ('value', models.FloatField(blank=True, null=True, verbose_name='value')), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.countryoverview', verbose_name='country overview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("date", models.DateField(verbose_name="date")), + ("value", models.FloatField(blank=True, null=True, verbose_name="value")), + ( + "overview", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="databank.countryoverview", + verbose_name="country overview", + ), + ), ], ), ] diff --git a/databank/migrations/0021_countrykeyclimate.py b/databank/migrations/0021_countrykeyclimate.py index dfe0aeb28..51ddcb910 100644 --- a/databank/migrations/0021_countrykeyclimate.py +++ b/databank/migrations/0021_countrykeyclimate.py @@ -1,32 +1,58 @@ # Generated by Django 3.2.23 on 2024-02-09 06:17 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('databank', '0020_fdrsannualincome'), + ("databank", "0020_fdrsannualincome"), ] operations = [ migrations.CreateModel( - name='CountryKeyClimate', + name="CountryKeyClimate", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('year', models.PositiveIntegerField(verbose_name='year')), - ('month', models.PositiveSmallIntegerField(choices=[(1, 'January'), (2, 'February'), (3, 'March'), (4, 'April'), (5, 'May'), (6, 'June'), (7, 'July'), (8, 'August'), (9, 'September'), (10, 'October'), (11, 'November'), (12, 'December')], verbose_name='month')), - ('min_temp', models.FloatField(verbose_name='min temperature')), - ('max_temp', models.FloatField(verbose_name='max temperature')), - ('avg_temp', models.FloatField(verbose_name='average temperature')), - ('precipitation', models.FloatField(verbose_name='precipitation')), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.countryoverview', verbose_name='country overview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("year", models.PositiveIntegerField(verbose_name="year")), + ( + "month", + models.PositiveSmallIntegerField( + choices=[ + (1, "January"), + (2, "February"), + (3, "March"), + (4, "April"), + (5, "May"), + (6, "June"), + (7, "July"), + (8, "August"), + (9, "September"), + (10, "October"), + (11, "November"), + (12, "December"), + ], + verbose_name="month", + ), + ), + ("min_temp", models.FloatField(verbose_name="min temperature")), + ("max_temp", models.FloatField(verbose_name="max temperature")), + ("avg_temp", models.FloatField(verbose_name="average temperature")), + ("precipitation", models.FloatField(verbose_name="precipitation")), + ( + "overview", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="databank.countryoverview", + verbose_name="country overview", + ), + ), ], options={ - 'verbose_name': 'Country Climate', - 'verbose_name_plural': 'Country Climate', - 'unique_together': {('overview', 'month', 'year')}, + "verbose_name": "Country Climate", + "verbose_name_plural": "Country Climate", + "unique_together": {("overview", "month", "year")}, }, ), ] diff --git a/databank/migrations/0022_alter_fdrsincome_indicator.py b/databank/migrations/0022_alter_fdrsincome_indicator.py index 50becaa7c..e2d82d9b6 100644 --- a/databank/migrations/0022_alter_fdrsincome_indicator.py +++ b/databank/migrations/0022_alter_fdrsincome_indicator.py @@ -6,13 +6,32 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0021_countrykeyclimate'), + ("databank", "0021_countrykeyclimate"), ] operations = [ migrations.AlterField( - model_name='fdrsincome', - name='indicator', - field=models.CharField(choices=[('h_gov_CHF', 'Home Government'), ('f_gov_CHF', 'Foreign Government'), ('ind_CHF', 'Individual'), ('corp_CHF', 'Corporation'), ('found_CHF', 'Foundation'), ('un_CHF', 'UN Agencies'), ('pooled_f_CHF', 'Pooled funds'), ('ngo_CHF', 'Non Governmental Organization'), ('si_CHF', 'Service Income'), ('iga_CHF', 'Income Generating Activity'), ('KPI_incomeFromNSsLC_CHF', 'Other National Society'), ('ifrc_CHF', 'IFRC'), ('icrc_CHF', 'ICRC'), ('other_CHF', 'Other Source')], max_length=255, verbose_name='indicator'), + model_name="fdrsincome", + name="indicator", + field=models.CharField( + choices=[ + ("h_gov_CHF", "Home Government"), + ("f_gov_CHF", "Foreign Government"), + ("ind_CHF", "Individual"), + ("corp_CHF", "Corporation"), + ("found_CHF", "Foundation"), + ("un_CHF", "UN Agencies"), + ("pooled_f_CHF", "Pooled funds"), + ("ngo_CHF", "Non Governmental Organization"), + ("si_CHF", "Service Income"), + ("iga_CHF", "Income Generating Activity"), + ("KPI_incomeFromNSsLC_CHF", "Other National Society"), + ("ifrc_CHF", "IFRC"), + ("icrc_CHF", "ICRC"), + ("other_CHF", "Other Source"), + ], + max_length=255, + verbose_name="indicator", + ), ), ] diff --git a/databank/migrations/0023_auto_20240402_0912.py b/databank/migrations/0023_auto_20240402_0912.py index 253c7889b..556e1d6be 100644 --- a/databank/migrations/0023_auto_20240402_0912.py +++ b/databank/migrations/0023_auto_20240402_0912.py @@ -1,27 +1,29 @@ # Generated by Django 3.2.25 on 2024-04-02 09:12 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('databank', '0022_alter_fdrsincome_indicator'), + ("databank", "0022_alter_fdrsincome_indicator"), ] operations = [ migrations.CreateModel( - name='FDRSIndicator', + name="FDRSIndicator", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='Indicator Title')), - ('description', models.TextField(blank=True, null=True, verbose_name='Indicator Descritpion')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="Indicator Title")), + ("description", models.TextField(blank=True, null=True, verbose_name="Indicator Descritpion")), ], ), migrations.AlterField( - model_name='fdrsincome', - name='indicator', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='databank.fdrsindicator', verbose_name='FDRS Indicator'), + model_name="fdrsincome", + name="indicator", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="databank.fdrsindicator", verbose_name="FDRS Indicator" + ), ), ] diff --git a/databank/migrations/0024_countryoverview_fdrs_data_fetched_year.py b/databank/migrations/0024_countryoverview_fdrs_data_fetched_year.py index aca065876..f77c67bc0 100644 --- a/databank/migrations/0024_countryoverview_fdrs_data_fetched_year.py +++ b/databank/migrations/0024_countryoverview_fdrs_data_fetched_year.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0023_auto_20240402_0912'), + ("databank", "0023_auto_20240402_0912"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='fdrs_data_fetched_year', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='FDRS Data Fetched Year'), + model_name="countryoverview", + name="fdrs_data_fetched_year", + field=models.CharField(blank=True, max_length=50, null=True, verbose_name="FDRS Data Fetched Year"), ), ] diff --git a/databank/migrations/0025_countryoverview_world_bank_gni_capita.py b/databank/migrations/0025_countryoverview_world_bank_gni_capita.py index a9872850c..bbb244bd8 100644 --- a/databank/migrations/0025_countryoverview_world_bank_gni_capita.py +++ b/databank/migrations/0025_countryoverview_world_bank_gni_capita.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('databank', '0024_countryoverview_fdrs_data_fetched_year'), + ("databank", "0024_countryoverview_fdrs_data_fetched_year"), ] operations = [ migrations.AddField( - model_name='countryoverview', - name='world_bank_gni_capita', - field=models.IntegerField(blank=True, null=True, verbose_name='world bank GNI Per Capita'), + model_name="countryoverview", + name="world_bank_gni_capita", + field=models.IntegerField(blank=True, null=True, verbose_name="world bank GNI Per Capita"), ), ] diff --git a/databank/models.py b/databank/models.py index 1fb1eb19e..15b3460c2 100644 --- a/databank/models.py +++ b/databank/models.py @@ -1,20 +1,19 @@ -from django.utils.translation import gettext_lazy as _ -from django.core.validators import MaxValueValidator, MinValueValidator -from django.db.models import JSONField from django.contrib.postgres.fields import ArrayField - +from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models +from django.db.models import JSONField +from django.utils.translation import gettext_lazy as _ -from api.models import Country, Appeal +from api.models import Appeal, Country class Status: - ACTIVE = 'active' - NOT_ACTIVE = 'not_active' + ACTIVE = "active" + NOT_ACTIVE = "not_active" CHOICES = ( - (ACTIVE, _('Active')), - (NOT_ACTIVE, _('Not Active')), + (ACTIVE, _("Active")), + (NOT_ACTIVE, _("Not Active")), ) @@ -33,152 +32,137 @@ class Month: DECEMBER = 12 CHOICES = ( - (JANUARY, _('January')), - (FEBRUARY, _('February')), - (MARCH, _('March')), - (APRIL, _('April')), - (MAY, _('May')), - (JUNE, _('June')), - (JULY, _('July')), - (AUGUST, _('August')), - (SEPTEMBER, _('September')), - (OCTOBER, _('October')), - (NOVEMBER, _('November')), - (DECEMBER, _('December')), - ) - LABEL_MAP = { - value: label - for value, label in CHOICES - } - - -class PastCrisesEvent(): - COLD_WAVE = 'CW' - HEAT_WAVE = 'HT' - DROUGHT = 'DR' - EARTHQUAKE = 'EQ' - LAND_SLIDE = 'LS' - TSUNAMI = 'TS' - VOLCANO = 'VO' - EXTRATROPICAL_CYCLONE = 'EC' - TROPICAL_CYCLONE = 'TC' - STORM_SURGE = 'SS' - FLOOD = 'FL' - FLASH_FLOOD = 'FF' - COMPLEX_EMERGENCY = 'CE' - FIRE = 'FR' - OTHER = 'OT' + (JANUARY, _("January")), + (FEBRUARY, _("February")), + (MARCH, _("March")), + (APRIL, _("April")), + (MAY, _("May")), + (JUNE, _("June")), + (JULY, _("July")), + (AUGUST, _("August")), + (SEPTEMBER, _("September")), + (OCTOBER, _("October")), + (NOVEMBER, _("November")), + (DECEMBER, _("December")), + ) + LABEL_MAP = {value: label for value, label in CHOICES} + + +class PastCrisesEvent: + COLD_WAVE = "CW" + HEAT_WAVE = "HT" + DROUGHT = "DR" + EARTHQUAKE = "EQ" + LAND_SLIDE = "LS" + TSUNAMI = "TS" + VOLCANO = "VO" + EXTRATROPICAL_CYCLONE = "EC" + TROPICAL_CYCLONE = "TC" + STORM_SURGE = "SS" + FLOOD = "FL" + FLASH_FLOOD = "FF" + COMPLEX_EMERGENCY = "CE" + FIRE = "FR" + OTHER = "OT" CHOICES = ( - (COLD_WAVE, _('Cold Wave')), - (HEAT_WAVE, _('Heat Wave')), - (DROUGHT, _('Drought')), - (EARTHQUAKE, _('Earthquake')), - (LAND_SLIDE, _('Land Slide')), - (TSUNAMI, _('Tsunami')), - (VOLCANO, _('Volcano')), - (EXTRATROPICAL_CYCLONE, _('Extratropical Cyclone')), - (TROPICAL_CYCLONE, _('Tropical Cyclone')), - (STORM_SURGE, _('Storm Surge')), - (FLOOD, _('Flood')), - (FLASH_FLOOD, _('Flash Flood')), - (COMPLEX_EMERGENCY, _('Complex Emergency')), - (FIRE, _('Fire')), - (OTHER, _('Other')), - ) - LABEL_MAP = { - value: label - for value, label in CHOICES - } - - -class PastEpidemic(): + (COLD_WAVE, _("Cold Wave")), + (HEAT_WAVE, _("Heat Wave")), + (DROUGHT, _("Drought")), + (EARTHQUAKE, _("Earthquake")), + (LAND_SLIDE, _("Land Slide")), + (TSUNAMI, _("Tsunami")), + (VOLCANO, _("Volcano")), + (EXTRATROPICAL_CYCLONE, _("Extratropical Cyclone")), + (TROPICAL_CYCLONE, _("Tropical Cyclone")), + (STORM_SURGE, _("Storm Surge")), + (FLOOD, _("Flood")), + (FLASH_FLOOD, _("Flash Flood")), + (COMPLEX_EMERGENCY, _("Complex Emergency")), + (FIRE, _("Fire")), + (OTHER, _("Other")), + ) + LABEL_MAP = {value: label for value, label in CHOICES} + + +class PastEpidemic: # Value are used to search in Reliefweb - CHOLERA = 'cholera' - MENINGITIS = 'meningitis' - RIFT_VALLEY_FEVER = 'rift valley fever' - HAEMORRHAGIC_FEVERS = 'haemorrhagic fevers' - HEPATITIS = 'hepatitis' - YELLOW_FEVER = 'yellow fever' + CHOLERA = "cholera" + MENINGITIS = "meningitis" + RIFT_VALLEY_FEVER = "rift valley fever" + HAEMORRHAGIC_FEVERS = "haemorrhagic fevers" + HEPATITIS = "hepatitis" + YELLOW_FEVER = "yellow fever" CHOICES = ( - (CHOLERA, _('Cholera Outbreak')), - (MENINGITIS, _('Meningitis')), - (RIFT_VALLEY_FEVER, _('Rift Valley fever')), - (HAEMORRHAGIC_FEVERS, _('Viral haemorrhagic fevers')), - (HEPATITIS, _('Viral hepatitis')), - (YELLOW_FEVER, _('Yellow fever')), + (CHOLERA, _("Cholera Outbreak")), + (MENINGITIS, _("Meningitis")), + (RIFT_VALLEY_FEVER, _("Rift Valley fever")), + (HAEMORRHAGIC_FEVERS, _("Viral haemorrhagic fevers")), + (HEPATITIS, _("Viral hepatitis")), + (YELLOW_FEVER, _("Yellow fever")), ) - LABEL_MAP = { - value: label - for value, label in CHOICES - } + LABEL_MAP = {value: label for value, label in CHOICES} -class InformIndicator(): +class InformIndicator: # Grouping indicators GROUP_LABELS = { - 'HA': _('Hazard & Exposure'), - 'VU': _('Vulnerability'), - 'CC': _('Lack Of Coping Capacity'), + "HA": _("Hazard & Exposure"), + "VU": _("Vulnerability"), + "CC": _("Lack Of Coping Capacity"), } # Indicators CHOICES = ( - ('HDI-Est', _('Estimated HDI from GDP per capita')), - ('INFORM', _('INFORM Risk Index')), - ('HA', _('Hazard & Exposure Index')), - ('VU', _('Vulnerability Index')), - ('CC', _('Lack of Coping Capacity Index')), - + ("HDI-Est", _("Estimated HDI from GDP per capita")), + ("INFORM", _("INFORM Risk Index")), + ("HA", _("Hazard & Exposure Index")), + ("VU", _("Vulnerability Index")), + ("CC", _("Lack of Coping Capacity Index")), # HAZARD AND EXPOSURE - ('HA.HUM', _('Human Hazard')), - ('HA.HUM.CON', _('Current conflicts')), - ('HA.HUM.CON.GCRI', _('GCRI Internal conflicts')), - ('HA.HUM.CON.HVC', _('Highly Violent Conflict probability Score')), - ('HA.HUM.CON.VC', _('Violent Conflict probability Score')), - ('HA.NAT', _('Natural Hazard')), - ('HA.NAT.DR', _('Droughts probability and historical impact')), - ('HA.NAT.DR.AFF', _('People affected by droughts')), - ('HA.NAT.DR.AFF-FREQ', _('People affected by drought and Frequency of events')), - ('HA.NAT.DR.ASI', _('Agriculture Drought Probability')), - ('HA.NAT.DR.ASI_temp', _('Agriculture Drought Probability')), - ('HA.NAT.DR.FREQ', _('Frequency of drought events')), - ('HA.NAT.EPI', _('Epidemic')), - ('HA.NAT.EQ', _('Physical exposure to earthquakes')), - ('HA.NAT.FL', _('Physical exposure to floods')), - ('HA.NAT.TC', _('Physical exposure to tropical cyclones')), - ('HA.NAT.TS', _('Physical exposure to tsunamis')), - + ("HA.HUM", _("Human Hazard")), + ("HA.HUM.CON", _("Current conflicts")), + ("HA.HUM.CON.GCRI", _("GCRI Internal conflicts")), + ("HA.HUM.CON.HVC", _("Highly Violent Conflict probability Score")), + ("HA.HUM.CON.VC", _("Violent Conflict probability Score")), + ("HA.NAT", _("Natural Hazard")), + ("HA.NAT.DR", _("Droughts probability and historical impact")), + ("HA.NAT.DR.AFF", _("People affected by droughts")), + ("HA.NAT.DR.AFF-FREQ", _("People affected by drought and Frequency of events")), + ("HA.NAT.DR.ASI", _("Agriculture Drought Probability")), + ("HA.NAT.DR.ASI_temp", _("Agriculture Drought Probability")), + ("HA.NAT.DR.FREQ", _("Frequency of drought events")), + ("HA.NAT.EPI", _("Epidemic")), + ("HA.NAT.EQ", _("Physical exposure to earthquakes")), + ("HA.NAT.FL", _("Physical exposure to floods")), + ("HA.NAT.TC", _("Physical exposure to tropical cyclones")), + ("HA.NAT.TS", _("Physical exposure to tsunamis")), # VULNERABILITY - ('VU.SEV', _('Socio-Economic Vulnerability')), - ('VU.SEV.AD', _('Economic Dependency')), - ('VU.SEV.INQ', _('Inequality')), - ('VU.SEV.INQ.GII', _('Gender Inequality Index')), - ('VU.SEV.INQ.GINI', _('Income Gini coefficient')), - ('VU.SEV.PD', _('Poverty & Development')), - ('VU.SEV.PD.HDI', _('Human Development Index')), - ('VU.SEV.PD.MPI', _('Multidimensional Poverty Index')), - ('VU.VGR', _('Vulnerable Groups')), - ('VU.VGR.OG', _('Others Vulnerable Groups')), - ('VU.VGR.UP', _('Uprooted people')), - + ("VU.SEV", _("Socio-Economic Vulnerability")), + ("VU.SEV.AD", _("Economic Dependency")), + ("VU.SEV.INQ", _("Inequality")), + ("VU.SEV.INQ.GII", _("Gender Inequality Index")), + ("VU.SEV.INQ.GINI", _("Income Gini coefficient")), + ("VU.SEV.PD", _("Poverty & Development")), + ("VU.SEV.PD.HDI", _("Human Development Index")), + ("VU.SEV.PD.MPI", _("Multidimensional Poverty Index")), + ("VU.VGR", _("Vulnerable Groups")), + ("VU.VGR.OG", _("Others Vulnerable Groups")), + ("VU.VGR.UP", _("Uprooted people")), # LACK OF COPING CAPACITY - ('CC.INF.AHC', _('Access to Health Care')), - ('CC.INF.COM', _('Communication')), - ('CC.INF.PHY', _('Physical Infrastructure')), - ('CC.INS.DRR', _('Disaster Risk Reduction')), - ('CC.INS.GOV', _('Governance')), + ("CC.INF.AHC", _("Access to Health Care")), + ("CC.INF.COM", _("Communication")), + ("CC.INF.PHY", _("Physical Infrastructure")), + ("CC.INS.DRR", _("Disaster Risk Reduction")), + ("CC.INS.GOV", _("Governance")), ) - LABEL_MAP = { - value: label - for value, label in CHOICES - } + LABEL_MAP = {value: label for value, label in CHOICES} @classmethod def get_group(cls, indicator): - if isinstance(indicator, str) and indicator.find('.') != -1: - return indicator.split('.')[0] + if isinstance(indicator, str) and indicator.find(".") != -1: + return indicator.split(".")[0] @classmethod def get_group_display(cls, indicator): @@ -190,364 +174,132 @@ class CountryOverview(models.Model): script_modified_at = models.DateTimeField(null=True, blank=True) # Country Key Indicators (Using Script: FDRS API) - population = models.IntegerField(null=True, blank=True, verbose_name=_('population')) - gdp = models.FloatField(verbose_name=_('GDP'), null=True, blank=True) - gnipc = models.IntegerField(verbose_name=_('GNI/CAPITA'), null=True, blank=True) - life_expectancy = models.IntegerField(null=True, blank=True, verbose_name=_('life expectancy')) + population = models.IntegerField(null=True, blank=True, verbose_name=_("population")) + gdp = models.FloatField(verbose_name=_("GDP"), null=True, blank=True) + gnipc = models.IntegerField(verbose_name=_("GNI/CAPITA"), null=True, blank=True) + life_expectancy = models.IntegerField(null=True, blank=True, verbose_name=_("life expectancy")) urban_population = models.FloatField( validators=[MaxValueValidator(100), MinValueValidator(0)], - verbose_name=_('urban POP (%)'), - null=True, blank=True, + verbose_name=_("urban POP (%)"), + null=True, + blank=True, ) poverty = models.FloatField( validators=[MaxValueValidator(100), MinValueValidator(0)], - verbose_name=_('poverty (%)'), - null=True, blank=True, + verbose_name=_("poverty (%)"), + null=True, + blank=True, ) literacy = models.FloatField( validators=[MaxValueValidator(100), MinValueValidator(0)], - verbose_name=_('literacy (%)'), - null=True, blank=True, + verbose_name=_("literacy (%)"), + null=True, + blank=True, ) # National Society Indicators (Using Script: FDRS API) - income = models.FloatField(verbose_name=_('income (CHF)'), null=True, blank=True) - expenditures = models.FloatField(verbose_name=_('expenditures (CHF)'), null=True, blank=True) - volunteers = models.IntegerField(verbose_name=_('volunteers'), null=True, blank=True) - trained_in_first_aid = models.IntegerField(verbose_name=_('trained in first aid'), null=True, blank=True) - branches = models.IntegerField( - verbose_name=_('Branches'), - null=True, - blank=True - ) + income = models.FloatField(verbose_name=_("income (CHF)"), null=True, blank=True) + expenditures = models.FloatField(verbose_name=_("expenditures (CHF)"), null=True, blank=True) + volunteers = models.IntegerField(verbose_name=_("volunteers"), null=True, blank=True) + trained_in_first_aid = models.IntegerField(verbose_name=_("trained in first aid"), null=True, blank=True) + branches = models.IntegerField(verbose_name=_("Branches"), null=True, blank=True) # Population data # Voluntering - male_volunteer_age_6_12 = models.IntegerField( - verbose_name=_('male volunteer age 6 to 12'), - null=True, - blank=True - ) - male_volunteer_age_13_17 = models.IntegerField( - verbose_name=_('male volunteer age 13 to 17'), - null=True, - blank=True - ) - male_volunteer_age_18_29 = models.IntegerField( - verbose_name=_('male volunteer age 18 to 29'), - null=True, - blank=True - ) - male_volunteer_age_18_49 = models.IntegerField( - verbose_name=_('male volunteer age 18 to 49'), - null=True, - blank=True - ) - male_volunteer_age_30_39 = models.IntegerField( - verbose_name=_('male volunteer age 30 to 39'), - null=True, - blank=True - ) - male_volunteer_age_40_49 = models.IntegerField( - verbose_name=_('male volunteer age 40 to 49'), - null=True, - blank=True - ) - male_volunteer_age_50_59 = models.IntegerField( - verbose_name=_('male volunteer age 50 to 59'), - null=True, - blank=True - ) - male_volunteer_age_60_69 = models.IntegerField( - verbose_name=_('male volunteer age 60 to 69'), - null=True, - blank=True - ) - male_volunteer_age_70_79 = models.IntegerField( - verbose_name=_('male volunteer age 70 to 79'), - null=True, - blank=True - ) - male_volunteer_age_80 = models.IntegerField( - verbose_name=_('male volunteer age 80'), - null=True, - blank=True - ) - male_volunteer_age_other = models.IntegerField( - verbose_name=_('male volunteer other'), - null=True, - blank=True - ) - male_volunteer_total = models.IntegerField( - verbose_name=_('male volunteer total'), - null=True, - blank=True - ) - female_volunteer_age_6_12 = models.IntegerField( - verbose_name=_('female volunteer age 6 to 12'), - null=True, - blank=True - ) - female_volunteer_age_13_17 = models.IntegerField( - verbose_name=_('female volunteer age 13 to 17'), - null=True, - blank=True - ) - female_volunteer_age_18_29 = models.IntegerField( - verbose_name=_('female volunteer age 18 to 29'), - null=True, - blank=True - ) - female_volunteer_age_18_49 = models.IntegerField( - verbose_name=_('female volunteer age 18 to 49'), - null=True, - blank=True - ) - female_volunteer_age_30_39 = models.IntegerField( - verbose_name=_('female volunteer age 30 to 39'), - null=True, - blank=True - ) - female_volunteer_age_40_49 = models.IntegerField( - verbose_name=_('female volunteer age 40 to 49'), - null=True, - blank=True - ) - female_volunteer_age_50_59 = models.IntegerField( - verbose_name=_('female volunteer age 50 to 59'), - null=True, - blank=True - ) - female_volunteer_age_60_69 = models.IntegerField( - verbose_name=_('female volunteer age 60 to 69'), - null=True, - blank=True - ) - female_volunteer_age_70_79 = models.IntegerField( - verbose_name=_('female volunteer age 70 to 79'), - null=True, - blank=True - ) - female_volunteer_age_80 = models.IntegerField( - verbose_name=_('female volunteer age 80'), - null=True, - blank=True - ) - - female_volunteer_age_other = models.IntegerField( - verbose_name=_('female volunteer other'), - null=True, - blank=True - ) - female_volunteer_total = models.IntegerField( - verbose_name=_('female volunteer total'), - null=True, - blank=True - ) - volunteer_total = models.IntegerField( - verbose_name=_('volunteer total'), - null=True, blank=True - ) - volunteer_age_6_12 = models.IntegerField( - verbose_name=_('volunteer age 6 to 12'), - null=True, blank=True - ) - volunteer_age_13_17 = models.IntegerField( - verbose_name=_('volunteer age 13 to 17'), - null=True, blank=True - ) - volunteer_age_18_29 = models.IntegerField( - verbose_name=_('volunteer age 18 to 29'), - null=True, blank=True - ) + male_volunteer_age_6_12 = models.IntegerField(verbose_name=_("male volunteer age 6 to 12"), null=True, blank=True) + male_volunteer_age_13_17 = models.IntegerField(verbose_name=_("male volunteer age 13 to 17"), null=True, blank=True) + male_volunteer_age_18_29 = models.IntegerField(verbose_name=_("male volunteer age 18 to 29"), null=True, blank=True) + male_volunteer_age_18_49 = models.IntegerField(verbose_name=_("male volunteer age 18 to 49"), null=True, blank=True) + male_volunteer_age_30_39 = models.IntegerField(verbose_name=_("male volunteer age 30 to 39"), null=True, blank=True) + male_volunteer_age_40_49 = models.IntegerField(verbose_name=_("male volunteer age 40 to 49"), null=True, blank=True) + male_volunteer_age_50_59 = models.IntegerField(verbose_name=_("male volunteer age 50 to 59"), null=True, blank=True) + male_volunteer_age_60_69 = models.IntegerField(verbose_name=_("male volunteer age 60 to 69"), null=True, blank=True) + male_volunteer_age_70_79 = models.IntegerField(verbose_name=_("male volunteer age 70 to 79"), null=True, blank=True) + male_volunteer_age_80 = models.IntegerField(verbose_name=_("male volunteer age 80"), null=True, blank=True) + male_volunteer_age_other = models.IntegerField(verbose_name=_("male volunteer other"), null=True, blank=True) + male_volunteer_total = models.IntegerField(verbose_name=_("male volunteer total"), null=True, blank=True) + female_volunteer_age_6_12 = models.IntegerField(verbose_name=_("female volunteer age 6 to 12"), null=True, blank=True) + female_volunteer_age_13_17 = models.IntegerField(verbose_name=_("female volunteer age 13 to 17"), null=True, blank=True) + female_volunteer_age_18_29 = models.IntegerField(verbose_name=_("female volunteer age 18 to 29"), null=True, blank=True) + female_volunteer_age_18_49 = models.IntegerField(verbose_name=_("female volunteer age 18 to 49"), null=True, blank=True) + female_volunteer_age_30_39 = models.IntegerField(verbose_name=_("female volunteer age 30 to 39"), null=True, blank=True) + female_volunteer_age_40_49 = models.IntegerField(verbose_name=_("female volunteer age 40 to 49"), null=True, blank=True) + female_volunteer_age_50_59 = models.IntegerField(verbose_name=_("female volunteer age 50 to 59"), null=True, blank=True) + female_volunteer_age_60_69 = models.IntegerField(verbose_name=_("female volunteer age 60 to 69"), null=True, blank=True) + female_volunteer_age_70_79 = models.IntegerField(verbose_name=_("female volunteer age 70 to 79"), null=True, blank=True) + female_volunteer_age_80 = models.IntegerField(verbose_name=_("female volunteer age 80"), null=True, blank=True) + + female_volunteer_age_other = models.IntegerField(verbose_name=_("female volunteer other"), null=True, blank=True) + female_volunteer_total = models.IntegerField(verbose_name=_("female volunteer total"), null=True, blank=True) + volunteer_total = models.IntegerField(verbose_name=_("volunteer total"), null=True, blank=True) + volunteer_age_6_12 = models.IntegerField(verbose_name=_("volunteer age 6 to 12"), null=True, blank=True) + volunteer_age_13_17 = models.IntegerField(verbose_name=_("volunteer age 13 to 17"), null=True, blank=True) + volunteer_age_18_29 = models.IntegerField(verbose_name=_("volunteer age 18 to 29"), null=True, blank=True) # Staff - female_staff_age_18_29 = models.IntegerField( - verbose_name=_('female staff age 18 to 29'), - null=True, - blank=True - ) - female_staff_age_18_49 = models.IntegerField( - verbose_name=_('female staff age 18 to 49'), - null=True, - blank=True - ) - female_staff_age_30_39 = models.IntegerField( - verbose_name=_('female staff age 30 to 39'), - null=True, - blank=True - ) - female_staff_age_40_49 = models.IntegerField( - verbose_name=_('female staff age 40 to 49'), - null=True, - blank=True - ) - female_staff_age_50_59 = models.IntegerField( - verbose_name=_('female staff age 50 to 59'), - null=True, - blank=True - ) - female_staff_age_60_69 = models.IntegerField( - verbose_name=_('female staff age 60 to 69'), - null=True, - blank=True - ) - female_staff_age_70_79 = models.IntegerField( - verbose_name=_('female staff age 70 to 79'), - null=True, - blank=True - ) - female_staff_age_80 = models.IntegerField( - verbose_name=_('female staff age 80'), - null=True, - blank=True - ) - female_staff_age_other = models.IntegerField( - verbose_name=_('female staff other'), - null=True, - blank=True - ) - female_staff_total = models.IntegerField( - verbose_name=_('female staff total'), - null=True, - blank=True - ) - male_staff_age_18_29 = models.IntegerField( - verbose_name=_('male staff age 18 to 29'), - null=True, - blank=True - ) - male_staff_age_18_49 = models.IntegerField( - verbose_name=_('male staff age 18 to 49'), - null=True, - blank=True - ) - male_staff_age_30_39 = models.IntegerField( - verbose_name=_('male staff age 30 to 39'), - null=True, - blank=True - ) - male_staff_age_40_49 = models.IntegerField( - verbose_name=_('male staff age 40 to 49'), - null=True, - blank=True - ) - male_staff_age_50_59 = models.IntegerField( - verbose_name=_('male staff age 50 to 59'), - null=True, - blank=True - ) - male_staff_age_60_69 = models.IntegerField( - verbose_name=_('male staff age 60 to 69'), - null=True, - blank=True - ) - male_staff_age_70_79 = models.IntegerField( - verbose_name=_('male staff age 70 to 79'), - null=True, - blank=True - ) - male_staff_age_80 = models.IntegerField( - verbose_name=_('male staff age 80'), - null=True, - blank=True - ) - male_staff_age_other = models.IntegerField( - verbose_name=_('male staff other'), - null=True, - blank=True - ) - male_staff_total = models.IntegerField( - verbose_name=_('male staff total'), - null=True, - blank=True - ) - staff_total = models.IntegerField( - verbose_name=_('staff total'), - null=True, blank=True - ) - staff_age_18_29 = models.IntegerField( - verbose_name=_('staff age 18 to 29'), - null=True, blank=True - ) + female_staff_age_18_29 = models.IntegerField(verbose_name=_("female staff age 18 to 29"), null=True, blank=True) + female_staff_age_18_49 = models.IntegerField(verbose_name=_("female staff age 18 to 49"), null=True, blank=True) + female_staff_age_30_39 = models.IntegerField(verbose_name=_("female staff age 30 to 39"), null=True, blank=True) + female_staff_age_40_49 = models.IntegerField(verbose_name=_("female staff age 40 to 49"), null=True, blank=True) + female_staff_age_50_59 = models.IntegerField(verbose_name=_("female staff age 50 to 59"), null=True, blank=True) + female_staff_age_60_69 = models.IntegerField(verbose_name=_("female staff age 60 to 69"), null=True, blank=True) + female_staff_age_70_79 = models.IntegerField(verbose_name=_("female staff age 70 to 79"), null=True, blank=True) + female_staff_age_80 = models.IntegerField(verbose_name=_("female staff age 80"), null=True, blank=True) + female_staff_age_other = models.IntegerField(verbose_name=_("female staff other"), null=True, blank=True) + female_staff_total = models.IntegerField(verbose_name=_("female staff total"), null=True, blank=True) + male_staff_age_18_29 = models.IntegerField(verbose_name=_("male staff age 18 to 29"), null=True, blank=True) + male_staff_age_18_49 = models.IntegerField(verbose_name=_("male staff age 18 to 49"), null=True, blank=True) + male_staff_age_30_39 = models.IntegerField(verbose_name=_("male staff age 30 to 39"), null=True, blank=True) + male_staff_age_40_49 = models.IntegerField(verbose_name=_("male staff age 40 to 49"), null=True, blank=True) + male_staff_age_50_59 = models.IntegerField(verbose_name=_("male staff age 50 to 59"), null=True, blank=True) + male_staff_age_60_69 = models.IntegerField(verbose_name=_("male staff age 60 to 69"), null=True, blank=True) + male_staff_age_70_79 = models.IntegerField(verbose_name=_("male staff age 70 to 79"), null=True, blank=True) + male_staff_age_80 = models.IntegerField(verbose_name=_("male staff age 80"), null=True, blank=True) + male_staff_age_other = models.IntegerField(verbose_name=_("male staff other"), null=True, blank=True) + male_staff_total = models.IntegerField(verbose_name=_("male staff total"), null=True, blank=True) + staff_total = models.IntegerField(verbose_name=_("staff total"), null=True, blank=True) + staff_age_18_29 = models.IntegerField(verbose_name=_("staff age 18 to 29"), null=True, blank=True) # Key Climate Event (Manual Entry) - avg_temperature = models.FloatField(verbose_name=_('average temperature'), null=True, blank=True) - avg_rainfall_precipitation = models.FloatField(verbose_name=_('average rainfall precipitation'), null=True, blank=True) - rainy_season = models.CharField(verbose_name=_('rainy season'), choices=Status.CHOICES, max_length=20, blank=True, null=True) + avg_temperature = models.FloatField(verbose_name=_("average temperature"), null=True, blank=True) + avg_rainfall_precipitation = models.FloatField(verbose_name=_("average rainfall precipitation"), null=True, blank=True) + rainy_season = models.CharField(verbose_name=_("rainy season"), choices=Status.CHOICES, max_length=20, blank=True, null=True) # JSON DATA (Using Script) # TODO: Seperate this to multiple tables to support Translation (not required for fts_data) - fts_data = JSONField(verbose_name=_('FTS data'), default=list) - start_network_data = JSONField(verbose_name=_('start network data'), default=list) - past_crises_events = JSONField(verbose_name=_('past crises data'), default=list) - past_epidemics = JSONField(verbose_name=_('past epidemics data'), default=list) - inform_indicators = JSONField(verbose_name=_('inform indicators data'), default=list) + fts_data = JSONField(verbose_name=_("FTS data"), default=list) + start_network_data = JSONField(verbose_name=_("start network data"), default=list) + past_crises_events = JSONField(verbose_name=_("past crises data"), default=list) + past_epidemics = JSONField(verbose_name=_("past epidemics data"), default=list) + inform_indicators = JSONField(verbose_name=_("inform indicators data"), default=list) # World bank data - world_bank_population = models.IntegerField( - verbose_name=_('world bank population'), - null=True, blank=True - ) + world_bank_population = models.IntegerField(verbose_name=_("world bank population"), null=True, blank=True) world_bank_population_above_age_65 = models.IntegerField( - verbose_name=_('world bank population above age 65'), - null=True, blank=True - ) - world_bank_population_age_14 = models.IntegerField( - verbose_name=_('world bank population age 14'), - null=True, blank=True + verbose_name=_("world bank population above age 65"), null=True, blank=True ) + world_bank_population_age_14 = models.IntegerField(verbose_name=_("world bank population age 14"), null=True, blank=True) world_bank_urban_population_percentage = models.FloatField( - verbose_name=_('world bank urban population percentage'), - null=True, blank=True - ) - world_bank_gdp = models.FloatField( - verbose_name=_('world bank gdp'), - null=True, blank=True - ) - world_bank_gni = models.FloatField( - verbose_name=_('world bank gni'), - null=True, blank=True + verbose_name=_("world bank urban population percentage"), null=True, blank=True ) + world_bank_gdp = models.FloatField(verbose_name=_("world bank gdp"), null=True, blank=True) + world_bank_gni = models.FloatField(verbose_name=_("world bank gni"), null=True, blank=True) world_bank_gender_inequality_index = models.FloatField( - verbose_name=_('world bank gender inequality index'), - null=True, blank=True - ) - world_bank_life_expectancy = models.IntegerField( - verbose_name=_('world bank life expectancy'), - null=True, blank=True - ) - world_bank_literacy_rate = models.FloatField( - verbose_name=_('world bank life expectancy'), - null=True, blank=True - ) - world_bank_poverty_rate = models.FloatField( - verbose_name=_('world bank poverty rate'), - null=True, blank=True - ) - world_bank_gni_capita = models.IntegerField( - verbose_name=_('world bank GNI Per Capita'), - null=True, blank=True + verbose_name=_("world bank gender inequality index"), null=True, blank=True ) + world_bank_life_expectancy = models.IntegerField(verbose_name=_("world bank life expectancy"), null=True, blank=True) + world_bank_literacy_rate = models.FloatField(verbose_name=_("world bank life expectancy"), null=True, blank=True) + world_bank_poverty_rate = models.FloatField(verbose_name=_("world bank poverty rate"), null=True, blank=True) + world_bank_gni_capita = models.IntegerField(verbose_name=_("world bank GNI Per Capita"), null=True, blank=True) # fetched from unicef - unicef_population_under_18 = models.IntegerField( - verbose_name=_('Unicef population under 18'), - null=True, blank=True - ) + unicef_population_under_18 = models.IntegerField(verbose_name=_("Unicef population under 18"), null=True, blank=True) # hdr - hdr_gii = models.FloatField( - verbose_name=_('HDR GII'), - null=True, blank=True - ) - fdrs_data_fetched_year = models.CharField( - verbose_name=_('FDRS Data Fetched Year'), - null=True, blank=True, - max_length=50 - ) + hdr_gii = models.FloatField(verbose_name=_("HDR GII"), null=True, blank=True) + fdrs_data_fetched_year = models.CharField(verbose_name=_("FDRS Data Fetched Year"), null=True, blank=True, max_length=50) class Meta: - verbose_name = _('country overview') - verbose_name_plural = _('countries overview') + verbose_name = _("country overview") + verbose_name_plural = _("countries overview") def __str__(self): return str(self.country) @@ -562,195 +314,157 @@ def past_crises_events_count(self): class SocialEvent(models.Model): - overview = models.ForeignKey(CountryOverview, verbose_name=_('country overview'), on_delete=models.CASCADE) - label = models.CharField(verbose_name=_('label'), max_length=255) - value = models.CharField(verbose_name=_('value'), max_length=255) + overview = models.ForeignKey(CountryOverview, verbose_name=_("country overview"), on_delete=models.CASCADE) + label = models.CharField(verbose_name=_("label"), max_length=255) + value = models.CharField(verbose_name=_("value"), max_length=255) class Meta: - unique_together = ('overview', 'label') - verbose_name = _('Social Event') - verbose_name_plural = _('Social Events') + unique_together = ("overview", "label") + verbose_name = _("Social Event") + verbose_name_plural = _("Social Events") def __str__(self): - return f'{self.overview} - {self.label}: {self.value}' + return f"{self.overview} - {self.label}: {self.value}" class KeyClimateEvent(models.Model): - overview = models.ForeignKey(CountryOverview, verbose_name=_('country overview'), on_delete=models.CASCADE) - modified_at = models.DateTimeField(auto_now=True, verbose_name=_('modified at')) + overview = models.ForeignKey(CountryOverview, verbose_name=_("country overview"), on_delete=models.CASCADE) + modified_at = models.DateTimeField(auto_now=True, verbose_name=_("modified at")) - month = models.PositiveSmallIntegerField(choices=Month.CHOICES, verbose_name=_('month')) + month = models.PositiveSmallIntegerField(choices=Month.CHOICES, verbose_name=_("month")) # TODO: Add validation min < max - avg_max_temperature = models.FloatField(verbose_name=_('average maximum temperature')) - avg_min_temperature = models.FloatField(verbose_name=_('average minimum temperature')) - avg_rainfall_precipitation = models.FloatField(verbose_name=_('average rainfall precipitation')) + avg_max_temperature = models.FloatField(verbose_name=_("average maximum temperature")) + avg_min_temperature = models.FloatField(verbose_name=_("average minimum temperature")) + avg_rainfall_precipitation = models.FloatField(verbose_name=_("average rainfall precipitation")) class Meta: - unique_together = ('overview', 'month') - verbose_name = _('Key Client Event') - verbose_name_plural = _('Key Client Events') + unique_together = ("overview", "month") + verbose_name = _("Key Client Event") + verbose_name_plural = _("Key Client Events") def __str__(self): - return f'{self.overview.country} - {self.get_month_display()}' + return f"{self.overview.country} - {self.get_month_display()}" class SeasonalCalender(models.Model): - overview = models.ForeignKey(CountryOverview, on_delete=models.CASCADE, verbose_name=_('country overview')) - modified_at = models.DateTimeField(auto_now=True, verbose_name=_('modified at')) - title = models.CharField(max_length=20, verbose_name=_('title')) # TODO: CHOICES? - sector = models.CharField(max_length=20, verbose_name=_('sector')) # TODO: CHOICES? - date_start = models.DateField(verbose_name=_('date start')) - date_end = models.DateField(verbose_name=_('date end')) + overview = models.ForeignKey(CountryOverview, on_delete=models.CASCADE, verbose_name=_("country overview")) + modified_at = models.DateTimeField(auto_now=True, verbose_name=_("modified at")) + title = models.CharField(max_length=20, verbose_name=_("title")) # TODO: CHOICES? + sector = models.CharField(max_length=20, verbose_name=_("sector")) # TODO: CHOICES? + date_start = models.DateField(verbose_name=_("date start")) + date_end = models.DateField(verbose_name=_("date end")) class Meta: - unique_together = ('overview', 'sector', 'title') - verbose_name = _('Seasonal Calender Record') - verbose_name_plural = _('Seasonal Calender Records') + unique_together = ("overview", "sector", "title") + verbose_name = _("Seasonal Calender Record") + verbose_name_plural = _("Seasonal Calender Records") def __str__(self): - return f'{self.overview.country} - {self.title} - {self.sector}' + return f"{self.overview.country} - {self.title} - {self.sector}" class AcapsSeasonalCalender(models.Model): - overview = models.ForeignKey( - CountryOverview, - on_delete=models.CASCADE, - verbose_name=_('country overview') - ) - modified_at = models.DateTimeField( - auto_now=True, - verbose_name=_('modified at') - ) + overview = models.ForeignKey(CountryOverview, on_delete=models.CASCADE, verbose_name=_("country overview")) + modified_at = models.DateTimeField(auto_now=True, verbose_name=_("modified at")) month = ArrayField( models.CharField(max_length=100), - verbose_name=_('month'), default=list, + verbose_name=_("month"), + default=list, ) event = ArrayField( models.CharField(max_length=100), - verbose_name=_('event'), default=list, + verbose_name=_("event"), + default=list, ) event_type = ArrayField( models.CharField(max_length=100), - verbose_name=_('event type'), default=list, + verbose_name=_("event type"), + default=list, ) label = ArrayField( models.CharField(max_length=100), - verbose_name=_('label'), default=list, - ) - source = models.CharField( - verbose_name=_('Source'), - max_length=255, - null=True, blank=True - ) - source_date = models.DateField( - verbose_name=_('Source Date'), - null=True, blank=True + verbose_name=_("label"), + default=list, ) + source = models.CharField(verbose_name=_("Source"), max_length=255, null=True, blank=True) + source_date = models.DateField(verbose_name=_("Source Date"), null=True, blank=True) def __str__(self): - return f'{self.overview.country.name} - {self.month}' + return f"{self.overview.country.name} - {self.month}" class KeyDocumentGroup(models.Model): - title = models.CharField(max_length=20, verbose_name=_('title')) + title = models.CharField(max_length=20, verbose_name=_("title")) def __str__(self): return self.title def key_document_path(instance, filename): - return 'country-key-documents/%s/%s' % (instance.overview.country_id, filename) + return "country-key-documents/%s/%s" % (instance.overview.country_id, filename) class KeyDocument(models.Model): - overview = models.ForeignKey(CountryOverview, verbose_name=_('country overview'), on_delete=models.CASCADE) - title = models.CharField(max_length=20, verbose_name=_('title')) - group = models.ForeignKey(KeyDocumentGroup, on_delete=models.CASCADE, verbose_name=_('group')) - date = models.DateField(verbose_name=_('date')) - file = models.FileField(verbose_name=_('file'), upload_to=key_document_path) + overview = models.ForeignKey(CountryOverview, verbose_name=_("country overview"), on_delete=models.CASCADE) + title = models.CharField(max_length=20, verbose_name=_("title")) + group = models.ForeignKey(KeyDocumentGroup, on_delete=models.CASCADE, verbose_name=_("group")) + date = models.DateField(verbose_name=_("date")) + file = models.FileField(verbose_name=_("file"), upload_to=key_document_path) def __str__(self): - return f'{self.title}, {self.date}' + return f"{self.title}, {self.date}" class ExternalSource(models.Model): - overview = models.ForeignKey(CountryOverview, verbose_name=_('country overview'), on_delete=models.CASCADE) - title = models.CharField(max_length=20, verbose_name=_('title')) - url = models.URLField(verbose_name=_('url'), max_length=300) + overview = models.ForeignKey(CountryOverview, verbose_name=_("country overview"), on_delete=models.CASCADE) + title = models.CharField(max_length=20, verbose_name=_("title")) + url = models.URLField(verbose_name=_("url"), max_length=300) def __str__(self): - return f'{self.title}: {self.url}' + return f"{self.title}: {self.url}" class FDRSIndicator(models.Model): - title = models.CharField(verbose_name=_('Indicator Title'), max_length=255) - description = models.TextField( - verbose_name=_('Indicator Descritpion'), - null=True, blank=True - ) + title = models.CharField(verbose_name=_("Indicator Title"), max_length=255) + description = models.TextField(verbose_name=_("Indicator Descritpion"), null=True, blank=True) class FDRSIncome(models.Model): - overview = models.ForeignKey( - CountryOverview, - verbose_name=_('country overview'), - on_delete=models.CASCADE - ) - date = models.DateField( - verbose_name=_('date') - ) - indicator = models.ForeignKey( - FDRSIndicator, - on_delete=models.CASCADE, - verbose_name=_('FDRS Indicator') - ) - value = models.FloatField( - verbose_name=_('value'), - null=True, blank=True - ) + overview = models.ForeignKey(CountryOverview, verbose_name=_("country overview"), on_delete=models.CASCADE) + date = models.DateField(verbose_name=_("date")) + indicator = models.ForeignKey(FDRSIndicator, on_delete=models.CASCADE, verbose_name=_("FDRS Indicator")) + value = models.FloatField(verbose_name=_("value"), null=True, blank=True) def __str__(self): - return f'{self.overview.country.name} - {self.date} - {self.indicator.title} - {self.value}' + return f"{self.overview.country.name} - {self.date} - {self.indicator.title} - {self.value}" class FDRSAnnualIncome(models.Model): """This is used to track the historical income data from fdrs""" - overview = models.ForeignKey( - CountryOverview, - verbose_name=_('country overview'), - on_delete=models.CASCADE - ) - date = models.DateField( - verbose_name=_('date') - ) - value = models.FloatField( - verbose_name=_('value'), - null=True, blank=True - ) + + overview = models.ForeignKey(CountryOverview, verbose_name=_("country overview"), on_delete=models.CASCADE) + date = models.DateField(verbose_name=_("date")) + value = models.FloatField(verbose_name=_("value"), null=True, blank=True) def __str__(self): - return f'{self.overview.country.name} - {self.date} - {self.value}' + return f"{self.overview.country.name} - {self.date} - {self.value}" class CountryKeyClimate(models.Model): - overview = models.ForeignKey( - CountryOverview, - on_delete=models.CASCADE, - verbose_name=_('country overview') - ) + overview = models.ForeignKey(CountryOverview, on_delete=models.CASCADE, verbose_name=_("country overview")) - year = models.PositiveIntegerField(verbose_name=_('year')) - month = models.PositiveSmallIntegerField(choices=Month.CHOICES, verbose_name=_('month')) + year = models.PositiveIntegerField(verbose_name=_("year")) + month = models.PositiveSmallIntegerField(choices=Month.CHOICES, verbose_name=_("month")) - min_temp = models.FloatField(verbose_name=_('min temperature')) - max_temp = models.FloatField(verbose_name=_('max temperature')) - avg_temp = models.FloatField(verbose_name=_('average temperature')) - precipitation = models.FloatField(verbose_name=_('precipitation')) + min_temp = models.FloatField(verbose_name=_("min temperature")) + max_temp = models.FloatField(verbose_name=_("max temperature")) + avg_temp = models.FloatField(verbose_name=_("average temperature")) + precipitation = models.FloatField(verbose_name=_("precipitation")) class Meta: - unique_together = ('overview', 'month', 'year') - verbose_name = _('Country Climate') - verbose_name_plural = _('Country Climate') + unique_together = ("overview", "month", "year") + verbose_name = _("Country Climate") + verbose_name_plural = _("Country Climate") def __str__(self): - return f'{self.overview.country.name} - { self.year} - {self.get_month_display()}' \ No newline at end of file + return f"{self.overview.country.name} - { self.year} - {self.get_month_display()}" diff --git a/databank/serializers.py b/databank/serializers.py index 446132abc..3bf95fa2b 100644 --- a/databank/serializers.py +++ b/databank/serializers.py @@ -1,89 +1,92 @@ from rest_framework import serializers -from api.models import ( - Appeal, - Country, - District, -) +from api.models import Appeal, Country, District from api.serializers import DisasterTypeSerializer +from utils.file_check import validate_file_type + from .models import ( + AcapsSeasonalCalender, CountryKeyClimate, CountryOverview, - - SocialEvent, - KeyClimateEvent, - SeasonalCalender, - KeyDocument, ExternalSource, - AcapsSeasonalCalender, - FDRSIncome, FDRSAnnualIncome, + FDRSIncome, FDRSIndicator, + KeyClimateEvent, + KeyDocument, + SeasonalCalender, + SocialEvent, ) -from utils.file_check import validate_file_type class KeyClimateEventSerializer(serializers.ModelSerializer): - month_display = serializers.CharField(source='get_month_display', read_only=True) + month_display = serializers.CharField(source="get_month_display", read_only=True) class Meta: model = KeyClimateEvent - exclude = ('overview',) + exclude = ("overview",) class SeasonalCalenderSerializer(serializers.ModelSerializer): class Meta: model = SeasonalCalender - exclude = ('overview',) + exclude = ("overview",) class CountrySerializer(serializers.ModelSerializer): class Meta: model = Country - fields = ('name', 'iso',) + fields = ( + "name", + "iso", + ) class SocialEventSerializer(serializers.ModelSerializer): class Meta: model = SocialEvent - exclude = ('overview',) + exclude = ("overview",) class AppealSerializer(serializers.ModelSerializer): dtype = DisasterTypeSerializer() - event_name = serializers.CharField(source='event.name', read_only=True) + event_name = serializers.CharField(source="event.name", read_only=True) class Meta: model = Appeal fields = ( - 'event_name', 'dtype', 'start_date', - 'num_beneficiaries', 'amount_requested', 'amount_funded', + "event_name", + "dtype", + "start_date", + "num_beneficiaries", + "amount_requested", + "amount_funded", ) class WBDistrictPopulationSerializer(serializers.ModelSerializer): - population = serializers.IntegerField(source='wb_population') - year = serializers.CharField(source='wb_year') + population = serializers.IntegerField(source="wb_population") + year = serializers.CharField(source="wb_year") class Meta: model = District - fields = ('id', 'name', 'code', 'population', 'year') + fields = ("id", "name", "code", "population", "year") class WBCountryPopulationSerializer(WBDistrictPopulationSerializer): - districts = WBDistrictPopulationSerializer(source='district_set', many=True) + districts = WBDistrictPopulationSerializer(source="district_set", many=True) class Meta: model = Country - fields = ('id', 'iso', 'iso3', 'name', 'population', 'year', 'districts') + fields = ("id", "iso", "iso3", "name", "population", "year", "districts") class KeyDocumentSerializer(serializers.ModelSerializer): - group_display = serializers.CharField(source='group.title', read_only=True) + group_display = serializers.CharField(source="group.title", read_only=True) class Meta: model = KeyDocument - exclude = ('overview',) + exclude = ("overview",) def validate_file(self, file): validate_file_type(file) @@ -93,7 +96,7 @@ def validate_file(self, file): class ExternalSourceSerializer(serializers.ModelSerializer): class Meta: model = ExternalSource - exclude = ('overview',) + exclude = ("overview",) class AcapsSeasonalCalenderSerializer(serializers.ModelSerializer): @@ -109,7 +112,7 @@ class Meta: class FDRSIncomeSerializer(serializers.ModelSerializer): - indicator_details = FDRSIndicatorSerializer(source='indicator', read_only=True) + indicator_details = FDRSIndicatorSerializer(source="indicator", read_only=True) class Meta: model = FDRSIncome @@ -123,35 +126,34 @@ class Meta: class CountryKeyClimateSerializer(serializers.ModelSerializer): - month_display = serializers.CharField(source='get_month_display', read_only=True) + month_display = serializers.CharField(source="get_month_display", read_only=True) class Meta: model = CountryKeyClimate - exclude = ('overview',) + exclude = ("overview",) + class CountryOverviewSerializer(serializers.ModelSerializer): - school_status_display = serializers.CharField(source='get_school_status_display', read_only=True) - rainy_season_display = serializers.CharField(source='get_rainy_season_display', read_only=True) + school_status_display = serializers.CharField(source="get_school_status_display", read_only=True) + rainy_season_display = serializers.CharField(source="get_rainy_season_display", read_only=True) past_crises_events_count = serializers.IntegerField(read_only=True) - wb_population = WBCountryPopulationSerializer(source='country', read_only=True) + wb_population = WBCountryPopulationSerializer(source="country", read_only=True) - social_events = SocialEventSerializer(source='socialevent_set', many=True, read_only=True) - climate_events = KeyClimateEventSerializer(source='keyclimateevent_set', many=True, read_only=True) - seasonal_calender = SeasonalCalenderSerializer(source='seasonalcalender_set', many=True, read_only=True) + social_events = SocialEventSerializer(source="socialevent_set", many=True, read_only=True) + climate_events = KeyClimateEventSerializer(source="keyclimateevent_set", many=True, read_only=True) + seasonal_calender = SeasonalCalenderSerializer(source="seasonalcalender_set", many=True, read_only=True) appeals = AppealSerializer(many=True, read_only=True) - key_documents = KeyDocumentSerializer(source='keydocument_set', many=True, read_only=True) - external_sources = ExternalSourceSerializer(source='externalsource_set', many=True, read_only=True) + key_documents = KeyDocumentSerializer(source="keydocument_set", many=True, read_only=True) + external_sources = ExternalSourceSerializer(source="externalsource_set", many=True, read_only=True) acaps = AcapsSeasonalCalenderSerializer(source="acapsseasonalcalender_set", many=True, read_only=True) founded_date = serializers.SerializerMethodField(source="get_founded_date") # fdrs_income = FDRSIncomeSerializer(source='fdrsincome_set', many=True, read_only=True) - key_climate = CountryKeyClimateSerializer(source='countrykeyclimate_set', many=True, read_only=True) - fdrs_annual_income = FDRSAnnualIncomeSerializer(source='fdrsannualincome_set', many=True, read_only=True) + key_climate = CountryKeyClimateSerializer(source="countrykeyclimate_set", many=True, read_only=True) + fdrs_annual_income = FDRSAnnualIncomeSerializer(source="fdrsannualincome_set", many=True, read_only=True) class Meta: model = CountryOverview - fields = '__all__' + fields = "__all__" def get_founded_date(self, object): - return Country.objects.filter( - countryoverview=object - ).values_list('founded_date', flat=True).first() + return Country.objects.filter(countryoverview=object).values_list("founded_date", flat=True).first() diff --git a/databank/views.py b/databank/views.py index 39f7e92e5..9fc9198d0 100644 --- a/databank/views.py +++ b/databank/views.py @@ -1,22 +1,19 @@ -from rest_framework.authentication import TokenAuthentication, BasicAuthentication +from rest_framework import mixins, viewsets +from rest_framework.authentication import BasicAuthentication, TokenAuthentication from rest_framework.permissions import IsAuthenticated -from rest_framework import viewsets, mixins +from .filter_set import FDRSIncomeFilter from .models import CountryOverview, FDRSIncome from .serializers import CountryOverviewSerializer, FDRSIncomeSerializer -from .filter_set import FDRSIncomeFilter -class CountryOverviewViewSet( - mixins.RetrieveModelMixin, - viewsets.GenericViewSet -): +class CountryOverviewViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): queryset = CountryOverview.objects.all() # TODO: Use global authentication class authentication_classes = (BasicAuthentication, TokenAuthentication) permission_classes = (IsAuthenticated,) serializer_class = CountryOverviewSerializer - lookup_field = 'country__iso__iexact' + lookup_field = "country__iso__iexact" class FDRSIncomeViewSet(viewsets.ReadOnlyModelViewSet): @@ -24,4 +21,4 @@ class FDRSIncomeViewSet(viewsets.ReadOnlyModelViewSet): filterset_class = FDRSIncomeFilter def get_queryset(self): - return FDRSIncome.objects.select_related('overview', 'indicator') + return FDRSIncome.objects.select_related("overview", "indicator") diff --git a/deployments/__init__.py b/deployments/__init__.py index a9c89f1d0..23ae97a2e 100644 --- a/deployments/__init__.py +++ b/deployments/__init__.py @@ -1 +1 @@ -default_app_config = 'deployments.apps.DeploymentsConfig' +default_app_config = "deployments.apps.DeploymentsConfig" diff --git a/deployments/admin.py b/deployments/admin.py index d8bc4f7d7..ea63ab030 100644 --- a/deployments/admin.py +++ b/deployments/admin.py @@ -1,125 +1,166 @@ import csv + +from admin_auto_filters.filters import AutocompleteFilter from django.contrib import admin -from django.urls import reverse -from django.utils.safestring import mark_safe -from django.urls import path from django.contrib.admin import helpers -from django.shortcuts import redirect, render from django.http import StreamingHttpResponse +from django.shortcuts import redirect, render +from django.urls import path, reverse +from django.utils.safestring import mark_safe from django.utils.translation import gettext from django.utils.translation import gettext_lazy as _ -from admin_auto_filters.filters import AutocompleteFilter from django_admin_listfilter_dropdown.filters import RelatedDropdownFilter +from reversion_compare.admin import CompareVersionAdmin -from api.utils import Echo import deployments.models as models from api.admin_classes import RegionRestrictedAdmin +from api.utils import Echo from lang.admin import TranslationAdmin -from reversion_compare.admin import CompareVersionAdmin from .forms import ProjectForm, ProjectImportForm class ERUInline(admin.TabularInline): model = models.ERU - autocomplete_fields = ('deployed_to', 'event', 'appeal') + autocomplete_fields = ("deployed_to", "event", "appeal") class ERUOwnerAdmin(CompareVersionAdmin, RegionRestrictedAdmin): - country_in = 'national_society_country__in' - region_in = 'national_society_country__region__in' + country_in = "national_society_country__in" + region_in = "national_society_country__region__in" inlines = [ERUInline] - autocomplete_fields = ('national_society_country',) - search_fields = ('national_society_country__name',) + autocomplete_fields = ("national_society_country",) + search_fields = ("national_society_country__name",) def get_queryset(self, request): - return super().get_queryset(request).select_related('national_society_country') + return super().get_queryset(request).select_related("national_society_country") class SectorAdmin(CompareVersionAdmin, admin.ModelAdmin): model = models.Sector - search_fields = ('title',) + search_fields = ("title",) class SectorTagAdmin(CompareVersionAdmin, admin.ModelAdmin): model = models.SectorTag - search_fields = ('title',) + search_fields = ("title",) class MolnixTagGroupAdmin(CompareVersionAdmin, admin.ModelAdmin): model = models.MolnixTagGroup - list_display = ['name', 'molnix_id'] - ordering = ('molnix_id',) - search_fields = ('name',) + list_display = ["name", "molnix_id"] + ordering = ("molnix_id",) + search_fields = ("name",) @admin.register(models.ERU) class ERUAdmin(CompareVersionAdmin, admin.ModelAdmin): - search_fields = ('national_society_country__name',) + search_fields = ("national_society_country__name",) class PersonnelAdmin(CompareVersionAdmin, TranslationAdmin): - country_in = 'country_from__in' - region_in = 'country_from__region__in' - search_fields = ('name', 'role', 'type',) - list_display = ('name', 'role', 'start_date', 'end_date', 'country_from', 'deployment',) - readonly_fields = ('molnix_id',) + country_in = "country_from__in" + region_in = "country_from__region__in" + search_fields = ( + "name", + "role", + "type", + ) + list_display = ( + "name", + "role", + "start_date", + "end_date", + "country_from", + "deployment", + ) + readonly_fields = ("molnix_id",) def get_queryset(self, request): - return super().get_queryset(request).select_related( - 'country_from', - 'deployment__country_deployed_to', - 'deployment__region_deployed_to', - 'deployment__event_deployed_to' + return ( + super() + .get_queryset(request) + .select_related( + "country_from", + "deployment__country_deployed_to", + "deployment__region_deployed_to", + "deployment__event_deployed_to", + ) ) class PersonnelInline(admin.TabularInline): model = models.Personnel - autocomplete_fields = ('country_from',) - readonly_fields = ('molnix_id',) + autocomplete_fields = ("country_from",) + readonly_fields = ("molnix_id",) class PersonnelDeploymentAdmin(CompareVersionAdmin, TranslationAdmin): - search_fields = ('country_deployed_to__name', 'region_deployed_to__label', 'event_deployed_to__name') - autocomplete_fields = ('event_deployed_to', 'appeal_deployed_to') + search_fields = ("country_deployed_to__name", "region_deployed_to__label", "event_deployed_to__name") + autocomplete_fields = ("event_deployed_to", "appeal_deployed_to") inlines = [PersonnelInline] - list_display = ('country_deployed_to', 'region_deployed_to', 'event_deployed_to', 'comments',) + list_display = ( + "country_deployed_to", + "region_deployed_to", + "event_deployed_to", + "comments", + ) def get_queryset(self, request): - return super().get_queryset(request).select_related('country_deployed_to', 'region_deployed_to', 'event_deployed_to') + return super().get_queryset(request).select_related("country_deployed_to", "region_deployed_to", "event_deployed_to") class PartnerSocietyActivityAdmin(CompareVersionAdmin, TranslationAdmin): - search_fields = ('activity',) + search_fields = ("activity",) class PartnerSocietyDeploymentAdmin(CompareVersionAdmin, RegionRestrictedAdmin, TranslationAdmin): - country_in = 'parent_society__in' - region_in = 'parent_society__region__in' - autocomplete_fields = ('parent_society', 'country_deployed_to', 'district_deployed_to',) + country_in = "parent_society__in" + region_in = "parent_society__region__in" + autocomplete_fields = ( + "parent_society", + "country_deployed_to", + "district_deployed_to", + ) search_fields = ( - 'activity__activity', 'name', 'role', 'country_deployed_to__name', 'parent_society__name', 'district_deployed_to__name', + "activity__activity", + "name", + "role", + "country_deployed_to__name", + "parent_society__name", + "district_deployed_to__name", + ) + list_display = ( + "name", + "role", + "activity", + "parent_society", + "country_deployed_to", + "start_date", + "end_date", ) - list_display = ('name', 'role', 'activity', 'parent_society', 'country_deployed_to', 'start_date', 'end_date',) def get_queryset(self, request): - return super().get_queryset(request).select_related('activity', 'parent_society', 'country_deployed_to') + return super().get_queryset(request).select_related("activity", "parent_society", "country_deployed_to") class RegionalProjectAdmin(CompareVersionAdmin, TranslationAdmin): - list_display = ('name', 'created_at', 'modified_at',) - search_fields = ('name',) + list_display = ( + "name", + "created_at", + "modified_at", + ) + search_fields = ("name",) class ProjectNSFilter(AutocompleteFilter): - title = _('National Society') - field_name = 'reporting_ns' + title = _("National Society") + field_name = "reporting_ns" class ProjectCountryFilter(AutocompleteFilter): - title = _('Country') - field_name = 'project_country' + title = _("Country") + field_name = "project_country" class ProjectAnnualSplitAdminInline(admin.TabularInline): @@ -128,15 +169,21 @@ class ProjectAnnualSplitAdminInline(admin.TabularInline): class ProjectAdmin(CompareVersionAdmin, TranslationAdmin): form = ProjectForm - reporting_ns_in = 'country_from__in' - search_fields = ('name',) + reporting_ns_in = "country_from__in" + search_fields = ("name",) list_filter = ( - ('reporting_ns', RelatedDropdownFilter), - ('project_country', RelatedDropdownFilter), + ("reporting_ns", RelatedDropdownFilter), + ("project_country", RelatedDropdownFilter), ) autocomplete_fields = ( - 'user', 'reporting_ns', 'project_country', 'project_districts', 'regional_project', - 'event', 'dtype', 'project_admin2' + "user", + "reporting_ns", + "project_country", + "project_districts", + "regional_project", + "event", + "dtype", + "project_admin2", ) inlines = [ProjectAnnualSplitAdminInline] @@ -144,37 +191,39 @@ class Media: # Required by AutocompleteFilter pass def get_queryset(self, request): - return super().get_queryset(request).select_related('reporting_ns') + return super().get_queryset(request).select_related("reporting_ns") def get_url_namespace(self, name, absolute=True): meta = self.model._meta - namespace = f'{meta.app_label}_{meta.model_name}_{name}' - return f'admin:{namespace}' if absolute else namespace + namespace = f"{meta.app_label}_{meta.model_name}_{name}" + return f"admin:{namespace}" if absolute else namespace # Add import button to changelist (Using extended admin/change_list.html) def changelist_view(self, request, extra_context={}): pi_meta = models.ProjectImport._meta - extra_context['additional_addlinks'] = [{ - 'namespace': self.get_url_namespace('bulk_import'), - 'label': gettext('New Import'), - }, { - 'namespace': f'admin:{pi_meta.app_label}_{pi_meta.model_name}_changelist', - 'label': gettext('Recent Imports'), - }, { - 'namespace': self.get_url_namespace('bulk_import_template'), - 'label': gettext('Import Template'), - }] + extra_context["additional_addlinks"] = [ + { + "namespace": self.get_url_namespace("bulk_import"), + "label": gettext("New Import"), + }, + { + "namespace": f"admin:{pi_meta.app_label}_{pi_meta.model_name}_changelist", + "label": gettext("Recent Imports"), + }, + { + "namespace": self.get_url_namespace("bulk_import_template"), + "label": gettext("Import Template"), + }, + ] return super().changelist_view(request, extra_context=extra_context) def get_urls(self): return [ + path("import/", self.admin_site.admin_view(self.bulk_import), name=self.get_url_namespace("bulk_import", False)), path( - 'import/', self.admin_site.admin_view(self.bulk_import), - name=self.get_url_namespace('bulk_import', False) - ), - path( - 'import-template/', self.admin_site.admin_view(self.bulk_import_template), - name=self.get_url_namespace('bulk_import_template', False) + "import-template/", + self.admin_site.admin_view(self.bulk_import_template), + name=self.get_url_namespace("bulk_import_template", False), ), ] + super().get_urls() @@ -183,67 +232,72 @@ def bulk_import_template(self, request): pseudo_buffer = Echo() writer = csv.writer(pseudo_buffer) response = StreamingHttpResponse((writer.writerow(row) for row in rows), content_type="text/csv") - response['Content-Disposition'] = 'attachment; filename="project-import-template.csv"' + response["Content-Disposition"] = 'attachment; filename="project-import-template.csv"' return response def bulk_import(self, request): - if request.method == 'POST': + if request.method == "POST": form = ProjectImportForm(request.POST, request.FILES) if form.is_valid(): form.handle_bulk_upload(request) - return redirect(self.get_url_namespace('changelist')) + return redirect(self.get_url_namespace("changelist")) form = ProjectImportForm() context = { **self.admin_site.each_context(request), - 'has_view_permission': self.has_change_permission(request), - 'app_label': self.model._meta.app_label, - 'title': 'Import Projects', - 'opts': self.model._meta, - 'form': form, - 'adminform': helpers.AdminForm( - form, list([(None, {'fields': form.base_fields})]), self.get_prepopulated_fields(request), - ) + "has_view_permission": self.has_change_permission(request), + "app_label": self.model._meta.app_label, + "title": "Import Projects", + "opts": self.model._meta, + "form": form, + "adminform": helpers.AdminForm( + form, + list([(None, {"fields": form.base_fields})]), + self.get_prepopulated_fields(request), + ), } return render( - request, "admin/import_form.html", context, + request, + "admin/import_form.html", + context, ) class ProjectImportProjectInline(admin.TabularInline): model = models.ProjectImport.projects_created.through - readonly_fields = ('project_link',) + readonly_fields = ("project_link",) verbose_name_plural = _("Projects") max_num = 0 show_change_link = True - fieldsets = ( - (None, { - 'fields': ('project_link',) - }), - ) + fieldsets = ((None, {"fields": ("project_link",)}),) def project_link(self, obj): meta = models.Project._meta - url = reverse(f'admin:{meta.app_label}_{meta.model_name}_change', args=(obj.project_id,)) - return mark_safe(f''' + url = reverse(f"admin:{meta.app_label}_{meta.model_name}_change", args=(obj.project_id,)) + return mark_safe( + f""" {obj.project} - ''') + """ + ) class ProjectImportAdmin(admin.ModelAdmin): - search_fields = ('file',) - readonly_fields = ('id', 'created_by', 'created_at', 'message_display', 'file', 'status',) - list_display = ('created_by', 'created_at', 'status', 'file') - list_filter = ('created_at', 'status') - actions = None - fieldsets = ( - (None, { - 'fields': ('created_by', 'created_at', 'file', 'status', 'message_display') - }), + search_fields = ("file",) + readonly_fields = ( + "id", + "created_by", + "created_at", + "message_display", + "file", + "status", ) + list_display = ("created_by", "created_at", "status", "file") + list_filter = ("created_at", "status") + actions = None + fieldsets = ((None, {"fields": ("created_by", "created_at", "file", "status", "message_display")}),) inlines = (ProjectImportProjectInline,) def get_queryset(self, request): - return super().get_queryset(request).prefetch_related('projects_created', 'created_by') + return super().get_queryset(request).prefetch_related("projects_created", "created_by") def has_add_permission(self, requests, obj=None): return False @@ -253,17 +307,19 @@ def has_delete_permission(self, requests, obj=None): def message_display(self, obj): if obj.message: - style_class = 'error' if obj.status == models.ProjectImport.FAILURE else '' - return mark_safe(f''' + style_class = "error" if obj.status == models.ProjectImport.FAILURE else "" + return mark_safe( + f"""
  • {obj.message}
- ''') + """ + ) class ERUReadinessAdmin(CompareVersionAdmin): - search_fields = ('national_society',) + search_fields = ("national_society",) def get_queryset(self, request): - return super().get_queryset(request).select_related('national_society') + return super().get_queryset(request).select_related("national_society") # ----- Emergency Project ----- [Start] @@ -277,35 +333,39 @@ class EmergencyProjectActivityActionInline(admin.TabularInline): @admin.register(models.EmergencyProjectActivityAction) class EmergencyProjectActivityActionAdmin(CompareVersionAdmin, admin.ModelAdmin): - search_fields = ('title',) + search_fields = ("title",) inlines = (EmergencyProjectActivityActionSupplyInline,) @admin.register(models.EmergencyProjectActivitySector) class EmergencyProjectActivitySectorAdmin(CompareVersionAdmin, admin.ModelAdmin): - search_fields = ('title',) + search_fields = ("title",) inlines = (EmergencyProjectActivityActionInline,) class EmergencyProjectActivityInline(admin.TabularInline): model = models.EmergencyProjectActivity - autocomplete_fields = ('sector', 'action',) + autocomplete_fields = ( + "sector", + "action", + ) extra = 0 @admin.register(models.EmergencyProject) class EmergencyProjectAdmin(CompareVersionAdmin, admin.ModelAdmin): - search_fields = ('title',) + search_fields = ("title",) autocomplete_fields = ( - 'created_by', 'modified_by', 'event', 'reporting_ns', 'deployed_eru', - 'country', 'districts', 'admin2', + "created_by", + "modified_by", + "event", + "reporting_ns", + "deployed_eru", + "country", + "districts", + "admin2", ) - list_display = [ - 'title', - 'event', - 'country', - 'reporting_ns' - ] + list_display = ["title", "event", "country", "reporting_ns"] inlines = (EmergencyProjectActivityInline,) diff --git a/deployments/apps.py b/deployments/apps.py index 9c17f1b98..3ee109a2f 100644 --- a/deployments/apps.py +++ b/deployments/apps.py @@ -1,10 +1,10 @@ -from django.utils.translation import gettext_lazy as _ from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class DeploymentsConfig(AppConfig): - name = 'deployments' - verbose_name = _('Deployments & 3W\'s (Who, What, Where)') + name = "deployments" + verbose_name = _("Deployments & 3W's (Who, What, Where)") def ready(self): import api.receivers # noqa: F401 diff --git a/deployments/drf_views.py b/deployments/drf_views.py index 8c1b4ec9e..124b89b1f 100644 --- a/deployments/drf_views.py +++ b/deployments/drf_views.py @@ -1,38 +1,37 @@ -from collections import defaultdict import datetime +from collections import defaultdict from datetime import date -from django.utils import timezone -from django.utils.translation import override as translation_override -from rest_framework.authentication import TokenAuthentication -from rest_framework.permissions import IsAuthenticated -from rest_framework.decorators import action -from rest_framework import viewsets -from rest_framework.response import Response -from rest_framework.views import APIView -from drf_spectacular.utils import extend_schema -from django_filters import rest_framework as filters +from django.contrib.postgres.aggregates.general import ArrayAgg from django.contrib.postgres.fields import ArrayField from django.db import models from django.db.models import Count from django.db.models.functions import Coalesce -from django.contrib.postgres.aggregates.general import ArrayAgg from django.shortcuts import get_object_or_404 +from django.utils import timezone +from django.utils.translation import override as translation_override +from django_filters import rest_framework as filters +from drf_spectacular.utils import extend_schema +from rest_framework import viewsets +from rest_framework.authentication import TokenAuthentication +from rest_framework.decorators import action +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.views import APIView from reversion.views import RevisionMixin -from main.utils import is_tableau -from main.serializers import CsvListMixin -from api.models import ( - Country, - Region, -) +from api.models import Country, Region from api.view_filters import ListFilter from api.visibility_class import ReadOnlyVisibilityViewsetMixin +from main.serializers import CsvListMixin +from main.utils import is_tableau -from .filters import ProjectFilter, EmergencyProjectFilter, ERUOwnerFilter -from .utils import get_previous_months +from .filters import EmergencyProjectFilter, ERUOwnerFilter, ProjectFilter from .models import ( ERU, + EmergencyProject, + EmergencyProjectActivityAction, + EmergencyProjectActivitySector, ERUOwner, OperationTypes, PartnerSocietyDeployment, @@ -43,33 +42,31 @@ RegionalProject, Sector, Statuses, - EmergencyProject, - EmergencyProjectActivitySector, - EmergencyProjectActivityAction, ) from .serializers import ( + AggregateDeploymentsSerializer, + DeploymentByNSSerializer, + DeploymentsByMonthSerializer, + EmergencyProjectOptionsSerializer, + EmergencyProjectSerializer, ERUOwnerSerializer, ERUSerializer, - PersonnelDeploymentSerializer, - PersonnelSerializer, + GlobalProjectNSOngoingProjectsStatsSerializer, + GlobalProjectOverviewSerializer, + PartnerDeploymentSerializer, + PartnerDeploymentTableauSerializer, PersonnelCsvSerializer, PersonnelCsvSerializerAnon, PersonnelCsvSerializerSuper, - PartnerDeploymentSerializer, - PartnerDeploymentTableauSerializer, - RegionalProjectSerializer, - ProjectSerializer, + PersonnelDeploymentSerializer, + PersonnelSerializer, ProjectCsvSerializer, - EmergencyProjectSerializer, - EmergencyProjectOptionsSerializer, - AggregateDeploymentsSerializer, - GlobalProjectNSOngoingProjectsStatsSerializer, - GlobalProjectOverviewSerializer, - DeploymentByNSSerializer, - DeploymentsByMonthSerializer, - ProjectRegionOverviewSerializer, ProjectRegionMovementActivitiesSerializer, + ProjectRegionOverviewSerializer, + ProjectSerializer, + RegionalProjectSerializer, ) +from .utils import get_previous_months class ERUOwnerViewset(viewsets.ReadOnlyModelViewSet): @@ -181,18 +178,23 @@ class PersonnelViewset(viewsets.ReadOnlyModelViewSet): def get_queryset(self): qs = super().get_queryset() - return qs.filter(is_active=True).select_related( - "deployment__country_deployed_to", - "deployment__event_deployed_to", - "deployment__event_deployed_to__dtype", - "country_from", - "country_to", - ).prefetch_related( - "deployment__event_deployed_to__countries", - "deployment__event_deployed_to__appeals", - "molnix_tags", - "molnix_tags__groups" - ).all() + return ( + qs.filter(is_active=True) + .select_related( + "deployment__country_deployed_to", + "deployment__event_deployed_to", + "deployment__event_deployed_to__dtype", + "country_from", + "country_to", + ) + .prefetch_related( + "deployment__event_deployed_to__countries", + "deployment__event_deployed_to__appeals", + "molnix_tags", + "molnix_tags__groups", + ) + .all() + ) def get_serializer_class(self): request_format_type = self.request.GET.get("format", "json") @@ -245,9 +247,9 @@ def get_renderer_context(self): "ongoing", "is_active", "name", - "molnix_status" + "molnix_status", ] - context['request'] = self.request + context["request"] = self.request context["header"] += [ "molnix_id", "molnix_sector", @@ -345,22 +347,14 @@ def get(cls, request): month_string = month[0] first_day = month[1] last_day = month[2] - count = Personnel.objects.filter( - start_date__date__lte=last_day, - end_date__date__gte=first_day - ).count() + count = Personnel.objects.filter(start_date__date__lte=last_day, end_date__date__gte=first_day).count() deployment_counts.append(dict(date=month_string, count=count)) - return Response( - DeploymentsByMonthSerializer(deployment_counts, many=True).data - ) + return Response(DeploymentsByMonthSerializer(deployment_counts, many=True).data) class DeploymentsByNS(APIView): @classmethod - @extend_schema( - request=None, - responses=DeploymentByNSSerializer(many=True) - ) + @extend_schema(request=None, responses=DeploymentByNSSerializer(many=True)) def get(cls, request): """Returns count of Personnel Deployments by National Society, for the current year. @@ -379,9 +373,7 @@ def get(cls, request): .order_by("-deployments_count") .values("id", "society_name", "deployments_count")[0:limit] ) - return Response( - DeploymentByNSSerializer(societies, many=True).data - ) + return Response(DeploymentByNSSerializer(societies, many=True).data) class PartnerDeploymentFilterset(filters.FilterSet): @@ -433,7 +425,8 @@ class ProjectViewset( "user", "modified_by", "project_country", "reporting_ns", "dtype", "regional_project", "primary_sector" ) .prefetch_related("project_districts", "event", "annual_splits", "secondary_sectors", "project_admin2") - .order_by("-modified_at").all() + .order_by("-modified_at") + .all() ) def get_permissions(self): @@ -464,10 +457,7 @@ def get_projects(self): # Filter by GET params return ProjectFilter(self.request.query_params, queryset=qs).qs - @extend_schema( - request=None, - responses=ProjectRegionOverviewSerializer - ) + @extend_schema(request=None, responses=ProjectRegionOverviewSerializer) @action(detail=True, url_path="overview", methods=("get",)) def overview(self, request, pk=None): projects = self.get_projects() @@ -491,14 +481,9 @@ def overview(self, request, pk=None): .annotate(count=models.Count("id", distinct=True)) .values("status", "count"), } - return Response( - data - ) + return Response(data) - @extend_schema( - request=None, - responses=ProjectRegionMovementActivitiesSerializer - ) + @extend_schema(request=None, responses=ProjectRegionMovementActivitiesSerializer) @action(detail=True, url_path="movement-activities", methods=("get",)) def movement_activities(self, request, pk=None): projects = self.get_projects() @@ -556,7 +541,7 @@ def _get_country_ns_sector_count(): countries = Country.objects.filter(region=region) # Using english label for now - with translation_override('en'): + with translation_override("en"): country_annotate = { f"{status_label.lower()}_projects_count": Coalesce( models.Subquery( @@ -595,9 +580,7 @@ def _get_country_ns_sector_count(): .values_list("reporting_ns", "reporting_ns__name", "count") ], } - return Response( - ProjectRegionMovementActivitiesSerializer(data).data - ) + return Response(ProjectRegionMovementActivitiesSerializer(data).data) @action(detail=True, url_path="national-society-activities", methods=("get",)) def national_society_activities(self, request, pk=None): @@ -705,11 +688,7 @@ def get_projects(self): status=Statuses.ONGOING, ) - @extend_schema( - methods=['GET'], - request=None, - responses=GlobalProjectOverviewSerializer - ) + @extend_schema(methods=["GET"], request=None, responses=GlobalProjectOverviewSerializer) @action(detail=False, url_path="overview", methods=("get",)) def overview(self, request, pk=None): def _get_projects_per_enum_field(EnumType, enum_field): @@ -764,28 +743,16 @@ def _get_projects_per_foreign_field(field, field_display): response_data = { "total_ongoing_projects": projects.filter(status=Statuses.ONGOING).count(), "ns_with_ongoing_activities": ( - projects.filter(status=Statuses.ONGOING) - .order_by("reporting_ns") - .values("reporting_ns") - .distinct() - .count() + projects.filter(status=Statuses.ONGOING).order_by("reporting_ns").values("reporting_ns").distinct().count() ), "target_total": target_total, "projects_per_sector": _get_projects_per_foreign_field("primary_sector", "primary_sector__title"), "projects_per_programme_type": _get_projects_per_enum_field(ProgrammeTypes, "programme_type"), - "projects_per_secondary_sectors": _get_projects_per_foreign_field( - "secondary_sectors", "secondary_sectors__title" - ), + "projects_per_secondary_sectors": _get_projects_per_foreign_field("secondary_sectors", "secondary_sectors__title"), } - return Response( - GlobalProjectOverviewSerializer(response_data).data - ) + return Response(GlobalProjectOverviewSerializer(response_data).data) - @extend_schema( - methods=['GET'], - request=None, - responses=GlobalProjectNSOngoingProjectsStatsSerializer(many=True) - ) + @extend_schema(methods=["GET"], request=None, responses=GlobalProjectNSOngoingProjectsStatsSerializer(many=True)) @action(detail=False, url_path="ns-ongoing-projects-stats", methods=("get",)) def ns_ongoing_projects_stats(self, request, pk=None): projects = self.get_projects() @@ -863,11 +830,7 @@ def ns_ongoing_projects_stats(self, request, pk=None): "operation_types", ) ] - return Response( - GlobalProjectNSOngoingProjectsStatsSerializer( - response_data, many=True - ).data - ) + return Response(GlobalProjectNSOngoingProjectsStatsSerializer(response_data, many=True).data) class EmergencyProjectViewSet( @@ -876,9 +839,7 @@ class EmergencyProjectViewSet( viewsets.ModelViewSet, ): queryset = ( - EmergencyProject.objects.select_related( - "created_by", "reporting_ns", "event", "country", "deployed_eru", "modified_by" - ) + EmergencyProject.objects.select_related("created_by", "reporting_ns", "event", "country", "deployed_eru", "modified_by") .prefetch_related("districts", "activities", "admin2") .order_by("-modified_at") .all() diff --git a/deployments/enums.py b/deployments/enums.py index 48db80b3a..80246f65f 100644 --- a/deployments/enums.py +++ b/deployments/enums.py @@ -1,13 +1,13 @@ from . import models enum_register = { - 'eru_type': models.ERUType, - 'personnel_type': models.Personnel.TypeChoices, - 'personnle_molnix_status': models.Personnel.StatusChoices, - 'project_programme_type': models.ProgrammeTypes, - 'project_status': models.Statuses, - 'project_operation_type': models.OperationTypes, - 'emergency_project_activity_lead': models.EmergencyProject.ActivityLead, - 'emergency_project_status': models.EmergencyProject.ActivityStatus, - 'emergency_project_activity_people_households': models.EmergencyProjectActivity.PeopleHouseholds, + "eru_type": models.ERUType, + "personnel_type": models.Personnel.TypeChoices, + "personnle_molnix_status": models.Personnel.StatusChoices, + "project_programme_type": models.ProgrammeTypes, + "project_status": models.Statuses, + "project_operation_type": models.OperationTypes, + "emergency_project_activity_lead": models.EmergencyProject.ActivityLead, + "emergency_project_status": models.EmergencyProject.ActivityStatus, + "emergency_project_activity_people_households": models.EmergencyProjectActivity.PeopleHouseholds, } diff --git a/deployments/factories/emergency_project.py b/deployments/factories/emergency_project.py index 96902f3c9..a855909aa 100644 --- a/deployments/factories/emergency_project.py +++ b/deployments/factories/emergency_project.py @@ -1,29 +1,32 @@ -import factory -from factory import fuzzy import datetime + +import factory import pytz +from factory import fuzzy +from api.factories.country import CountryFactory +from api.factories.event import AppealFactory, EventFactory from deployments.models import ( + ERU, EmergencyProject, EmergencyProjectActivity, - ERU, - ERUOwner, + EmergencyProjectActivityAction, EmergencyProjectActivitySector, - EmergencyProjectActivityAction + ERUOwner, ) -from api.factories.event import EventFactory, AppealFactory -from api.factories.country import CountryFactory class ERUOwnerFactory(factory.django.DjangoModelFactory): class Meta: model = ERUOwner + national_society_country = factory.SubFactory(CountryFactory) class EruFactory(factory.django.DjangoModelFactory): class Meta: model = ERU + deployed_to = factory.SubFactory(CountryFactory) event = factory.SubFactory(EventFactory) eru_owner = factory.SubFactory(ERUOwnerFactory) @@ -33,21 +36,23 @@ class Meta: class EmergencyProjectActivitySectorFactory(factory.django.DjangoModelFactory): class Meta: model = EmergencyProjectActivitySector - title = fuzzy.FuzzyText(length=50, prefix='title-') + + title = fuzzy.FuzzyText(length=50, prefix="title-") class EmergencyProjectActivityActionFactory(factory.django.DjangoModelFactory): class Meta: model = EmergencyProjectActivityAction + sector = factory.SubFactory(EmergencyProjectActivitySectorFactory) - title = fuzzy.FuzzyText(length=50, prefix='title-') + title = fuzzy.FuzzyText(length=50, prefix="title-") class EmergencyProjectFactory(factory.django.DjangoModelFactory): class Meta: model = EmergencyProject - title = fuzzy.FuzzyText(length=50, prefix='emergency-project-') + title = fuzzy.FuzzyText(length=50, prefix="emergency-project-") event = factory.SubFactory(EventFactory) reporting_ns = factory.SubFactory(CountryFactory) deployed_eru = factory.SubFactory(EruFactory) @@ -68,6 +73,7 @@ def districts(self, create, extracted, **kwargs): class EmergencyProjectActivityFactory(factory.django.DjangoModelFactory): class Meta: model = EmergencyProjectActivity + sector = factory.SubFactory(EmergencyProjectActivitySectorFactory) action = factory.SubFactory(EmergencyProjectActivityActionFactory) project = factory.SubFactory(EmergencyProjectFactory) diff --git a/deployments/factories/molnix_tag.py b/deployments/factories/molnix_tag.py index f5868b7b7..0fa84844d 100644 --- a/deployments/factories/molnix_tag.py +++ b/deployments/factories/molnix_tag.py @@ -1,9 +1,7 @@ import factory from factory import fuzzy -from deployments.models import ( - MolnixTag, -) +from deployments.models import MolnixTag class MolnixTagFactory(factory.django.DjangoModelFactory): @@ -13,12 +11,12 @@ class Meta: molnix_id = factory.Sequence(lambda n: n) description = fuzzy.FuzzyText(length=512) color = fuzzy.FuzzyText(length=6) - tag_type = fuzzy.FuzzyChoice(choices=['regular', 'language']) - tag_category = fuzzy.FuzzyChoice(choices=['molnix_language', 'molnix_region', 'molnix_operation']) + tag_type = fuzzy.FuzzyChoice(choices=["regular", "language"]) + tag_category = fuzzy.FuzzyChoice(choices=["molnix_language", "molnix_region", "molnix_operation"]) @factory.lazy_attribute def name(self): - return f'{self.tag_category}-{self.molnix_id}' + return f"{self.tag_category}-{self.molnix_id}" @factory.post_generation def groups(self, create, extracted, **_): diff --git a/deployments/factories/personnel.py b/deployments/factories/personnel.py index 062655173..1af44a373 100644 --- a/deployments/factories/personnel.py +++ b/deployments/factories/personnel.py @@ -2,10 +2,7 @@ from api.factories.country import CountryFactory from api.factories.region import RegionFactory -from deployments.models import ( - Personnel, - PersonnelDeployment, -) +from deployments.models import Personnel, PersonnelDeployment class PersonnelDeploymentFactory(factory.django.DjangoModelFactory): diff --git a/deployments/factories/project.py b/deployments/factories/project.py index 03f87f16b..c8d735bd8 100644 --- a/deployments/factories/project.py +++ b/deployments/factories/project.py @@ -1,18 +1,20 @@ -import factory -from factory import fuzzy import datetime + +import factory import pytz +from factory import fuzzy + +from api.factories import country, disaster_type, event from .. import models -from . import user, regional_project -from api.factories import country, event, disaster_type +from . import regional_project, user class SectorFactory(factory.django.DjangoModelFactory): class Meta: model = models.Sector - title = fuzzy.FuzzyText(length=50, prefix='sect-') + title = fuzzy.FuzzyText(length=50, prefix="sect-") order = fuzzy.FuzzyInteger(0, 19) @@ -20,7 +22,7 @@ class SectorTagFactory(factory.django.DjangoModelFactory): class Meta: model = models.SectorTag - title = fuzzy.FuzzyText(length=50, prefix='sect-tag-') + title = fuzzy.FuzzyText(length=50, prefix="sect-tag-") order = fuzzy.FuzzyInteger(0, 19) @@ -45,7 +47,7 @@ def project_districts(self, create, extracted, **kwargs): event = factory.SubFactory(event.EventFactory) dtype = factory.SubFactory(disaster_type.DisasterTypeFactory) - name = fuzzy.FuzzyText(length=50, prefix='project-') + name = fuzzy.FuzzyText(length=50, prefix="project-") programme_type = fuzzy.FuzzyChoice(models.ProgrammeTypes) @factory.post_generation @@ -58,9 +60,7 @@ def secondary_sectors(self, create, extracted, **kwargs): self.secondary_sectors.add(secondary_sector) operation_type = fuzzy.FuzzyChoice(models.OperationTypes) - start_date = factory.LazyFunction( - datetime.datetime(2008, 1, 1, tzinfo=pytz.utc).date - ) + start_date = factory.LazyFunction(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc).date) end_date = factory.LazyFunction(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc).date) budget_amount = fuzzy.FuzzyInteger(0, 10000000, step=10000) actual_expenditure = fuzzy.FuzzyInteger(0) diff --git a/deployments/factories/regional_project.py b/deployments/factories/regional_project.py index f23260cb8..f978c3048 100644 --- a/deployments/factories/regional_project.py +++ b/deployments/factories/regional_project.py @@ -1,7 +1,8 @@ -import factory -from factory import fuzzy import datetime + +import factory import pytz +from factory import fuzzy from .. import models @@ -10,6 +11,6 @@ class RegionalProjectFactory(factory.django.DjangoModelFactory): class Meta: model = models.RegionalProject - name = fuzzy.FuzzyText(length=50, prefix='regional-project-') + name = fuzzy.FuzzyText(length=50, prefix="regional-project-") created_at = fuzzy.FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc)) modified_at = fuzzy.FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=pytz.utc)) diff --git a/deployments/filters.py b/deployments/filters.py index f97aa34aa..882d65391 100644 --- a/deployments/filters.py +++ b/deployments/filters.py @@ -1,68 +1,59 @@ from functools import reduce + import django_filters as filters -from django.db.models import Q, F from django.contrib.auth.models import User +from django.db.models import F, Q + +from api.models import Country, Event, Region -from api.models import ( - Region, - Country, - Event, -) from .models import ( + ERU, + EmergencyProject, + EmergencyProjectActivitySector, + ERUOwner, + ERUType, OperationTypes, ProgrammeTypes, + Project, Sector, SectorTag, Statuses, - Project, - ERU, - EmergencyProjectActivitySector, - EmergencyProject, - ERUOwner, - ERUType ) class ProjectFilter(filters.FilterSet): - budget_amount = filters.NumberFilter(field_name='budget_amount', lookup_expr='exact') + budget_amount = filters.NumberFilter(field_name="budget_amount", lookup_expr="exact") country = filters.ModelMultipleChoiceFilter( - field_name='project_country', - queryset=Country.objects.all(), - widget=filters.widgets.CSVWidget, - method='filter_countries' + field_name="project_country", queryset=Country.objects.all(), widget=filters.widgets.CSVWidget, method="filter_countries" ) user = filters.ModelChoiceFilter( field_name="user", queryset=User.objects.all(), ) country_iso3 = filters.ModelMultipleChoiceFilter( - label='Country ISO3', - field_name='project_country__iso3', - method='filter_countries_iso3', - to_field_name='iso3', + label="Country ISO3", + field_name="project_country__iso3", + method="filter_countries_iso3", + to_field_name="iso3", widget=filters.widgets.CSVWidget, queryset=Country.objects.filter(iso3__isnull=False).all(), ) region = filters.ModelMultipleChoiceFilter( - label='Region', queryset=Region.objects.all(), - widget=filters.widgets.CSVWidget, - method='filter_regions' + label="Region", queryset=Region.objects.all(), widget=filters.widgets.CSVWidget, method="filter_regions" ) operation_type = filters.MultipleChoiceFilter(choices=OperationTypes.choices, widget=filters.widgets.CSVWidget) programme_type = filters.MultipleChoiceFilter(choices=ProgrammeTypes.choices, widget=filters.widgets.CSVWidget) primary_sector = filters.ModelMultipleChoiceFilter( - label='Sector', queryset=Sector.objects.all(), - widget=filters.widgets.CSVWidget + label="Sector", queryset=Sector.objects.all(), widget=filters.widgets.CSVWidget ) secondary_sectors = filters.ModelMultipleChoiceFilter( - label='SectorTag', queryset=SectorTag.objects.all(), - widget=filters.widgets.CSVWidget) + label="SectorTag", queryset=SectorTag.objects.all(), widget=filters.widgets.CSVWidget + ) status = filters.MultipleChoiceFilter(choices=Statuses.choices, widget=filters.widgets.CSVWidget) # Supporting/Receiving NS Filters (Multiselect) reporting_ns = filters.ModelMultipleChoiceFilter(queryset=Country.objects.all(), widget=filters.widgets.CSVWidget) exclude_within = filters.BooleanFilter( - label='Exclude projects with same country and Reporting NS', - field_name='exclude_within', method='filter_exclude_within' + label="Exclude projects with same country and Reporting NS", field_name="exclude_within", method="filter_exclude_within" ) def filter_exclude_within(self, queryset, name, value): @@ -70,49 +61,42 @@ def filter_exclude_within(self, queryset, name, value): Exclude projects which have same country and Reporting NS """ if value: - return queryset.exclude(reporting_ns=F('project_country')) + return queryset.exclude(reporting_ns=F("project_country")) return queryset def filter_countries_iso3(self, queryset, name, value): if value: - return queryset.filter( - Q(project_country__in=value) | - Q(project_districts__country__in=value) - ).distinct() + return queryset.filter(Q(project_country__in=value) | Q(project_districts__country__in=value)).distinct() return queryset def filter_countries(self, queryset, name, country): if len(country): - return queryset.filter( - Q(project_country__in=country) | - Q(project_districts__country__in=country) - ).distinct() + return queryset.filter(Q(project_country__in=country) | Q(project_districts__country__in=country)).distinct() return queryset def filter_regions(self, queryset, name, regions): if len(regions): return queryset.filter( - Q(project_country__region__in=regions) | - Q(project_districts__country__region__in=regions) + Q(project_country__region__in=regions) | Q(project_districts__country__region__in=regions) ).distinct() return queryset class Meta: model = Project fields = [ - 'country', - 'budget_amount', - 'start_date', - 'end_date', - 'project_districts', - 'reporting_ns', - 'programme_type', - 'status', - 'primary_sector', - 'operation_type', - 'exclude_within', - 'country_iso3', - 'user' + "country", + "budget_amount", + "start_date", + "end_date", + "project_districts", + "reporting_ns", + "programme_type", + "status", + "primary_sector", + "operation_type", + "exclude_within", + "country_iso3", + "user", ] @@ -123,35 +107,20 @@ class EmergencyProjectFilter(filters.FilterSet): activity_lead = filters.MultipleChoiceFilter( choices=EmergencyProject.ActivityLead.choices, ) - country = filters.ModelMultipleChoiceFilter( - field_name='country', - queryset=Country.objects.all() - ) + country = filters.ModelMultipleChoiceFilter(field_name="country", queryset=Country.objects.all()) country_iso3 = filters.ModelMultipleChoiceFilter( - label='Country ISO3', - field_name='country__iso3', - method='filter_countries_iso3', + label="Country ISO3", + field_name="country__iso3", + method="filter_countries_iso3", widget=filters.widgets.CSVWidget, - to_field_name='iso3', + to_field_name="iso3", queryset=Country.objects.filter(iso3__isnull=False).all(), ) - reporting_ns = filters.ModelMultipleChoiceFilter( - field_name='reporting_ns', - queryset=Country.objects.all() - ) - event = filters.ModelMultipleChoiceFilter( - field_name='event', - queryset=Event.objects.all() - ) - deployed_eru = filters.ModelMultipleChoiceFilter( - field_name='deployed_eru', - queryset=ERU.objects.all() - ) + reporting_ns = filters.ModelMultipleChoiceFilter(field_name="reporting_ns", queryset=Country.objects.all()) + event = filters.ModelMultipleChoiceFilter(field_name="event", queryset=Event.objects.all()) + deployed_eru = filters.ModelMultipleChoiceFilter(field_name="deployed_eru", queryset=ERU.objects.all()) sector = filters.ModelMultipleChoiceFilter( - label='sector', - field_name='activities__sector', - queryset=EmergencyProjectActivitySector.objects.all() - + label="sector", field_name="activities__sector", queryset=EmergencyProjectActivitySector.objects.all() ) user = filters.ModelChoiceFilter( field_name="created_by", @@ -161,29 +130,20 @@ class EmergencyProjectFilter(filters.FilterSet): class Meta: model = EmergencyProject fields = { - 'start_date': ('exact', 'gt', 'gte', 'lt', 'lte'), + "start_date": ("exact", "gt", "gte", "lt", "lte"), } def filter_countries_iso3(self, queryset, name, value): if value: - return queryset.filter( - Q(country__in=value) | - Q(districts__country__in=value) - ).distinct() + return queryset.filter(Q(country__in=value) | Q(districts__country__in=value)).distinct() return queryset class ERUOwnerFilter(filters.FilterSet): eru_type = filters.MultipleChoiceFilter( - choices=ERUType.choices, - label='eru_type', - widget=filters.widgets.CSVWidget, - method='filter_noop' - ) - available = filters.BooleanFilter( - method='filter_noop', - label='available' + choices=ERUType.choices, label="eru_type", widget=filters.widgets.CSVWidget, method="filter_noop" ) + available = filters.BooleanFilter(method="filter_noop", label="available") class Meta: model = ERUOwner @@ -195,8 +155,8 @@ def filter_noop(self, qs, name, value, *_): @property def qs(self): qs = super().qs - eru_type = self.form.cleaned_data.get('eru_type') - available = self.form.cleaned_data.get('available') + eru_type = self.form.cleaned_data.get("eru_type") + available = self.form.cleaned_data.get("available") eru_qs = ERU.objects.all() if eru_type: eru_qs = eru_qs.filter(type__in=eru_type) diff --git a/deployments/forms.py b/deployments/forms.py index 552e8c475..9c01836c4 100644 --- a/deployments/forms.py +++ b/deployments/forms.py @@ -1,28 +1,24 @@ -import io -import traceback import csv import datetime +import io +import traceback from functools import reduce from itertools import zip_longest from django import forms -from django.utils.translation import gettext_lazy as _ -from django.utils.safestring import mark_safe from django.contrib import messages -from django.db.models import Q from django.core.exceptions import ValidationError -from api.models import ( - Country, - District, - DisasterType, - VisibilityCharChoices, -) +from django.db.models import Q +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from api.models import Country, DisasterType, District, VisibilityCharChoices from .models import ( - Project, - ProjectImport, OperationTypes, ProgrammeTypes, + Project, + ProjectImport, Sector, SectorTag, Statuses, @@ -37,57 +33,53 @@ class ProjectForm(forms.ModelForm): class Meta: model = Project - fields = '__all__' + fields = "__all__" class ProjectImportForm(forms.Form): - file = forms.FileField(label=_('file'), widget=forms.FileInput(attrs={'accept': '.csv'})) - field_delimiter = forms.CharField(label=_('field delimiter'), initial=',') - string_delimiter = forms.CharField(label=_('string delimiter'), initial='"') + file = forms.FileField(label=_("file"), widget=forms.FileInput(attrs={"accept": ".csv"})) + field_delimiter = forms.CharField(label=_("field delimiter"), initial=",") + string_delimiter = forms.CharField(label=_("string delimiter"), initial='"') class Columns: # COLUMNS - COUNTRY = 'Country' - DISTRICT = 'Regions' - REPORTING_NS = 'Reporting NS' - DISASTER_TYPE = 'Disaster Type' - OPERATION_TYPE = 'Operation Type' - PROGRAMME_TYPE = 'Programme Type' - PRIMARY_SECTOR = 'Primary Sector' - TAGS = 'Tags' - STATUS = 'Status' - PROJECT_NAME = 'Project Name' - START_DATE = 'Start Date' - END_DATE = 'End Date' - BUDGET = 'Budget(CHF)' - TARGETED_MALES = 'Targeted Males' - TARGETED_FEMALES = 'Targeted Females' - TARGETED_OTHER = 'Targeted Others' - TARGETED_TOTAL = 'Targeted Total' - REACHED_MALES = 'Reached Males' - REACHED_FEMALES = 'Reached Females' - REACHED_OTHERS = 'Reached Others' - REACHED_TOTAL = 'Reached Total' - VISIBILITY = 'Visibility' - ACTUAL_EXPENDITURE = 'Actual Expenditure' - REPORTING_NS_CONTACT_EMAIL = 'Contact Email' - REPORTING_NS_CONTACT_NAME = 'Contact Name' - REPORTING_NS_CONTACT_ROLE = 'Contact Role' - DESCRIPTION = 'Description' + COUNTRY = "Country" + DISTRICT = "Regions" + REPORTING_NS = "Reporting NS" + DISASTER_TYPE = "Disaster Type" + OPERATION_TYPE = "Operation Type" + PROGRAMME_TYPE = "Programme Type" + PRIMARY_SECTOR = "Primary Sector" + TAGS = "Tags" + STATUS = "Status" + PROJECT_NAME = "Project Name" + START_DATE = "Start Date" + END_DATE = "End Date" + BUDGET = "Budget(CHF)" + TARGETED_MALES = "Targeted Males" + TARGETED_FEMALES = "Targeted Females" + TARGETED_OTHER = "Targeted Others" + TARGETED_TOTAL = "Targeted Total" + REACHED_MALES = "Reached Males" + REACHED_FEMALES = "Reached Females" + REACHED_OTHERS = "Reached Others" + REACHED_TOTAL = "Reached Total" + VISIBILITY = "Visibility" + ACTUAL_EXPENDITURE = "Actual Expenditure" + REPORTING_NS_CONTACT_EMAIL = "Contact Email" + REPORTING_NS_CONTACT_NAME = "Contact Name" + REPORTING_NS_CONTACT_ROLE = "Contact Role" + DESCRIPTION = "Description" @classmethod def generate_template(cls): - country_districts = list( - District.objects - .values_list('country__name', 'name') - .order_by('country__name', 'name') - ) - countries = Country.objects.values_list('name', flat=True) - disaster_types = DisasterType.objects.values_list('name', flat=True) + country_districts = list(District.objects.values_list("country__name", "name").order_by("country__name", "name")) + countries = Country.objects.values_list("name", flat=True) + disaster_types = DisasterType.objects.values_list("name", flat=True) operation_types = {label for _, label in OperationTypes.choices} programme_types = {label for _, label in ProgrammeTypes.choices} - sectors = Sector.objects.values_list('title', flat=True) - sector_tags = SectorTag.objects.values_list('title', flat=True) + sectors = Sector.objects.values_list("title", flat=True) + sector_tags = SectorTag.objects.values_list("title", flat=True) statuses = {label for _, label in Statuses.choices} # Headers @@ -119,7 +111,7 @@ def generate_template(cls): c.REPORTING_NS_CONTACT_EMAIL, c.REPORTING_NS_CONTACT_NAME, c.REPORTING_NS_CONTACT_ROLE, - c.DESCRIPTION + c.DESCRIPTION, ] rows = [ @@ -135,27 +127,29 @@ def generate_template(cls): sectors, sector_tags, statuses, - ) + ), ] return rows def _handle_bulk_upload(self, user, file, delimiter, quotechar): def _get_error_message(row, custom_errors, validation_errors=None): - messages = ', '.join([ - f"{field}: {', '.join(error_message)}" - for field, error_message in { - **(validation_errors or {}), - **custom_errors, - }.items() - ]) - return f'ROW {row}: {str(messages)}' + messages = ", ".join( + [ + f"{field}: {', '.join(error_message)}" + for field, error_message in { + **(validation_errors or {}), + **custom_errors, + }.items() + ] + ) + return f"ROW {row}: {str(messages)}" def _key_clean(string): return string.lower().strip() def _parse_date(date, field, row_errors): try: - return datetime.datetime.strptime(date, '%d/%m/%Y') + return datetime.datetime.strptime(date, "%d/%m/%Y") except ValueError as e: row_errors[field] = [str(e)] @@ -170,7 +164,7 @@ def _parse_integer(integer): file.seek(0) reader = csv.DictReader( - io.StringIO(file.read().decode('utf-8-sig', errors='ignore')), + io.StringIO(file.read().decode("utf-8-sig", errors="ignore")), skipinitialspace=True, delimiter=delimiter, quotechar=quotechar, @@ -187,7 +181,7 @@ def _parse_integer(integer): sectors = {t.title.lower(): t.id for t in Sector.objects.all()} add_to_sectors = dict() # Add the main words of sectors to the definition: for s in sectors.keys(): - tt = s.replace(' and', '').replace(', ', ',').replace(' ', ',').split(',') + tt = s.replace(" and", "").replace(", ", ",").replace(" ", ",").split(",") for t in tt: add_to_sectors[t] = sectors[s] sectors.update(add_to_sectors) @@ -199,21 +193,21 @@ def _parse_integer(integer): # Extract from import csv file for row_number, row in enumerate(reader, start=2): - district_names = list({d.strip() for d in filter( - lambda x: x.strip() != '', row[c.DISTRICT].split(',')) - }) if row[c.DISTRICT].lower() not in ['countrywide', ''] else [] + district_names = ( + list({d.strip() for d in filter(lambda x: x.strip() != "", row[c.DISTRICT].split(","))}) + if row[c.DISTRICT].lower() not in ["countrywide", ""] + else [] + ) reporting_ns_name = row[c.REPORTING_NS].strip() country_name = row[c.COUNTRY].strip() # An often misspelled word cleanup: - if reporting_ns_name == 'Turkey': - reporting_ns_name = 'Türkiye' - if country_name == 'Turkey': - country_name = 'Türkiye' + if reporting_ns_name == "Turkey": + reporting_ns_name = "Türkiye" + if country_name == "Turkey": + country_name = "Türkiye" disaster_type_name = row[c.DISASTER_TYPE].strip() sector_name = row[c.PRIMARY_SECTOR].strip() - tag_names = list({d.strip() for d in filter( - lambda x: x.strip() != '', row[c.TAGS].split(',')) - }) + tag_names = list({d.strip() for d in filter(lambda x: x.strip() != "", row[c.TAGS].split(","))}) reporting_ns = Country.objects.filter( Q(name__iexact=reporting_ns_name) | Q(society_name__iexact=reporting_ns_name) @@ -228,26 +222,28 @@ def _parse_integer(integer): project_country = Country.objects.filter(name__iexact=country_name).first() project_districts = [] if district_names: - project_districts = list(District.objects.filter( - reduce( - lambda acc, item: acc | item, - [ - Q(country__name__iexact=country_name) & Q(name__iexact=district_name) - for district_name in district_names - ], - ) - ).all()) + project_districts = list( + District.objects.filter( + reduce( + lambda acc, item: acc | item, + [ + Q(country__name__iexact=country_name) & Q(name__iexact=district_name) + for district_name in district_names + ], + ) + ).all() + ) # Check if all district_names is available in db if len(project_districts) == len(district_names): if project_country is None: # in case of we did not find a proper country name, trying to know it: project_country = project_districts[0].country else: # but it can not happen that some of the given district-names cannot be found: - row_errors['project_districts'] = [f'Some given district_names are not available. "{district_names}"'] + row_errors["project_districts"] = [f'Some given district_names are not available. "{district_names}"'] # A validation error will be raised. This is just a custom message if project_country is None: - row_errors['project_country'] = [f'Country "{country_name}" is not available.'] + row_errors["project_country"] = [f'Country "{country_name}" is not available.'] project_sectortag_ids = [] # if we use sectortag objects, not only id-s, the "project_sectortags" would be better. if tag_names: @@ -255,7 +251,7 @@ def _parse_integer(integer): for t in tag_names: if t.lower() not in sector_tags: all_ok = False - row_errors['project_sectortags'] = [f'Given tag: "{t}" is not all available.'] + row_errors["project_sectortags"] = [f'Given tag: "{t}" is not all available.'] if all_ok: # Cheaper than: list( # SectorTag.objects.filter( @@ -263,10 +259,10 @@ def _parse_integer(integer): project_sectortag_ids = {title: sector_tags[title.lower()] for title in tag_names}.values() if reporting_ns is None: - row_errors['reporting_ns'] = [f'Given country "{reporting_ns_name}" is not available.'] + row_errors["reporting_ns"] = [f'Given country "{reporting_ns_name}" is not available.'] # Optional, but can be invalid - if disaster_type_id is None and disaster_type_name != '': - row_errors['disaster_type'] = [f'Given disaster type "{disaster_type_name}" is not available.'] + if disaster_type_id is None and disaster_type_name != "": + row_errors["disaster_type"] = [f'Given disaster type "{disaster_type_name}" is not available.'] visibility = row[c.VISIBILITY].strip() project = Project( @@ -276,17 +272,14 @@ def _parse_integer(integer): # project_districts and secondary_sectors are M2M fields, they will be added later. primary_sector_id=project_sector_id, dtype_id=disaster_type_id, - # Enum fields operation_type=operation_types.get(_key_clean(row[c.OPERATION_TYPE])), programme_type=programme_types.get(_key_clean(row[c.PROGRAMME_TYPE])), status=statuses.get(_key_clean(row[c.STATUS])), - name=row[c.PROJECT_NAME], - start_date=_parse_date(row[c.START_DATE], 'start_date', row_errors), - end_date=_parse_date(row[c.END_DATE], 'end_date', row_errors), + start_date=_parse_date(row[c.START_DATE], "start_date", row_errors), + end_date=_parse_date(row[c.END_DATE], "end_date", row_errors), budget_amount=_parse_integer(row[c.BUDGET].strip()), - # Optional fields target_male=_parse_integer(row[c.TARGETED_MALES]), target_female=_parse_integer(row[c.TARGETED_FEMALES]), @@ -313,7 +306,7 @@ def _parse_integer(integer): errors.append(_get_error_message(row_number, row_errors, e.message_dict)) if len(errors) != 0: - errors_str = '\n'.join(errors) + errors_str = "\n".join(errors) raise Exception(f"Error detected:\n{errors_str}") Project.objects.bulk_create([p[0] for p in projects]) @@ -325,9 +318,9 @@ def _parse_integer(integer): return [p[0] for p in projects] def handle_bulk_upload(self, request): - file = self.cleaned_data['file'] - delimiter = self.cleaned_data['field_delimiter'] - quotechar = self.cleaned_data['string_delimiter'] + file = self.cleaned_data["file"] + delimiter = self.cleaned_data["field_delimiter"] + quotechar = self.cleaned_data["string_delimiter"] try: project_import = ProjectImport.objects.none() # for later reference, if next command fails @@ -338,14 +331,13 @@ def handle_bulk_upload(self, request): file=file, ) project_import.projects_created.add(*projects) - project_import.message = f'Successfully added {len(projects)} project(s) using {file}.' + project_import.message = f"Successfully added {len(projects)} project(s) using {file}." project_import.status = ProjectImport.ProjImpStatus.SUCCESS # Also show error in Admin Panel messages.add_message(request, messages.INFO, mark_safe(project_import.message)) except Exception as e: project_import.message = ( - f"Importing {file} failed. Check file and try again!!
" - f"
{traceback.format_exc()}
" + f"Importing {file} failed. Check file and try again!!
" f"
{traceback.format_exc()}
" ) if isinstance(e, KeyError): project_import.message += ( diff --git a/deployments/management/commands/update_project_status.py b/deployments/management/commands/update_project_status.py index a5864b028..171ffe665 100644 --- a/deployments/management/commands/update_project_status.py +++ b/deployments/management/commands/update_project_status.py @@ -1,77 +1,78 @@ from dateutil.relativedelta import relativedelta -from django.template.loader import render_to_string from django.core.management.base import BaseCommand -from django.utils.translation import gettext_lazy as _ -from django.utils.translation import gettext -from django.utils import timezone -from django.urls import reverse from django.db.models import Q +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext +from django.utils.translation import gettext_lazy as _ from sentry_sdk.crons import monitor +from deployments.models import Project, Statuses from main.frontend import get_project_url from main.sentry import SentryMonitor from notifications.notification import send_notification -from deployments.models import Project, Statuses - COMPLETE_STATUS_CHANGE_ALERT_DAYS = 5 PROJECT_STATUS_WILL_COMPLETE_MESSAGE = _( - '%(project_name)s project end date is in %(days)d days (%(end_date)s).' # noqa:E501 - ' Please note that the project status will automatically change to Completed, when the end date passes.' # noqa:E501 - ' You can update the end date to further keep the project in Ongoing status.' + "%(project_name)s project end date is in %(days)d days (%(end_date)s)." # noqa:E501 + " Please note that the project status will automatically change to Completed, when the end date passes." # noqa:E501 + " You can update the end date to further keep the project in Ongoing status." ) + @monitor(monitor_slug=SentryMonitor.UPDATE_PROJECT_STATUS) class Command(BaseCommand): - help = 'Update project status using start/end date' + help = "Update project status using start/end date" def handle(self, *args, **options): now = timezone.now().date() for projects, new_status in [ - (Project.objects.filter(start_date__gt=now), Statuses.PLANNED), - (Project.objects.filter(start_date__lte=now, end_date__gte=now), Statuses.ONGOING), - (Project.objects.filter(end_date__lt=now), Statuses.COMPLETED), + (Project.objects.filter(start_date__gt=now), Statuses.PLANNED), + (Project.objects.filter(start_date__lte=now, end_date__gte=now), Statuses.ONGOING), + (Project.objects.filter(end_date__lt=now), Statuses.COMPLETED), ]: updated_projects = projects.exclude(status=new_status) - print( - f'{str(new_status)} projects' - f' Total: {projects.count()},' - f' Updated: {updated_projects.count()}' - ) + print(f"{str(new_status)} projects" f" Total: {projects.count()}," f" Updated: {updated_projects.count()}") updated_projects.update(status=new_status) # Send alert if project status will change in COMPLETE_STATUS_CHANGE_ALERT_DAYS. coming_end_date = now + relativedelta(days=COMPLETE_STATUS_CHANGE_ALERT_DAYS) notify_projects = Project.objects.filter(end_date=coming_end_date).exclude( # Can't send email to user without email - Q(user__email__isnull=True) | Q(user__email='') + Q(user__email__isnull=True) + | Q(user__email="") ) for project in notify_projects.distinct(): user = project.user - subject = gettext('3W Project Notification') - admin_uri = f'admin:{Project._meta.app_label}_{Project._meta.model_name}_change' - records = [{ - 'title': gettext('1 new 3W project notification'), - 'is_staff': user.is_staff, - 'resource_uri': get_project_url(project.id), - 'admin_uri': reverse(admin_uri, args=(project.id,)), - 'content': PROJECT_STATUS_WILL_COMPLETE_MESSAGE % { - 'project_name': project.name, - 'days': COMPLETE_STATUS_CHANGE_ALERT_DAYS, - 'end_date': coming_end_date, - }, - }] + subject = gettext("3W Project Notification") + admin_uri = f"admin:{Project._meta.app_label}_{Project._meta.model_name}_change" + records = [ + { + "title": gettext("1 new 3W project notification"), + "is_staff": user.is_staff, + "resource_uri": get_project_url(project.id), + "admin_uri": reverse(admin_uri, args=(project.id,)), + "content": PROJECT_STATUS_WILL_COMPLETE_MESSAGE + % { + "project_name": project.name, + "days": COMPLETE_STATUS_CHANGE_ALERT_DAYS, + "end_date": coming_end_date, + }, + } + ] send_notification( subject, [user.email], render_to_string( - 'design/generic_notification.html', { - 'records': records, - 'hide_preferences': True, - } + "design/generic_notification.html", + { + "records": records, + "hide_preferences": True, + }, ), - f'Project will change to {str(Statuses.COMPLETED)} notifications - {subject}', + f"Project will change to {str(Statuses.COMPLETED)} notifications - {subject}", ) - print(f'Notified users for {notify_projects.count()} projects for coming {str(Statuses.COMPLETED)} status') + print(f"Notified users for {notify_projects.count()} projects for coming {str(Statuses.COMPLETED)} status") diff --git a/deployments/migrations/0001_initial.py b/deployments/migrations/0001_initial.py index de620c14a..8a4bdb357 100644 --- a/deployments/migrations/0001_initial.py +++ b/deployments/migrations/0001_initial.py @@ -2,9 +2,10 @@ # Generated by Django 1.11.8 on 2018-02-07 21:09 from __future__ import unicode_literals -import deployments.models -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + +import deployments.models class Migration(migrations.Migration): @@ -12,128 +13,163 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('api', '0001_initial'), + ("api", "0001_initial"), ] operations = [ migrations.CreateModel( - name='DeployedPerson', + name="DeployedPerson", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start_date', models.DateTimeField(null=True)), - ('end_date', models.DateTimeField(null=True)), - ('name', models.CharField(blank=True, max_length=100, null=True)), - ('role', models.CharField(blank=True, max_length=32, null=True)), - ('society_deployed_from', models.CharField(blank=True, max_length=100, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("start_date", models.DateTimeField(null=True)), + ("end_date", models.DateTimeField(null=True)), + ("name", models.CharField(blank=True, max_length=100, null=True)), + ("role", models.CharField(blank=True, max_length=32, null=True)), + ("society_deployed_from", models.CharField(blank=True, max_length=100, null=True)), ], ), migrations.CreateModel( - name='ERU', + name="ERU", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('type', models.IntegerField(default=0, choices=deployments.models.ERUType.choices)), - ('units', models.IntegerField(default=0)), - ('equipment_units', models.IntegerField(default=0)), - ('available', models.BooleanField(default=False)), - ('deployed_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("type", models.IntegerField(default=0, choices=deployments.models.ERUType.choices)), + ("units", models.IntegerField(default=0)), + ("equipment_units", models.IntegerField(default=0)), + ("available", models.BooleanField(default=False)), + ( + "deployed_to", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), + ), ], ), migrations.CreateModel( - name='ERUOwner', + name="ERUOwner", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('national_society_country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "national_society_country", + models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), + ), ], options={ - 'verbose_name': 'ERUs from a National Society', - 'verbose_name_plural': 'ERUs', + "verbose_name": "ERUs from a National Society", + "verbose_name_plural": "ERUs", }, ), migrations.CreateModel( - name='Fact', + name="Fact", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start_date', models.DateTimeField(null=True)), - ('comments', models.TextField(blank=True, null=True)), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Country')), - ('dtype', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType')), - ('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("start_date", models.DateTimeField(null=True)), + ("comments", models.TextField(blank=True, null=True)), + ("country", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Country")), + ( + "dtype", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.DisasterType"), + ), + ("event", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event")), + ("region", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Region")), ], options={ - 'verbose_name': 'FACT', - 'verbose_name_plural': 'FACTs', + "verbose_name": "FACT", + "verbose_name_plural": "FACTs", }, ), migrations.CreateModel( - name='Heop', + name="Heop", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start_date', models.DateTimeField(null=True)), - ('end_date', models.DateTimeField(null=True)), - ('person', models.CharField(blank=True, max_length=100, null=True)), - ('role', models.CharField(blank=True, default='HeOps', max_length=32, null=True)), - ('comments', models.TextField(blank=True, null=True)), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Country')), - ('dtype', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType')), - ('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("start_date", models.DateTimeField(null=True)), + ("end_date", models.DateTimeField(null=True)), + ("person", models.CharField(blank=True, max_length=100, null=True)), + ("role", models.CharField(blank=True, default="HeOps", max_length=32, null=True)), + ("comments", models.TextField(blank=True, null=True)), + ("country", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Country")), + ( + "dtype", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.DisasterType"), + ), + ("event", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event")), + ("region", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Region")), ], options={ - 'verbose_name': 'HeOp', - 'verbose_name_plural': 'HeOps', + "verbose_name": "HeOp", + "verbose_name_plural": "HeOps", }, ), migrations.CreateModel( - name='Rdrt', + name="Rdrt", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start_date', models.DateTimeField(null=True)), - ('comments', models.TextField(blank=True, null=True)), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Country')), - ('dtype', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType')), - ('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event')), - ('region', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("start_date", models.DateTimeField(null=True)), + ("comments", models.TextField(blank=True, null=True)), + ("country", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Country")), + ( + "dtype", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.DisasterType"), + ), + ("event", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event")), + ("region", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Region")), ], options={ - 'verbose_name': 'RDRT/RIT', - 'verbose_name_plural': 'RDRTs/RITs', + "verbose_name": "RDRT/RIT", + "verbose_name_plural": "RDRTs/RITs", }, ), migrations.CreateModel( - name='FactPerson', + name="FactPerson", fields=[ - ('deployedperson_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='deployments.DeployedPerson')), - ('fact', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deployments.Fact')), + ( + "deployedperson_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="deployments.DeployedPerson", + ), + ), + ("fact", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="deployments.Fact")), ], options={ - 'verbose_name': 'FACT Person', - 'verbose_name_plural': 'FACT People', + "verbose_name": "FACT Person", + "verbose_name_plural": "FACT People", }, - bases=('deployments.deployedperson',), + bases=("deployments.deployedperson",), ), migrations.CreateModel( - name='RdrtPerson', + name="RdrtPerson", fields=[ - ('deployedperson_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='deployments.DeployedPerson')), - ('rdrt', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deployments.Rdrt')), + ( + "deployedperson_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="deployments.DeployedPerson", + ), + ), + ("rdrt", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="deployments.Rdrt")), ], options={ - 'verbose_name': 'RDRT/RIT Person', - 'verbose_name_plural': 'RDRT/RIT People', + "verbose_name": "RDRT/RIT Person", + "verbose_name_plural": "RDRT/RIT People", }, - bases=('deployments.deployedperson',), + bases=("deployments.deployedperson",), ), migrations.AddField( - model_name='eru', - name='eru_owner', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deployments.ERUOwner'), + model_name="eru", + name="eru_owner", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="deployments.ERUOwner"), ), migrations.AddField( - model_name='eru', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event'), + model_name="eru", + name="event", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event"), ), ] diff --git a/deployments/migrations/0002_auto_20180614_2206.py b/deployments/migrations/0002_auto_20180614_2206.py index 4c66eca58..32b677951 100644 --- a/deployments/migrations/0002_auto_20180614_2206.py +++ b/deployments/migrations/0002_auto_20180614_2206.py @@ -1,39 +1,76 @@ # Generated by Django 2.0.5 on 2018-06-14 22:06 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0005_auto_20180614_2206'), - ('deployments', '0001_initial'), + ("api", "0005_auto_20180614_2206"), + ("deployments", "0001_initial"), ] operations = [ migrations.CreateModel( - name='PartnerSocietyDeployment', + name="PartnerSocietyDeployment", fields=[ - ('deployedperson_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='deployments.DeployedPerson')), - ('country_deployed_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='country_partner_deployments', to='api.Country')), - ('district_deployed_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='district_partner_deployments', to='api.District')), - ('parent_society', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='partner_society_members', to='api.Country')), + ( + "deployedperson_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="deployments.DeployedPerson", + ), + ), + ( + "country_deployed_to", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="country_partner_deployments", + to="api.Country", + ), + ), + ( + "district_deployed_to", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="district_partner_deployments", + to="api.District", + ), + ), + ( + "parent_society", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="partner_society_members", + to="api.Country", + ), + ), ], - bases=('deployments.deployedperson',), + bases=("deployments.deployedperson",), ), migrations.RemoveField( - model_name='deployedperson', - name='society_deployed_from', + model_name="deployedperson", + name="society_deployed_from", ), migrations.AddField( - model_name='factperson', - name='society_deployed_from', + model_name="factperson", + name="society_deployed_from", field=models.CharField(blank=True, max_length=100, null=True), ), migrations.AddField( - model_name='rdrtperson', - name='society_deployed_from', + model_name="rdrtperson", + name="society_deployed_from", field=models.CharField(blank=True, max_length=100, null=True), ), ] diff --git a/deployments/migrations/0003_auto_20180620_0950.py b/deployments/migrations/0003_auto_20180620_0950.py index 15d157c53..6829cccae 100644 --- a/deployments/migrations/0003_auto_20180620_0950.py +++ b/deployments/migrations/0003_auto_20180620_0950.py @@ -1,31 +1,41 @@ # Generated by Django 2.0.5 on 2018-06-20 09:50 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0002_auto_20180614_2206'), + ("deployments", "0002_auto_20180614_2206"), ] operations = [ migrations.CreateModel( - name='PartnerSocietyActivities', + name="PartnerSocietyActivities", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('activity', models.CharField(max_length=50)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("activity", models.CharField(max_length=50)), ], ), migrations.AlterField( - model_name='partnersocietydeployment', - name='district_deployed_to', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='district_partner_deployments', to='api.District'), + model_name="partnersocietydeployment", + name="district_deployed_to", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="district_partner_deployments", + to="api.District", + ), ), migrations.AddField( - model_name='partnersocietydeployment', - name='activity', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='partner_societies', to='deployments.PartnerSocietyActivities'), + model_name="partnersocietydeployment", + name="activity", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="partner_societies", + to="deployments.PartnerSocietyActivities", + ), ), ] diff --git a/deployments/migrations/0004_auto_20180621_1519.py b/deployments/migrations/0004_auto_20180621_1519.py index 1e712eb20..ae3f2bb9f 100644 --- a/deployments/migrations/0004_auto_20180621_1519.py +++ b/deployments/migrations/0004_auto_20180621_1519.py @@ -1,34 +1,41 @@ # Generated by Django 2.0.5 on 2018-06-21 15:19 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0006_fieldreport_report_date'), - ('deployments', '0003_auto_20180620_0950'), + ("api", "0006_fieldreport_report_date"), + ("deployments", "0003_auto_20180620_0950"), ] operations = [ migrations.AlterField( - model_name='partnersocietydeployment', - name='country_deployed_to', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='country_partner_deployments', to='api.Country'), + model_name="partnersocietydeployment", + name="country_deployed_to", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="country_partner_deployments", + to="api.Country", + ), ), migrations.RemoveField( - model_name='partnersocietydeployment', - name='district_deployed_to', + model_name="partnersocietydeployment", + name="district_deployed_to", ), migrations.AddField( - model_name='partnersocietydeployment', - name='district_deployed_to', - field=models.ManyToManyField(to='api.District'), + model_name="partnersocietydeployment", + name="district_deployed_to", + field=models.ManyToManyField(to="api.District"), ), migrations.AlterField( - model_name='partnersocietydeployment', - name='parent_society', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='partner_society_members', to='api.Country'), + model_name="partnersocietydeployment", + name="parent_society", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="partner_society_members", to="api.Country" + ), ), ] diff --git a/deployments/migrations/0005_auto_20180726_2025.py b/deployments/migrations/0005_auto_20180726_2025.py index 95f15d2f8..3427a1c5f 100644 --- a/deployments/migrations/0005_auto_20180726_2025.py +++ b/deployments/migrations/0005_auto_20180726_2025.py @@ -1,45 +1,66 @@ # Generated by Django 2.0.5 on 2018-07-26 20:25 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0009_auto_20180712_1922'), - ('deployments', '0004_auto_20180621_1519'), + ("api", "0009_auto_20180712_1922"), + ("deployments", "0004_auto_20180621_1519"), ] operations = [ migrations.CreateModel( - name='Personnel', + name="Personnel", fields=[ - ('deployedperson_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='deployments.DeployedPerson')), - ('type', models.CharField(choices=[('fact', 'FACT'), ('heop', 'HEOP'), ('rdrt', 'RDRT')], max_length=4)), - ('country_from', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='personnel_deployments', to='api.Country')), + ( + "deployedperson_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="deployments.DeployedPerson", + ), + ), + ("type", models.CharField(choices=[("fact", "FACT"), ("heop", "HEOP"), ("rdrt", "RDRT")], max_length=4)), + ( + "country_from", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="personnel_deployments", + to="api.Country", + ), + ), ], options={ - 'verbose_name_plural': 'Personnel', + "verbose_name_plural": "Personnel", }, - bases=('deployments.deployedperson',), + bases=("deployments.deployedperson",), ), migrations.CreateModel( - name='PersonnelDeployment', + name="PersonnelDeployment", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('comments', models.TextField(blank=True, null=True)), - ('country_deployed_to', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Country')), - ('event_deployed_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event')), - ('region_deployed_to', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("comments", models.TextField(blank=True, null=True)), + ("country_deployed_to", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Country")), + ( + "event_deployed_to", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event"), + ), + ("region_deployed_to", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Region")), ], options={ - 'verbose_name_plural': 'Personnel Deployments', + "verbose_name_plural": "Personnel Deployments", }, ), migrations.AddField( - model_name='personnel', - name='deployment', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deployments.PersonnelDeployment'), + model_name="personnel", + name="deployment", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="deployments.PersonnelDeployment"), ), ] diff --git a/deployments/migrations/0006_auto_20180817_1554.py b/deployments/migrations/0006_auto_20180817_1554.py index e8dc929fa..9f2bc1321 100644 --- a/deployments/migrations/0006_auto_20180817_1554.py +++ b/deployments/migrations/0006_auto_20180817_1554.py @@ -6,13 +6,15 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0005_auto_20180726_2025'), + ("deployments", "0005_auto_20180726_2025"), ] operations = [ migrations.AlterField( - model_name='personnel', - name='type', - field=models.CharField(choices=[('fact', 'FACT'), ('heop', 'HEOP'), ('rdrt', 'RDRT'), ('ifrc', 'IFRC'), ('eru', 'ERU HR')], max_length=4), + model_name="personnel", + name="type", + field=models.CharField( + choices=[("fact", "FACT"), ("heop", "HEOP"), ("rdrt", "RDRT"), ("ifrc", "IFRC"), ("eru", "ERU HR")], max_length=4 + ), ), ] diff --git a/deployments/migrations/0007_auto_20190413_1421.py b/deployments/migrations/0007_auto_20190413_1421.py index 02d5c278a..78b4c1afc 100644 --- a/deployments/migrations/0007_auto_20190413_1421.py +++ b/deployments/migrations/0007_auto_20190413_1421.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0006_auto_20180817_1554'), + ("deployments", "0006_auto_20180817_1554"), ] operations = [ migrations.AlterModelOptions( - name='partnersocietyactivities', - options={'verbose_name': 'Partner society activity', 'verbose_name_plural': 'Partner society activities'}, + name="partnersocietyactivities", + options={"verbose_name": "Partner society activity", "verbose_name_plural": "Partner society activities"}, ), ] diff --git a/deployments/migrations/0008_project.py b/deployments/migrations/0008_project.py index f962c9952..9bf9cfc1c 100644 --- a/deployments/migrations/0008_project.py +++ b/deployments/migrations/0008_project.py @@ -1,34 +1,40 @@ # Generated by Django 2.0.12 on 2019-06-27 11:06 -import deployments.models +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion + +import deployments.models class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('api', '0019_auto_20190626_1420'), - ('deployments', '0007_auto_20190413_1421'), + ("api", "0019_auto_20190626_1420"), + ("deployments", "0007_auto_20190413_1421"), ] operations = [ migrations.CreateModel( - name='Project', + name="Project", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.TextField()), - ('programme_type', models.IntegerField(choices=deployments.models.ProgrammeTypes.choices, default=0)), - ('sector', models.IntegerField(default=0)), - ('start_date', models.DateField()), - ('end_date', models.DateField()), - ('budget_amount', models.IntegerField(default=0)), - ('status', models.IntegerField(choices=deployments.models.Statuses.choices, default=0)), - ('project_district', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.District')), - ('reporting_ns', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Country')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.TextField()), + ("programme_type", models.IntegerField(choices=deployments.models.ProgrammeTypes.choices, default=0)), + ("sector", models.IntegerField(default=0)), + ("start_date", models.DateField()), + ("end_date", models.DateField()), + ("budget_amount", models.IntegerField(default=0)), + ("status", models.IntegerField(choices=deployments.models.Statuses.choices, default=0)), + ("project_district", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.District")), + ("reporting_ns", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.Country")), + ( + "user", + models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL + ), + ), ], ), ] diff --git a/deployments/migrations/0009_auto_20190708_1626.py b/deployments/migrations/0009_auto_20190708_1626.py index 8cd234ce2..a63677d22 100644 --- a/deployments/migrations/0009_auto_20190708_1626.py +++ b/deployments/migrations/0009_auto_20190708_1626.py @@ -1,75 +1,75 @@ # Generated by Django 2.0.12 on 2019-07-08 16:26 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0020_auto_20190703_0614'), - ('deployments', '0008_project'), + ("api", "0020_auto_20190703_0614"), + ("deployments", "0008_project"), ] operations = [ migrations.AddField( - model_name='eru', - name='alert_date', + model_name="eru", + name="alert_date", field=models.DateTimeField(null=True), ), migrations.AddField( - model_name='eru', - name='appeal', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Appeal'), + model_name="eru", + name="appeal", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Appeal"), ), migrations.AddField( - model_name='eru', - name='end_date', + model_name="eru", + name="end_date", field=models.DateTimeField(null=True), ), migrations.AddField( - model_name='eru', - name='num_people_deployed', + model_name="eru", + name="num_people_deployed", field=models.IntegerField(default=0), ), migrations.AddField( - model_name='eru', - name='start_date', + model_name="eru", + name="start_date", field=models.DateTimeField(null=True), ), migrations.AddField( - model_name='eru', - name='supporting_societies', + model_name="eru", + name="supporting_societies", field=models.CharField(blank=True, max_length=500, null=True), ), migrations.AddField( - model_name='personneldeployment', - name='alert_date', + model_name="personneldeployment", + name="alert_date", field=models.DateTimeField(null=True), ), migrations.AddField( - model_name='personneldeployment', - name='appeal_deployed_to', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Appeal'), + model_name="personneldeployment", + name="appeal_deployed_to", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Appeal"), ), migrations.AddField( - model_name='personneldeployment', - name='end_date', + model_name="personneldeployment", + name="end_date", field=models.DateTimeField(null=True), ), migrations.AddField( - model_name='personneldeployment', - name='end_duration', + model_name="personneldeployment", + name="end_duration", field=models.CharField(blank=True, max_length=100, null=True), ), migrations.AddField( - model_name='personneldeployment', - name='exp_start_date', + model_name="personneldeployment", + name="exp_start_date", field=models.DateTimeField(null=True), ), migrations.AddField( - model_name='personneldeployment', - name='start_date', + model_name="personneldeployment", + name="start_date", field=models.DateTimeField(null=True), ), ] diff --git a/deployments/migrations/0010_auto_20190711_0822.py b/deployments/migrations/0010_auto_20190711_0822.py index 54bc720c4..6a9e957d0 100644 --- a/deployments/migrations/0010_auto_20190711_0822.py +++ b/deployments/migrations/0010_auto_20190711_0822.py @@ -1,74 +1,86 @@ # Generated by Django 2.0.12 on 2019-07-11 08:22 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0009_auto_20190708_1626'), + ("deployments", "0009_auto_20190708_1626"), ] operations = [ migrations.AlterField( - model_name='eru', - name='alert_date', - field=models.DateTimeField(help_text='Still not used in frontend', null=True), + model_name="eru", + name="alert_date", + field=models.DateTimeField(help_text="Still not used in frontend", null=True), ), migrations.AlterField( - model_name='eru', - name='appeal', - field=models.ForeignKey(blank=True, help_text='Still not used in frontend', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Appeal'), + model_name="eru", + name="appeal", + field=models.ForeignKey( + blank=True, + help_text="Still not used in frontend", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Appeal", + ), ), migrations.AlterField( - model_name='eru', - name='end_date', - field=models.DateTimeField(help_text='Still not used in frontend', null=True), + model_name="eru", + name="end_date", + field=models.DateTimeField(help_text="Still not used in frontend", null=True), ), migrations.AlterField( - model_name='eru', - name='num_people_deployed', - field=models.IntegerField(default=0, help_text='Still not used in frontend'), + model_name="eru", + name="num_people_deployed", + field=models.IntegerField(default=0, help_text="Still not used in frontend"), ), migrations.AlterField( - model_name='eru', - name='start_date', - field=models.DateTimeField(help_text='Still not used in frontend', null=True), + model_name="eru", + name="start_date", + field=models.DateTimeField(help_text="Still not used in frontend", null=True), ), migrations.AlterField( - model_name='eru', - name='supporting_societies', - field=models.CharField(blank=True, help_text='Still not used in frontend', max_length=500, null=True), + model_name="eru", + name="supporting_societies", + field=models.CharField(blank=True, help_text="Still not used in frontend", max_length=500, null=True), ), migrations.AlterField( - model_name='personneldeployment', - name='alert_date', - field=models.DateTimeField(help_text='Still not used in frontend', null=True), + model_name="personneldeployment", + name="alert_date", + field=models.DateTimeField(help_text="Still not used in frontend", null=True), ), migrations.AlterField( - model_name='personneldeployment', - name='appeal_deployed_to', - field=models.ForeignKey(blank=True, help_text='Still not used in frontend', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Appeal'), + model_name="personneldeployment", + name="appeal_deployed_to", + field=models.ForeignKey( + blank=True, + help_text="Still not used in frontend", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Appeal", + ), ), migrations.AlterField( - model_name='personneldeployment', - name='end_date', - field=models.DateTimeField(help_text='Still not used in frontend', null=True), + model_name="personneldeployment", + name="end_date", + field=models.DateTimeField(help_text="Still not used in frontend", null=True), ), migrations.AlterField( - model_name='personneldeployment', - name='end_duration', - field=models.CharField(blank=True, help_text='Still not used in frontend', max_length=100, null=True), + model_name="personneldeployment", + name="end_duration", + field=models.CharField(blank=True, help_text="Still not used in frontend", max_length=100, null=True), ), migrations.AlterField( - model_name='personneldeployment', - name='exp_start_date', - field=models.DateTimeField(help_text='Still not used in frontend', null=True), + model_name="personneldeployment", + name="exp_start_date", + field=models.DateTimeField(help_text="Still not used in frontend", null=True), ), migrations.AlterField( - model_name='personneldeployment', - name='start_date', - field=models.DateTimeField(help_text='Still not used in frontend', null=True), + model_name="personneldeployment", + name="start_date", + field=models.DateTimeField(help_text="Still not used in frontend", null=True), ), ] diff --git a/deployments/migrations/0011_erureadiness.py b/deployments/migrations/0011_erureadiness.py index be9f7313e..aae2c6c0c 100644 --- a/deployments/migrations/0011_erureadiness.py +++ b/deployments/migrations/0011_erureadiness.py @@ -1,32 +1,36 @@ # Generated by Django 2.0.12 on 2019-07-11 08:59 -import deployments.models -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + +import deployments.models class Migration(migrations.Migration): dependencies = [ - ('api', '0020_auto_20190703_0614'), - ('deployments', '0010_auto_20190711_0822'), + ("api", "0020_auto_20190703_0614"), + ("deployments", "0010_auto_20190711_0822"), ] operations = [ migrations.CreateModel( - name='ERUReadiness', + name="ERUReadiness", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('ERU_type', models.IntegerField(default=0, choices=deployments.models.ERUType.choices)), - ('is_personnel', models.BooleanField(default=False)), - ('is_equipment', models.BooleanField(default=False)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('national_society', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("ERU_type", models.IntegerField(default=0, choices=deployments.models.ERUType.choices)), + ("is_personnel", models.BooleanField(default=False)), + ("is_equipment", models.BooleanField(default=False)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "national_society", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), + ), ], options={ - 'verbose_name': 'ERU Readiness', - 'verbose_name_plural': 'NS-es ERU Readiness', - 'ordering': ('updated_at', 'national_society'), + "verbose_name": "ERU Readiness", + "verbose_name_plural": "NS-es ERU Readiness", + "ordering": ("updated_at", "national_society"), }, ), ] diff --git a/deployments/migrations/0012_auto_20190722_1408.py b/deployments/migrations/0012_auto_20190722_1408.py index 3afe30b15..c0b573952 100644 --- a/deployments/migrations/0012_auto_20190722_1408.py +++ b/deployments/migrations/0012_auto_20190722_1408.py @@ -1,6 +1,7 @@ # Generated by Django 2.0.12 on 2019-07-22 14:08 import datetime + from django.db import migrations, models from django.utils.timezone import utc @@ -8,23 +9,23 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0011_erureadiness'), + ("deployments", "0011_erureadiness"), ] operations = [ migrations.AddField( - model_name='personneldeployment', - name='created_at', + model_name="personneldeployment", + name="created_at", field=models.DateTimeField(default=datetime.datetime(2017, 8, 21, 14, 8, 50, 306044, tzinfo=utc)), ), migrations.AddField( - model_name='personneldeployment', - name='previous_update', + model_name="personneldeployment", + name="previous_update", field=models.DateTimeField(blank=True, null=True), ), migrations.AddField( - model_name='personneldeployment', - name='updated_at', + model_name="personneldeployment", + name="updated_at", field=models.DateTimeField(auto_now=True), ), ] diff --git a/deployments/migrations/0013_auto_20190722_1410.py b/deployments/migrations/0013_auto_20190722_1410.py index b4917efb4..b494cb336 100644 --- a/deployments/migrations/0013_auto_20190722_1410.py +++ b/deployments/migrations/0013_auto_20190722_1410.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0012_auto_20190722_1408'), + ("deployments", "0012_auto_20190722_1408"), ] operations = [ migrations.AlterField( - model_name='personneldeployment', - name='created_at', + model_name="personneldeployment", + name="created_at", field=models.DateTimeField(auto_now_add=True), ), ] diff --git a/deployments/migrations/0014_auto_20191024_0646.py b/deployments/migrations/0014_auto_20191024_0646.py index cc2f194d6..794983a58 100644 --- a/deployments/migrations/0014_auto_20191024_0646.py +++ b/deployments/migrations/0014_auto_20191024_0646.py @@ -1,119 +1,121 @@ # Generated by Django 2.0.12 on 2019-10-04 06:46 -import deployments.models import django.contrib.postgres.fields from django.db import migrations, models +import deployments.models + class Migration(migrations.Migration): dependencies = [ - ('deployments', '0013_auto_20190722_1410'), + ("deployments", "0013_auto_20190722_1410"), ] operations = [ migrations.RenameField( - model_name='project', - old_name='sector', - new_name='primary_sector', + model_name="project", + old_name="sector", + new_name="primary_sector", ), migrations.AddField( - model_name='project', - name='operation_type', + model_name="project", + name="operation_type", field=models.IntegerField(default=0, choices=deployments.models.OperationTypes.choices), preserve_default=False, ), migrations.AddField( - model_name='project', - name='secondary_sectors', + model_name="project", + name="secondary_sectors", field=django.contrib.postgres.fields.ArrayField( base_field=models.IntegerField(default=0), - blank=True, default=list, size=None, + blank=True, + default=list, + size=None, ), ), - migrations.AddField( - model_name='project', - name='modified_at', + model_name="project", + name="modified_at", field=models.DateTimeField(auto_now=True), ), - migrations.CreateModel( - name='RegionalProject', + name="RegionalProject", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=100)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("modified_at", models.DateTimeField(auto_now=True)), ], ), migrations.AddField( - model_name='project', - name='regional_project', + model_name="project", + name="regional_project", field=models.ForeignKey( - blank=True, null=True, + blank=True, + null=True, on_delete=django.db.models.deletion.SET_NULL, - to='deployments.RegionalProject', + to="deployments.RegionalProject", ), ), - migrations.AddField( - model_name='project', - name='dtype', + model_name="project", + name="dtype", field=models.ForeignKey( - blank=True, null=True, + blank=True, + null=True, on_delete=django.db.models.deletion.SET_NULL, - to='api.DisasterType', + to="api.DisasterType", ), ), migrations.AddField( - model_name='project', - name='event', + model_name="project", + name="event", field=models.ForeignKey( - blank=True, null=True, + blank=True, + null=True, on_delete=django.db.models.deletion.SET_NULL, - to='api.Event', + to="api.Event", ), ), - migrations.AddField( - model_name='project', - name='reached_children', + model_name="project", + name="reached_children", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='project', - name='reached_female', + model_name="project", + name="reached_female", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='project', - name='reached_male', + model_name="project", + name="reached_male", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='project', - name='reached_total', + model_name="project", + name="reached_total", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='project', - name='target_children', + model_name="project", + name="target_children", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='project', - name='target_female', + model_name="project", + name="target_female", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='project', - name='target_male', + model_name="project", + name="target_male", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='project', - name='target_total', + model_name="project", + name="target_total", field=models.IntegerField(blank=True, null=True), ), ] diff --git a/deployments/migrations/0015_auto_20191128_0640.py b/deployments/migrations/0015_auto_20191128_0640.py index 34a31accf..4053bf9c0 100644 --- a/deployments/migrations/0015_auto_20191128_0640.py +++ b/deployments/migrations/0015_auto_20191128_0640.py @@ -1,19 +1,21 @@ # Generated by Django 2.0.12 on 2019-11-28 06:40 import django.contrib.postgres.fields -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0014_auto_20191024_0646'), + ("deployments", "0014_auto_20191024_0646"), ] operations = [ migrations.AlterField( - model_name='project', - name='secondary_sectors', - field=django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(default=0), blank=True, default=list, size=None), + model_name="project", + name="secondary_sectors", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.IntegerField(default=0), blank=True, default=list, size=None + ), ), ] diff --git a/deployments/migrations/0016_auto_20200107_0855.py b/deployments/migrations/0016_auto_20200107_0855.py index 5e0dde3b7..7616ce7cc 100644 --- a/deployments/migrations/0016_auto_20200107_0855.py +++ b/deployments/migrations/0016_auto_20200107_0855.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0015_auto_20191128_0640'), + ("deployments", "0015_auto_20191128_0640"), ] operations = [ migrations.RenameField( - model_name='project', - old_name='reached_children', - new_name='reached_other', + model_name="project", + old_name="reached_children", + new_name="reached_other", ), migrations.RenameField( - model_name='project', - old_name='target_children', - new_name='target_other', + model_name="project", + old_name="target_children", + new_name="target_other", ), ] diff --git a/deployments/migrations/0017_auto_20200122_1434.py b/deployments/migrations/0017_auto_20200122_1434.py index cbdf63971..f7f364573 100644 --- a/deployments/migrations/0017_auto_20200122_1434.py +++ b/deployments/migrations/0017_auto_20200122_1434.py @@ -6,13 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0016_auto_20200107_0855'), + ("deployments", "0016_auto_20200107_0855"), ] operations = [ migrations.AlterField( - model_name='personnel', - name='type', - field=models.CharField(choices=[('fact', 'FACT'), ('heop', 'HEOP'), ('rdrt', 'RDRT'), ('ifrc', 'IFRC'), ('eru', 'ERU HR'), ('rr', 'Rapid Response')], max_length=4), + model_name="personnel", + name="type", + field=models.CharField( + choices=[ + ("fact", "FACT"), + ("heop", "HEOP"), + ("rdrt", "RDRT"), + ("ifrc", "IFRC"), + ("eru", "ERU HR"), + ("rr", "Rapid Response"), + ], + max_length=4, + ), ), ] diff --git a/deployments/migrations/0018_auto_20200319_0431.py b/deployments/migrations/0018_auto_20200319_0431.py index 4a1a99c2f..4e12c9214 100644 --- a/deployments/migrations/0018_auto_20200319_0431.py +++ b/deployments/migrations/0018_auto_20200319_0431.py @@ -1,19 +1,25 @@ # Generated by Django 2.0.12 on 2020-03-19 04:31 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0017_auto_20200122_1434'), + ("deployments", "0017_auto_20200122_1434"), ] operations = [ migrations.AlterField( - model_name='project', - name='project_district', - field=models.ForeignKey(blank=True, help_text='No selection will indicate all districts.', null=True, on_delete=django.db.models.deletion.CASCADE, to='api.District'), + model_name="project", + name="project_district", + field=models.ForeignKey( + blank=True, + help_text="No selection will indicate all districts.", + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="api.District", + ), ), ] diff --git a/deployments/migrations/0019_auto_20200319_0806.py b/deployments/migrations/0019_auto_20200319_0806.py index 28e3e0cca..6c87eb5d0 100644 --- a/deployments/migrations/0019_auto_20200319_0806.py +++ b/deployments/migrations/0019_auto_20200319_0806.py @@ -1,25 +1,27 @@ # Generated by Django 2.0.12 on 2020-03-19 08:06 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0042_auto_20200128_1045'), - ('deployments', '0018_auto_20200319_0431'), + ("api", "0042_auto_20200128_1045"), + ("deployments", "0018_auto_20200319_0431"), ] operations = [ migrations.AddField( - model_name='project', - name='project_country', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='api.Country'), + model_name="project", + name="project_country", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.CASCADE, related_name="projects", to="api.Country" + ), ), migrations.AlterField( - model_name='project', - name='reporting_ns', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ns_projects', to='api.Country'), + model_name="project", + name="reporting_ns", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="ns_projects", to="api.Country"), ), ] diff --git a/deployments/migrations/0020_project_is_private.py b/deployments/migrations/0020_project_is_private.py index 1a1955e08..f86c65edf 100644 --- a/deployments/migrations/0020_project_is_private.py +++ b/deployments/migrations/0020_project_is_private.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0019_auto_20200319_0806'), + ("deployments", "0019_auto_20200319_0806"), ] operations = [ migrations.AddField( - model_name='project', - name='is_private', - field=models.BooleanField(default=False, help_text='Private projects are only visible to authenticated users.'), + model_name="project", + name="is_private", + field=models.BooleanField(default=False, help_text="Private projects are only visible to authenticated users."), ), ] diff --git a/deployments/migrations/0021_projectimport.py b/deployments/migrations/0021_projectimport.py index 3f7cf8bea..ac597938b 100644 --- a/deployments/migrations/0021_projectimport.py +++ b/deployments/migrations/0021_projectimport.py @@ -1,28 +1,38 @@ # Generated by Django 2.0.12 on 2020-04-08 08:14 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('deployments', '0020_project_is_private'), + ("deployments", "0020_project_is_private"), ] operations = [ migrations.CreateModel( - name='ProjectImport', + name="ProjectImport", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('message', models.TextField()), - ('status', models.CharField(choices=[('pending', 'Pending'), ('success', 'Success'), ('failure', 'Failure')], default='pending', max_length=10)), - ('file', models.FileField(upload_to='project-imports/')), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), - ('projects_created', models.ManyToManyField(to='deployments.Project')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("message", models.TextField()), + ( + "status", + models.CharField( + choices=[("pending", "Pending"), ("success", "Success"), ("failure", "Failure")], + default="pending", + max_length=10, + ), + ), + ("file", models.FileField(upload_to="project-imports/")), + ( + "created_by", + models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ("projects_created", models.ManyToManyField(to="deployments.Project")), ], ), ] diff --git a/deployments/migrations/0022_auto_20200409_1214.py b/deployments/migrations/0022_auto_20200409_1214.py index 3ebb6c0f9..07ef3b736 100644 --- a/deployments/migrations/0022_auto_20200409_1214.py +++ b/deployments/migrations/0022_auto_20200409_1214.py @@ -6,17 +6,21 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0021_projectimport'), + ("deployments", "0021_projectimport"), ] operations = [ migrations.RemoveField( - model_name='project', - name='is_private', + model_name="project", + name="is_private", ), migrations.AddField( - model_name='project', - name='visibility', - field=models.CharField(choices=[('public', 'Public'), ('logged_in_user', 'Logged in user'), ('ifrc_only', 'IFRC only')], default='public', max_length=32), + model_name="project", + name="visibility", + field=models.CharField( + choices=[("public", "Public"), ("logged_in_user", "Logged in user"), ("ifrc_only", "IFRC only")], + default="public", + max_length=32, + ), ), ] diff --git a/deployments/migrations/0023_project_multiple_districts_20200513_1125.py b/deployments/migrations/0023_project_multiple_districts_20200513_1125.py index 5dc27fd97..8cf46d14c 100644 --- a/deployments/migrations/0023_project_multiple_districts_20200513_1125.py +++ b/deployments/migrations/0023_project_multiple_districts_20200513_1125.py @@ -1,25 +1,37 @@ # Generated by Django 2.2.10 on 2020-05-13 11:25 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0064_auto_20200504_1438'), - ('deployments', '0022_auto_20200409_1214'), + ("api", "0064_auto_20200504_1438"), + ("deployments", "0022_auto_20200409_1214"), ] operations = [ migrations.AddField( - model_name='project', - name='project_districts', - field=models.ManyToManyField(blank=True, help_text='No selection will indicate all districts.', related_name='many_to_many_projects', to='api.District'), + model_name="project", + name="project_districts", + field=models.ManyToManyField( + blank=True, + help_text="No selection will indicate all districts.", + related_name="many_to_many_projects", + to="api.District", + ), ), migrations.AlterField( - model_name='project', - name='project_district', - field=models.ForeignKey(blank=True, help_text='No selection will indicate all districts.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='api.District'), + model_name="project", + name="project_district", + field=models.ForeignKey( + blank=True, + help_text="No selection will indicate all districts.", + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="projects", + to="api.District", + ), ), ] diff --git a/deployments/migrations/0024_migrate_project_districts_to_new_field_20200513_1126.py b/deployments/migrations/0024_migrate_project_districts_to_new_field_20200513_1126.py index 18faa8f11..3fd623839 100644 --- a/deployments/migrations/0024_migrate_project_districts_to_new_field_20200513_1126.py +++ b/deployments/migrations/0024_migrate_project_districts_to_new_field_20200513_1126.py @@ -5,24 +5,22 @@ def make_many_districts(apps, schema_editor): """ - Adds the District object in Project.project_district to the - many-to-many relationship in Project.project_districts + Adds the District object in Project.project_district to the + many-to-many relationship in Project.project_districts """ - Project = apps.get_model('deployments', 'Project') + Project = apps.get_model("deployments", "Project") for project in Project.objects.all(): if project.project_district: project.project_districts.add(project.project_district) elif project.project_country: - project.project_districts.set( - project.project_country.district_set.all() - ) + project.project_districts.set(project.project_country.district_set.all()) class Migration(migrations.Migration): dependencies = [ - ('deployments', '0023_project_multiple_districts_20200513_1125'), + ("deployments", "0023_project_multiple_districts_20200513_1125"), ] operations = [ diff --git a/deployments/migrations/0025_remove_project_district_20200513_1130.py b/deployments/migrations/0025_remove_project_district_20200513_1130.py index f958d5d27..9fdf091c8 100644 --- a/deployments/migrations/0025_remove_project_district_20200513_1130.py +++ b/deployments/migrations/0025_remove_project_district_20200513_1130.py @@ -6,17 +6,17 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0024_migrate_project_districts_to_new_field_20200513_1126'), + ("deployments", "0024_migrate_project_districts_to_new_field_20200513_1126"), ] operations = [ migrations.RemoveField( - model_name='project', - name='project_district', + model_name="project", + name="project_district", ), migrations.AlterField( - model_name='project', - name='project_districts', - field=models.ManyToManyField(blank=True, help_text='No selection will indicate all districts.', to='api.District'), + model_name="project", + name="project_districts", + field=models.ManyToManyField(blank=True, help_text="No selection will indicate all districts.", to="api.District"), ), ] diff --git a/deployments/migrations/0026_sector_health_merge.py b/deployments/migrations/0026_sector_health_merge.py index 55c3533ea..446803064 100644 --- a/deployments/migrations/0026_sector_health_merge.py +++ b/deployments/migrations/0026_sector_health_merge.py @@ -5,9 +5,9 @@ def merge_sector_health(apps, schema_editor): """ - Merge Sectors Health (public) and Health (clinical) to Health for Sectors + Merge Sectors Health (public) and Health (clinical) to Health for Sectors """ - Project = apps.get_model('deployments', 'Project') + Project = apps.get_model("deployments", "Project") # This value can change so using value from this time HEALTH = 4 # HEALTH_PUBLIC is same as HEALTH in DB @@ -20,7 +20,7 @@ def merge_sector_health(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('deployments', '0025_remove_project_district_20200513_1130'), + ("deployments", "0025_remove_project_district_20200513_1130"), ] operations = [ diff --git a/deployments/migrations/0027_auto_20200528_0840.py b/deployments/migrations/0027_auto_20200528_0840.py index 6a404b570..6773a48ae 100644 --- a/deployments/migrations/0027_auto_20200528_0840.py +++ b/deployments/migrations/0027_auto_20200528_0840.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0026_sector_health_merge'), + ("deployments", "0026_sector_health_merge"), ] operations = [ migrations.AlterField( - model_name='project', - name='project_districts', - field=models.ManyToManyField(to='api.District'), + model_name="project", + name="project_districts", + field=models.ManyToManyField(to="api.District"), ), ] diff --git a/deployments/migrations/0028_auto_20200618_0904.py b/deployments/migrations/0028_auto_20200618_0904.py index 37ac12005..26e28b8c5 100644 --- a/deployments/migrations/0028_auto_20200618_0904.py +++ b/deployments/migrations/0028_auto_20200618_0904.py @@ -1,454 +1,587 @@ # Generated by Django 2.2.13 on 2020-06-18 09:04 -import deployments.models -from django.conf import settings import django.contrib.postgres.fields -from django.db import migrations, models import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + +import deployments.models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0027_auto_20200528_0840'), + ("deployments", "0027_auto_20200528_0840"), ] operations = [ migrations.AlterModelOptions( - name='deployedperson', - options={'verbose_name': 'Deployed Person', 'verbose_name_plural': 'Deployed Persons'}, + name="deployedperson", + options={"verbose_name": "Deployed Person", "verbose_name_plural": "Deployed Persons"}, ), migrations.AlterModelOptions( - name='eru', - options={'verbose_name': 'Emergency Response Unit', 'verbose_name_plural': 'Emergency Response Units'}, + name="eru", + options={"verbose_name": "Emergency Response Unit", "verbose_name_plural": "Emergency Response Units"}, ), migrations.AlterModelOptions( - name='partnersocietydeployment', - options={'verbose_name': 'Partner Society Deployment', 'verbose_name_plural': 'Partner Society Deployments'}, + name="partnersocietydeployment", + options={"verbose_name": "Partner Society Deployment", "verbose_name_plural": "Partner Society Deployments"}, ), migrations.AlterModelOptions( - name='personnel', - options={'verbose_name': 'Personnel', 'verbose_name_plural': 'Personnels'}, + name="personnel", + options={"verbose_name": "Personnel", "verbose_name_plural": "Personnels"}, ), migrations.AlterModelOptions( - name='personneldeployment', - options={'verbose_name': 'Personnel Deployment', 'verbose_name_plural': 'Personnel Deployments'}, + name="personneldeployment", + options={"verbose_name": "Personnel Deployment", "verbose_name_plural": "Personnel Deployments"}, ), migrations.AlterModelOptions( - name='project', - options={'verbose_name': 'Project', 'verbose_name_plural': 'Projects'}, + name="project", + options={"verbose_name": "Project", "verbose_name_plural": "Projects"}, ), migrations.AlterModelOptions( - name='projectimport', - options={'verbose_name': 'Project Import', 'verbose_name_plural': 'Projects Import'}, + name="projectimport", + options={"verbose_name": "Project Import", "verbose_name_plural": "Projects Import"}, ), migrations.AlterModelOptions( - name='regionalproject', - options={'verbose_name': 'Regional Project', 'verbose_name_plural': 'Regional Projects'}, + name="regionalproject", + options={"verbose_name": "Regional Project", "verbose_name_plural": "Regional Projects"}, ), migrations.AlterField( - model_name='deployedperson', - name='end_date', - field=models.DateTimeField(null=True, verbose_name='end date'), + model_name="deployedperson", + name="end_date", + field=models.DateTimeField(null=True, verbose_name="end date"), ), migrations.AlterField( - model_name='deployedperson', - name='name', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='name'), + model_name="deployedperson", + name="name", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='deployedperson', - name='role', - field=models.CharField(blank=True, max_length=32, null=True, verbose_name='role'), + model_name="deployedperson", + name="role", + field=models.CharField(blank=True, max_length=32, null=True, verbose_name="role"), ), migrations.AlterField( - model_name='deployedperson', - name='start_date', - field=models.DateTimeField(null=True, verbose_name='start date'), + model_name="deployedperson", + name="start_date", + field=models.DateTimeField(null=True, verbose_name="start date"), ), migrations.AlterField( - model_name='eru', - name='alert_date', - field=models.DateTimeField(help_text='still not used in frontend', null=True, verbose_name='alert date'), + model_name="eru", + name="alert_date", + field=models.DateTimeField(help_text="still not used in frontend", null=True, verbose_name="alert date"), ), migrations.AlterField( - model_name='eru', - name='appeal', - field=models.ForeignKey(blank=True, help_text='still not used in frontend', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Appeal', verbose_name='appeal'), + model_name="eru", + name="appeal", + field=models.ForeignKey( + blank=True, + help_text="still not used in frontend", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Appeal", + verbose_name="appeal", + ), ), migrations.AlterField( - model_name='eru', - name='available', - field=models.BooleanField(default=False, verbose_name='available'), + model_name="eru", + name="available", + field=models.BooleanField(default=False, verbose_name="available"), ), migrations.AlterField( - model_name='eru', - name='deployed_to', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country deployed to'), + model_name="eru", + name="deployed_to", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Country", + verbose_name="country deployed to", + ), ), migrations.AlterField( - model_name='eru', - name='end_date', - field=models.DateTimeField(help_text='still not used in frontend', null=True, verbose_name='end date'), + model_name="eru", + name="end_date", + field=models.DateTimeField(help_text="still not used in frontend", null=True, verbose_name="end date"), ), migrations.AlterField( - model_name='eru', - name='equipment_units', - field=models.IntegerField(default=0, verbose_name='equipment units'), + model_name="eru", + name="equipment_units", + field=models.IntegerField(default=0, verbose_name="equipment units"), ), migrations.AlterField( - model_name='eru', - name='eru_owner', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deployments.ERUOwner', verbose_name='owner'), + model_name="eru", + name="eru_owner", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="deployments.ERUOwner", verbose_name="owner"), ), migrations.AlterField( - model_name='eru', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event', verbose_name='event'), + model_name="eru", + name="event", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event", verbose_name="event" + ), ), migrations.AlterField( - model_name='eru', - name='num_people_deployed', - field=models.IntegerField(default=0, help_text='still not used in frontend', verbose_name='number of people deployed'), + model_name="eru", + name="num_people_deployed", + field=models.IntegerField( + default=0, help_text="still not used in frontend", verbose_name="number of people deployed" + ), ), migrations.AlterField( - model_name='eru', - name='start_date', - field=models.DateTimeField(help_text='still not used in frontend', null=True, verbose_name='start date'), + model_name="eru", + name="start_date", + field=models.DateTimeField(help_text="still not used in frontend", null=True, verbose_name="start date"), ), migrations.AlterField( - model_name='eru', - name='supporting_societies', - field=models.CharField(blank=True, help_text='still not used in frontend', max_length=500, null=True, verbose_name='suuporting societies'), + model_name="eru", + name="supporting_societies", + field=models.CharField( + blank=True, help_text="still not used in frontend", max_length=500, null=True, verbose_name="suuporting societies" + ), ), migrations.AlterField( - model_name='eru', - name='type', - field=models.IntegerField(default=0, choices=deployments.models.ERUType.choices, verbose_name='type'), + model_name="eru", + name="type", + field=models.IntegerField(default=0, choices=deployments.models.ERUType.choices, verbose_name="type"), ), migrations.AlterField( - model_name='eru', - name='units', - field=models.IntegerField(default=0, verbose_name='units'), + model_name="eru", + name="units", + field=models.IntegerField(default=0, verbose_name="units"), ), migrations.AlterField( - model_name='eruowner', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="eruowner", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='eruowner', - name='national_society_country', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='national society country'), + model_name="eruowner", + name="national_society_country", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="national society country" + ), ), migrations.AlterField( - model_name='eruowner', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='updated at'), + model_name="eruowner", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="updated at"), ), migrations.AlterField( - model_name='erureadiness', - name='ERU_type', - field=models.IntegerField(default=0, choices=deployments.models.ERUType.choices, verbose_name='ERU type'), + model_name="erureadiness", + name="ERU_type", + field=models.IntegerField(default=0, choices=deployments.models.ERUType.choices, verbose_name="ERU type"), ), migrations.AlterField( - model_name='erureadiness', - name='is_equipment', - field=models.BooleanField(default=False, verbose_name='is equipment?'), + model_name="erureadiness", + name="is_equipment", + field=models.BooleanField(default=False, verbose_name="is equipment?"), ), migrations.AlterField( - model_name='erureadiness', - name='is_personnel', - field=models.BooleanField(default=False, verbose_name='is personnel?'), + model_name="erureadiness", + name="is_personnel", + field=models.BooleanField(default=False, verbose_name="is personnel?"), ), migrations.AlterField( - model_name='erureadiness', - name='national_society', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='national society'), + model_name="erureadiness", + name="national_society", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Country", + verbose_name="national society", + ), ), migrations.AlterField( - model_name='erureadiness', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='updated at'), + model_name="erureadiness", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="updated at"), ), migrations.AlterField( - model_name='partnersocietyactivities', - name='activity', - field=models.CharField(max_length=50, verbose_name='activity'), + model_name="partnersocietyactivities", + name="activity", + field=models.CharField(max_length=50, verbose_name="activity"), ), migrations.AlterField( - model_name='partnersocietydeployment', - name='activity', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='partner_societies', to='deployments.PartnerSocietyActivities', verbose_name='activity'), + model_name="partnersocietydeployment", + name="activity", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="partner_societies", + to="deployments.PartnerSocietyActivities", + verbose_name="activity", + ), ), migrations.AlterField( - model_name='partnersocietydeployment', - name='country_deployed_to', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='country_partner_deployments', to='api.Country', verbose_name='country deployed to'), + model_name="partnersocietydeployment", + name="country_deployed_to", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="country_partner_deployments", + to="api.Country", + verbose_name="country deployed to", + ), ), migrations.AlterField( - model_name='partnersocietydeployment', - name='district_deployed_to', - field=models.ManyToManyField(to='api.District', verbose_name='district deployed to'), + model_name="partnersocietydeployment", + name="district_deployed_to", + field=models.ManyToManyField(to="api.District", verbose_name="district deployed to"), ), migrations.AlterField( - model_name='partnersocietydeployment', - name='parent_society', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='partner_society_members', to='api.Country', verbose_name='parent society'), + model_name="partnersocietydeployment", + name="parent_society", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="partner_society_members", + to="api.Country", + verbose_name="parent society", + ), ), migrations.AlterField( - model_name='personnel', - name='country_from', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='personnel_deployments', to='api.Country', verbose_name='country from'), + model_name="personnel", + name="country_from", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="personnel_deployments", + to="api.Country", + verbose_name="country from", + ), ), migrations.AlterField( - model_name='personnel', - name='deployment', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deployments.PersonnelDeployment', verbose_name='deployment'), + model_name="personnel", + name="deployment", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="deployments.PersonnelDeployment", verbose_name="deployment" + ), ), migrations.AlterField( - model_name='personnel', - name='type', - field=models.CharField(choices=[('fact', 'Fact'), ('heop', 'HEOP'), ('rdrt', 'RDRT'), ('ifrc', 'IFRC'), ('eru', 'ERU HR'), ('rr', 'Rapid Response')], max_length=4, verbose_name='type'), + model_name="personnel", + name="type", + field=models.CharField( + choices=[ + ("fact", "Fact"), + ("heop", "HEOP"), + ("rdrt", "RDRT"), + ("ifrc", "IFRC"), + ("eru", "ERU HR"), + ("rr", "Rapid Response"), + ], + max_length=4, + verbose_name="type", + ), ), migrations.AlterField( - model_name='personneldeployment', - name='alert_date', - field=models.DateTimeField(help_text='still not used in frontend', null=True, verbose_name='alert date'), + model_name="personneldeployment", + name="alert_date", + field=models.DateTimeField(help_text="still not used in frontend", null=True, verbose_name="alert date"), ), migrations.AlterField( - model_name='personneldeployment', - name='appeal_deployed_to', - field=models.ForeignKey(blank=True, help_text='still not used in frontend', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Appeal', verbose_name='appeal deployed to'), + model_name="personneldeployment", + name="appeal_deployed_to", + field=models.ForeignKey( + blank=True, + help_text="still not used in frontend", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Appeal", + verbose_name="appeal deployed to", + ), ), migrations.AlterField( - model_name='personneldeployment', - name='comments', - field=models.TextField(blank=True, null=True, verbose_name='comments'), + model_name="personneldeployment", + name="comments", + field=models.TextField(blank=True, null=True, verbose_name="comments"), ), migrations.AlterField( - model_name='personneldeployment', - name='country_deployed_to', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='country deployed to'), + model_name="personneldeployment", + name="country_deployed_to", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="api.Country", verbose_name="country deployed to" + ), ), migrations.AlterField( - model_name='personneldeployment', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="personneldeployment", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='personneldeployment', - name='end_date', - field=models.DateTimeField(help_text='still not used in frontend', null=True, verbose_name='end date'), + model_name="personneldeployment", + name="end_date", + field=models.DateTimeField(help_text="still not used in frontend", null=True, verbose_name="end date"), ), migrations.AlterField( - model_name='personneldeployment', - name='end_duration', - field=models.CharField(blank=True, help_text='still not used in frontend', max_length=100, null=True, verbose_name='end duration'), + model_name="personneldeployment", + name="end_duration", + field=models.CharField( + blank=True, help_text="still not used in frontend", max_length=100, null=True, verbose_name="end duration" + ), ), migrations.AlterField( - model_name='personneldeployment', - name='event_deployed_to', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event', verbose_name='event deployed to'), + model_name="personneldeployment", + name="event_deployed_to", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Event", + verbose_name="event deployed to", + ), ), migrations.AlterField( - model_name='personneldeployment', - name='exp_start_date', - field=models.DateTimeField(help_text='still not used in frontend', null=True, verbose_name='expire start date'), + model_name="personneldeployment", + name="exp_start_date", + field=models.DateTimeField(help_text="still not used in frontend", null=True, verbose_name="expire start date"), ), migrations.AlterField( - model_name='personneldeployment', - name='previous_update', - field=models.DateTimeField(blank=True, null=True, verbose_name='previous update'), + model_name="personneldeployment", + name="previous_update", + field=models.DateTimeField(blank=True, null=True, verbose_name="previous update"), ), migrations.AlterField( - model_name='personneldeployment', - name='region_deployed_to', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Region', verbose_name='region deployed to'), + model_name="personneldeployment", + name="region_deployed_to", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="api.Region", verbose_name="region deployed to" + ), ), migrations.AlterField( - model_name='personneldeployment', - name='start_date', - field=models.DateTimeField(help_text='still not used in frontend', null=True, verbose_name='start date'), + model_name="personneldeployment", + name="start_date", + field=models.DateTimeField(help_text="still not used in frontend", null=True, verbose_name="start date"), ), migrations.AlterField( - model_name='personneldeployment', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='updated at'), + model_name="personneldeployment", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="updated at"), ), migrations.AlterField( - model_name='project', - name='budget_amount', - field=models.IntegerField(verbose_name='budget amount'), + model_name="project", + name="budget_amount", + field=models.IntegerField(verbose_name="budget amount"), ), migrations.AlterField( - model_name='project', - name='dtype', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType', verbose_name='disaster type'), + model_name="project", + name="dtype", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.DisasterType", + verbose_name="disaster type", + ), ), migrations.AlterField( - model_name='project', - name='end_date', - field=models.DateField(verbose_name='end date'), + model_name="project", + name="end_date", + field=models.DateField(verbose_name="end date"), ), migrations.AlterField( - model_name='project', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event', verbose_name='event'), + model_name="project", + name="event", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event", verbose_name="event" + ), ), migrations.AlterField( - model_name='project', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), + model_name="project", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified at"), ), migrations.AlterField( - model_name='project', - name='name', - field=models.TextField(verbose_name='name'), + model_name="project", + name="name", + field=models.TextField(verbose_name="name"), ), migrations.AlterField( - model_name='project', - name='operation_type', - field=models.IntegerField(choices=deployments.models.OperationTypes.choices, default=0, verbose_name='operation type'), + model_name="project", + name="operation_type", + field=models.IntegerField( + choices=deployments.models.OperationTypes.choices, default=0, verbose_name="operation type" + ), ), migrations.AlterField( - model_name='project', - name='primary_sector', - field=models.IntegerField(default=0, verbose_name='sector'), + model_name="project", + name="primary_sector", + field=models.IntegerField(default=0, verbose_name="sector"), ), migrations.AlterField( - model_name='project', - name='programme_type', - field=models.IntegerField(choices=deployments.models.ProgrammeTypes.choices, default=0, verbose_name='programme type'), + model_name="project", + name="programme_type", + field=models.IntegerField( + choices=deployments.models.ProgrammeTypes.choices, default=0, verbose_name="programme type" + ), ), migrations.AlterField( - model_name='project', - name='project_country', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='api.Country', verbose_name='country'), + model_name="project", + name="project_country", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="projects", + to="api.Country", + verbose_name="country", + ), ), migrations.AlterField( - model_name='project', - name='project_districts', - field=models.ManyToManyField(to='api.District', verbose_name='districts'), + model_name="project", + name="project_districts", + field=models.ManyToManyField(to="api.District", verbose_name="districts"), ), migrations.AlterField( - model_name='project', - name='reached_female', - field=models.IntegerField(blank=True, null=True, verbose_name='reached female'), + model_name="project", + name="reached_female", + field=models.IntegerField(blank=True, null=True, verbose_name="reached female"), ), migrations.AlterField( - model_name='project', - name='reached_male', - field=models.IntegerField(blank=True, null=True, verbose_name='reached male'), + model_name="project", + name="reached_male", + field=models.IntegerField(blank=True, null=True, verbose_name="reached male"), ), migrations.AlterField( - model_name='project', - name='reached_other', - field=models.IntegerField(blank=True, null=True, verbose_name='reached other'), + model_name="project", + name="reached_other", + field=models.IntegerField(blank=True, null=True, verbose_name="reached other"), ), migrations.AlterField( - model_name='project', - name='reached_total', - field=models.IntegerField(blank=True, null=True, verbose_name='reached total'), + model_name="project", + name="reached_total", + field=models.IntegerField(blank=True, null=True, verbose_name="reached total"), ), migrations.AlterField( - model_name='project', - name='regional_project', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='deployments.RegionalProject', verbose_name='regional project'), + model_name="project", + name="regional_project", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="deployments.RegionalProject", + verbose_name="regional project", + ), ), migrations.AlterField( - model_name='project', - name='reporting_ns', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ns_projects', to='api.Country', verbose_name='reporting national society'), + model_name="project", + name="reporting_ns", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="ns_projects", + to="api.Country", + verbose_name="reporting national society", + ), ), migrations.AlterField( - model_name='project', - name='secondary_sectors', - field=django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(default=0), blank=True, default=list, size=None, verbose_name='tags'), + model_name="project", + name="secondary_sectors", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.IntegerField(default=0), blank=True, default=list, size=None, verbose_name="tags" + ), ), migrations.AlterField( - model_name='project', - name='start_date', - field=models.DateField(verbose_name='start date'), + model_name="project", + name="start_date", + field=models.DateField(verbose_name="start date"), ), migrations.AlterField( - model_name='project', - name='status', - field=models.IntegerField(choices=deployments.models.Statuses.choices, default=0, verbose_name='status'), + model_name="project", + name="status", + field=models.IntegerField(choices=deployments.models.Statuses.choices, default=0, verbose_name="status"), ), migrations.AlterField( - model_name='project', - name='target_female', - field=models.IntegerField(blank=True, null=True, verbose_name='target female'), + model_name="project", + name="target_female", + field=models.IntegerField(blank=True, null=True, verbose_name="target female"), ), migrations.AlterField( - model_name='project', - name='target_male', - field=models.IntegerField(blank=True, null=True, verbose_name='target male'), + model_name="project", + name="target_male", + field=models.IntegerField(blank=True, null=True, verbose_name="target male"), ), migrations.AlterField( - model_name='project', - name='target_other', - field=models.IntegerField(blank=True, null=True, verbose_name='target other'), + model_name="project", + name="target_other", + field=models.IntegerField(blank=True, null=True, verbose_name="target other"), ), migrations.AlterField( - model_name='project', - name='target_total', - field=models.IntegerField(blank=True, null=True, verbose_name='target total'), + model_name="project", + name="target_total", + field=models.IntegerField(blank=True, null=True, verbose_name="target total"), ), migrations.AlterField( - model_name='project', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="project", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), migrations.AlterField( - model_name='project', - name='visibility', - field=models.CharField(choices=[('logged_in_user', 'Membership'), ('ifrc_only', 'IFRC Only'), ('public', 'Public')], default='public', max_length=32, verbose_name='visibility'), + model_name="project", + name="visibility", + field=models.CharField( + choices=[("logged_in_user", "Membership"), ("ifrc_only", "IFRC Only"), ("public", "Public")], + default="public", + max_length=32, + verbose_name="visibility", + ), ), migrations.AlterField( - model_name='projectimport', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="projectimport", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='projectimport', - name='created_by', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='created by'), + model_name="projectimport", + name="created_by", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name="created by" + ), ), migrations.AlterField( - model_name='projectimport', - name='file', - field=models.FileField(upload_to='project-imports/', verbose_name='file'), + model_name="projectimport", + name="file", + field=models.FileField(upload_to="project-imports/", verbose_name="file"), ), migrations.AlterField( - model_name='projectimport', - name='message', - field=models.TextField(verbose_name='message'), + model_name="projectimport", + name="message", + field=models.TextField(verbose_name="message"), ), migrations.AlterField( - model_name='projectimport', - name='projects_created', - field=models.ManyToManyField(to='deployments.Project', verbose_name='projects created'), + model_name="projectimport", + name="projects_created", + field=models.ManyToManyField(to="deployments.Project", verbose_name="projects created"), ), migrations.AlterField( - model_name='projectimport', - name='status', - field=models.CharField(choices=[('pending', 'Pending'), ('success', 'Success'), ('failure', 'Failure')], default='pending', max_length=10, verbose_name='status'), + model_name="projectimport", + name="status", + field=models.CharField( + choices=[("pending", "Pending"), ("success", "Success"), ("failure", "Failure")], + default="pending", + max_length=10, + verbose_name="status", + ), ), migrations.AlterField( - model_name='regionalproject', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="regionalproject", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='regionalproject', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), + model_name="regionalproject", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified at"), ), migrations.AlterField( - model_name='regionalproject', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="regionalproject", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), ] diff --git a/deployments/migrations/0029_auto_20200625_1019.py b/deployments/migrations/0029_auto_20200625_1019.py index 15932452d..f0cdc3ab6 100644 --- a/deployments/migrations/0029_auto_20200625_1019.py +++ b/deployments/migrations/0029_auto_20200625_1019.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0028_auto_20200618_0904'), + ("deployments", "0028_auto_20200618_0904"), ] operations = [ migrations.AddField( - model_name='project', - name='actual_expenditure', - field=models.IntegerField(blank=True, null=True, verbose_name='actual expenditure'), + model_name="project", + name="actual_expenditure", + field=models.IntegerField(blank=True, null=True, verbose_name="actual expenditure"), ), migrations.AlterField( - model_name='project', - name='budget_amount', - field=models.IntegerField(blank=True, null=True, verbose_name='budget amount'), + model_name="project", + name="budget_amount", + field=models.IntegerField(blank=True, null=True, verbose_name="budget amount"), ), ] diff --git a/deployments/migrations/0030_actual_expenditure_complete_project.py b/deployments/migrations/0030_actual_expenditure_complete_project.py index 3cb0f611c..753df2e8a 100644 --- a/deployments/migrations/0030_actual_expenditure_complete_project.py +++ b/deployments/migrations/0030_actual_expenditure_complete_project.py @@ -1,21 +1,23 @@ # Generated by Django 2.2.13 on 2020-06-26 07:29 -from deployments.models import Statuses from django.db import migrations from django.db.models import F +from deployments.models import Statuses + + def set_actual_expenditure_for_completed_projects(apps, schema_editor): """ - set actual expenditure using budget amount for completed projects + set actual expenditure using budget amount for completed projects """ - Project = apps.get_model('deployments', 'Project') - Project.objects.filter(status=Statuses.COMPLETED).update(actual_expenditure=F('budget_amount')) + Project = apps.get_model("deployments", "Project") + Project.objects.filter(status=Statuses.COMPLETED).update(actual_expenditure=F("budget_amount")) class Migration(migrations.Migration): dependencies = [ - ('deployments', '0029_auto_20200625_1019'), + ("deployments", "0029_auto_20200625_1019"), ] operations = [ diff --git a/deployments/migrations/0031_auto_20200701_0939.py b/deployments/migrations/0031_auto_20200701_0939.py index 3aa534703..244fd35c2 100644 --- a/deployments/migrations/0031_auto_20200701_0939.py +++ b/deployments/migrations/0031_auto_20200701_0939.py @@ -6,13 +6,24 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0030_actual_expenditure_complete_project'), + ("deployments", "0030_actual_expenditure_complete_project"), ] operations = [ migrations.AlterField( - model_name='personnel', - name='type', - field=models.CharField(choices=[('fact', 'FACT'), ('heop', 'HEOP'), ('rdrt', 'RDRT'), ('ifrc', 'IFRC'), ('eru', 'ERU HR'), ('rr', 'Rapid Response')], max_length=4, verbose_name='type'), + model_name="personnel", + name="type", + field=models.CharField( + choices=[ + ("fact", "FACT"), + ("heop", "HEOP"), + ("rdrt", "RDRT"), + ("ifrc", "IFRC"), + ("eru", "ERU HR"), + ("rr", "Rapid Response"), + ], + max_length=4, + verbose_name="type", + ), ), ] diff --git a/deployments/migrations/0032_auto_20200729_0934.py b/deployments/migrations/0032_auto_20200729_0934.py index 0f0fdcfbb..6151d3712 100644 --- a/deployments/migrations/0032_auto_20200729_0934.py +++ b/deployments/migrations/0032_auto_20200729_0934.py @@ -6,113 +6,115 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0031_auto_20200701_0939'), + ("deployments", "0031_auto_20200701_0939"), ] operations = [ migrations.AddField( - model_name='deployedperson', - name='role_ar', - field=models.CharField(blank=True, max_length=32, null=True, verbose_name='role'), + model_name="deployedperson", + name="role_ar", + field=models.CharField(blank=True, max_length=32, null=True, verbose_name="role"), ), migrations.AddField( - model_name='deployedperson', - name='role_en', - field=models.CharField(blank=True, max_length=32, null=True, verbose_name='role'), + model_name="deployedperson", + name="role_en", + field=models.CharField(blank=True, max_length=32, null=True, verbose_name="role"), ), migrations.AddField( - model_name='deployedperson', - name='role_es', - field=models.CharField(blank=True, max_length=32, null=True, verbose_name='role'), + model_name="deployedperson", + name="role_es", + field=models.CharField(blank=True, max_length=32, null=True, verbose_name="role"), ), migrations.AddField( - model_name='deployedperson', - name='role_fr', - field=models.CharField(blank=True, max_length=32, null=True, verbose_name='role'), + model_name="deployedperson", + name="role_fr", + field=models.CharField(blank=True, max_length=32, null=True, verbose_name="role"), ), migrations.AddField( - model_name='partnersocietyactivities', - name='activity_ar', - field=models.CharField(max_length=50, null=True, verbose_name='activity'), + model_name="partnersocietyactivities", + name="activity_ar", + field=models.CharField(max_length=50, null=True, verbose_name="activity"), ), migrations.AddField( - model_name='partnersocietyactivities', - name='activity_en', - field=models.CharField(max_length=50, null=True, verbose_name='activity'), + model_name="partnersocietyactivities", + name="activity_en", + field=models.CharField(max_length=50, null=True, verbose_name="activity"), ), migrations.AddField( - model_name='partnersocietyactivities', - name='activity_es', - field=models.CharField(max_length=50, null=True, verbose_name='activity'), + model_name="partnersocietyactivities", + name="activity_es", + field=models.CharField(max_length=50, null=True, verbose_name="activity"), ), migrations.AddField( - model_name='partnersocietyactivities', - name='activity_fr', - field=models.CharField(max_length=50, null=True, verbose_name='activity'), + model_name="partnersocietyactivities", + name="activity_fr", + field=models.CharField(max_length=50, null=True, verbose_name="activity"), ), migrations.AddField( - model_name='personneldeployment', - name='comments_ar', - field=models.TextField(blank=True, null=True, verbose_name='comments'), + model_name="personneldeployment", + name="comments_ar", + field=models.TextField(blank=True, null=True, verbose_name="comments"), ), migrations.AddField( - model_name='personneldeployment', - name='comments_en', - field=models.TextField(blank=True, null=True, verbose_name='comments'), + model_name="personneldeployment", + name="comments_en", + field=models.TextField(blank=True, null=True, verbose_name="comments"), ), migrations.AddField( - model_name='personneldeployment', - name='comments_es', - field=models.TextField(blank=True, null=True, verbose_name='comments'), + model_name="personneldeployment", + name="comments_es", + field=models.TextField(blank=True, null=True, verbose_name="comments"), ), migrations.AddField( - model_name='personneldeployment', - name='comments_fr', - field=models.TextField(blank=True, null=True, verbose_name='comments'), + model_name="personneldeployment", + name="comments_fr", + field=models.TextField(blank=True, null=True, verbose_name="comments"), ), migrations.AddField( - model_name='project', - name='name_ar', - field=models.TextField(null=True, verbose_name='name'), + model_name="project", + name="name_ar", + field=models.TextField(null=True, verbose_name="name"), ), migrations.AddField( - model_name='project', - name='name_en', - field=models.TextField(null=True, verbose_name='name'), + model_name="project", + name="name_en", + field=models.TextField(null=True, verbose_name="name"), ), migrations.AddField( - model_name='project', - name='name_es', - field=models.TextField(null=True, verbose_name='name'), + model_name="project", + name="name_es", + field=models.TextField(null=True, verbose_name="name"), ), migrations.AddField( - model_name='project', - name='name_fr', - field=models.TextField(null=True, verbose_name='name'), + model_name="project", + name="name_fr", + field=models.TextField(null=True, verbose_name="name"), ), migrations.AddField( - model_name='regionalproject', - name='name_ar', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="regionalproject", + name="name_ar", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='regionalproject', - name='name_en', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="regionalproject", + name="name_en", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='regionalproject', - name='name_es', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="regionalproject", + name="name_es", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AddField( - model_name='regionalproject', - name='name_fr', - field=models.CharField(max_length=100, null=True, verbose_name='name'), + model_name="regionalproject", + name="name_fr", + field=models.CharField(max_length=100, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='eru', - name='supporting_societies', - field=models.CharField(blank=True, help_text='still not used in frontend', max_length=500, null=True, verbose_name='supporting societies'), + model_name="eru", + name="supporting_societies", + field=models.CharField( + blank=True, help_text="still not used in frontend", max_length=500, null=True, verbose_name="supporting societies" + ), ), ] diff --git a/deployments/migrations/0033_molnixtag.py b/deployments/migrations/0033_molnixtag.py index 5054c1ca4..5bcc36fb1 100644 --- a/deployments/migrations/0033_molnixtag.py +++ b/deployments/migrations/0033_molnixtag.py @@ -6,19 +6,19 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0032_auto_20200729_0934'), + ("deployments", "0032_auto_20200729_0934"), ] operations = [ migrations.CreateModel( - name='MolnixTag', + name="MolnixTag", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('molnix_id', models.IntegerField()), - ('name', models.CharField(max_length=255)), - ('description', models.CharField(max_length=512)), - ('color', models.CharField(max_length=6)), - ('tag_type', models.CharField(max_length=127)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("molnix_id", models.IntegerField()), + ("name", models.CharField(max_length=255)), + ("description", models.CharField(max_length=512)), + ("color", models.CharField(max_length=6)), + ("tag_type", models.CharField(max_length=127)), ], ), ] diff --git a/deployments/migrations/0034_auto_20201111_1056.py b/deployments/migrations/0034_auto_20201111_1056.py index b2b2ec93a..bbc3c9b9f 100644 --- a/deployments/migrations/0034_auto_20201111_1056.py +++ b/deployments/migrations/0034_auto_20201111_1056.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0033_molnixtag'), + ("deployments", "0033_molnixtag"), ] operations = [ migrations.AddField( - model_name='personnel', - name='is_active', + model_name="personnel", + name="is_active", field=models.BooleanField(default=True), ), migrations.AddField( - model_name='personnel', - name='molnix_id', + model_name="personnel", + name="molnix_id", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='personneldeployment', - name='is_molnix', + model_name="personneldeployment", + name="is_molnix", field=models.BooleanField(default=False), ), ] diff --git a/deployments/migrations/0035_personnel_molnix_tags.py b/deployments/migrations/0035_personnel_molnix_tags.py index 388e6570f..bb4477397 100644 --- a/deployments/migrations/0035_personnel_molnix_tags.py +++ b/deployments/migrations/0035_personnel_molnix_tags.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0034_auto_20201111_1056'), + ("deployments", "0034_auto_20201111_1056"), ] operations = [ migrations.AddField( - model_name='personnel', - name='molnix_tags', - field=models.ManyToManyField(blank=True, to='deployments.MolnixTag'), + model_name="personnel", + name="molnix_tags", + field=models.ManyToManyField(blank=True, to="deployments.MolnixTag"), ), ] diff --git a/deployments/migrations/0036_auto_20201118_0812.py b/deployments/migrations/0036_auto_20201118_0812.py index 1f247cdbc..cbcfdb8cd 100644 --- a/deployments/migrations/0036_auto_20201118_0812.py +++ b/deployments/migrations/0036_auto_20201118_0812.py @@ -6,38 +6,38 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0035_personnel_molnix_tags'), + ("deployments", "0035_personnel_molnix_tags"), ] operations = [ migrations.AlterField( - model_name='deployedperson', - name='name', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='name'), + model_name="deployedperson", + name="name", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="name"), ), migrations.AlterField( - model_name='deployedperson', - name='role', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='role'), + model_name="deployedperson", + name="role", + field=models.CharField(blank=True, max_length=512, null=True, verbose_name="role"), ), migrations.AlterField( - model_name='deployedperson', - name='role_ar', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='role'), + model_name="deployedperson", + name="role_ar", + field=models.CharField(blank=True, max_length=512, null=True, verbose_name="role"), ), migrations.AlterField( - model_name='deployedperson', - name='role_en', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='role'), + model_name="deployedperson", + name="role_en", + field=models.CharField(blank=True, max_length=512, null=True, verbose_name="role"), ), migrations.AlterField( - model_name='deployedperson', - name='role_es', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='role'), + model_name="deployedperson", + name="role_es", + field=models.CharField(blank=True, max_length=512, null=True, verbose_name="role"), ), migrations.AlterField( - model_name='deployedperson', - name='role_fr', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='role'), + model_name="deployedperson", + name="role_fr", + field=models.CharField(blank=True, max_length=512, null=True, verbose_name="role"), ), ] diff --git a/deployments/migrations/0037_project_modified_by.py b/deployments/migrations/0037_project_modified_by.py index 6536e386c..2fdd5c563 100644 --- a/deployments/migrations/0037_project_modified_by.py +++ b/deployments/migrations/0037_project_modified_by.py @@ -1,21 +1,28 @@ # Generated by Django 2.2.20 on 2021-08-06 08:23 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('deployments', '0036_auto_20201118_0812'), + ("deployments", "0036_auto_20201118_0812"), ] operations = [ migrations.AddField( - model_name='project', - name='modified_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='project_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='modified by'), + model_name="project", + name="modified_by", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="project_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="modified by", + ), ), ] diff --git a/deployments/migrations/0038_auto_20210820_0733.py b/deployments/migrations/0038_auto_20210820_0733.py index 76cdb28ec..2af27a5a1 100644 --- a/deployments/migrations/0038_auto_20210820_0733.py +++ b/deployments/migrations/0038_auto_20210820_0733.py @@ -15,19 +15,19 @@ def remove_rcce_tag(apps, schema_editor): HEALTH_PUBLIC = 4 CEA = 2 - Project = apps.get_model('deployments', 'Project') + Project = apps.get_model("deployments", "Project") # get only the project that have `RCCE` tag projects = Project.objects.filter(secondary_sectors__contains=[RCCE]) for project in projects: project.secondary_sectors.remove(RCCE) project.secondary_sectors.extend([HEALTH_PUBLIC, CEA]) - project.save(update_fields=['secondary_sectors']) + project.save(update_fields=["secondary_sectors"]) class Migration(migrations.Migration): dependencies = [ - ('deployments', '0037_project_modified_by'), + ("deployments", "0037_project_modified_by"), ] operations = [ diff --git a/deployments/migrations/0039_auto_20210823_1159.py b/deployments/migrations/0039_auto_20210823_1159.py index 87f42ccbe..22205466c 100644 --- a/deployments/migrations/0039_auto_20210823_1159.py +++ b/deployments/migrations/0039_auto_20210823_1159.py @@ -1,7 +1,7 @@ # Generated by Django 2.2.20 on 2021-08-23 11:59 -from django.db import models, migrations -from django.db.models.expressions import Func, F, Value +from django.db import migrations, models +from django.db.models.expressions import F, Func, Value def _remove_rcce_tag(Project): @@ -15,32 +15,29 @@ def _remove_rcce_tag(Project): # Add HEALTH_PUBLIC/CEA if there is RCCE for tag in [HEALTH_PUBLIC, CEA]: - Project.objects\ - .filter(secondary_sectors__contains=[RCCE])\ - .exclude(secondary_sectors__contains=[tag])\ - .update( - secondary_sectors=Func( - F('secondary_sectors'), - Value(tag), - function='ARRAY_APPEND', - ) + Project.objects.filter(secondary_sectors__contains=[RCCE]).exclude(secondary_sectors__contains=[tag]).update( + secondary_sectors=Func( + F("secondary_sectors"), + Value(tag), + function="ARRAY_APPEND", ) + ) # Finally remove Project.objects.filter(secondary_sectors__contains=[RCCE]).update( - secondary_sectors=Func(F('secondary_sectors'), Value(RCCE), function='ARRAY_REMOVE') + secondary_sectors=Func(F("secondary_sectors"), Value(RCCE), function="ARRAY_REMOVE") ) def remove_rcce_tag(apps, schema_editor): - Project = apps.get_model('deployments', 'Project') + Project = apps.get_model("deployments", "Project") _remove_rcce_tag(Project) class Migration(migrations.Migration): dependencies = [ - ('deployments', '0038_auto_20210820_0733'), + ("deployments", "0038_auto_20210820_0733"), ] operations = [ diff --git a/deployments/migrations/0040_auto_20210920_1250.py b/deployments/migrations/0040_auto_20210920_1250.py index 9c56424b5..42c84a661 100644 --- a/deployments/migrations/0040_auto_20210920_1250.py +++ b/deployments/migrations/0040_auto_20210920_1250.py @@ -1,19 +1,21 @@ # Generated by Django 2.2.24 on 2021-09-20 12:50 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0039_auto_20210823_1159'), + ("deployments", "0039_auto_20210823_1159"), ] operations = [ migrations.AlterField( - model_name='personneldeployment', - name='region_deployed_to', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Region', verbose_name='region deployed to'), + model_name="personneldeployment", + name="region_deployed_to", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Region", verbose_name="region deployed to" + ), ), ] diff --git a/deployments/migrations/0041_auto_20211110_0924.py b/deployments/migrations/0041_auto_20211110_0924.py index d9e208c89..17ce6d124 100644 --- a/deployments/migrations/0041_auto_20211110_0924.py +++ b/deployments/migrations/0041_auto_20211110_0924.py @@ -6,13 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0040_auto_20210920_1250'), + ("deployments", "0040_auto_20210920_1250"), ] operations = [ migrations.AlterField( - model_name='project', - name='visibility', - field=models.CharField(choices=[('logged_in_user', 'Membership'), ('ifrc_only', 'IFRC Only'), ('public', 'Public'), ('ifrc_ns', 'IFRC_NS')], default='public', max_length=32, verbose_name='visibility'), + model_name="project", + name="visibility", + field=models.CharField( + choices=[ + ("logged_in_user", "Membership"), + ("ifrc_only", "IFRC Only"), + ("public", "Public"), + ("ifrc_ns", "IFRC_NS"), + ], + default="public", + max_length=32, + verbose_name="visibility", + ), ), ] diff --git a/deployments/migrations/0042_personnel_country_to.py b/deployments/migrations/0042_personnel_country_to.py index 52697d181..a08260568 100644 --- a/deployments/migrations/0042_personnel_country_to.py +++ b/deployments/migrations/0042_personnel_country_to.py @@ -1,20 +1,26 @@ # Generated by Django 2.2.26 on 2022-01-24 13:50 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0137_auto_20220105_1533'), - ('deployments', '0041_auto_20211110_0924'), + ("api", "0137_auto_20220105_1533"), + ("deployments", "0041_auto_20211110_0924"), ] operations = [ migrations.AddField( - model_name='personnel', - name='country_to', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='personnel_deployments_to', to='api.Country', verbose_name='country to'), + model_name="personnel", + name="country_to", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="personnel_deployments_to", + to="api.Country", + verbose_name="country to", + ), ), ] diff --git a/deployments/migrations/0043_personnel_country_to_fill.py b/deployments/migrations/0043_personnel_country_to_fill.py index f7124c7c8..5cde413e6 100644 --- a/deployments/migrations/0043_personnel_country_to_fill.py +++ b/deployments/migrations/0043_personnel_country_to_fill.py @@ -1,26 +1,30 @@ # Generated manually on 2022-01-24 17:40 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0042_personnel_country_to'), + ("deployments", "0042_personnel_country_to"), ] operations = [ migrations.RunSQL( - sql=[("update deployments_personnel " + - "set country_to_id=d.country_id " + - "from deployments_personnel a " + - "join deployments_personneldeployment b on a.deployment_id = b.id " + - "join api_event c on b.event_deployed_to_id = c.id " + - "join api_event_countries d on c.id = d.event_id " + - "join api_country e on d.country_id = e.id " + - "where deployments_personnel.deployedperson_ptr_id = a.deployedperson_ptr_id " + - "and e.record_type = 1")], # important – otherwise regions also can appear + sql=[ + ( + "update deployments_personnel " + + "set country_to_id=d.country_id " + + "from deployments_personnel a " + + "join deployments_personneldeployment b on a.deployment_id = b.id " + + "join api_event c on b.event_deployed_to_id = c.id " + + "join api_event_countries d on c.id = d.event_id " + + "join api_country e on d.country_id = e.id " + + "where deployments_personnel.deployedperson_ptr_id = a.deployedperson_ptr_id " + + "and e.record_type = 1" + ) + ], # important – otherwise regions also can appear reverse_sql=[("update deployments_personnel set country_to_id=NULL")], ) ] diff --git a/deployments/migrations/0044_auto_20220305_0922.py b/deployments/migrations/0044_auto_20220305_0922.py index 35be4cf99..6cf946898 100644 --- a/deployments/migrations/0044_auto_20220305_0922.py +++ b/deployments/migrations/0044_auto_20220305_0922.py @@ -1,106 +1,217 @@ # Generated by Django 2.2.27 on 2022-03-05 09:22 -import deployments.models -from django.conf import settings import django.contrib.postgres.fields.jsonb -from django.db import migrations, models import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + +import deployments.models class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('api', '0146_auto_20220228_0952'), - ('deployments', '0043_personnel_country_to_fill'), + ("api", "0146_auto_20220228_0952"), + ("deployments", "0043_personnel_country_to_fill"), ] operations = [ migrations.CreateModel( - name='EmergencyProject', + name="EmergencyProject", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), - ('activity_lead', models.CharField(choices=[('national_society', 'National Society'), ('deployed_eru', 'Deployed ERU')], max_length=30, verbose_name='Activity lead')), - ('reporting_ns_contact_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='NS Contanct Information: Name')), - ('reporting_ns_contact_role', models.CharField(blank=True, max_length=255, null=True, verbose_name='NS Contanct Information: Role')), - ('reporting_ns_contact_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='NS Contanct Information: Email')), - ('start_date', models.DateField(verbose_name='Start Date')), - ('status', models.CharField(choices=[('on_going', 'Activity Ongoing'), ('complete', 'Activity Complete')], default=deployments.models.EmergencyProject.ActivityStatus('on_going'), max_length=40)), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='api.Country', verbose_name='Country')), - ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='created by')), - ('deployed_eru', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='deployments.ERU', verbose_name='Deployed ERU')), - ('districts', models.ManyToManyField(related_name='_emergencyproject_districts_+', to='api.District', verbose_name='Districts')), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='api.Event', verbose_name='Event')), - ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='modified by')), - ('reporting_ns', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='api.Country', verbose_name='Reporting national society')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="modified at")), + ( + "activity_lead", + models.CharField( + choices=[("national_society", "National Society"), ("deployed_eru", "Deployed ERU")], + max_length=30, + verbose_name="Activity lead", + ), + ), + ( + "reporting_ns_contact_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="NS Contanct Information: Name"), + ), + ( + "reporting_ns_contact_role", + models.CharField(blank=True, max_length=255, null=True, verbose_name="NS Contanct Information: Role"), + ), + ( + "reporting_ns_contact_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="NS Contanct Information: Email"), + ), + ("start_date", models.DateField(verbose_name="Start Date")), + ( + "status", + models.CharField( + choices=[("on_going", "Activity Ongoing"), ("complete", "Activity Complete")], + default=deployments.models.EmergencyProject.ActivityStatus("on_going"), + max_length=40, + ), + ), + ( + "country", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="+", to="api.Country", verbose_name="Country" + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="created by", + ), + ), + ( + "deployed_eru", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to="deployments.ERU", + verbose_name="Deployed ERU", + ), + ), + ( + "districts", + models.ManyToManyField( + related_name="_emergencyproject_districts_+", to="api.District", verbose_name="Districts" + ), + ), + ( + "event", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="+", to="api.Event", verbose_name="Event" + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="modified by", + ), + ), + ( + "reporting_ns", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to="api.Country", + verbose_name="Reporting national society", + ), + ), ], ), migrations.CreateModel( - name='EmergencyProjectActivityAction', + name="EmergencyProjectActivityAction", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('order', models.SmallIntegerField(default=0)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("order", models.SmallIntegerField(default=0)), ], ), migrations.CreateModel( - name='EmergencyProjectActivitySector', + name="EmergencyProjectActivitySector", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('order', models.SmallIntegerField(default=0)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("order", models.SmallIntegerField(default=0)), ], ), migrations.CreateModel( - name='EmergencyProjectActivityActionSupply', + name="EmergencyProjectActivityActionSupply", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('order', models.SmallIntegerField(default=0)), - ('action', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='supplies', to='deployments.EmergencyProjectActivityAction', verbose_name='action')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("order", models.SmallIntegerField(default=0)), + ( + "action", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="supplies", + to="deployments.EmergencyProjectActivityAction", + verbose_name="action", + ), + ), ], ), migrations.AddField( - model_name='emergencyprojectactivityaction', - name='sector', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='deployments.EmergencyProjectActivitySector', verbose_name='sector'), + model_name="emergencyprojectactivityaction", + name="sector", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="deployments.EmergencyProjectActivitySector", + verbose_name="sector", + ), ), migrations.CreateModel( - name='EmergencyProjectActivity', + name="EmergencyProjectActivity", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_simplified_report', models.BooleanField(default=True, verbose_name='is_simplified_report')), - ('people_count', models.IntegerField(blank=True, null=True, verbose_name='People')), - ('male_count', models.IntegerField(blank=True, null=True, verbose_name='Men')), - ('female_count', models.IntegerField(blank=True, null=True, verbose_name='Female')), - ('male_0_5_count', models.IntegerField(blank=True, null=True, verbose_name='Boys 0-5')), - ('male_6_12_count', models.IntegerField(blank=True, null=True, verbose_name='Boys 6-12')), - ('male_13_17_count', models.IntegerField(blank=True, null=True, verbose_name='Boys 13-17')), - ('male_18_29_count', models.IntegerField(blank=True, null=True, verbose_name='Men 18-29')), - ('male_30_39_count', models.IntegerField(blank=True, null=True, verbose_name='Men 30-39')), - ('male_40_49_count', models.IntegerField(blank=True, null=True, verbose_name='Men 40-49')), - ('male_50_59_count', models.IntegerField(blank=True, null=True, verbose_name='Men 50-59')), - ('male_60_69_count', models.IntegerField(blank=True, null=True, verbose_name='Men 60-69')), - ('male_70_plus_count', models.IntegerField(blank=True, null=True, verbose_name='Men 70+')), - ('female_0_5_count', models.IntegerField(blank=True, null=True, verbose_name='Girls 0-5')), - ('female_6_12_count', models.IntegerField(blank=True, null=True, verbose_name='Girls 6-12')), - ('female_13_17_count', models.IntegerField(blank=True, null=True, verbose_name='Girls 13-17')), - ('female_18_29_count', models.IntegerField(blank=True, null=True, verbose_name='Women 18-29')), - ('female_30_39_count', models.IntegerField(blank=True, null=True, verbose_name='Women 30-39')), - ('female_40_49_count', models.IntegerField(blank=True, null=True, verbose_name='Women 40-49')), - ('female_50_59_count', models.IntegerField(blank=True, null=True, verbose_name='Women 50-59')), - ('female_60_69_count', models.IntegerField(blank=True, null=True, verbose_name='Women 60-69')), - ('female_70_plus_count', models.IntegerField(blank=True, null=True, verbose_name='Women 70+')), - ('details', models.TextField(blank=True, verbose_name='details')), - ('supplies', django.db.models.JSONField(default=dict, verbose_name='supplies')), - ('custom_action', models.CharField(blank=True, max_length=255, null=True, verbose_name='custom_action')), - ('custom_supplies', django.db.models.JSONField(default=dict, verbose_name='custom supplies')), - ('action', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='deployments.EmergencyProjectActivityAction', verbose_name='action')), - ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='deployments.EmergencyProject', verbose_name='emergency project/3W')), - ('sector', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deployments.EmergencyProjectActivitySector', verbose_name='sector')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("is_simplified_report", models.BooleanField(default=True, verbose_name="is_simplified_report")), + ("people_count", models.IntegerField(blank=True, null=True, verbose_name="People")), + ("male_count", models.IntegerField(blank=True, null=True, verbose_name="Men")), + ("female_count", models.IntegerField(blank=True, null=True, verbose_name="Female")), + ("male_0_5_count", models.IntegerField(blank=True, null=True, verbose_name="Boys 0-5")), + ("male_6_12_count", models.IntegerField(blank=True, null=True, verbose_name="Boys 6-12")), + ("male_13_17_count", models.IntegerField(blank=True, null=True, verbose_name="Boys 13-17")), + ("male_18_29_count", models.IntegerField(blank=True, null=True, verbose_name="Men 18-29")), + ("male_30_39_count", models.IntegerField(blank=True, null=True, verbose_name="Men 30-39")), + ("male_40_49_count", models.IntegerField(blank=True, null=True, verbose_name="Men 40-49")), + ("male_50_59_count", models.IntegerField(blank=True, null=True, verbose_name="Men 50-59")), + ("male_60_69_count", models.IntegerField(blank=True, null=True, verbose_name="Men 60-69")), + ("male_70_plus_count", models.IntegerField(blank=True, null=True, verbose_name="Men 70+")), + ("female_0_5_count", models.IntegerField(blank=True, null=True, verbose_name="Girls 0-5")), + ("female_6_12_count", models.IntegerField(blank=True, null=True, verbose_name="Girls 6-12")), + ("female_13_17_count", models.IntegerField(blank=True, null=True, verbose_name="Girls 13-17")), + ("female_18_29_count", models.IntegerField(blank=True, null=True, verbose_name="Women 18-29")), + ("female_30_39_count", models.IntegerField(blank=True, null=True, verbose_name="Women 30-39")), + ("female_40_49_count", models.IntegerField(blank=True, null=True, verbose_name="Women 40-49")), + ("female_50_59_count", models.IntegerField(blank=True, null=True, verbose_name="Women 50-59")), + ("female_60_69_count", models.IntegerField(blank=True, null=True, verbose_name="Women 60-69")), + ("female_70_plus_count", models.IntegerField(blank=True, null=True, verbose_name="Women 70+")), + ("details", models.TextField(blank=True, verbose_name="details")), + ("supplies", django.db.models.JSONField(default=dict, verbose_name="supplies")), + ("custom_action", models.CharField(blank=True, max_length=255, null=True, verbose_name="custom_action")), + ("custom_supplies", django.db.models.JSONField(default=dict, verbose_name="custom supplies")), + ( + "action", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="deployments.EmergencyProjectActivityAction", + verbose_name="action", + ), + ), + ( + "project", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="activities", + to="deployments.EmergencyProject", + verbose_name="emergency project/3W", + ), + ), + ( + "sector", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="deployments.EmergencyProjectActivitySector", + verbose_name="sector", + ), + ), ], ), ] diff --git a/deployments/migrations/0044_personnel_molnix_status.py b/deployments/migrations/0044_personnel_molnix_status.py index 228b03d7a..0d8fa78c4 100644 --- a/deployments/migrations/0044_personnel_molnix_status.py +++ b/deployments/migrations/0044_personnel_molnix_status.py @@ -6,13 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0043_personnel_country_to_fill'), + ("deployments", "0043_personnel_country_to_fill"), ] operations = [ migrations.AddField( - model_name='personnel', - name='molnix_status', - field=models.CharField(choices=[('active', 'ACTIVE'), ('hidden', 'HIDDEN'), ('draft', 'DRAFT'), ('deleted', 'DELETED')], default='active', max_length=8, verbose_name='molnix status'), + model_name="personnel", + name="molnix_status", + field=models.CharField( + choices=[("active", "ACTIVE"), ("hidden", "HIDDEN"), ("draft", "DRAFT"), ("deleted", "DELETED")], + default="active", + max_length=8, + verbose_name="molnix status", + ), ), ] diff --git a/deployments/migrations/0045_molnixtag_tag_category.py b/deployments/migrations/0045_molnixtag_tag_category.py index c07632cb3..2d64dd1ed 100644 --- a/deployments/migrations/0045_molnixtag_tag_category.py +++ b/deployments/migrations/0045_molnixtag_tag_category.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0044_personnel_molnix_status'), + ("deployments", "0044_personnel_molnix_status"), ] operations = [ migrations.AddField( - model_name='molnixtag', - name='tag_category', + model_name="molnixtag", + name="tag_category", field=models.CharField(max_length=127, null=True), ), ] diff --git a/deployments/migrations/0045_remove_emergencyproject_country.py b/deployments/migrations/0045_remove_emergencyproject_country.py index 0cd129b0c..fed0e4b10 100644 --- a/deployments/migrations/0045_remove_emergencyproject_country.py +++ b/deployments/migrations/0045_remove_emergencyproject_country.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0044_auto_20220305_0922'), + ("deployments", "0044_auto_20220305_0922"), ] operations = [ migrations.RemoveField( - model_name='emergencyproject', - name='country', + model_name="emergencyproject", + name="country", ), ] diff --git a/deployments/migrations/0046_auto_20220307_0926.py b/deployments/migrations/0046_auto_20220307_0926.py index b5137701e..4f8495247 100644 --- a/deployments/migrations/0046_auto_20220307_0926.py +++ b/deployments/migrations/0046_auto_20220307_0926.py @@ -7,18 +7,18 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0045_remove_emergencyproject_country'), + ("deployments", "0045_remove_emergencyproject_country"), ] operations = [ migrations.AddField( - model_name='emergencyprojectactivity', - name='location_description', - field=models.TextField(blank=True, verbose_name='location description'), + model_name="emergencyprojectactivity", + name="location_description", + field=models.TextField(blank=True, verbose_name="location description"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='location_point', - field=django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326, verbose_name='location point'), + model_name="emergencyprojectactivity", + name="location_point", + field=django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326, verbose_name="location point"), ), ] diff --git a/deployments/migrations/0047_emergencyproject_country.py b/deployments/migrations/0047_emergencyproject_country.py index 12b303699..d18331192 100644 --- a/deployments/migrations/0047_emergencyproject_country.py +++ b/deployments/migrations/0047_emergencyproject_country.py @@ -1,21 +1,23 @@ # Generated by Django 2.2.27 on 2022-03-09 10:17 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0146_auto_20220228_0952'), - ('deployments', '0046_auto_20220307_0926'), + ("api", "0146_auto_20220228_0952"), + ("deployments", "0046_auto_20220307_0926"), ] operations = [ migrations.AddField( - model_name='emergencyproject', - name='country', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='api.Country', verbose_name='Country'), + model_name="emergencyproject", + name="country", + field=models.ForeignKey( + default=1, on_delete=django.db.models.deletion.CASCADE, related_name="+", to="api.Country", verbose_name="Country" + ), preserve_default=False, ), ] diff --git a/deployments/migrations/0048_auto_20220310_0524.py b/deployments/migrations/0048_auto_20220310_0524.py index 225387c3f..e2e405d02 100644 --- a/deployments/migrations/0048_auto_20220310_0524.py +++ b/deployments/migrations/0048_auto_20220310_0524.py @@ -6,95 +6,95 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0047_emergencyproject_country'), + ("deployments", "0047_emergencyproject_country"), ] operations = [ migrations.CreateModel( - name='EmergencyProjectActivityLocation', + name="EmergencyProjectActivityLocation", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('latitude', models.IntegerField(verbose_name='latitude')), - ('longitude', models.IntegerField(verbose_name='longitude')), - ('description', models.TextField(verbose_name='location description')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("latitude", models.IntegerField(verbose_name="latitude")), + ("longitude", models.IntegerField(verbose_name="longitude")), + ("description", models.TextField(verbose_name="location description")), ], ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='location_description', + model_name="emergencyprojectactivity", + name="location_description", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='location_point', + model_name="emergencyprojectactivity", + name="location_point", ), migrations.AddField( - model_name='emergencyprojectactivity', - name='amount', - field=models.IntegerField(blank=True, null=True, verbose_name='Amount'), + model_name="emergencyprojectactivity", + name="amount", + field=models.IntegerField(blank=True, null=True, verbose_name="Amount"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='household_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Household'), + model_name="emergencyprojectactivity", + name="household_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Household"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='item_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Item'), + model_name="emergencyprojectactivity", + name="item_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Item"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_0_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 0-5'), + model_name="emergencyprojectactivity", + name="other_0_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 0-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_13_17_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 13-17'), + model_name="emergencyprojectactivity", + name="other_13_17_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 13-17"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_18_29_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 18-29'), + model_name="emergencyprojectactivity", + name="other_18_29_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 18-29"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_30_39_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 30-39'), + model_name="emergencyprojectactivity", + name="other_30_39_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 30-39"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_40_49_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 40-49'), + model_name="emergencyprojectactivity", + name="other_40_49_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 40-49"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_50_59_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 50-59'), + model_name="emergencyprojectactivity", + name="other_50_59_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 50-59"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_60_69_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 60-69'), + model_name="emergencyprojectactivity", + name="other_60_69_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 60-69"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_6_12_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 6-12'), + model_name="emergencyprojectactivity", + name="other_6_12_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 6-12"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_70_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 70+'), + model_name="emergencyprojectactivity", + name="other_70_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 70+"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='point_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Point Count'), + model_name="emergencyprojectactivity", + name="point_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Point Count"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='points', - field=models.ManyToManyField(blank=True, to='deployments.EmergencyProjectActivityLocation', verbose_name='Points'), + model_name="emergencyprojectactivity", + name="points", + field=models.ManyToManyField(blank=True, to="deployments.EmergencyProjectActivityLocation", verbose_name="Points"), ), ] diff --git a/deployments/migrations/0049_auto_20220311_0400.py b/deployments/migrations/0049_auto_20220311_0400.py index fe5cda300..dcfe1c48d 100644 --- a/deployments/migrations/0049_auto_20220311_0400.py +++ b/deployments/migrations/0049_auto_20220311_0400.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0048_auto_20220310_0524'), + ("deployments", "0048_auto_20220310_0524"), ] operations = [ migrations.AlterField( - model_name='emergencyprojectactivitylocation', - name='latitude', - field=models.FloatField(verbose_name='latitude'), + model_name="emergencyprojectactivitylocation", + name="latitude", + field=models.FloatField(verbose_name="latitude"), ), migrations.AlterField( - model_name='emergencyprojectactivitylocation', - name='longitude', - field=models.FloatField(verbose_name='longitude'), + model_name="emergencyprojectactivitylocation", + name="longitude", + field=models.FloatField(verbose_name="longitude"), ), ] diff --git a/deployments/migrations/0050_emergencyprojectactivity_people_households.py b/deployments/migrations/0050_emergencyprojectactivity_people_households.py index 231561269..f2aefeb3f 100644 --- a/deployments/migrations/0050_emergencyprojectactivity_people_households.py +++ b/deployments/migrations/0050_emergencyprojectactivity_people_households.py @@ -6,13 +6,19 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0049_auto_20220311_0400'), + ("deployments", "0049_auto_20220311_0400"), ] operations = [ migrations.AddField( - model_name='emergencyprojectactivity', - name='people_households', - field=models.CharField(blank=True, choices=[('people', 'People'), ('households', 'Households')], max_length=50, null=True, verbose_name='People Households'), + model_name="emergencyprojectactivity", + name="people_households", + field=models.CharField( + blank=True, + choices=[("people", "People"), ("households", "Households")], + max_length=50, + null=True, + verbose_name="People Households", + ), ), ] diff --git a/deployments/migrations/0051_auto_20220311_0947.py b/deployments/migrations/0051_auto_20220311_0947.py index 885df6de9..a09656283 100644 --- a/deployments/migrations/0051_auto_20220311_0947.py +++ b/deployments/migrations/0051_auto_20220311_0947.py @@ -1,24 +1,38 @@ # Generated by Django 2.2.27 on 2022-03-11 09:47 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0050_emergencyprojectactivity_people_households'), + ("deployments", "0050_emergencyprojectactivity_people_households"), ] operations = [ migrations.AlterField( - model_name='emergencyproject', - name='deployed_eru', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='deployments.ERU', verbose_name='Deployed ERU'), + model_name="emergencyproject", + name="deployed_eru", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to="deployments.ERU", + verbose_name="Deployed ERU", + ), ), migrations.AlterField( - model_name='emergencyproject', - name='reporting_ns', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='api.Country', verbose_name='Reporting national society'), + model_name="emergencyproject", + name="reporting_ns", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to="api.Country", + verbose_name="Reporting national society", + ), ), ] diff --git a/deployments/migrations/0052_auto_20220314_0633.py b/deployments/migrations/0052_auto_20220314_0633.py index 839406863..81a900748 100644 --- a/deployments/migrations/0052_auto_20220314_0633.py +++ b/deployments/migrations/0052_auto_20220314_0633.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0051_auto_20220311_0947'), + ("deployments", "0051_auto_20220311_0947"), ] operations = [ migrations.AddField( - model_name='emergencyprojectactivityaction', - name='description', - field=models.TextField(blank=True, verbose_name='Description'), + model_name="emergencyprojectactivityaction", + name="description", + field=models.TextField(blank=True, verbose_name="Description"), ), migrations.AlterField( - model_name='emergencyprojectactivity', - name='details', - field=models.TextField(blank=True, null=True, verbose_name='details'), + model_name="emergencyprojectactivity", + name="details", + field=models.TextField(blank=True, null=True, verbose_name="details"), ), ] diff --git a/deployments/migrations/0053_merge_20220314_1059.py b/deployments/migrations/0053_merge_20220314_1059.py index 5eced71b2..f00ba9a14 100644 --- a/deployments/migrations/0053_merge_20220314_1059.py +++ b/deployments/migrations/0053_merge_20220314_1059.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0052_auto_20220314_0633'), - ('deployments', '0044_personnel_molnix_status'), + ("deployments", "0052_auto_20220314_0633"), + ("deployments", "0044_personnel_molnix_status"), ] - operations = [ - ] + operations = [] diff --git a/deployments/migrations/0054_auto_20220314_1059.py b/deployments/migrations/0054_auto_20220314_1059.py index eb2f58b82..b4af52265 100644 --- a/deployments/migrations/0054_auto_20220314_1059.py +++ b/deployments/migrations/0054_auto_20220314_1059.py @@ -6,178 +6,178 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0053_merge_20220314_1059'), + ("deployments", "0053_merge_20220314_1059"), ] operations = [ migrations.AddField( - model_name='emergencyproject', - name='end_date', - field=models.DateField(blank=True, null=True, verbose_name='End Date'), + model_name="emergencyproject", + name="end_date", + field=models.DateField(blank=True, null=True, verbose_name="End Date"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='beneficiaries_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Beneficiaries Count'), + model_name="emergencyprojectactivity", + name="beneficiaries_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Beneficiaries Count"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_0_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Girls 0-5'), + model_name="emergencyprojectactivity", + name="disabled_female_0_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Girls 0-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_13_17_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Girls 13-17'), + model_name="emergencyprojectactivity", + name="disabled_female_13_17_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Girls 13-17"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_18_29_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Women 18-29'), + model_name="emergencyprojectactivity", + name="disabled_female_18_29_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Women 18-29"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_30_39_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Women 30-39'), + model_name="emergencyprojectactivity", + name="disabled_female_30_39_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Women 30-39"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_40_49_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Women 40-49'), + model_name="emergencyprojectactivity", + name="disabled_female_40_49_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Women 40-49"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_50_59_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Women 50-59'), + model_name="emergencyprojectactivity", + name="disabled_female_50_59_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Women 50-59"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_60_69_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Women 60-69'), + model_name="emergencyprojectactivity", + name="disabled_female_60_69_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Women 60-69"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_6_12_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Girls 6-12'), + model_name="emergencyprojectactivity", + name="disabled_female_6_12_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Girls 6-12"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_70_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Women 70+'), + model_name="emergencyprojectactivity", + name="disabled_female_70_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Women 70+"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_0_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name=' Disabled Boys 0-5'), + model_name="emergencyprojectactivity", + name="disabled_male_0_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name=" Disabled Boys 0-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_13_17_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Boys 13-17'), + model_name="emergencyprojectactivity", + name="disabled_male_13_17_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Boys 13-17"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_18_29_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Men 18-29'), + model_name="emergencyprojectactivity", + name="disabled_male_18_29_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Men 18-29"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_30_39_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Men 30-39'), + model_name="emergencyprojectactivity", + name="disabled_male_30_39_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Men 30-39"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_40_49_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Men 40-49'), + model_name="emergencyprojectactivity", + name="disabled_male_40_49_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Men 40-49"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_50_59_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Men 50-59'), + model_name="emergencyprojectactivity", + name="disabled_male_50_59_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Men 50-59"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_60_69_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Men 60-69'), + model_name="emergencyprojectactivity", + name="disabled_male_60_69_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Men 60-69"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_6_12_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Boys 6-12'), + model_name="emergencyprojectactivity", + name="disabled_male_6_12_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Boys 6-12"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_70_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Men 70+'), + model_name="emergencyprojectactivity", + name="disabled_male_70_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Men 70+"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_0_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 0-5'), + model_name="emergencyprojectactivity", + name="disabled_other_0_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 0-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_13_17_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 13-17'), + model_name="emergencyprojectactivity", + name="disabled_other_13_17_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 13-17"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_18_29_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 18-29'), + model_name="emergencyprojectactivity", + name="disabled_other_18_29_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 18-29"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_30_39_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 30-39'), + model_name="emergencyprojectactivity", + name="disabled_other_30_39_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 30-39"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_40_49_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 40-49'), + model_name="emergencyprojectactivity", + name="disabled_other_40_49_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 40-49"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_50_59_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 50-59'), + model_name="emergencyprojectactivity", + name="disabled_other_50_59_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 50-59"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_60_69_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 60-69'), + model_name="emergencyprojectactivity", + name="disabled_other_60_69_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 60-69"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_6_12_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 6-12'), + model_name="emergencyprojectactivity", + name="disabled_other_6_12_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 6-12"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_70_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 70+'), + model_name="emergencyprojectactivity", + name="disabled_other_70_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 70+"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='female_unknown_age', - field=models.IntegerField(blank=True, null=True, verbose_name='Female Unknown Age'), + model_name="emergencyprojectactivity", + name="female_unknown_age", + field=models.IntegerField(blank=True, null=True, verbose_name="Female Unknown Age"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='is_disaggregated_for_disabled', - field=models.BooleanField(default=False, verbose_name='is_disaggregated_for_disabled'), + model_name="emergencyprojectactivity", + name="is_disaggregated_for_disabled", + field=models.BooleanField(default=False, verbose_name="is_disaggregated_for_disabled"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='male_unknown_age', - field=models.IntegerField(blank=True, null=True, verbose_name='Male Unknown Age'), + model_name="emergencyprojectactivity", + name="male_unknown_age", + field=models.IntegerField(blank=True, null=True, verbose_name="Male Unknown Age"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_unknown_age', - field=models.IntegerField(blank=True, null=True, verbose_name='Other Unknown Age'), + model_name="emergencyprojectactivity", + name="other_unknown_age", + field=models.IntegerField(blank=True, null=True, verbose_name="Other Unknown Age"), ), migrations.AddField( - model_name='emergencyprojectactivityaction', - name='is_cash_type', - field=models.BooleanField(default=False, verbose_name='is_cash_type'), + model_name="emergencyprojectactivityaction", + name="is_cash_type", + field=models.BooleanField(default=False, verbose_name="is_cash_type"), ), ] diff --git a/deployments/migrations/0055_auto_20220315_0420.py b/deployments/migrations/0055_auto_20220315_0420.py index 55b41f8f1..f6ca5519f 100644 --- a/deployments/migrations/0055_auto_20220315_0420.py +++ b/deployments/migrations/0055_auto_20220315_0420.py @@ -6,272 +6,272 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0054_auto_20220314_1059'), + ("deployments", "0054_auto_20220314_1059"), ] operations = [ migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='disabled_female_18_29_count', - new_name='disabled_female_18_59_count', + model_name="emergencyprojectactivity", + old_name="disabled_female_18_29_count", + new_name="disabled_female_18_59_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='disabled_male_18_29_count', - new_name='disabled_male_18_59_count', + model_name="emergencyprojectactivity", + old_name="disabled_male_18_29_count", + new_name="disabled_male_18_59_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='disabled_other_18_29_count', - new_name='disabled_other_18_59_count', + model_name="emergencyprojectactivity", + old_name="disabled_other_18_29_count", + new_name="disabled_other_18_59_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='female_18_29_count', - new_name='female_18_59_count', + model_name="emergencyprojectactivity", + old_name="female_18_29_count", + new_name="female_18_59_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='male_18_29_count', - new_name='male_18_59_count', + model_name="emergencyprojectactivity", + old_name="male_18_29_count", + new_name="male_18_59_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='other_18_29_count', - new_name='other_18_59_count', + model_name="emergencyprojectactivity", + old_name="other_18_29_count", + new_name="other_18_59_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_female_0_5_count', + model_name="emergencyprojectactivity", + name="disabled_female_0_5_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_female_30_39_count', + model_name="emergencyprojectactivity", + name="disabled_female_30_39_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_female_40_49_count', + model_name="emergencyprojectactivity", + name="disabled_female_40_49_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_female_50_59_count', + model_name="emergencyprojectactivity", + name="disabled_female_50_59_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_female_60_69_count', + model_name="emergencyprojectactivity", + name="disabled_female_60_69_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_female_70_plus_count', + model_name="emergencyprojectactivity", + name="disabled_female_70_plus_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_male_0_5_count', + model_name="emergencyprojectactivity", + name="disabled_male_0_5_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_male_30_39_count', + model_name="emergencyprojectactivity", + name="disabled_male_30_39_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_male_40_49_count', + model_name="emergencyprojectactivity", + name="disabled_male_40_49_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_male_50_59_count', + model_name="emergencyprojectactivity", + name="disabled_male_50_59_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_male_60_69_count', + model_name="emergencyprojectactivity", + name="disabled_male_60_69_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_male_70_plus_count', + model_name="emergencyprojectactivity", + name="disabled_male_70_plus_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_other_0_5_count', + model_name="emergencyprojectactivity", + name="disabled_other_0_5_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_other_30_39_count', + model_name="emergencyprojectactivity", + name="disabled_other_30_39_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_other_40_49_count', + model_name="emergencyprojectactivity", + name="disabled_other_40_49_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_other_50_59_count', + model_name="emergencyprojectactivity", + name="disabled_other_50_59_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_other_60_69_count', + model_name="emergencyprojectactivity", + name="disabled_other_60_69_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='disabled_other_70_plus_count', + model_name="emergencyprojectactivity", + name="disabled_other_70_plus_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='female_0_5_count', + model_name="emergencyprojectactivity", + name="female_0_5_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='female_30_39_count', + model_name="emergencyprojectactivity", + name="female_30_39_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='female_40_49_count', + model_name="emergencyprojectactivity", + name="female_40_49_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='female_50_59_count', + model_name="emergencyprojectactivity", + name="female_50_59_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='female_60_69_count', + model_name="emergencyprojectactivity", + name="female_60_69_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='female_70_plus_count', + model_name="emergencyprojectactivity", + name="female_70_plus_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='male_0_5_count', + model_name="emergencyprojectactivity", + name="male_0_5_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='male_30_39_count', + model_name="emergencyprojectactivity", + name="male_30_39_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='male_40_49_count', + model_name="emergencyprojectactivity", + name="male_40_49_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='male_50_59_count', + model_name="emergencyprojectactivity", + name="male_50_59_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='male_60_69_count', + model_name="emergencyprojectactivity", + name="male_60_69_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='male_70_plus_count', + model_name="emergencyprojectactivity", + name="male_70_plus_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='other_0_5_count', + model_name="emergencyprojectactivity", + name="other_0_5_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='other_30_39_count', + model_name="emergencyprojectactivity", + name="other_30_39_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='other_40_49_count', + model_name="emergencyprojectactivity", + name="other_40_49_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='other_50_59_count', + model_name="emergencyprojectactivity", + name="other_50_59_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='other_60_69_count', + model_name="emergencyprojectactivity", + name="other_60_69_count", ), migrations.RemoveField( - model_name='emergencyprojectactivity', - name='other_70_plus_count', + model_name="emergencyprojectactivity", + name="other_70_plus_count", ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_femal_0_1', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Girls 0-1'), + model_name="emergencyprojectactivity", + name="disabled_femal_0_1", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Girls 0-1"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_2_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Girls 2-5'), + model_name="emergencyprojectactivity", + name="disabled_female_2_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Girls 2-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_60_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Older Women 60+'), + model_name="emergencyprojectactivity", + name="disabled_female_60_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Older Women 60+"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_0_1', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Boys 0-1'), + model_name="emergencyprojectactivity", + name="disabled_male_0_1", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Boys 0-1"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_2_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Boys 2-5'), + model_name="emergencyprojectactivity", + name="disabled_male_2_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Boys 2-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_60_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Older Men 60+'), + model_name="emergencyprojectactivity", + name="disabled_male_60_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Older Men 60+"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_0_1', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 0-1'), + model_name="emergencyprojectactivity", + name="disabled_other_0_1", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 0-1"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_2_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 2-5'), + model_name="emergencyprojectactivity", + name="disabled_other_2_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 2-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_60_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Others/Unknown 60+'), + model_name="emergencyprojectactivity", + name="disabled_other_60_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Others/Unknown 60+"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='female_0_1', - field=models.IntegerField(blank=True, null=True, verbose_name='Girls 0-1'), + model_name="emergencyprojectactivity", + name="female_0_1", + field=models.IntegerField(blank=True, null=True, verbose_name="Girls 0-1"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='female_2_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Girls 2-5'), + model_name="emergencyprojectactivity", + name="female_2_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Girls 2-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='female_60_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Older Women 60+'), + model_name="emergencyprojectactivity", + name="female_60_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Older Women 60+"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='male_0_1', - field=models.IntegerField(blank=True, null=True, verbose_name='Boys 0-1'), + model_name="emergencyprojectactivity", + name="male_0_1", + field=models.IntegerField(blank=True, null=True, verbose_name="Boys 0-1"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='male_2_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Boys 2-5'), + model_name="emergencyprojectactivity", + name="male_2_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Boys 2-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='male_60_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Older Men 60+'), + model_name="emergencyprojectactivity", + name="male_60_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Older Men 60+"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_0_1', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 0-1'), + model_name="emergencyprojectactivity", + name="other_0_1", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 0-1"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_2_5_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 2-5'), + model_name="emergencyprojectactivity", + name="other_2_5_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 2-5"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='other_60_plus_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Others/Unknown 60+'), + model_name="emergencyprojectactivity", + name="other_60_plus_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Others/Unknown 60+"), ), ] diff --git a/deployments/migrations/0056_auto_20220318_0413.py b/deployments/migrations/0056_auto_20220318_0413.py index fdfd6b003..490c00b59 100644 --- a/deployments/migrations/0056_auto_20220318_0413.py +++ b/deployments/migrations/0056_auto_20220318_0413.py @@ -1,24 +1,29 @@ # Generated by Django 2.2.27 on 2022-03-18 04:13 -import deployments.models from django.db import migrations, models +import deployments.models + class Migration(migrations.Migration): dependencies = [ - ('deployments', '0055_auto_20220315_0420'), + ("deployments", "0055_auto_20220315_0420"), ] operations = [ migrations.AddField( - model_name='emergencyprojectactivityaction', - name='has_location', - field=models.BooleanField(default=False, verbose_name='has location'), + model_name="emergencyprojectactivityaction", + name="has_location", + field=models.BooleanField(default=False, verbose_name="has location"), ), migrations.AlterField( - model_name='emergencyproject', - name='status', - field=models.CharField(choices=[('on_going', 'Activity Ongoing'), ('complete', 'Activity Complete'), ('planned', 'Planned')], default=deployments.models.EmergencyProject.ActivityStatus('on_going'), max_length=40), + model_name="emergencyproject", + name="status", + field=models.CharField( + choices=[("on_going", "Activity Ongoing"), ("complete", "Activity Complete"), ("planned", "Planned")], + default=deployments.models.EmergencyProject.ActivityStatus("on_going"), + max_length=40, + ), ), ] diff --git a/deployments/migrations/0057_merge_20220318_0527.py b/deployments/migrations/0057_merge_20220318_0527.py index 1353021b1..1d4df83d0 100644 --- a/deployments/migrations/0057_merge_20220318_0527.py +++ b/deployments/migrations/0057_merge_20220318_0527.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0056_auto_20220318_0413'), - ('deployments', '0045_molnixtag_tag_category'), + ("deployments", "0056_auto_20220318_0413"), + ("deployments", "0045_molnixtag_tag_category"), ] - operations = [ - ] + operations = [] diff --git a/deployments/migrations/0058_auto_20220322_1056.py b/deployments/migrations/0058_auto_20220322_1056.py index 27dc497cf..a2bf273e5 100644 --- a/deployments/migrations/0058_auto_20220322_1056.py +++ b/deployments/migrations/0058_auto_20220322_1056.py @@ -1,24 +1,29 @@ # Generated by Django 2.2.27 on 2022-03-22 10:56 -import deployments.models from django.db import migrations, models +import deployments.models + class Migration(migrations.Migration): dependencies = [ - ('deployments', '0057_merge_20220318_0527'), + ("deployments", "0057_merge_20220318_0527"), ] operations = [ migrations.AddField( - model_name='emergencyprojectactivity', - name='has_no_data_on_people_reached', - field=models.BooleanField(default=False, verbose_name='has_no_data_on_people_reached'), + model_name="emergencyprojectactivity", + name="has_no_data_on_people_reached", + field=models.BooleanField(default=False, verbose_name="has_no_data_on_people_reached"), ), migrations.AlterField( - model_name='emergencyproject', - name='status', - field=models.CharField(choices=[('on_going', 'Ongoing'), ('complete', 'Complete'), ('planned', 'Planned')], default=deployments.models.EmergencyProject.ActivityStatus('on_going'), max_length=40), + model_name="emergencyproject", + name="status", + field=models.CharField( + choices=[("on_going", "Ongoing"), ("complete", "Complete"), ("planned", "Planned")], + default=deployments.models.EmergencyProject.ActivityStatus("on_going"), + max_length=40, + ), ), ] diff --git a/deployments/migrations/0059_auto_20220323_1028.py b/deployments/migrations/0059_auto_20220323_1028.py index 26b539ead..041b71d76 100644 --- a/deployments/migrations/0059_auto_20220323_1028.py +++ b/deployments/migrations/0059_auto_20220323_1028.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0058_auto_20220322_1056'), + ("deployments", "0058_auto_20220322_1056"), ] operations = [ migrations.AlterField( - model_name='emergencyprojectactivity', - name='is_disaggregated_for_disabled', - field=models.BooleanField(verbose_name='is_disaggregated_for_disabled'), + model_name="emergencyprojectactivity", + name="is_disaggregated_for_disabled", + field=models.BooleanField(verbose_name="is_disaggregated_for_disabled"), ), ] diff --git a/deployments/migrations/0060_auto_20220323_1527.py b/deployments/migrations/0060_auto_20220323_1527.py index 9b951ea4e..bb21c1cac 100644 --- a/deployments/migrations/0060_auto_20220323_1527.py +++ b/deployments/migrations/0060_auto_20220323_1527.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0059_auto_20220323_1028'), + ("deployments", "0059_auto_20220323_1028"), ] operations = [ migrations.AlterField( - model_name='emergencyprojectactivity', - name='has_no_data_on_people_reached', - field=models.BooleanField(verbose_name='Has no data on people reached'), + model_name="emergencyprojectactivity", + name="has_no_data_on_people_reached", + field=models.BooleanField(verbose_name="Has no data on people reached"), ), migrations.AlterField( - model_name='emergencyprojectactivity', - name='is_disaggregated_for_disabled', - field=models.BooleanField(verbose_name='Is disaggregated for disabled'), + model_name="emergencyprojectactivity", + name="is_disaggregated_for_disabled", + field=models.BooleanField(verbose_name="Is disaggregated for disabled"), ), ] diff --git a/deployments/migrations/0061_auto_20220331_1121.py b/deployments/migrations/0061_auto_20220331_1121.py index 3b6cb477f..6376e52c2 100644 --- a/deployments/migrations/0061_auto_20220331_1121.py +++ b/deployments/migrations/0061_auto_20220331_1121.py @@ -6,38 +6,38 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0060_auto_20220323_1527'), + ("deployments", "0060_auto_20220323_1527"), ] operations = [ migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='disabled_femal_0_1', - new_name='disabled_female_0_1_count', + model_name="emergencyprojectactivity", + old_name="disabled_femal_0_1", + new_name="disabled_female_0_1_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='disabled_male_0_1', - new_name='disabled_male_0_1_count', + model_name="emergencyprojectactivity", + old_name="disabled_male_0_1", + new_name="disabled_male_0_1_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='disabled_other_0_1', - new_name='disabled_other_0_1_count', + model_name="emergencyprojectactivity", + old_name="disabled_other_0_1", + new_name="disabled_other_0_1_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='female_0_1', - new_name='female_0_1_count', + model_name="emergencyprojectactivity", + old_name="female_0_1", + new_name="female_0_1_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='male_0_1', - new_name='male_0_1_count', + model_name="emergencyprojectactivity", + old_name="male_0_1", + new_name="male_0_1_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='other_0_1', - new_name='other_0_1_count', + model_name="emergencyprojectactivity", + old_name="other_0_1", + new_name="other_0_1_count", ), ] diff --git a/deployments/migrations/0062_auto_20220331_1143.py b/deployments/migrations/0062_auto_20220331_1143.py index 333976c99..00a34a4e8 100644 --- a/deployments/migrations/0062_auto_20220331_1143.py +++ b/deployments/migrations/0062_auto_20220331_1143.py @@ -6,38 +6,38 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0061_auto_20220331_1121'), + ("deployments", "0061_auto_20220331_1121"), ] operations = [ migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='female_unknown_age', - new_name='female_unknown_age_count', + model_name="emergencyprojectactivity", + old_name="female_unknown_age", + new_name="female_unknown_age_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='male_unknown_age', - new_name='male_unknown_age_count', + model_name="emergencyprojectactivity", + old_name="male_unknown_age", + new_name="male_unknown_age_count", ), migrations.RenameField( - model_name='emergencyprojectactivity', - old_name='other_unknown_age', - new_name='other_unknown_age_count', + model_name="emergencyprojectactivity", + old_name="other_unknown_age", + new_name="other_unknown_age_count", ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_female_unknown_age_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Female Unknown Age'), + model_name="emergencyprojectactivity", + name="disabled_female_unknown_age_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Female Unknown Age"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_male_unknown_age_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Male Unknown Age'), + model_name="emergencyprojectactivity", + name="disabled_male_unknown_age_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Male Unknown Age"), ), migrations.AddField( - model_name='emergencyprojectactivity', - name='disabled_other_unknown_age_count', - field=models.IntegerField(blank=True, null=True, verbose_name='Disabled Other Unknown Age'), + model_name="emergencyprojectactivity", + name="disabled_other_unknown_age_count", + field=models.IntegerField(blank=True, null=True, verbose_name="Disabled Other Unknown Age"), ), ] diff --git a/deployments/migrations/0063_auto_20220413_1438.py b/deployments/migrations/0063_auto_20220413_1438.py index 7e64d0f9a..159112798 100644 --- a/deployments/migrations/0063_auto_20220413_1438.py +++ b/deployments/migrations/0063_auto_20220413_1438.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0062_auto_20220331_1143'), + ("deployments", "0062_auto_20220331_1143"), ] operations = [ migrations.AddField( - model_name='project', - name='reporting_ns_contact_email', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='NS Contanct Information: Email'), + model_name="project", + name="reporting_ns_contact_email", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="NS Contanct Information: Email"), ), migrations.AddField( - model_name='project', - name='reporting_ns_contact_name', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='NS Contanct Information: Name'), + model_name="project", + name="reporting_ns_contact_name", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="NS Contanct Information: Name"), ), migrations.AddField( - model_name='project', - name='reporting_ns_contact_role', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='NS Contanct Information: Role'), + model_name="project", + name="reporting_ns_contact_role", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="NS Contanct Information: Role"), ), ] diff --git a/deployments/migrations/0064_auto_20220414_0842.py b/deployments/migrations/0064_auto_20220414_0842.py index 5dc7dd4ba..522e41955 100644 --- a/deployments/migrations/0064_auto_20220414_0842.py +++ b/deployments/migrations/0064_auto_20220414_0842.py @@ -1,46 +1,52 @@ # Generated by Django 2.2.27 on 2022-04-14 08:42 -from django.db import migrations, models import django.db.models.deletion import tinymce.models +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0152_countryoffieldreporttoreview'), - ('deployments', '0063_auto_20220413_1438'), + ("api", "0152_countryoffieldreporttoreview"), + ("deployments", "0063_auto_20220413_1438"), ] operations = [ migrations.AddField( - model_name='project', - name='description', - field=tinymce.models.HTMLField(blank=True, default='', verbose_name='description'), + model_name="project", + name="description", + field=tinymce.models.HTMLField(blank=True, default="", verbose_name="description"), ), migrations.AddField( - model_name='project', - name='description_ar', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='description'), + model_name="project", + name="description_ar", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="description"), ), migrations.AddField( - model_name='project', - name='description_en', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='description'), + model_name="project", + name="description_en", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="description"), ), migrations.AddField( - model_name='project', - name='description_es', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='description'), + model_name="project", + name="description_es", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="description"), ), migrations.AddField( - model_name='project', - name='description_fr', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='description'), + model_name="project", + name="description_fr", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="description"), ), migrations.AddField( - model_name='project', - name='document', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.GeneralDocument', verbose_name='linked document'), + model_name="project", + name="document", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.GeneralDocument", + verbose_name="linked document", + ), ), ] diff --git a/deployments/migrations/0065_emergencyproject_visibility.py b/deployments/migrations/0065_emergencyproject_visibility.py index 9f10b10a9..4416b485a 100644 --- a/deployments/migrations/0065_emergencyproject_visibility.py +++ b/deployments/migrations/0065_emergencyproject_visibility.py @@ -6,13 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0064_auto_20220414_0842'), + ("deployments", "0064_auto_20220414_0842"), ] operations = [ migrations.AddField( - model_name='emergencyproject', - name='visibility', - field=models.CharField(choices=[('logged_in_user', 'Membership'), ('ifrc_only', 'IFRC Only'), ('public', 'Public'), ('ifrc_ns', 'IFRC_NS')], default='public', max_length=32, verbose_name='visibility'), + model_name="emergencyproject", + name="visibility", + field=models.CharField( + choices=[ + ("logged_in_user", "Membership"), + ("ifrc_only", "IFRC Only"), + ("public", "Public"), + ("ifrc_ns", "IFRC_NS"), + ], + default="public", + max_length=32, + verbose_name="visibility", + ), ), ] diff --git a/deployments/migrations/0066_auto_20220523_0824.py b/deployments/migrations/0066_auto_20220523_0824.py index 45e085467..f03927c9a 100644 --- a/deployments/migrations/0066_auto_20220523_0824.py +++ b/deployments/migrations/0066_auto_20220523_0824.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0065_emergencyproject_visibility'), + ("deployments", "0065_emergencyproject_visibility"), ] operations = [ migrations.AlterField( - model_name='emergencyprojectactivity', - name='has_no_data_on_people_reached', - field=models.BooleanField(blank=True, null=True, verbose_name='Has no data on people reached'), + model_name="emergencyprojectactivity", + name="has_no_data_on_people_reached", + field=models.BooleanField(blank=True, null=True, verbose_name="Has no data on people reached"), ), migrations.AlterField( - model_name='emergencyprojectactivity', - name='is_disaggregated_for_disabled', - field=models.BooleanField(blank=True, null=True, verbose_name='Is disaggregated for disabled'), + model_name="emergencyprojectactivity", + name="is_disaggregated_for_disabled", + field=models.BooleanField(blank=True, null=True, verbose_name="Is disaggregated for disabled"), ), ] diff --git a/deployments/migrations/0066_auto_20220727_0708.py b/deployments/migrations/0066_auto_20220727_0708.py index da1c63072..48d8b993a 100644 --- a/deployments/migrations/0066_auto_20220727_0708.py +++ b/deployments/migrations/0066_auto_20220727_0708.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0065_emergencyproject_visibility'), + ("deployments", "0065_emergencyproject_visibility"), ] operations = [ migrations.AlterField( - model_name='deployedperson', - name='end_date', - field=models.DateTimeField(db_index=True, null=True, verbose_name='end date'), + model_name="deployedperson", + name="end_date", + field=models.DateTimeField(db_index=True, null=True, verbose_name="end date"), ), ] diff --git a/deployments/migrations/0067_annualsplit.py b/deployments/migrations/0067_annualsplit.py index 0ac51286c..b5b9df197 100644 --- a/deployments/migrations/0067_annualsplit.py +++ b/deployments/migrations/0067_annualsplit.py @@ -1,35 +1,43 @@ # Generated by Django 2.2.27 on 2022-08-18 09:43 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0067_merge_0066_auto_20220523_0824_0066_auto_20220727_0708'), + ("deployments", "0067_merge_0066_auto_20220523_0824_0066_auto_20220727_0708"), ] operations = [ migrations.CreateModel( - name='AnnualSplit', + name="AnnualSplit", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('year', models.IntegerField(blank=True, null=True, verbose_name='year')), - ('budget_amount', models.IntegerField(blank=True, null=True, verbose_name='amount')), - ('target_male', models.IntegerField(blank=True, null=True, verbose_name='target male')), - ('target_female', models.IntegerField(blank=True, null=True, verbose_name='target female')), - ('target_other', models.IntegerField(blank=True, null=True, verbose_name='target other')), - ('target_total', models.IntegerField(blank=True, null=True, verbose_name='target total')), - ('reached_male', models.IntegerField(blank=True, null=True, verbose_name='reached male')), - ('reached_female', models.IntegerField(blank=True, null=True, verbose_name='reached female')), - ('reached_other', models.IntegerField(blank=True, null=True, verbose_name='reached other')), - ('reached_total', models.IntegerField(blank=True, null=True, verbose_name='reached total')), - ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='annual_splits', to='deployments.Project', verbose_name='project')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("year", models.IntegerField(blank=True, null=True, verbose_name="year")), + ("budget_amount", models.IntegerField(blank=True, null=True, verbose_name="amount")), + ("target_male", models.IntegerField(blank=True, null=True, verbose_name="target male")), + ("target_female", models.IntegerField(blank=True, null=True, verbose_name="target female")), + ("target_other", models.IntegerField(blank=True, null=True, verbose_name="target other")), + ("target_total", models.IntegerField(blank=True, null=True, verbose_name="target total")), + ("reached_male", models.IntegerField(blank=True, null=True, verbose_name="reached male")), + ("reached_female", models.IntegerField(blank=True, null=True, verbose_name="reached female")), + ("reached_other", models.IntegerField(blank=True, null=True, verbose_name="reached other")), + ("reached_total", models.IntegerField(blank=True, null=True, verbose_name="reached total")), + ( + "project", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="annual_splits", + to="deployments.Project", + verbose_name="project", + ), + ), ], options={ - 'verbose_name': 'Annual Split', - 'verbose_name_plural': 'Annual Splits', + "verbose_name": "Annual Split", + "verbose_name_plural": "Annual Splits", }, ), ] diff --git a/deployments/migrations/0067_merge_0066_auto_20220523_0824_0066_auto_20220727_0708.py b/deployments/migrations/0067_merge_0066_auto_20220523_0824_0066_auto_20220727_0708.py index 112d46eb0..49a41316f 100644 --- a/deployments/migrations/0067_merge_0066_auto_20220523_0824_0066_auto_20220727_0708.py +++ b/deployments/migrations/0067_merge_0066_auto_20220523_0824_0066_auto_20220727_0708.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0066_auto_20220523_0824'), - ('deployments', '0066_auto_20220727_0708'), + ("deployments", "0066_auto_20220523_0824"), + ("deployments", "0066_auto_20220727_0708"), ] - operations = [ - ] + operations = [] diff --git a/deployments/migrations/0068_merge_20220818_1357.py b/deployments/migrations/0068_merge_20220818_1357.py index 85ffd3600..25e639803 100644 --- a/deployments/migrations/0068_merge_20220818_1357.py +++ b/deployments/migrations/0068_merge_20220818_1357.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0067_annualsplit'), - ('deployments', '0067_merge_0066_auto_20220523_0824_0066_auto_20220727_0708'), + ("deployments", "0067_annualsplit"), + ("deployments", "0067_merge_0066_auto_20220523_0824_0066_auto_20220727_0708"), ] - operations = [ - ] + operations = [] diff --git a/deployments/migrations/0069_auto_20221022_1542.py b/deployments/migrations/0069_auto_20221022_1542.py index 019b22c0b..03d7a475d 100644 --- a/deployments/migrations/0069_auto_20221022_1542.py +++ b/deployments/migrations/0069_auto_20221022_1542.py @@ -6,33 +6,87 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0068_merge_20220818_1357'), + ("deployments", "0068_merge_20220818_1357"), ] operations = [ migrations.AlterField( - model_name='eru', - name='type', - field=models.IntegerField(choices=[(0, 'Basecamp'), (1, 'IT & Telecom'), (2, 'Logistics'), (3, 'RCRC Emergency Hospital'), (4, 'RCRC Emergency Clinic'), (5, 'Relief'), (6, 'Wash M15'), (7, 'Wash MSM20'), (8, 'Wash M40'), (9, 'Water Supply and rehabilitation'), (10, 'Household Water Treatment and safe storage'), (11, 'Cholera Case management at Community level'), (12, 'Safe and Dignified Burials'), (13, 'Community Based Surveillance'), (14, 'Base Camp – S'), (15, 'Base Camp – M'), (16, 'Base Camp – L')], default=0, help_text='Key/value pairs', verbose_name='type'), + model_name="eru", + name="type", + field=models.IntegerField( + choices=[ + (0, "Basecamp"), + (1, "IT & Telecom"), + (2, "Logistics"), + (3, "RCRC Emergency Hospital"), + (4, "RCRC Emergency Clinic"), + (5, "Relief"), + (6, "Wash M15"), + (7, "Wash MSM20"), + (8, "Wash M40"), + (9, "Water Supply and rehabilitation"), + (10, "Household Water Treatment and safe storage"), + (11, "Cholera Case management at Community level"), + (12, "Safe and Dignified Burials"), + (13, "Community Based Surveillance"), + (14, "Base Camp – S"), + (15, "Base Camp – M"), + (16, "Base Camp – L"), + ], + default=0, + help_text='Key/value pairs', + verbose_name="type", + ), ), migrations.AlterField( - model_name='project', - name='operation_type', - field=models.IntegerField(choices=[(0, 'Programme'), (1, 'Emergency Operation')], default=0, help_text='Key/value pairs', verbose_name='operation type'), + model_name="project", + name="operation_type", + field=models.IntegerField( + choices=[(0, "Programme"), (1, "Emergency Operation")], + default=0, + help_text='Key/value pairs', + verbose_name="operation type", + ), ), migrations.AlterField( - model_name='project', - name='primary_sector', - field=models.IntegerField(choices=[(0, 'WASH'), (1, 'PGI'), (2, 'CEA'), (3, 'Migration'), (4, 'Health'), (5, 'DRR'), (6, 'Shelter'), (7, 'NS Strengthening'), (8, 'Education'), (9, 'Livelihoods and basic needs')], default=0, help_text='Key/value pairs', verbose_name='sector'), + model_name="project", + name="primary_sector", + field=models.IntegerField( + choices=[ + (0, "WASH"), + (1, "PGI"), + (2, "CEA"), + (3, "Migration"), + (4, "Health"), + (5, "DRR"), + (6, "Shelter"), + (7, "NS Strengthening"), + (8, "Education"), + (9, "Livelihoods and basic needs"), + ], + default=0, + help_text='Key/value pairs', + verbose_name="sector", + ), ), migrations.AlterField( - model_name='project', - name='programme_type', - field=models.IntegerField(choices=[(0, 'Bilateral'), (1, 'Multilateral'), (2, 'Domestic')], default=0, help_text='Key/value pairs', verbose_name='programme type'), + model_name="project", + name="programme_type", + field=models.IntegerField( + choices=[(0, "Bilateral"), (1, "Multilateral"), (2, "Domestic")], + default=0, + help_text='Key/value pairs', + verbose_name="programme type", + ), ), migrations.AlterField( - model_name='project', - name='status', - field=models.IntegerField(choices=[(0, 'Planned'), (1, 'Ongoing'), (2, 'Completed')], default=0, help_text='Key/value pairs', verbose_name='status'), + model_name="project", + name="status", + field=models.IntegerField( + choices=[(0, "Planned"), (1, "Ongoing"), (2, "Completed")], + default=0, + help_text='Key/value pairs', + verbose_name="status", + ), ), ] diff --git a/deployments/migrations/0070_alter_personnel_options.py b/deployments/migrations/0070_alter_personnel_options.py index 9a2ca4fbe..86889cec4 100644 --- a/deployments/migrations/0070_alter_personnel_options.py +++ b/deployments/migrations/0070_alter_personnel_options.py @@ -6,12 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0069_auto_20221022_1542'), + ("deployments", "0069_auto_20221022_1542"), ] operations = [ migrations.AlterModelOptions( - name='personnel', - options={'ordering': ('deployment', 'country_to', 'country_from', 'molnix_id', 'deployedperson_ptr_id'), 'verbose_name': 'Personnel', 'verbose_name_plural': 'Personnels'}, + name="personnel", + options={ + "ordering": ("deployment", "country_to", "country_from", "molnix_id", "deployedperson_ptr_id"), + "verbose_name": "Personnel", + "verbose_name_plural": "Personnels", + }, ), ] diff --git a/deployments/migrations/0071_sector.py b/deployments/migrations/0071_sector.py index e70a6900c..2e743a2a5 100644 --- a/deployments/migrations/0071_sector.py +++ b/deployments/migrations/0071_sector.py @@ -6,17 +6,17 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0070_alter_personnel_options'), + ("deployments", "0070_alter_personnel_options"), ] operations = [ migrations.CreateModel( - name='Sector', + name="Sector", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('slug', models.CharField(max_length=255, verbose_name='slug')), - ('order', models.SmallIntegerField(default=0)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("slug", models.CharField(max_length=255, verbose_name="slug")), + ("order", models.SmallIntegerField(default=0)), ], ), ] diff --git a/deployments/migrations/0072_sectortag.py b/deployments/migrations/0072_sectortag.py index e25135e68..93a9490d5 100644 --- a/deployments/migrations/0072_sectortag.py +++ b/deployments/migrations/0072_sectortag.py @@ -6,17 +6,17 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0071_sector'), + ("deployments", "0071_sector"), ] operations = [ migrations.CreateModel( - name='SectorTag', + name="SectorTag", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('slug', models.CharField(max_length=255, verbose_name='slug')), - ('order', models.SmallIntegerField(default=0)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("slug", models.CharField(max_length=255, verbose_name="slug")), + ("order", models.SmallIntegerField(default=0)), ], ), ] diff --git a/deployments/migrations/0073_auto_20230301_1606.py b/deployments/migrations/0073_auto_20230301_1606.py index f346917e4..c4314aec6 100644 --- a/deployments/migrations/0073_auto_20230301_1606.py +++ b/deployments/migrations/0073_auto_20230301_1606.py @@ -1,77 +1,101 @@ # Generated by Django 3.2.18 on 2023-03-01 16:06 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0072_sectortag'), + ("deployments", "0072_sectortag"), ] operations = [ migrations.RunSQL( sql=[ - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (0 ,0 ,'WASH', 'WASH')"), - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (1 ,1 ,'PGI', 'PGI')"), - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (2 ,2 ,'CEA' , 'CEA')"), - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (3 ,3 ,'MIGRATION', 'Migration')"), - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (4 ,4 ,'HEALTH_PUBLIC' , 'Health (public)')"), - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (5 ,5 ,'DRR', 'DRR')"), - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (6 ,6 ,'SHELTER' ,'Shelter')"), - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (7 ,7 ,'NS_STRENGTHENING' , 'NS Strengthening')"), - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (8 ,8 ,'EDUCATION' , 'Education')"), - ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (9 ,9 ,'LIVELIHOODS_AND_BASIC_NEEDS', 'Livelihoods and basic needs')"), - ("SELECT SETVAL('deployments_sector_id_seq', (select max(id) from deployments_sector))"), - # ---------------- - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (0 ,0 ,'WASH', 'WASH')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (1 ,1 ,'PGI', 'PGI')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (2 ,2 ,'CEA' , 'CEA')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (3 ,3 ,'MIGRATION', 'Migration')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (4 ,4 ,'HEALTH_PUBLIC' , 'Health (public)')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (5 ,5 ,'DRR', 'DRR')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (6 ,6 ,'SHELTER' ,'Shelter')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (7 ,7 ,'NS_STRENGTHENING' , 'NS Strengthening')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (8 ,8 ,'EDUCATION' , 'Education')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (9 ,9 ,'LIVELIHOODS_AND_BASIC_NEEDS', 'Livelihoods and basic needs')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (10,10,'RECOVERY', 'Recovery')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (11,11,'INTERNAL_DISPLACEMENT', 'Internal displacement')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (12,12,'HEALTH_CLINICAL' , 'Health (clinical)')"), - ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (13,13,'COVID_19' , 'COVID-19')"), - ("SELECT SETVAL('deployments_sectortag_id_seq', (select max(id) from deployments_sectortag))"), - # ---------------- - ("CREATE TABLE tmp2sect as select id, secondary_sectors from deployments_project"), + ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (0 ,0 ,'WASH', 'WASH')"), + ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (1 ,1 ,'PGI', 'PGI')"), + ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (2 ,2 ,'CEA' , 'CEA')"), + ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (3 ,3 ,'MIGRATION', 'Migration')"), + ( + "INSERT INTO deployments_sector (id, \"order\", slug, title) values (4 ,4 ,'HEALTH_PUBLIC' , 'Health (public)')" + ), + ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (5 ,5 ,'DRR', 'DRR')"), + ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (6 ,6 ,'SHELTER' ,'Shelter')"), + ( + "INSERT INTO deployments_sector (id, \"order\", slug, title) values (7 ,7 ,'NS_STRENGTHENING' , 'NS Strengthening')" + ), + ("INSERT INTO deployments_sector (id, \"order\", slug, title) values (8 ,8 ,'EDUCATION' , 'Education')"), + ( + "INSERT INTO deployments_sector (id, \"order\", slug, title) values (9 ,9 ,'LIVELIHOODS_AND_BASIC_NEEDS', 'Livelihoods and basic needs')" + ), + ("SELECT SETVAL('deployments_sector_id_seq', (select max(id) from deployments_sector))"), + # ---------------- + ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (0 ,0 ,'WASH', 'WASH')"), + ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (1 ,1 ,'PGI', 'PGI')"), + ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (2 ,2 ,'CEA' , 'CEA')"), + ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (3 ,3 ,'MIGRATION', 'Migration')"), + ( + "INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (4 ,4 ,'HEALTH_PUBLIC' , 'Health (public)')" + ), + ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (5 ,5 ,'DRR', 'DRR')"), + ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (6 ,6 ,'SHELTER' ,'Shelter')"), + ( + "INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (7 ,7 ,'NS_STRENGTHENING' , 'NS Strengthening')" + ), + ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (8 ,8 ,'EDUCATION' , 'Education')"), + ( + "INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (9 ,9 ,'LIVELIHOODS_AND_BASIC_NEEDS', 'Livelihoods and basic needs')" + ), + ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (10,10,'RECOVERY', 'Recovery')"), + ( + "INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (11,11,'INTERNAL_DISPLACEMENT', 'Internal displacement')" + ), + ( + "INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (12,12,'HEALTH_CLINICAL' , 'Health (clinical)')" + ), + ("INSERT INTO deployments_sectortag(id, \"order\", slug, title) values (13,13,'COVID_19' , 'COVID-19')"), + ("SELECT SETVAL('deployments_sectortag_id_seq', (select max(id) from deployments_sectortag))"), + # ---------------- + ("CREATE TABLE tmp2sect as select id, secondary_sectors from deployments_project"), + ], + reverse_sql=[ + ("DELETE FROM deployments_sector"), + ("DELETE FROM deployments_sectortag"), + ("DROP TABLE tmp2sect"), ], - reverse_sql=[("DELETE FROM deployments_sector"), ("DELETE FROM deployments_sectortag"), ("DROP TABLE tmp2sect"),], ), migrations.AlterField( - model_name='project', - name='primary_sector', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deployments.sector', verbose_name='sector'), + model_name="project", + name="primary_sector", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="deployments.sector", verbose_name="sector"), ), migrations.RemoveField( - model_name='project', - name='secondary_sectors', + model_name="project", + name="secondary_sectors", ), migrations.AddField( - model_name='project', - name='secondary_sectors', - field=models.ManyToManyField(blank=True, related_name='tags', to='deployments.SectorTag'), + model_name="project", + name="secondary_sectors", + field=models.ManyToManyField(blank=True, related_name="tags", to="deployments.SectorTag"), ), migrations.AlterModelOptions( - name='sector', - options={'verbose_name': 'Project Sector', 'verbose_name_plural': 'Project Sectors'}, + name="sector", + options={"verbose_name": "Project Sector", "verbose_name_plural": "Project Sectors"}, ), migrations.AlterModelOptions( - name='sectortag', - options={'verbose_name': 'Project Sector Tag', 'verbose_name_plural': 'Project Sector Tags'}, + name="sectortag", + options={"verbose_name": "Project Sector Tag", "verbose_name_plural": "Project Sector Tags"}, ), migrations.RunSQL( sql=[ - ("INSERT INTO deployments_project_secondary_sectors (project_id,sectortag_id) (select distinct id, unnest(secondary_sectors) FROM tmp2sect)"), - ("DROP TABLE tmp2sect"), + ( + "INSERT INTO deployments_project_secondary_sectors (project_id,sectortag_id) (select distinct id, unnest(secondary_sectors) FROM tmp2sect)" + ), + ("DROP TABLE tmp2sect"), + ], + reverse_sql=[ + ("DELETE FROM deployments_project_secondary_sectors"), ], - reverse_sql=[("DELETE FROM deployments_project_secondary_sectors"),], ), ] diff --git a/deployments/migrations/0074_alter_molnixtag_description.py b/deployments/migrations/0074_alter_molnixtag_description.py index bd38cdbe0..68bdd837a 100644 --- a/deployments/migrations/0074_alter_molnixtag_description.py +++ b/deployments/migrations/0074_alter_molnixtag_description.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0073_auto_20230301_1606'), + ("deployments", "0073_auto_20230301_1606"), ] operations = [ migrations.AlterField( - model_name='molnixtag', - name='description', + model_name="molnixtag", + name="description", field=models.CharField(blank=True, max_length=512), ), ] diff --git a/deployments/migrations/0075_alter_project_primary_sector.py b/deployments/migrations/0075_alter_project_primary_sector.py index 1b4c83509..8c3c18960 100644 --- a/deployments/migrations/0075_alter_project_primary_sector.py +++ b/deployments/migrations/0075_alter_project_primary_sector.py @@ -1,19 +1,19 @@ # Generated by Django 3.2.18 on 2023-03-07 15:34 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('deployments', '0074_alter_molnixtag_description'), + ("deployments", "0074_alter_molnixtag_description"), ] operations = [ migrations.AlterField( - model_name='project', - name='primary_sector', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='deployments.sector', verbose_name='sector'), + model_name="project", + name="primary_sector", + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="deployments.sector", verbose_name="sector"), ), ] diff --git a/deployments/migrations/0076_auto_20230309_1556.py b/deployments/migrations/0076_auto_20230309_1556.py index 0780bc424..d0dc7fe06 100644 --- a/deployments/migrations/0076_auto_20230309_1556.py +++ b/deployments/migrations/0076_auto_20230309_1556.py @@ -6,36 +6,36 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0075_alter_project_primary_sector'), + ("deployments", "0075_alter_project_primary_sector"), ] operations = [ migrations.RemoveField( - model_name='sector', - name='slug', + model_name="sector", + name="slug", ), migrations.RemoveField( - model_name='sectortag', - name='slug', + model_name="sectortag", + name="slug", ), migrations.AddField( - model_name='sector', - name='color', - field=models.CharField(blank=True, max_length=7, null=True, verbose_name='color'), + model_name="sector", + name="color", + field=models.CharField(blank=True, max_length=7, null=True, verbose_name="color"), ), migrations.AddField( - model_name='sector', - name='is_deprecated', - field=models.BooleanField(default=False, help_text='Is this a deprecated sector?'), + model_name="sector", + name="is_deprecated", + field=models.BooleanField(default=False, help_text="Is this a deprecated sector?"), ), migrations.AddField( - model_name='sectortag', - name='color', - field=models.CharField(blank=True, max_length=7, null=True, verbose_name='color'), + model_name="sectortag", + name="color", + field=models.CharField(blank=True, max_length=7, null=True, verbose_name="color"), ), migrations.AddField( - model_name='sectortag', - name='is_deprecated', - field=models.BooleanField(default=False, help_text='Is this a deprecated sector tag?'), + model_name="sectortag", + name="is_deprecated", + field=models.BooleanField(default=False, help_text="Is this a deprecated sector tag?"), ), ] diff --git a/deployments/migrations/0077_auto_20230410_0720.py b/deployments/migrations/0077_auto_20230410_0720.py index 50594ecd4..b235590c9 100644 --- a/deployments/migrations/0077_auto_20230410_0720.py +++ b/deployments/migrations/0077_auto_20230410_0720.py @@ -6,58 +6,98 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0076_auto_20230309_1556'), + ("deployments", "0076_auto_20230309_1556"), ] operations = [ migrations.AddField( - model_name='deployedperson', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="deployedperson", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='deployedperson', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="deployedperson", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='partnersocietyactivities', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="partnersocietyactivities", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='partnersocietyactivities', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="partnersocietyactivities", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='personneldeployment', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="personneldeployment", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='personneldeployment', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="personneldeployment", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='project', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="project", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='project', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="project", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='regionalproject', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="regionalproject", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='regionalproject', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="regionalproject", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/deployments/migrations/0077_auto_20230420_1609.py b/deployments/migrations/0077_auto_20230420_1609.py index 2e487a7f4..f08ac4f43 100644 --- a/deployments/migrations/0077_auto_20230420_1609.py +++ b/deployments/migrations/0077_auto_20230420_1609.py @@ -6,19 +6,21 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0164_appealdocumenttype'), - ('deployments', '0076_auto_20230309_1556'), + ("api", "0164_appealdocumenttype"), + ("deployments", "0076_auto_20230309_1556"), ] operations = [ migrations.AlterField( - model_name='emergencyproject', - name='districts', - field=models.ManyToManyField(blank=True, related_name='_deployments_emergencyproject_districts_+', to='api.District', verbose_name='Districts'), + model_name="emergencyproject", + name="districts", + field=models.ManyToManyField( + blank=True, related_name="_deployments_emergencyproject_districts_+", to="api.District", verbose_name="Districts" + ), ), migrations.AlterField( - model_name='project', - name='project_districts', - field=models.ManyToManyField(blank=True, to='api.District', verbose_name='districts'), + model_name="project", + name="project_districts", + field=models.ManyToManyField(blank=True, to="api.District", verbose_name="districts"), ), ] diff --git a/deployments/migrations/0077_project_project_admin2.py b/deployments/migrations/0077_project_project_admin2.py index ab2e78477..d58028d1f 100644 --- a/deployments/migrations/0077_project_project_admin2.py +++ b/deployments/migrations/0077_project_project_admin2.py @@ -6,14 +6,14 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0161_alter_event_options'), - ('deployments', '0076_auto_20230309_1556'), + ("api", "0161_alter_event_options"), + ("deployments", "0076_auto_20230309_1556"), ] operations = [ migrations.AddField( - model_name='project', - name='project_admin2', - field=models.ManyToManyField(blank=True, to='api.Admin2', verbose_name='admin2'), + model_name="project", + name="project_admin2", + field=models.ManyToManyField(blank=True, to="api.Admin2", verbose_name="admin2"), ), ] diff --git a/deployments/migrations/0078_auto_20230421_1110.py b/deployments/migrations/0078_auto_20230421_1110.py index 7f515d7e4..2b06c504b 100644 --- a/deployments/migrations/0078_auto_20230421_1110.py +++ b/deployments/migrations/0078_auto_20230421_1110.py @@ -6,23 +6,48 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0077_auto_20230420_1609'), + ("deployments", "0077_auto_20230420_1609"), ] operations = [ migrations.AlterField( - model_name='emergencyprojectactivity', - name='custom_supplies', - field=models.JSONField(blank=True, default=dict, null=True, verbose_name='custom supplies'), + model_name="emergencyprojectactivity", + name="custom_supplies", + field=models.JSONField(blank=True, default=dict, null=True, verbose_name="custom supplies"), ), migrations.AlterField( - model_name='emergencyprojectactivity', - name='supplies', - field=models.JSONField(blank=True, default=dict, null=True, verbose_name='supplies'), + model_name="emergencyprojectactivity", + name="supplies", + field=models.JSONField(blank=True, default=dict, null=True, verbose_name="supplies"), ), migrations.AlterField( - model_name='eru', - name='type', - field=models.IntegerField(choices=[(0, 'Basecamp'), (1, 'IT & Telecom'), (2, 'Logistics'), (3, 'RCRC Emergency Hospital'), (4, 'RCRC Emergency Clinic'), (5, 'Relief'), (6, 'Wash M15'), (7, 'Wash MSM20'), (8, 'Wash M40'), (9, 'Water Supply and rehabilitation'), (10, 'Household Water Treatment and safe storage'), (11, 'Cholera Case management at Community level'), (12, 'Safe and Dignified Burials'), (13, 'Community Based Surveillance'), (14, 'Base Camp – S'), (15, 'Base Camp – M'), (16, 'Base Camp – L'), (17, 'Outpatient Department (OPD) Module'), (18, 'MHPSS')], default=0, help_text='Key/value pairs', verbose_name='type'), + model_name="eru", + name="type", + field=models.IntegerField( + choices=[ + (0, "Basecamp"), + (1, "IT & Telecom"), + (2, "Logistics"), + (3, "RCRC Emergency Hospital"), + (4, "RCRC Emergency Clinic"), + (5, "Relief"), + (6, "Wash M15"), + (7, "Wash MSM20"), + (8, "Wash M40"), + (9, "Water Supply and rehabilitation"), + (10, "Household Water Treatment and safe storage"), + (11, "Cholera Case management at Community level"), + (12, "Safe and Dignified Burials"), + (13, "Community Based Surveillance"), + (14, "Base Camp – S"), + (15, "Base Camp – M"), + (16, "Base Camp – L"), + (17, "Outpatient Department (OPD) Module"), + (18, "MHPSS"), + ], + default=0, + help_text='Key/value pairs', + verbose_name="type", + ), ), ] diff --git a/deployments/migrations/0078_emergencyproject_admin2.py b/deployments/migrations/0078_emergencyproject_admin2.py index 2ba39924a..3acfeb2e3 100644 --- a/deployments/migrations/0078_emergencyproject_admin2.py +++ b/deployments/migrations/0078_emergencyproject_admin2.py @@ -6,14 +6,14 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0161_alter_event_options'), - ('deployments', '0077_project_project_admin2'), + ("api", "0161_alter_event_options"), + ("deployments", "0077_project_project_admin2"), ] operations = [ migrations.AddField( - model_name='emergencyproject', - name='admin2', - field=models.ManyToManyField(blank=True, to='api.Admin2', verbose_name='admin2'), + model_name="emergencyproject", + name="admin2", + field=models.ManyToManyField(blank=True, to="api.Admin2", verbose_name="admin2"), ), ] diff --git a/deployments/migrations/0079_auto_20230423_0628.py b/deployments/migrations/0079_auto_20230423_0628.py index cc68c7a02..61ed2dcbe 100644 --- a/deployments/migrations/0079_auto_20230423_0628.py +++ b/deployments/migrations/0079_auto_20230423_0628.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0078_auto_20230421_1110'), + ("deployments", "0078_auto_20230421_1110"), ] operations = [ migrations.AlterField( - model_name='emergencyprojectactivity', - name='custom_supplies', - field=models.JSONField(blank=True, default=dict, verbose_name='custom supplies'), + model_name="emergencyprojectactivity", + name="custom_supplies", + field=models.JSONField(blank=True, default=dict, verbose_name="custom supplies"), ), migrations.AlterField( - model_name='emergencyprojectactivity', - name='supplies', - field=models.JSONField(blank=True, default=dict, verbose_name='supplies'), + model_name="emergencyprojectactivity", + name="supplies", + field=models.JSONField(blank=True, default=dict, verbose_name="supplies"), ), ] diff --git a/deployments/migrations/0080_merge_20230505_0418.py b/deployments/migrations/0080_merge_20230505_0418.py index 3c5da2b98..d04dbbb76 100644 --- a/deployments/migrations/0080_merge_20230505_0418.py +++ b/deployments/migrations/0080_merge_20230505_0418.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0078_emergencyproject_admin2'), - ('deployments', '0079_auto_20230423_0628'), + ("deployments", "0078_emergencyproject_admin2"), + ("deployments", "0079_auto_20230423_0628"), ] - operations = [ - ] + operations = [] diff --git a/deployments/migrations/0081_merge_20230614_0804.py b/deployments/migrations/0081_merge_20230614_0804.py index 411bd3c3e..0cd7ada6f 100644 --- a/deployments/migrations/0081_merge_20230614_0804.py +++ b/deployments/migrations/0081_merge_20230614_0804.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0077_auto_20230410_0720'), - ('deployments', '0080_merge_20230505_0418'), + ("deployments", "0077_auto_20230410_0720"), + ("deployments", "0080_merge_20230505_0418"), ] - operations = [ - ] + operations = [] diff --git a/deployments/migrations/0082_personnel_surge_alert.py b/deployments/migrations/0082_personnel_surge_alert.py index 911afd224..5917eea28 100644 --- a/deployments/migrations/0082_personnel_surge_alert.py +++ b/deployments/migrations/0082_personnel_surge_alert.py @@ -1,20 +1,26 @@ # Generated by Django 3.2.20 on 2023-07-26 10:12 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('notifications', '0013_auto_20230410_0720'), - ('deployments', '0081_merge_20230614_0804'), + ("notifications", "0013_auto_20230410_0720"), + ("deployments", "0081_merge_20230614_0804"), ] operations = [ migrations.AddField( - model_name='personnel', - name='surge_alert', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='notifications.surgealert', verbose_name='surge alert'), + model_name="personnel", + name="surge_alert", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="notifications.surgealert", + verbose_name="surge alert", + ), ), ] diff --git a/deployments/migrations/0083_auto_20230727_0853.py b/deployments/migrations/0083_auto_20230727_0853.py index 75181a0ff..ab8c14fc2 100644 --- a/deployments/migrations/0083_auto_20230727_0853.py +++ b/deployments/migrations/0083_auto_20230727_0853.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0082_personnel_surge_alert'), + ("deployments", "0082_personnel_surge_alert"), ] operations = [ migrations.CreateModel( - name='MolnixTagGroup', + name="MolnixTagGroup", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('molnix_id', models.IntegerField()), - ('name', models.CharField(max_length=255, verbose_name='name')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('is_deprecated', models.BooleanField(default=False, help_text='Is this a deprecated group?')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("molnix_id", models.IntegerField()), + ("name", models.CharField(max_length=255, verbose_name="name")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")), + ("is_deprecated", models.BooleanField(default=False, help_text="Is this a deprecated group?")), ], options={ - 'verbose_name': 'Molnix Tag Group', - 'verbose_name_plural': 'Molnix Tag Groups', + "verbose_name": "Molnix Tag Group", + "verbose_name_plural": "Molnix Tag Groups", }, ), migrations.AddField( - model_name='molnixtag', - name='groups', - field=models.ManyToManyField(blank=True, related_name='groups', to='deployments.MolnixTagGroup'), + model_name="molnixtag", + name="groups", + field=models.ManyToManyField(blank=True, related_name="groups", to="deployments.MolnixTagGroup"), ), ] diff --git a/deployments/migrations/0084_auto_20230731_1006.py b/deployments/migrations/0084_auto_20230731_1006.py index da85a9fcf..8d285cae3 100644 --- a/deployments/migrations/0084_auto_20230731_1006.py +++ b/deployments/migrations/0084_auto_20230731_1006.py @@ -6,23 +6,41 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0083_auto_20230727_0853'), + ("deployments", "0083_auto_20230727_0853"), ] operations = [ migrations.AddField( - model_name='personnel', - name='appraisal_score', - field=models.IntegerField(blank=True, null=True, verbose_name='appraisal score'), + model_name="personnel", + name="appraisal_score", + field=models.IntegerField(blank=True, null=True, verbose_name="appraisal score"), ), migrations.AddField( - model_name='personnel', - name='gender', - field=models.CharField(blank=True, choices=[('male', 'MALE'), ('female', 'FEMALE'), ('agender', 'AGENDER'), ('pangender', 'PANGENDER'), ('transgender', 'TRANSGENDER'), ('third-gender', 'THIRD_GENDER'), ('genderqueer', 'GENDERQUEER'), ('gender-neutral', 'GENDER_NEUTRAL'), ('non-binary', 'NON_BINARY'), ('two-spirit', 'TWO_SPIRIT'), ('hidden', 'HIDDEN')], max_length=15, null=True, verbose_name='gender'), + model_name="personnel", + name="gender", + field=models.CharField( + blank=True, + choices=[ + ("male", "MALE"), + ("female", "FEMALE"), + ("agender", "AGENDER"), + ("pangender", "PANGENDER"), + ("transgender", "TRANSGENDER"), + ("third-gender", "THIRD_GENDER"), + ("genderqueer", "GENDERQUEER"), + ("gender-neutral", "GENDER_NEUTRAL"), + ("non-binary", "NON_BINARY"), + ("two-spirit", "TWO_SPIRIT"), + ("hidden", "HIDDEN"), + ], + max_length=15, + null=True, + verbose_name="gender", + ), ), migrations.AddField( - model_name='personnel', - name='location', - field=models.CharField(max_length=300, null=True, verbose_name='location'), + model_name="personnel", + name="location", + field=models.CharField(max_length=300, null=True, verbose_name="location"), ), ] diff --git a/deployments/migrations/0085_alter_personnel_location.py b/deployments/migrations/0085_alter_personnel_location.py index 21b510713..91fed13ca 100644 --- a/deployments/migrations/0085_alter_personnel_location.py +++ b/deployments/migrations/0085_alter_personnel_location.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0084_auto_20230731_1006'), + ("deployments", "0084_auto_20230731_1006"), ] operations = [ migrations.AlterField( - model_name='personnel', - name='location', - field=models.CharField(blank=True, max_length=300, null=True, verbose_name='location'), + model_name="personnel", + name="location", + field=models.CharField(blank=True, max_length=300, null=True, verbose_name="location"), ), ] diff --git a/deployments/migrations/0086_auto_20230809_0822.py b/deployments/migrations/0086_auto_20230809_0822.py index 924c9d2c7..94b4a227b 100644 --- a/deployments/migrations/0086_auto_20230809_0822.py +++ b/deployments/migrations/0086_auto_20230809_0822.py @@ -6,22 +6,22 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0085_alter_personnel_location'), + ("deployments", "0085_alter_personnel_location"), ] operations = [ migrations.RemoveField( - model_name='personnel', - name='appraisal_score', + model_name="personnel", + name="appraisal_score", ), migrations.AddField( - model_name='personnel', - name='appraisal_received', - field=models.BooleanField(default=False, verbose_name='appraisal received'), + model_name="personnel", + name="appraisal_received", + field=models.BooleanField(default=False, verbose_name="appraisal received"), ), migrations.AlterField( - model_name='personnel', - name='gender', - field=models.CharField(blank=True, max_length=15, null=True, verbose_name='gender'), + model_name="personnel", + name="gender", + field=models.CharField(blank=True, max_length=15, null=True, verbose_name="gender"), ), ] diff --git a/deployments/migrations/0087_auto_20230816_0430.py b/deployments/migrations/0087_auto_20230816_0430.py index 0cf14c06a..9f9e091c2 100644 --- a/deployments/migrations/0087_auto_20230816_0430.py +++ b/deployments/migrations/0087_auto_20230816_0430.py @@ -6,33 +6,53 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0086_auto_20230809_0822'), + ("deployments", "0086_auto_20230809_0822"), ] operations = [ migrations.AlterField( - model_name='emergencyproject', - name='reporting_ns_contact_email', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='NS Contact Information: Email'), + model_name="emergencyproject", + name="reporting_ns_contact_email", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="NS Contact Information: Email"), ), migrations.AlterField( - model_name='emergencyproject', - name='reporting_ns_contact_name', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='NS Contact Information: Name'), + model_name="emergencyproject", + name="reporting_ns_contact_name", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="NS Contact Information: Name"), ), migrations.AlterField( - model_name='emergencyproject', - name='reporting_ns_contact_role', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='NS Contact Information: Role'), + model_name="emergencyproject", + name="reporting_ns_contact_role", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="NS Contact Information: Role"), ), migrations.AlterField( - model_name='emergencyproject', - name='visibility', - field=models.CharField(choices=[('logged_in_user', 'RCRC Movement'), ('ifrc_only', 'IFRC Secretariat'), ('public', 'Public'), ('ifrc_ns', 'IFRC and NS')], default='public', max_length=32, verbose_name='visibility'), + model_name="emergencyproject", + name="visibility", + field=models.CharField( + choices=[ + ("logged_in_user", "RCRC Movement"), + ("ifrc_only", "IFRC Secretariat"), + ("public", "Public"), + ("ifrc_ns", "IFRC and NS"), + ], + default="public", + max_length=32, + verbose_name="visibility", + ), ), migrations.AlterField( - model_name='project', - name='visibility', - field=models.CharField(choices=[('logged_in_user', 'RCRC Movement'), ('ifrc_only', 'IFRC Secretariat'), ('public', 'Public'), ('ifrc_ns', 'IFRC and NS')], default='public', max_length=32, verbose_name='visibility'), + model_name="project", + name="visibility", + field=models.CharField( + choices=[ + ("logged_in_user", "RCRC Movement"), + ("ifrc_only", "IFRC Secretariat"), + ("public", "Public"), + ("ifrc_ns", "IFRC and NS"), + ], + default="public", + max_length=32, + verbose_name="visibility", + ), ), ] diff --git a/deployments/migrations/0088_alter_project_visibility.py b/deployments/migrations/0088_alter_project_visibility.py index 8e2cbfdd8..a8670f595 100644 --- a/deployments/migrations/0088_alter_project_visibility.py +++ b/deployments/migrations/0088_alter_project_visibility.py @@ -6,13 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0087_auto_20230816_0430'), + ("deployments", "0087_auto_20230816_0430"), ] operations = [ migrations.AlterField( - model_name='project', - name='visibility', - field=models.CharField(choices=[('logged_in_user', 'RCRC Movement'), ('ifrc_only', 'IFRC Secretariat'), ('public', 'Public'), ('ifrc_ns', 'IFRC and NS')], default='public', max_length=64, verbose_name='visibility'), + model_name="project", + name="visibility", + field=models.CharField( + choices=[ + ("logged_in_user", "RCRC Movement"), + ("ifrc_only", "IFRC Secretariat"), + ("public", "Public"), + ("ifrc_ns", "IFRC and NS"), + ], + default="public", + max_length=64, + verbose_name="visibility", + ), ), ] diff --git a/deployments/migrations/0089_alter_emergencyproject_districts.py b/deployments/migrations/0089_alter_emergencyproject_districts.py index 9c921efc4..9bf4ac491 100644 --- a/deployments/migrations/0089_alter_emergencyproject_districts.py +++ b/deployments/migrations/0089_alter_emergencyproject_districts.py @@ -6,14 +6,14 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0210_profile_accepted_montandon_license_terms'), - ('deployments', '0088_alter_project_visibility'), + ("api", "0210_profile_accepted_montandon_license_terms"), + ("deployments", "0088_alter_project_visibility"), ] operations = [ migrations.AlterField( - model_name='emergencyproject', - name='districts', - field=models.ManyToManyField(blank=True, related_name='+', to='api.district', verbose_name='Districts'), + model_name="emergencyproject", + name="districts", + field=models.ManyToManyField(blank=True, related_name="+", to="api.district", verbose_name="Districts"), ), ] diff --git a/deployments/models.py b/deployments/models.py index 9151b4ad8..81e853b3b 100644 --- a/deployments/models.py +++ b/deployments/models.py @@ -1,26 +1,25 @@ -import reversion from datetime import datetime -from tinymce.models import HTMLField +import reversion +from django.conf import settings from django.db import models +from django.db.models import JSONField, Q from django.utils import timezone from django.utils.translation import gettext_lazy as _ -from django.conf import settings -from django.db.models import Q -from django.db.models import JSONField +from tinymce.models import HTMLField from api.models import ( - District, - Country, - Region, Admin2, - Event, - DisasterType, Appeal, + Country, + DisasterType, + District, + Event, + GeneralDocument, Profile, + Region, UserCountry, VisibilityCharChoices, - GeneralDocument, ) DATE_FORMAT = "%Y/%m/%d %H:%M" @@ -122,9 +121,7 @@ def __str__(self): @reversion.register() class PersonnelDeployment(models.Model): country_deployed_to = models.ForeignKey(Country, verbose_name=_("country deployed to"), on_delete=models.CASCADE) - region_deployed_to = models.ForeignKey( - Region, verbose_name=_("region deployed to"), null=True, on_delete=models.SET_NULL - ) + region_deployed_to = models.ForeignKey(Region, verbose_name=_("region deployed to"), null=True, on_delete=models.SET_NULL) event_deployed_to = models.ForeignKey( Event, verbose_name=_("event deployed to"), null=True, blank=True, on_delete=models.SET_NULL ) @@ -251,7 +248,7 @@ class StatusChoices(models.TextChoices): ) is_active = models.BooleanField(default=True) # Active in Molnix API surge_alert = models.ForeignKey( # position_id in Molnix API - 'notifications.SurgeAlert', # import as string to avoid circular import (MolnixTag) + "notifications.SurgeAlert", # import as string to avoid circular import (MolnixTag) verbose_name=_("surge alert"), null=True, blank=True, @@ -453,9 +450,7 @@ class Project(models.Model): blank=True, on_delete=models.SET_NULL, ) # this is the current operation - dtype = models.ForeignKey( - DisasterType, verbose_name=_("disaster type"), null=True, blank=True, on_delete=models.SET_NULL - ) + dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, blank=True, on_delete=models.SET_NULL) name = models.TextField(verbose_name=_("name")) description = HTMLField(verbose_name=_("description"), blank=True, default="") document = models.ForeignKey( @@ -565,14 +560,10 @@ def save(self, *args, **kwargs): @staticmethod def get_for(user, queryset=None): countries_qs = ( - UserCountry.objects.filter(user=user) - .values("country") - .union(Profile.objects.filter(user=user).values("country")) + UserCountry.objects.filter(user=user).values("country").union(Profile.objects.filter(user=user).values("country")) ) return queryset.exclude( - Q(visibility=VisibilityCharChoices.IFRC_NS) & - ~Q(project_country__in=countries_qs) & - ~Q(reporting_ns__in=countries_qs) + Q(visibility=VisibilityCharChoices.IFRC_NS) & ~Q(project_country__in=countries_qs) & ~Q(reporting_ns__in=countries_qs) ) @@ -584,7 +575,7 @@ def get_for(user, queryset=None): # return 'secondary_sectors__title' -@reversion.register(follow=('project',)) +@reversion.register(follow=("project",)) class AnnualSplit(models.Model): """Annual split for Project""" @@ -818,7 +809,7 @@ def __str__(self): return f"{self.latitude} - {self.longitude}" -@reversion.register(follow=('project',)) +@reversion.register(follow=("project",)) class EmergencyProjectActivity(models.Model): class PeopleHouseholds(models.TextChoices): PEOPLE = "people", _("People") @@ -843,12 +834,8 @@ class PeopleHouseholds(models.TextChoices): related_name="activities", ) is_simplified_report = models.BooleanField(verbose_name=_("is_simplified_report"), default=True) - is_disaggregated_for_disabled = models.BooleanField( - verbose_name=_("Is disaggregated for disabled"), null=True, blank=True - ) - has_no_data_on_people_reached = models.BooleanField( - verbose_name=_("Has no data on people reached"), null=True, blank=True - ) + is_disaggregated_for_disabled = models.BooleanField(verbose_name=_("Is disaggregated for disabled"), null=True, blank=True) + has_no_data_on_people_reached = models.BooleanField(verbose_name=_("Has no data on people reached"), null=True, blank=True) # Metrics people_households = models.CharField( max_length=50, @@ -910,12 +897,8 @@ class PeopleHouseholds(models.TextChoices): disabled_other_18_59_count = models.IntegerField(verbose_name=_("Disabled Others/Unknown 18-29"), null=True, blank=True) disabled_other_60_plus_count = models.IntegerField(verbose_name=_("Disabled Others/Unknown 60+"), null=True, blank=True) disabled_male_unknown_age_count = models.IntegerField(verbose_name=_("Disabled Male Unknown Age"), null=True, blank=True) - disabled_female_unknown_age_count = models.IntegerField( - verbose_name=_("Disabled Female Unknown Age"), null=True, blank=True - ) - disabled_other_unknown_age_count = models.IntegerField( - verbose_name=_("Disabled Other Unknown Age"), null=True, blank=True - ) + disabled_female_unknown_age_count = models.IntegerField(verbose_name=_("Disabled Female Unknown Age"), null=True, blank=True) + disabled_other_unknown_age_count = models.IntegerField(verbose_name=_("Disabled Other Unknown Age"), null=True, blank=True) # More Details details = models.TextField(verbose_name=_("details"), blank=True, null=True) diff --git a/deployments/search_indexes.py b/deployments/search_indexes.py index f465d51f0..13b3b26c8 100644 --- a/deployments/search_indexes.py +++ b/deployments/search_indexes.py @@ -1,23 +1,23 @@ from haystack import indexes -from deployments.models import Project, ERU, Personnel +from deployments.models import ERU, Personnel, Project class ProjectIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='name') - event_name = indexes.CharField(model_attr='event__name') - start_date = indexes.DateTimeField(model_attr='start_date', null=True) - end_date = indexes.DateTimeField(model_attr='end_date', null=True) - reporting_ns = indexes.CharField(model_attr='reporting_ns__name') + name = indexes.EdgeNgramField(model_attr="name") + event_name = indexes.CharField(model_attr="event__name") + start_date = indexes.DateTimeField(model_attr="start_date", null=True) + end_date = indexes.DateTimeField(model_attr="end_date", null=True) + reporting_ns = indexes.CharField(model_attr="reporting_ns__name") project_districts = indexes.MultiValueField() - sector = indexes.CharField(model_attr='primary_sector__title') - tags = indexes.MultiValueField(model_attr='secondary_sectors__title') - target_total = indexes.IntegerField(model_attr='target_total', null=True) - event_id = indexes.IntegerField(model_attr='event__id', null=True) - reporting_ns_id = indexes.IntegerField(model_attr='reporting_ns__id') - iso3 = indexes.CharField(model_attr='reporting_ns__iso3', null=True) - visibility = indexes.CharField(model_attr='get_visibility_display', null=True) + sector = indexes.CharField(model_attr="primary_sector__title") + tags = indexes.MultiValueField(model_attr="secondary_sectors__title") + target_total = indexes.IntegerField(model_attr="target_total", null=True) + event_id = indexes.IntegerField(model_attr="event__id", null=True) + reporting_ns_id = indexes.IntegerField(model_attr="reporting_ns__id") + iso3 = indexes.CharField(model_attr="reporting_ns__iso3", null=True) + visibility = indexes.CharField(model_attr="get_visibility_display", null=True) def get_model(self): return Project @@ -31,16 +31,16 @@ def index_queryset(self, using=None): class ERUIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True) - event_name = indexes.EdgeNgramField(model_attr='event__name') - country = indexes.CharField(model_attr='deployed_to__name') - personnel_units = indexes.IntegerField(model_attr='units', null=True) - equipment_units = indexes.IntegerField(model_attr='equipment_units', null=True) - eru_type = indexes.CharField(model_attr='get_type_display') - eru_owner = indexes.CharField(model_attr='eru_owner__national_society_country__society_name') - event_id = indexes.IntegerField(model_attr='event__id', null=True) - country_id = indexes.IntegerField(model_attr='deployed_to__id') - iso3 = indexes.CharField(model_attr='deployed_to__iso3', null=True) - visibility = indexes.CharField(model_attr='event__get_visibility_display', null=True) + event_name = indexes.EdgeNgramField(model_attr="event__name") + country = indexes.CharField(model_attr="deployed_to__name") + personnel_units = indexes.IntegerField(model_attr="units", null=True) + equipment_units = indexes.IntegerField(model_attr="equipment_units", null=True) + eru_type = indexes.CharField(model_attr="get_type_display") + eru_owner = indexes.CharField(model_attr="eru_owner__national_society_country__society_name") + event_id = indexes.IntegerField(model_attr="event__id", null=True) + country_id = indexes.IntegerField(model_attr="deployed_to__id") + iso3 = indexes.CharField(model_attr="deployed_to__iso3", null=True) + visibility = indexes.CharField(model_attr="event__get_visibility_display", null=True) def get_model(self): return ERU @@ -51,18 +51,18 @@ def index_queryset(self, using=None): class PersonnelIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.CharField(model_attr='name', null=True) - start_date = indexes.DateTimeField(model_attr='start_date', null=True) - end_date = indexes.DateTimeField(model_attr='end_date', null=True) - position = indexes.CharField(model_attr='role', null=True) - type = indexes.CharField(model_attr='get_type_display', null=True) - deploying_country_name = indexes.CharField(model_attr='country_from__society_name', null=True) - deploying_country_id = indexes.IntegerField(model_attr='country_from__id', null=True) - deployed_to_country_name = indexes.CharField(model_attr='country_to__name', null=True) - deployed_to_country_id = indexes.IntegerField(model_attr='country_to__id', null=True) - event_name = indexes.EdgeNgramField(model_attr='deployment__event_deployed_to__name') - event_id = indexes.IntegerField(model_attr='deployment__event_deployed_to__id', null=True) - visibility = indexes.CharField(model_attr='deployment__event_deployed_to__get_visibility_display', null=True) + name = indexes.CharField(model_attr="name", null=True) + start_date = indexes.DateTimeField(model_attr="start_date", null=True) + end_date = indexes.DateTimeField(model_attr="end_date", null=True) + position = indexes.CharField(model_attr="role", null=True) + type = indexes.CharField(model_attr="get_type_display", null=True) + deploying_country_name = indexes.CharField(model_attr="country_from__society_name", null=True) + deploying_country_id = indexes.IntegerField(model_attr="country_from__id", null=True) + deployed_to_country_name = indexes.CharField(model_attr="country_to__name", null=True) + deployed_to_country_id = indexes.IntegerField(model_attr="country_to__id", null=True) + event_name = indexes.EdgeNgramField(model_attr="deployment__event_deployed_to__name") + event_id = indexes.IntegerField(model_attr="deployment__event_deployed_to__id", null=True) + visibility = indexes.CharField(model_attr="deployment__event_deployed_to__get_visibility_display", null=True) def get_model(self): return Personnel diff --git a/deployments/serializers.py b/deployments/serializers.py index 3ccb97fe7..e82850cec 100644 --- a/deployments/serializers.py +++ b/deployments/serializers.py @@ -1,123 +1,130 @@ from datetime import datetime, timezone -from django.utils.translation import gettext -from django.contrib.auth.models import User +from django.contrib.auth.models import User +from django.utils.translation import gettext from rest_framework import serializers - -from main.utils import get_merged_items_by_fields -from main.writable_nested_serializers import ( - NestedCreateMixin, - NestedUpdateMixin, -) -from lang.serializers import ModelSerializer from api.serializers import ( DisasterTypeSerializer, ListEventSerializer, - SurgeEventSerializer, - SmallEventForPersonnelCsvSerializer, - MiniEventSerializer, + MiniAdmin2Serializer, MiniCountrySerializer, - NanoCountrySerializer, MiniDistrictSerializer, - MiniAdmin2Serializer + MiniEventSerializer, + NanoCountrySerializer, + SmallEventForPersonnelCsvSerializer, + SurgeEventSerializer, ) +from lang.serializers import ModelSerializer +from main.utils import get_merged_items_by_fields +from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin from .models import ( - AnnualSplit, - ERUOwner, ERU, - PersonnelDeployment, - MolnixTag, - Personnel, - PartnerSocietyActivities, - PartnerSocietyDeployment, - RegionalProject, - Project, + Admin2, + AnnualSplit, + Country, + District, EmergencyProject, - EmergencyProjectActivitySector, + EmergencyProjectActivity, EmergencyProjectActivityAction, EmergencyProjectActivityActionSupply, - EmergencyProjectActivity, EmergencyProjectActivityLocation, + EmergencyProjectActivitySector, + ERUOwner, + Event, + MolnixTag, OperationTypes, + PartnerSocietyActivities, + PartnerSocietyDeployment, + Personnel, + PersonnelDeployment, ProgrammeTypes, - Country, - District, + Project, Region, - Admin2, - Event, + RegionalProject, ) class DeploymentMiniUserSerializer(ModelSerializer): class Meta: model = User - fields = ( - 'id', - 'username', - 'email', - 'first_name', - 'last_name' - ) + fields = ("id", "username", "email", "first_name", "last_name") class ERUSetSerializer(ModelSerializer): deployed_to = MiniCountrySerializer() - type_display = serializers.CharField(source='get_type_display', read_only=True) + type_display = serializers.CharField(source="get_type_display", read_only=True) class Meta: model = ERU - fields = ('type', 'type_display', 'units', 'equipment_units', 'deployed_to', 'event', 'eru_owner', 'available', 'id',) + fields = ( + "type", + "type_display", + "units", + "equipment_units", + "deployed_to", + "event", + "eru_owner", + "available", + "id", + ) class ERUOwnerSerializer(ModelSerializer): - eru = ERUSetSerializer(many=True, source='eru_set') + eru = ERUSetSerializer(many=True, source="eru_set") national_society_country = MiniCountrySerializer() class Meta: model = ERUOwner - fields = ('created_at', 'updated_at', 'national_society_country', 'eru', 'id',) + fields = ( + "created_at", + "updated_at", + "national_society_country", + "eru", + "id", + ) class ERUSerializer(ModelSerializer): deployed_to = MiniCountrySerializer() event = ListEventSerializer(allow_null=True, required=False) eru_owner = ERUOwnerSerializer() - type_display = serializers.CharField(source='get_type_display', read_only=True) + type_display = serializers.CharField(source="get_type_display", read_only=True) class Meta: model = ERU fields = ( - 'type', - 'type_display', - 'units', - 'equipment_units', - 'deployed_to', - 'event', - 'eru_owner', - 'available', - 'id', + "type", + "type_display", + "units", + "equipment_units", + "deployed_to", + "event", + "eru_owner", + "available", + "id", ) class ERUOwnerMiniSerializer(ModelSerializer): - national_society_country_details = MiniCountrySerializer(source='national_society_country', read_only=True) + national_society_country_details = MiniCountrySerializer(source="national_society_country", read_only=True) class Meta: model = ERUOwner - fields = ('id', 'national_society_country_details',) + fields = ( + "id", + "national_society_country_details", + ) class ERUMiniSerializer(ModelSerializer): - eru_owner_details = ERUOwnerMiniSerializer(source='eru_owner', read_only=True) - type_display = serializers.CharField(source='get_type_display', read_only=True) + eru_owner_details = ERUOwnerMiniSerializer(source="eru_owner", read_only=True) + type_display = serializers.CharField(source="get_type_display", read_only=True) class Meta: model = ERU - fields = ( - 'id', 'type', 'type_display', 'units', 'equipment_units', 'eru_owner_details' - ) + fields = ("id", "type", "type_display", "units", "equipment_units", "eru_owner_details") class PersonnelDeploymentSerializer(ModelSerializer): @@ -126,14 +133,20 @@ class PersonnelDeploymentSerializer(ModelSerializer): class Meta: model = PersonnelDeployment - fields = ('country_deployed_to', 'region_deployed_to', 'event_deployed_to', 'comments', 'id',) + fields = ( + "country_deployed_to", + "region_deployed_to", + "event_deployed_to", + "comments", + "id", + ) class MolnixTagSerializer(ModelSerializer): groups = serializers.SerializerMethodField() class Meta: - fields = ('id', 'molnix_id', 'name', 'description', 'color', 'tag_type', 'groups') + fields = ("id", "molnix_id", "name", "description", "color", "tag_type", "groups") model = MolnixTag @staticmethod @@ -148,7 +161,7 @@ class PersonnelDeploymentCsvSerializer(ModelSerializer): class Meta: model = PersonnelDeployment - fields = ('event_deployed_to', ) + fields = ("event_deployed_to",) # 3 versions: a "regular", an Anon(yme) and a Super(user) class: @@ -164,20 +177,33 @@ class PersonnelSerializer(ModelSerializer): class Meta: model = Personnel fields = ( - 'start_date', 'end_date', 'role', 'type', 'country_from', 'country_to', - 'deployment', 'molnix_id', 'molnix_tags', 'is_active', 'id', - 'surge_alert_id', 'appraisal_received', 'gender', 'location', - 'name', 'molnix_status', + "start_date", + "end_date", + "role", + "type", + "country_from", + "country_to", + "deployment", + "molnix_id", + "molnix_tags", + "is_active", + "id", + "surge_alert_id", + "appraisal_received", + "gender", + "location", + "name", + "molnix_status", ) def get_name(self, personnel) -> str: - user = self.context['request'].user + user = self.context["request"].user if user.is_authenticated: return personnel.name return None def get_molnix_status(self, personnel) -> str: - user = self.context['request'].user + user = self.context["request"].user if user.is_authenticated and user.is_superuser: return personnel.molnix_status return None @@ -193,9 +219,22 @@ class PersonnelSerializerAnon(ModelSerializer): class Meta: model = Personnel fields = ( - 'start_date', 'end_date', 'role', 'type', 'country_from', 'country_to', - 'deployment', 'molnix_id', 'molnix_tags', 'is_active', 'id', - 'surge_alert_id', 'appraisal_received', 'gender', 'location', "name", + "start_date", + "end_date", + "role", + "type", + "country_from", + "country_to", + "deployment", + "molnix_id", + "molnix_tags", + "is_active", + "id", + "surge_alert_id", + "appraisal_received", + "gender", + "location", + "name", ) @@ -209,10 +248,23 @@ class PersonnelSerializerSuper(ModelSerializer): class Meta: model = Personnel fields = ( - 'start_date', 'end_date', 'role', 'type', 'country_from', 'country_to', - 'deployment', 'molnix_id', 'molnix_tags', 'is_active', 'id', - 'surge_alert_id', 'appraisal_received', 'gender', 'location', - 'name', 'molnix_status', # 2 plus + "start_date", + "end_date", + "role", + "type", + "country_from", + "country_to", + "deployment", + "molnix_id", + "molnix_tags", + "is_active", + "id", + "surge_alert_id", + "appraisal_received", + "gender", + "location", + "name", + "molnix_status", # 2 plus ) @@ -247,35 +299,35 @@ def get_end_date(obj): @staticmethod def get_molnix_sector(obj): - return obj.get_tags_for_category('molnix_sector') + return obj.get_tags_for_category("molnix_sector") @staticmethod def get_molnix_role_profile(obj): - return obj.get_tags_for_category('molnix_role_profile') + return obj.get_tags_for_category("molnix_role_profile") @staticmethod def get_molnix_language(obj): - return obj.get_tags_for_category('molnix_language') + return obj.get_tags_for_category("molnix_language") @staticmethod def get_molnix_region(obj): - return obj.get_tags_for_category('molnix_region') + return obj.get_tags_for_category("molnix_region") @staticmethod def get_molnix_scope(obj): - return obj.get_tags_for_category('molnix_scope') + return obj.get_tags_for_category("molnix_scope") @staticmethod def get_molnix_modality(obj): - return obj.get_tags_for_category('molnix_modality') + return obj.get_tags_for_category("molnix_modality") @staticmethod def get_molnix_operation(obj): - return obj.get_tags_for_category('molnix_operation') + return obj.get_tags_for_category("molnix_operation") @staticmethod def get_inactive_status(obj): - return obj.molnix_status if obj.molnix_status in ('deleted', 'hidden') else None + return obj.molnix_status if obj.molnix_status in ("deleted", "hidden") else None @staticmethod def get_ongoing(obj): @@ -308,13 +360,30 @@ class PersonnelCsvSerializer(PersonnelCsvSerializerBase): class Meta: model = Personnel fields = ( - 'start_date', 'end_date', - 'name', # plus - 'role', 'type', 'country_from', 'country_to', - 'deployment', 'id', 'is_active', 'molnix_sector', 'molnix_id', - 'molnix_role_profile', 'molnix_language', 'molnix_region', 'molnix_scope', - 'molnix_modality', 'molnix_operation', 'ongoing', 'inactive_status', - 'surge_alert_id', 'appraisal_received', 'gender', 'location', + "start_date", + "end_date", + "name", # plus + "role", + "type", + "country_from", + "country_to", + "deployment", + "id", + "is_active", + "molnix_sector", + "molnix_id", + "molnix_role_profile", + "molnix_language", + "molnix_region", + "molnix_scope", + "molnix_modality", + "molnix_operation", + "ongoing", + "inactive_status", + "surge_alert_id", + "appraisal_received", + "gender", + "location", ) @@ -324,12 +393,29 @@ class PersonnelCsvSerializerAnon(PersonnelCsvSerializerBase): class Meta: model = Personnel fields = ( - 'start_date', 'end_date', - 'role', 'type', 'country_from', 'country_to', - 'deployment', 'id', 'is_active', 'molnix_sector', 'molnix_id', - 'molnix_role_profile', 'molnix_language', 'molnix_region', 'molnix_scope', - 'molnix_modality', 'molnix_operation', 'ongoing', 'inactive_status', - 'surge_alert_id', 'appraisal_received', 'gender', 'location', + "start_date", + "end_date", + "role", + "type", + "country_from", + "country_to", + "deployment", + "id", + "is_active", + "molnix_sector", + "molnix_id", + "molnix_role_profile", + "molnix_language", + "molnix_region", + "molnix_scope", + "molnix_modality", + "molnix_operation", + "ongoing", + "inactive_status", + "surge_alert_id", + "appraisal_received", + "gender", + "location", ) @@ -339,14 +425,31 @@ class PersonnelCsvSerializerSuper(PersonnelCsvSerializerBase): class Meta: model = Personnel fields = ( - 'start_date', 'end_date', - 'name', # plus - 'role', 'type', 'country_from', 'country_to', - 'deployment', 'id', 'is_active', 'molnix_sector', 'molnix_id', - 'molnix_status', # plus - 'molnix_role_profile', 'molnix_language', 'molnix_region', 'molnix_scope', - 'molnix_modality', 'molnix_operation', 'ongoing', 'inactive_status', - 'surge_alert_id', 'appraisal_received', 'gender', 'location', + "start_date", + "end_date", + "name", # plus + "role", + "type", + "country_from", + "country_to", + "deployment", + "id", + "is_active", + "molnix_sector", + "molnix_id", + "molnix_status", # plus + "molnix_role_profile", + "molnix_language", + "molnix_region", + "molnix_scope", + "molnix_modality", + "molnix_operation", + "ongoing", + "inactive_status", + "surge_alert_id", + "appraisal_received", + "gender", + "location", ) @@ -354,7 +457,10 @@ class PartnerDeploymentActivitySerializer(ModelSerializer): class Meta: model = PartnerSocietyActivities - fields = ('activity', 'id',) + fields = ( + "activity", + "id", + ) class PartnerDeploymentTableauSerializer(serializers.ModelSerializer): @@ -365,19 +471,24 @@ class PartnerDeploymentTableauSerializer(serializers.ModelSerializer): @staticmethod def get_district_deployed_to(obj): - district_fields = { - 'name': '' - } + district_fields = {"name": ""} district_deployed_to = obj.district_deployed_to.all() if len(district_deployed_to) > 0: - district_fields['name'] = ', '.join([str(district.name) for district in district_deployed_to]) + district_fields["name"] = ", ".join([str(district.name) for district in district_deployed_to]) return district_fields class Meta: model = PartnerSocietyDeployment fields = ( - 'start_date', 'end_date', 'name', 'role', 'parent_society', 'country_deployed_to', - 'district_deployed_to', 'activity', 'id', + "start_date", + "end_date", + "name", + "role", + "parent_society", + "country_deployed_to", + "district_deployed_to", + "activity", + "id", ) @@ -390,24 +501,39 @@ class PartnerDeploymentSerializer(ModelSerializer): class Meta: model = PartnerSocietyDeployment fields = ( - 'start_date', 'end_date', 'name', 'role', 'parent_society', 'country_deployed_to', - 'district_deployed_to', 'activity', 'id', + "start_date", + "end_date", + "name", + "role", + "parent_society", + "country_deployed_to", + "district_deployed_to", + "activity", + "id", ) class RegionalProjectSerializer(ModelSerializer): class Meta: model = RegionalProject - fields = '__all__' + fields = "__all__" class AnnualSplitSerializer(ModelSerializer): class Meta: model = AnnualSplit fields = ( - 'id', 'year', 'budget_amount', # id: needed for appropriate update - 'target_male', 'target_female', 'target_other', 'target_total', - 'reached_male', 'reached_female', 'reached_other', 'reached_total', + "id", + "year", + "budget_amount", # id: needed for appropriate update + "target_male", + "target_female", + "target_other", + "target_total", + "reached_male", + "reached_female", + "reached_other", + "reached_total", ) @@ -415,8 +541,8 @@ class DeployemntCountrySerializer(serializers.ModelSerializer): class Meta: model = Country fields = ( - 'id', - 'name', + "id", + "name", "iso", "iso3", "society_name", @@ -426,19 +552,13 @@ class Meta: class DeploymentDistrictSerializer(serializers.ModelSerializer): class Meta: model = District - fields = ( - "id", - "name" - ) + fields = ("id", "name") class DeploymentRegionSerializer(serializers.ModelSerializer): class Meta: model = Region - fields = ( - "id", - "name" - ) + fields = ("id", "name") class DeploymentAdmin2Serializer(serializers.ModelSerializer): @@ -465,29 +585,22 @@ class Meta: ) -class ProjectSerializer( - NestedUpdateMixin, - NestedCreateMixin, - ModelSerializer -): - project_country_detail = DeployemntCountrySerializer(source='project_country', read_only=True) - project_districts_detail = DeploymentDistrictSerializer(source='project_districts', read_only=True, many=True) - project_admin2_detail = DeploymentAdmin2Serializer(source='project_admin2', read_only=True, many=True) - reporting_ns_detail = DeployemntCountrySerializer(source='reporting_ns', read_only=True) - dtype_detail = DisasterTypeSerializer(source='dtype', read_only=True) - regional_project_detail = RegionalProjectSerializer(source='regional_project', read_only=True) - event_detail = MiniEventSerializer(source='event', read_only=True) - primary_sector_display = serializers.CharField(source='primary_sector.title', read_only=True) +class ProjectSerializer(NestedUpdateMixin, NestedCreateMixin, ModelSerializer): + project_country_detail = DeployemntCountrySerializer(source="project_country", read_only=True) + project_districts_detail = DeploymentDistrictSerializer(source="project_districts", read_only=True, many=True) + project_admin2_detail = DeploymentAdmin2Serializer(source="project_admin2", read_only=True, many=True) + reporting_ns_detail = DeployemntCountrySerializer(source="reporting_ns", read_only=True) + dtype_detail = DisasterTypeSerializer(source="dtype", read_only=True) + regional_project_detail = RegionalProjectSerializer(source="regional_project", read_only=True) + event_detail = MiniEventSerializer(source="event", read_only=True) + primary_sector_display = serializers.CharField(source="primary_sector.title", read_only=True) secondary_sectors_display = serializers.SerializerMethodField() - programme_type_display = serializers.CharField(source='get_programme_type_display', read_only=True) - operation_type_display = serializers.CharField(source='get_operation_type_display', read_only=True) - status_display = serializers.CharField(source='get_status_display', read_only=True) - visibility_display = serializers.CharField(source='get_visibility_display', read_only=True) - annual_splits = AnnualSplitSerializer( - many=True, - required=False - ) - modified_by_detail = DeploymentMiniUserSerializer(source='modified_by', read_only=True) + programme_type_display = serializers.CharField(source="get_programme_type_display", read_only=True) + operation_type_display = serializers.CharField(source="get_operation_type_display", read_only=True) + status_display = serializers.CharField(source="get_status_display", read_only=True) + visibility_display = serializers.CharField(source="get_visibility_display", read_only=True) + annual_splits = AnnualSplitSerializer(many=True, required=False) + modified_by_detail = DeploymentMiniUserSerializer(source="modified_by", read_only=True) @staticmethod def get_secondary_sectors_display(obj) -> list: @@ -495,56 +608,58 @@ def get_secondary_sectors_display(obj) -> list: class Meta: model = Project - fields = '__all__' - read_only_fields = ('user', 'modified_by') + fields = "__all__" + read_only_fields = ("user", "modified_by") extra_kwargs = { field: { - 'allow_null': False, 'required': True, - } for field in ( - 'reporting_ns', - 'name', - 'project_country', - 'programme_type', - 'primary_sector', - 'project_districts', + "allow_null": False, + "required": True, + } + for field in ( + "reporting_ns", + "name", + "project_country", + "programme_type", + "primary_sector", + "project_districts", ) } def validate(self, data): - d_project_districts = data['project_districts'] + d_project_districts = data["project_districts"] # Override country with district's country if isinstance(d_project_districts, list) and len(d_project_districts): - data['project_country'] = data['project_districts'][0].country - for project in data['project_districts'][1:]: - if project.country != data['project_country']: - raise serializers.ValidationError(gettext('Different country found for given districts')) + data["project_country"] = data["project_districts"][0].country + for project in data["project_districts"][1:]: + if project.country != data["project_country"]: + raise serializers.ValidationError(gettext("Different country found for given districts")) if ( - data['operation_type'] == OperationTypes.EMERGENCY_OPERATION and - data['programme_type'] == ProgrammeTypes.MULTILATERAL and - data.get('event') is None + data["operation_type"] == OperationTypes.EMERGENCY_OPERATION + and data["programme_type"] == ProgrammeTypes.MULTILATERAL + and data.get("event") is None ): raise serializers.ValidationError( - gettext('Event should be provided if operation type is Emergency Operation and programme type is Multilateral') + gettext("Event should be provided if operation type is Emergency Operation and programme type is Multilateral") ) return data def create(self, validated_data): project = super().create(validated_data) # create does not bear the non-Project extra fields (which are needed for AnnualSplits), so we must đouble: - if self.context and 'request' in self.context: - if 'is_annual_report' in self.context['request'].data: - project.is_annual_report = self.context['request'].data['is_annual_report'] + if self.context and "request" in self.context: + if "is_annual_report" in self.context["request"].data: + project.is_annual_report = self.context["request"].data["is_annual_report"] # if 'annual_split_detail' in self.context['request'].data: # project.annual_split_detail = self.context['request'].data['annual_split_detail'] - project.user = self.context['request'].user + project.user = self.context["request"].user project.save() return project def update(self, instance, validated_data): - validated_data['modified_by'] = self.context['request'].user - if self.context and 'request' in self.context: # code đuplication - if 'is_annual_report' in self.context['request'].data: - validated_data['is_annual_report'] = self.context['request'].data['is_annual_report'] + validated_data["modified_by"] = self.context["request"].user + if self.context and "request" in self.context: # code đuplication + if "is_annual_report" in self.context["request"].data: + validated_data["is_annual_report"] = self.context["request"].data["is_annual_report"] # if 'annual_split_detail' in self.context['request'].data: # validated_data['annual_split_detail'] = self.context['request'].data['annual_split_detail'] return super().update(instance, validated_data) @@ -557,22 +672,19 @@ class ProjectCsvSerializer(ProjectSerializer): class Meta: model = Project - exclude = ['project_districts'] + exclude = ["project_districts"] @staticmethod def get_secondary_sectors(obj): - return ', '.join([str(t.id) for t in obj.secondary_sectors.all()]) + return ", ".join([str(t.id) for t in obj.secondary_sectors.all()]) @staticmethod def get_secondary_sectors_display(obj): - return ', '.join([t.title for t in obj.secondary_sectors.all()]) + return ", ".join([t.title for t in obj.secondary_sectors.all()]) @staticmethod def get_project_districts_detail(obj): - return get_merged_items_by_fields( - obj.project_districts.all(), - ['name', 'code', 'id', 'is_enclave', 'is_deprecated'] - ) + return get_merged_items_by_fields(obj.project_districts.all(), ["name", "code", "id", "is_enclave", "is_deprecated"]) class CharKeyValueSerializer(serializers.Serializer): @@ -583,8 +695,8 @@ class CharKeyValueSerializer(serializers.Serializer): def choices_to_data(choices): return [ { - 'key': key, - 'value': value, + "key": key, + "value": value, } for key, value in choices ] @@ -594,40 +706,39 @@ def choices_to_data(choices): class EmergencyProjectActivitySectorSerializer(ModelSerializer): class Meta: model = EmergencyProjectActivitySector - fields = ('id', 'title', 'order',) + fields = ( + "id", + "title", + "order", + ) class EmergencyProjectActivityActionSupplySerializer(ModelSerializer): class Meta: model = EmergencyProjectActivityActionSupply - fields = ('id', 'title', 'order',) + fields = ( + "id", + "title", + "order", + ) class EmergencyProjectActivityActionSerializer(ModelSerializer): supplies_details = EmergencyProjectActivityActionSupplySerializer( - source='supplies', + source="supplies", read_only=True, many=True, ) class Meta: model = EmergencyProjectActivityAction - fields = ( - 'id', - 'sector', - 'title', - 'order', - 'supplies_details', - 'description', - 'is_cash_type', - 'has_location' - ) + fields = ("id", "sector", "title", "order", "supplies_details", "description", "is_cash_type", "has_location") class EmergencyProjectActivityLocationSerializer(ModelSerializer): class Meta: model = EmergencyProjectActivityLocation - fields = '__all__' + fields = "__all__" class EmergencyProjectOptionsSerializer(serializers.Serializer): @@ -635,40 +746,36 @@ class EmergencyProjectOptionsSerializer(serializers.Serializer): actions = EmergencyProjectActivityActionSerializer(read_only=True, many=True) -class EmergencyProjectActivitySerializer( - NestedUpdateMixin, - NestedCreateMixin, - ModelSerializer -): +class EmergencyProjectActivitySerializer(NestedUpdateMixin, NestedCreateMixin, ModelSerializer): supplies = serializers.DictField(child=serializers.IntegerField(), required=False) - custom_supplies = serializers.DictField(child=serializers.IntegerField(),) + custom_supplies = serializers.DictField( + child=serializers.IntegerField(), + ) points = EmergencyProjectActivityLocationSerializer(many=True, required=False) - sector_details = EmergencyProjectActivitySectorSerializer(source='sector', read_only=True) - action_details = EmergencyProjectActivityActionSerializer(source='action', read_only=True) + sector_details = EmergencyProjectActivitySectorSerializer(source="sector", read_only=True) + action_details = EmergencyProjectActivityActionSerializer(source="action", read_only=True) class Meta: model = EmergencyProjectActivity - exclude = ('project',) + exclude = ("project",) def validate(self, data): - sector = data.get('sector', self.instance and self.instance.sector) - action = data.get('action', self.instance and self.instance.action) - supplies = data.get('supplies') + sector = data.get("sector", self.instance and self.instance.sector) + action = data.get("action", self.instance and self.instance.action) + supplies = data.get("supplies") if action: - data['sector'] = sector = action.sector + data["sector"] = sector = action.sector if sector is None: - raise serializers.ValidationError({ - 'sector': gettext('This is required, Or provide a valid action.') - }) + raise serializers.ValidationError({"sector": gettext("This is required, Or provide a valid action.")}) if supplies: supplies_keys = supplies.keys() - action_supplies_id = list(action.supplies.values_list('id', flat=True)) + action_supplies_id = list(action.supplies.values_list("id", flat=True)) if invalid_keys := [key for key in supplies_keys if int(key) not in action_supplies_id]: - raise serializers.ValidationError({ - 'supplies': gettext( - 'Invalid supplies keys: %s' % ', '.join(invalid_keys) - ), - }) + raise serializers.ValidationError( + { + "supplies": gettext("Invalid supplies keys: %s" % ", ".join(invalid_keys)), + } + ) return data @@ -677,67 +784,96 @@ class EmergencyProjectSerializer( NestedCreateMixin, ModelSerializer, ): - created_by_details = DeploymentMiniUserSerializer(source='created_by', read_only=True) - modified_by_details = DeploymentMiniUserSerializer(source='modified_by', read_only=True) - event_details = MiniEventSerializer(source='event', read_only=True) - reporting_ns_details = MiniCountrySerializer(source='reporting_ns', read_only=True, allow_null=True, required=False) - deployed_eru_details = ERUMiniSerializer(source='deployed_eru', read_only=True) - districts_details = MiniDistrictSerializer(source='districts', read_only=True, many=True) - admin2_details = MiniAdmin2Serializer(source='admin2', read_only=True, many=True) + created_by_details = DeploymentMiniUserSerializer(source="created_by", read_only=True) + modified_by_details = DeploymentMiniUserSerializer(source="modified_by", read_only=True) + event_details = MiniEventSerializer(source="event", read_only=True) + reporting_ns_details = MiniCountrySerializer(source="reporting_ns", read_only=True, allow_null=True, required=False) + deployed_eru_details = ERUMiniSerializer(source="deployed_eru", read_only=True) + districts_details = MiniDistrictSerializer(source="districts", read_only=True, many=True) + admin2_details = MiniAdmin2Serializer(source="admin2", read_only=True, many=True) activities = EmergencyProjectActivitySerializer(many=True, required=False) # Enums - activity_lead_display = serializers.CharField(source='get_activity_lead_display', read_only=True) - status_display = serializers.CharField(source='get_status_display', read_only=True) - country_details = MiniCountrySerializer(source='country', read_only=True) - visibility_display = serializers.CharField(source='get_visibility_display', read_only=True) + activity_lead_display = serializers.CharField(source="get_activity_lead_display", read_only=True) + status_display = serializers.CharField(source="get_status_display", read_only=True) + country_details = MiniCountrySerializer(source="country", read_only=True) + visibility_display = serializers.CharField(source="get_visibility_display", read_only=True) class Meta: model = EmergencyProject fields = ( - 'id', 'created_by_details', 'modified_by_details', 'reporting_ns_details', - 'deployed_eru_details', 'districts_details', 'activities', 'event_details', - 'activity_lead_display', 'status_display', 'country_details', 'visibility_display', - 'title', 'activity_lead', 'reporting_ns', 'event', 'country', 'districts', 'status', - 'created_at', 'modified_at', 'start_date', 'end_date', 'admin2', 'admin2_details', - 'reporting_ns_contact_name', 'reporting_ns_contact_role', - 'reporting_ns_contact_email', 'deployed_eru', + "id", + "created_by_details", + "modified_by_details", + "reporting_ns_details", + "deployed_eru_details", + "districts_details", + "activities", + "event_details", + "activity_lead_display", + "status_display", + "country_details", + "visibility_display", + "title", + "activity_lead", + "reporting_ns", + "event", + "country", + "districts", + "status", + "created_at", + "modified_at", + "start_date", + "end_date", + "admin2", + "admin2_details", + "reporting_ns_contact_name", + "reporting_ns_contact_role", + "reporting_ns_contact_email", + "deployed_eru", ) # '__all__' | Both X_details + X fields are needed: outgoing + incoming data. read_only_fields = ( - 'created_by', - 'created_at', - 'modified_by', - 'modified_at', + "created_by", + "created_at", + "modified_by", + "modified_at", ) def validate(self, data): - reporting_ns = data.get('reporting_ns', self.instance and self.instance.reporting_ns) - deployed_eru = data.get('deployed_eru', self.instance and self.instance.deployed_eru) - country = data.get('country', None) - for district in data.get('districts') or []: + reporting_ns = data.get("reporting_ns", self.instance and self.instance.reporting_ns) + deployed_eru = data.get("deployed_eru", self.instance and self.instance.deployed_eru) + country = data.get("country", None) + for district in data.get("districts") or []: if district.country_id != country.id: - raise serializers.ValidationError({ - 'districts': gettext("All region/province should be from selected country"), - }) - if data['activity_lead'] == EmergencyProject.ActivityLead.NATIONAL_SOCIETY: + raise serializers.ValidationError( + { + "districts": gettext("All region/province should be from selected country"), + } + ) + if data["activity_lead"] == EmergencyProject.ActivityLead.NATIONAL_SOCIETY: if reporting_ns is None: - raise serializers.ValidationError({ - 'reporting_ns': gettext('Reporting NS is required when National Society is leading the activity'), - }) + raise serializers.ValidationError( + { + "reporting_ns": gettext("Reporting NS is required when National Society is leading the activity"), + } + ) else: if deployed_eru is None: - raise serializers.ValidationError({ - 'deployed_eru': gettext('Deployed ERU is required when Deployed ERU is leading the activity'), - }) + raise serializers.ValidationError( + { + "deployed_eru": gettext("Deployed ERU is required when Deployed ERU is leading the activity"), + } + ) return data def create(self, validated_data): - validated_data['created_by'] = self.context['request'].user + validated_data["created_by"] = self.context["request"].user return super().create(validated_data) def update(self, instance, validated_data): - validated_data['modified_by'] = self.context['request'].user + validated_data["modified_by"] = self.context["request"].user return super().update(instance, validated_data) + # ------ Emergency Project -- [End] @@ -761,13 +897,9 @@ class GlobalProjectNSOngoingProjectsStatsSerializer(serializers.Serializer): ongoing_projects = serializers.IntegerField(allow_null=True, required=False) target_total = serializers.IntegerField(allow_null=True, required=False) budget_amount_total = serializers.IntegerField(allow_null=True, required=False) - operation_types = serializers.ListField( - child=serializers.IntegerField(), required=False, allow_null=True - ) + operation_types = serializers.ListField(child=serializers.IntegerField(), required=False, allow_null=True) projects_per_sector = ProjectPerSector(many=True, required=False) - operation_types_display = serializers.ListField( - child=serializers.CharField(), required=False, allow_null=True - ) + operation_types_display = serializers.ListField(child=serializers.CharField(), required=False, allow_null=True) class OverviewProjectsPerSector(serializers.Serializer): diff --git a/deployments/snapshots/snap_tests.py b/deployments/snapshots/snap_tests.py index 575365af3..14b8ee66d 100644 --- a/deployments/snapshots/snap_tests.py +++ b/deployments/snapshots/snap_tests.py @@ -4,397 +4,253 @@ from snapshottest import Snapshot - snapshots = Snapshot() -snapshots['TestProjectAPI::test_global_project_api 1'] = { - 'ns_with_ongoing_activities': 16, - 'projects_per_programme_type': [ - { - 'count': 6, - 'programme_type': 0, - 'programme_type_display': 'Bilateral' - }, - { - 'count': 3, - 'programme_type': 1, - 'programme_type_display': 'Multilateral' - }, - { - 'count': 7, - 'programme_type': 2, - 'programme_type_display': 'Domestic' - } - ], - 'projects_per_secondary_sectors': [ +snapshots["TestProjectAPI::test_global_project_api 1"] = { + "ns_with_ongoing_activities": 16, + "projects_per_programme_type": [ + {"count": 6, "programme_type": 0, "programme_type_display": "Bilateral"}, + {"count": 3, "programme_type": 1, "programme_type_display": "Multilateral"}, + {"count": 7, "programme_type": 2, "programme_type_display": "Domestic"}, ], - 'projects_per_sector': [ - { - 'count': 16, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } + "projects_per_secondary_sectors": [], + "projects_per_sector": [ + {"count": 16, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} ], - 'target_total': 0, - 'total_ongoing_projects': 16 + "target_total": 0, + "total_ongoing_projects": 16, } -snapshots['TestProjectAPI::test_global_project_api 2'] = [ +snapshots["TestProjectAPI::test_global_project_api 2"] = [ { - 'budget_amount_total': 7890000, - 'id': 5, - 'iso3': 'YvZ', - 'name': 'country-SZuAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkg', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-JNSRTdkyOaZfjEMBfeqoxfMcUyzNPHsTMdXlOFCamQZHsmcYMG', - 'target_total': 0 + "budget_amount_total": 7890000, + "id": 5, + "iso3": "YvZ", + "name": "country-SZuAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkg", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-JNSRTdkyOaZfjEMBfeqoxfMcUyzNPHsTMdXlOFCamQZHsmcYMG", + "target_total": 0, }, { - 'budget_amount_total': 720000, - 'id': 7, - 'iso3': 'kfs', - 'name': 'country-ZwjrVnVzStakFageXSAHAPsUBklxlTimFlGhCKnlmdVlZWmqAC', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-fyhrevbLpEFRWgadrWaQLYcgnHYayMHWrFEWvMBvxRvupxQzyN', - 'target_total': 0 + "budget_amount_total": 720000, + "id": 7, + "iso3": "kfs", + "name": "country-ZwjrVnVzStakFageXSAHAPsUBklxlTimFlGhCKnlmdVlZWmqAC", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-fyhrevbLpEFRWgadrWaQLYcgnHYayMHWrFEWvMBvxRvupxQzyN", + "target_total": 0, }, { - 'budget_amount_total': 4740000, - 'id': 9, - 'iso3': 'hWp', - 'name': 'country-FSBAdOgXrUUrqOGvAQqwfagTZFpLFoLBQrgXTFJMKyMHQycMgL', - 'ongoing_projects': 1, - 'operation_types': [ - 0 - ], - 'operation_types_display': [ - 'Programme' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-xLRTMAzTVcwPYCDKHczZOVXBQbnKlbOvgsAZbUDqwRwwprCYdu', - 'target_total': 0 + "budget_amount_total": 4740000, + "id": 9, + "iso3": "hWp", + "name": "country-FSBAdOgXrUUrqOGvAQqwfagTZFpLFoLBQrgXTFJMKyMHQycMgL", + "ongoing_projects": 1, + "operation_types": [0], + "operation_types_display": ["Programme"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-xLRTMAzTVcwPYCDKHczZOVXBQbnKlbOvgsAZbUDqwRwwprCYdu", + "target_total": 0, }, { - 'budget_amount_total': 1510000, - 'id': 11, - 'iso3': 'upQ', - 'name': 'country-jfwLeHpiSEbcdrzABgtvOLbWeYhdCLFQDhqcbVPqLpIXJeTKWS', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-TeuYlcqNMGcZLtPMFzYMHFOoPemDLCRhAyMJVsgAygjnFsdFEK', - 'target_total': 0 + "budget_amount_total": 1510000, + "id": 11, + "iso3": "upQ", + "name": "country-jfwLeHpiSEbcdrzABgtvOLbWeYhdCLFQDhqcbVPqLpIXJeTKWS", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-TeuYlcqNMGcZLtPMFzYMHFOoPemDLCRhAyMJVsgAygjnFsdFEK", + "target_total": 0, }, { - 'budget_amount_total': 2590000, - 'id': 13, - 'iso3': 'DUn', - 'name': 'country-HMXjEmKAVfuMCBqXaumRPVuACdVEGMDFTvwqkBeLTbpYHqjlEn', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-ldTllPjEggWeDxPFBMhFgBkdXskNIxhsrJzKJocxlgBLanLZll', - 'target_total': 0 + "budget_amount_total": 2590000, + "id": 13, + "iso3": "DUn", + "name": "country-HMXjEmKAVfuMCBqXaumRPVuACdVEGMDFTvwqkBeLTbpYHqjlEn", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-ldTllPjEggWeDxPFBMhFgBkdXskNIxhsrJzKJocxlgBLanLZll", + "target_total": 0, }, { - 'budget_amount_total': 4880000, - 'id': 15, - 'iso3': 'Rap', - 'name': 'country-pUBMSvIcwbWUYtuZdxUcMlIrzDkUadDmrlWMWmKcSDCoVFjLur', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-JbeAivJwhwcRiSSOatvbQlJgtnvoeiDMqXRRRRooWFNWvmfZUU', - 'target_total': 0 + "budget_amount_total": 4880000, + "id": 15, + "iso3": "Rap", + "name": "country-pUBMSvIcwbWUYtuZdxUcMlIrzDkUadDmrlWMWmKcSDCoVFjLur", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-JbeAivJwhwcRiSSOatvbQlJgtnvoeiDMqXRRRRooWFNWvmfZUU", + "target_total": 0, }, { - 'budget_amount_total': 6060000, - 'id': 17, - 'iso3': 'ZEZ', - 'name': 'country-SQTvZhsNCjqMSdmiiprEFesBYNvcLpTwuxwSCcjccAhEqemAtq', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-zhXkgJKpQMfOjERUWYaAubCVzgjkjIPpPTObxyssAJSwpQaqxx', - 'target_total': 0 + "budget_amount_total": 6060000, + "id": 17, + "iso3": "ZEZ", + "name": "country-SQTvZhsNCjqMSdmiiprEFesBYNvcLpTwuxwSCcjccAhEqemAtq", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-zhXkgJKpQMfOjERUWYaAubCVzgjkjIPpPTObxyssAJSwpQaqxx", + "target_total": 0, }, { - 'budget_amount_total': 1230000, - 'id': 19, - 'iso3': 'zEf', - 'name': 'country-hpQyDQuMgAtrSOKhumYjUhJPbggmdHuingwzIXkpslIqTaUijU', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-OpXkaiupWqkpIBCZcCEybtXiNUmPOQQLWIFOTBTzEtdISFFiec', - 'target_total': 0 + "budget_amount_total": 1230000, + "id": 19, + "iso3": "zEf", + "name": "country-hpQyDQuMgAtrSOKhumYjUhJPbggmdHuingwzIXkpslIqTaUijU", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-OpXkaiupWqkpIBCZcCEybtXiNUmPOQQLWIFOTBTzEtdISFFiec", + "target_total": 0, }, { - 'budget_amount_total': 1150000, - 'id': 21, - 'iso3': 'Bzu', - 'name': 'country-GtArEivAdsyZDGkPcRnBNbzSguTYSwcQlzepqbSNEofijYXRdT', - 'ongoing_projects': 1, - 'operation_types': [ - 0 - ], - 'operation_types_display': [ - 'Programme' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-sPauoVOlrkOPhSAKrovoSkGVBeDJQaxJepHcvColhoyXZCJWPJ', - 'target_total': 0 + "budget_amount_total": 1150000, + "id": 21, + "iso3": "Bzu", + "name": "country-GtArEivAdsyZDGkPcRnBNbzSguTYSwcQlzepqbSNEofijYXRdT", + "ongoing_projects": 1, + "operation_types": [0], + "operation_types_display": ["Programme"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-sPauoVOlrkOPhSAKrovoSkGVBeDJQaxJepHcvColhoyXZCJWPJ", + "target_total": 0, }, { - 'budget_amount_total': 8860000, - 'id': 23, - 'iso3': 'CQe', - 'name': 'country-qWYnIFiQbCuCMmUgtPtqPMrZYZhLTKyQruRKWWPylOqQmJraKT', - 'ongoing_projects': 1, - 'operation_types': [ - 0 - ], - 'operation_types_display': [ - 'Programme' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-wCoQOAHvaPCduRhIjwfPhYbmfPIBCibEwLgrrVxABeNAZzUDRy', - 'target_total': 0 + "budget_amount_total": 8860000, + "id": 23, + "iso3": "CQe", + "name": "country-qWYnIFiQbCuCMmUgtPtqPMrZYZhLTKyQruRKWWPylOqQmJraKT", + "ongoing_projects": 1, + "operation_types": [0], + "operation_types_display": ["Programme"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-wCoQOAHvaPCduRhIjwfPhYbmfPIBCibEwLgrrVxABeNAZzUDRy", + "target_total": 0, }, { - 'budget_amount_total': 2410000, - 'id': 25, - 'iso3': 'uBA', - 'name': 'country-icmMwRdPTZdCGBCCvvacXumVuEYOOyTdPozCnnyerlqErfwWfB', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-TePrGXYYSkSqPpAtIveCHkSCRxVFEmdWyeqzbfFQqXfMytbUdd', - 'target_total': 0 + "budget_amount_total": 2410000, + "id": 25, + "iso3": "uBA", + "name": "country-icmMwRdPTZdCGBCCvvacXumVuEYOOyTdPozCnnyerlqErfwWfB", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-TePrGXYYSkSqPpAtIveCHkSCRxVFEmdWyeqzbfFQqXfMytbUdd", + "target_total": 0, }, { - 'budget_amount_total': 4770000, - 'id': 27, - 'iso3': 'rMT', - 'name': 'country-OaaikPCKBXkVrtvlCGsmaSaoMIFGOWcAYsBvKtVMfQWIAIPUtM', - 'ongoing_projects': 1, - 'operation_types': [ - 0 - ], - 'operation_types_display': [ - 'Programme' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-mSlanULjkyJzGEbPRnExxVYFIxYsuETSyunaLjqVAsnbGhoijl', - 'target_total': 0 + "budget_amount_total": 4770000, + "id": 27, + "iso3": "rMT", + "name": "country-OaaikPCKBXkVrtvlCGsmaSaoMIFGOWcAYsBvKtVMfQWIAIPUtM", + "ongoing_projects": 1, + "operation_types": [0], + "operation_types_display": ["Programme"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-mSlanULjkyJzGEbPRnExxVYFIxYsuETSyunaLjqVAsnbGhoijl", + "target_total": 0, }, { - 'budget_amount_total': 1590000, - 'id': 29, - 'iso3': 'nUd', - 'name': 'country-vywZNUlnadilslioCfzytonQUmVZSwfZMNNCOVkeeeuiNkCWaY', - 'ongoing_projects': 1, - 'operation_types': [ - 0 - ], - 'operation_types_display': [ - 'Programme' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-AZEBOqidOTSYhUXfFWSpececNhbRXqzcdvlPctLvyAIZzTwfbm', - 'target_total': 0 + "budget_amount_total": 1590000, + "id": 29, + "iso3": "nUd", + "name": "country-vywZNUlnadilslioCfzytonQUmVZSwfZMNNCOVkeeeuiNkCWaY", + "ongoing_projects": 1, + "operation_types": [0], + "operation_types_display": ["Programme"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-AZEBOqidOTSYhUXfFWSpececNhbRXqzcdvlPctLvyAIZzTwfbm", + "target_total": 0, }, { - 'budget_amount_total': 8470000, - 'id': 31, - 'iso3': 'tSc', - 'name': 'country-UMYoFEUEYltXVlqkEGtYSelIQFOAXYgiWVGjBgkrTLNJDCMKMs', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-ATJhlDwzfUascJBEmjuYHzGrHebykrDeywzNmOWSYYIVAuelbv', - 'target_total': 0 + "budget_amount_total": 8470000, + "id": 31, + "iso3": "tSc", + "name": "country-UMYoFEUEYltXVlqkEGtYSelIQFOAXYgiWVGjBgkrTLNJDCMKMs", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-ATJhlDwzfUascJBEmjuYHzGrHebykrDeywzNmOWSYYIVAuelbv", + "target_total": 0, }, { - 'budget_amount_total': 1940000, - 'id': 33, - 'iso3': 'qdv', - 'name': 'country-gEjLhkzKGguporwomItnbNOiAMDGGPmnhdTlXdGvSjcPxzqvNH', - 'ongoing_projects': 1, - 'operation_types': [ - 1 - ], - 'operation_types_display': [ - 'Emergency Operation' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-IZwBwUNxfLEVqSpXMXwcqsWTQOQtTSKUYiWRbLxruxrMflWHne', - 'target_total': 0 + "budget_amount_total": 1940000, + "id": 33, + "iso3": "qdv", + "name": "country-gEjLhkzKGguporwomItnbNOiAMDGGPmnhdTlXdGvSjcPxzqvNH", + "ongoing_projects": 1, + "operation_types": [1], + "operation_types_display": ["Emergency Operation"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-IZwBwUNxfLEVqSpXMXwcqsWTQOQtTSKUYiWRbLxruxrMflWHne", + "target_total": 0, }, { - 'budget_amount_total': 3090000, - 'id': 35, - 'iso3': 'BZd', - 'name': 'country-ETrgvqBqljxxKiiFeNlOaEtrfQgsRHykMQTFGmiOGsumHhWkWK', - 'ongoing_projects': 1, - 'operation_types': [ - 0 - ], - 'operation_types_display': [ - 'Programme' - ], - 'projects_per_sector': [ - { - 'count': 1, - 'primary_sector': 1, - 'primary_sector_display': 'sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx' - } - ], - 'society_name': 'society-name-rSaSXZWbVLJLoVBIUCceEjexSfIqPYDWsqYcdduqRpPfQkikTA', - 'target_total': 0 - } + "budget_amount_total": 3090000, + "id": 35, + "iso3": "BZd", + "name": "country-ETrgvqBqljxxKiiFeNlOaEtrfQgsRHykMQTFGmiOGsumHhWkWK", + "ongoing_projects": 1, + "operation_types": [0], + "operation_types_display": ["Programme"], + "projects_per_sector": [ + {"count": 1, "primary_sector": 1, "primary_sector_display": "sect-zoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYx"} + ], + "society_name": "society-name-rSaSXZWbVLJLoVBIUCceEjexSfIqPYDWsqYcdduqRpPfQkikTA", + "target_total": 0, + }, ] -snapshots['TestProjectAPI::test_personnel_csv_api 1'] = '''event_id,event_glide_id,event_name,event_ifrc_severity_level,event_disaster_type,event_country_name,event_country_iso3,event_country_nationalsociety,event_country_regionname,role,type,surge_alert_id,appraisal_received,gender,location,deployed_id,deployed_to_name,deployed_to_iso3,deployed_to_nationalsociety,deployed_to_regionname,deployed_from_name,deployed_from_iso3,deployed_from_nationalsociety,deployed_from_regionname,start_date,end_date,ongoing,is_active,name,molnix_status,molnix_id,molnix_sector,molnix_role_profile,molnix_language,molnix_region,molnix_scope,molnix_modality,molnix_operation\r +snapshots[ + "TestProjectAPI::test_personnel_csv_api 1" +] = """event_id,event_glide_id,event_name,event_ifrc_severity_level,event_disaster_type,event_country_name,event_country_iso3,event_country_nationalsociety,event_country_regionname,role,type,surge_alert_id,appraisal_received,gender,location,deployed_id,deployed_to_name,deployed_to_iso3,deployed_to_nationalsociety,deployed_to_regionname,deployed_from_name,deployed_from_iso3,deployed_from_nationalsociety,deployed_from_regionname,start_date,end_date,ongoing,is_active,name,molnix_status,molnix_id,molnix_sector,molnix_role_profile,molnix_language,molnix_region,molnix_scope,molnix_modality,molnix_operation\r ,,,,,,,,,,,,False,,,1,,,,,,,,,,,True,True,,,,,,,,,,\r ,,,,,,,,,,,,False,,,2,,,,,,,,,,,True,True,,,,,,,,,,\r ,,,,,,,,,,,,False,,,3,,,,,,,,,,,True,True,,,,,,,,,,\r @@ -405,92 +261,81 @@ ,,,,,,,,,,,,False,,,8,,,,,,,,,,,True,True,,,,,,,,,,\r ,,,,,,,,,,,,False,,,9,,,,,,,,,,,True,True,,,,,,,,,,\r ,,,,,,,,,,,,False,,,10,,,,,,,,,,,True,True,,,,,,,,,,\r -''' +""" -snapshots['TestProjectAPI::test_project_create 1'] = { - 'actual_expenditure': 0, - 'annual_splits': [ - ], - 'budget_amount': 7530000, - 'description': '', - 'document': None, - 'dtype': None, - 'dtype_detail': None, - 'end_date': '2008-01-01', - 'event': None, - 'event_detail': None, - 'id': 1, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'modified_by': None, - 'modified_by_detail': None, - 'name': 'Mock Project for Create API Test', - 'operation_type': 0, - 'operation_type_display': 'Programme', - 'primary_sector': 1, - 'primary_sector_display': 'sect-blDLTmDfquSPTYkTUhfhTCOxfHTyUYGNkyJycXkvKQjkjlXTdA', - 'programme_type': 2, - 'programme_type_display': 'Domestic', - 'project_admin2': [ - ], - 'project_admin2_detail': [ - ], - 'project_country': 1, - 'project_country_detail': { - 'id': 1, - 'iso': 'nC', - 'iso3': 'MEE', - 'name': 'country-jlkxMThQoAZvUhEREEnLkPAbpciKLkiOGcKjdkqlHzMKObUUQs', - 'society_name': 'society-name-koAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGWhfEQiM' +snapshots["TestProjectAPI::test_project_create 1"] = { + "actual_expenditure": 0, + "annual_splits": [], + "budget_amount": 7530000, + "description": "", + "document": None, + "dtype": None, + "dtype_detail": None, + "end_date": "2008-01-01", + "event": None, + "event_detail": None, + "id": 1, + "modified_at": "2008-01-01T00:00:00.123456Z", + "modified_by": None, + "modified_by_detail": None, + "name": "Mock Project for Create API Test", + "operation_type": 0, + "operation_type_display": "Programme", + "primary_sector": 1, + "primary_sector_display": "sect-blDLTmDfquSPTYkTUhfhTCOxfHTyUYGNkyJycXkvKQjkjlXTdA", + "programme_type": 2, + "programme_type_display": "Domestic", + "project_admin2": [], + "project_admin2_detail": [], + "project_country": 1, + "project_country_detail": { + "id": 1, + "iso": "nC", + "iso3": "MEE", + "name": "country-jlkxMThQoAZvUhEREEnLkPAbpciKLkiOGcKjdkqlHzMKObUUQs", + "society_name": "society-name-koAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGWhfEQiM", }, - 'project_districts': [ - 1 - ], - 'project_districts_detail': [ - { - 'id': 1, - 'name': 'district-DpBzXcMVyUuzNVKMIHPTYcHgCDcpHIzVcJyHWOdmsCztXsDkBs' - } - ], - 'reached_female': 0, - 'reached_male': 0, - 'reached_other': 0, - 'reached_total': 0, - 'regional_project': None, - 'regional_project_detail': None, - 'reporting_ns': 1, - 'reporting_ns_contact_email': None, - 'reporting_ns_contact_name': None, - 'reporting_ns_contact_role': None, - 'reporting_ns_detail': { - 'id': 1, - 'iso': 'nC', - 'iso3': 'MEE', - 'name': 'country-jlkxMThQoAZvUhEREEnLkPAbpciKLkiOGcKjdkqlHzMKObUUQs', - 'society_name': 'society-name-koAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGWhfEQiM' + "project_districts": [1], + "project_districts_detail": [{"id": 1, "name": "district-DpBzXcMVyUuzNVKMIHPTYcHgCDcpHIzVcJyHWOdmsCztXsDkBs"}], + "reached_female": 0, + "reached_male": 0, + "reached_other": 0, + "reached_total": 0, + "regional_project": None, + "regional_project_detail": None, + "reporting_ns": 1, + "reporting_ns_contact_email": None, + "reporting_ns_contact_name": None, + "reporting_ns_contact_role": None, + "reporting_ns_detail": { + "id": 1, + "iso": "nC", + "iso3": "MEE", + "name": "country-jlkxMThQoAZvUhEREEnLkPAbpciKLkiOGcKjdkqlHzMKObUUQs", + "society_name": "society-name-koAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGWhfEQiM", }, - 'secondary_sectors': [ - 1, - 2 - ], - 'secondary_sectors_display': [ - 'sect-tag-tUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMapJrNOJndljdPwcj', - 'sect-tag-QKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEihSrvHAHnS' + "secondary_sectors": [1, 2], + "secondary_sectors_display": [ + "sect-tag-tUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMapJrNOJndljdPwcj", + "sect-tag-QKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEihSrvHAHnS", ], - 'start_date': '2008-01-01', - 'status': 1, - 'status_display': 'Ongoing', - 'target_female': 0, - 'target_male': 0, - 'target_other': 0, - 'target_total': 0, - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False, - 'user': 5, - 'visibility': 'public', - 'visibility_display': 'Public' + "start_date": "2008-01-01", + "status": 1, + "status_display": "Ongoing", + "target_female": 0, + "target_male": 0, + "target_other": 0, + "target_total": 0, + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, + "user": 5, + "visibility": "public", + "visibility_display": "Public", } -snapshots['TestProjectAPI::test_project_csv_api 1'] = '''actual_expenditure,budget_amount,description,document,dtype,dtype_detail.id,dtype_detail.name,dtype_detail.summary,dtype_detail.translation_module_original_language,end_date,event,event_detail.dtype,event_detail.emergency_response_contact_email,event_detail.id,event_detail.name,event_detail.parent_event,event_detail.slug,event_detail.start_date,event_detail.translation_module_original_language,id,modified_at,modified_by,modified_by_detail,name,operation_type,operation_type_display,primary_sector,primary_sector_display,programme_type,programme_type_display,project_country,project_country_detail.id,project_country_detail.iso,project_country_detail.iso3,project_country_detail.name,project_country_detail.society_name,project_districts_detail.code,project_districts_detail.id,project_districts_detail.is_deprecated,project_districts_detail.is_enclave,project_districts_detail.name,reached_female,reached_male,reached_other,reached_total,regional_project,regional_project_detail.created_at,regional_project_detail.id,regional_project_detail.modified_at,regional_project_detail.name,regional_project_detail.translation_module_original_language,regional_project_detail.translation_module_skip_auto_translation,reporting_ns,reporting_ns_contact_email,reporting_ns_contact_name,reporting_ns_contact_role,reporting_ns_detail.id,reporting_ns_detail.iso,reporting_ns_detail.iso3,reporting_ns_detail.name,reporting_ns_detail.society_name,secondary_sectors,secondary_sectors_display,start_date,status,status_display,target_female,target_male,target_other,target_total,translation_module_original_language,translation_module_skip_auto_translation,user,visibility,visibility_display\r +snapshots[ + "TestProjectAPI::test_project_csv_api 1" +] = """actual_expenditure,budget_amount,description,document,dtype,dtype_detail.id,dtype_detail.name,dtype_detail.summary,dtype_detail.translation_module_original_language,end_date,event,event_detail.dtype,event_detail.emergency_response_contact_email,event_detail.id,event_detail.name,event_detail.parent_event,event_detail.slug,event_detail.start_date,event_detail.translation_module_original_language,id,modified_at,modified_by,modified_by_detail,name,operation_type,operation_type_display,primary_sector,primary_sector_display,programme_type,programme_type_display,project_country,project_country_detail.id,project_country_detail.iso,project_country_detail.iso3,project_country_detail.name,project_country_detail.society_name,project_districts_detail.code,project_districts_detail.id,project_districts_detail.is_deprecated,project_districts_detail.is_enclave,project_districts_detail.name,reached_female,reached_male,reached_other,reached_total,regional_project,regional_project_detail.created_at,regional_project_detail.id,regional_project_detail.modified_at,regional_project_detail.name,regional_project_detail.translation_module_original_language,regional_project_detail.translation_module_skip_auto_translation,reporting_ns,reporting_ns_contact_email,reporting_ns_contact_name,reporting_ns_contact_role,reporting_ns_detail.id,reporting_ns_detail.iso,reporting_ns_detail.iso3,reporting_ns_detail.name,reporting_ns_detail.society_name,secondary_sectors,secondary_sectors_display,start_date,status,status_display,target_female,target_male,target_other,target_total,translation_module_original_language,translation_module_skip_auto_translation,user,visibility,visibility_display\r 0,3070000,,,3,3,disaster-type-zjivfEKVdJzqfzGBXSiWiEJmFzPKmJNVHpperXBuRKfhQABxwm,uwMPbXtkwNZCNjCcomRxjWUfhVdpNjsavSZhtCEbvnVInnIHWqJENUjSSQbyLQHcqkdsmYSNrdDPaeyQrQQxgbsPyoyGTguFMIflmGDJTbcpHtvFzVkbwRwwOtpGrZdOqybJrojvzQifUyHRNORoApKjBtMvCIinPiLIRZmitSTHiBXjPKkueJIUhlujUbWuAAtCVOVrjXmgilbWNNrMKNoMooRbwfSXEiGMETPxlyFEikmocAWarAoVQmWnelCNFSuDpBzXcMVyUuzNVKMIHPTYcHgCDcpHIzVcJyHWOdmsCztXsDkBsNdSHjDPCfUGhlXLSIizAuCblDLTmDfquSPTYkTUhfhTCOxfHTyUYGNkyJycXkvKQjkjlXTdAttUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMapJrNOJndljdPwcjcQKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEihSrvHAHnSnNdgKUOHfEUSMYTsB,en,2008-01-01,2,1,,2,event-silUaSKzXKclMuZNoOKgFjvVepwukOfTQOUvCaqnpSewqYgUad,1,ycuakafywiygeykpwrokcezcsbuqgevkykuejfvmnetbbpkmbk,,en,1,2008-01-01T00:00:00.123456Z,,,project-MuqHKNwiNKFHUOFFZlNoTsmahbDOYhVnZNAAcvwJZOnaOmSsqY,1,Emergency Operation,1,sect-uVAlmiYIxHGrkqEZsVvZhDejWoRURzZJxfYzaqIhDxRVRqLyOx,0,Bilateral,3,3,gZ,UEW,country-mdryRMMcemZWLUQJnEnvtanmVhVWEpSMTnzpJuXsyDIPwtqxGF,society-name-unxuAcKoVjbqJLLUAsjmvoyKpFJPRvqWFUPVFDkUYwkiUIFlIP,"CefuMjeirN, QWBUdsMtwg","1, 2","False, True","False, True","district-hQbiawYYpLublqdiVAHhVeECXxGLgCGoNcUYQHtDPbdEzBRgFT, district-gYShPPXJUnBCoAvDzAUguBuQqxjREefffBgVVxZiJdLJJvQhAw",0,0,0,0,1,2008-01-01T00:00:00.123456Z,1,2008-01-01T00:00:00.123456Z,regional-project-vREEZcPiEjODIvDYAVdHtKURuJIbnKRvZYwejrbvyOIkKMylMh,en,False,2,,,,2,Mf,djk,country-WrKoZBJXNNRPJbMQSrblrSWtvwaljKQzejVObfVHnyADvkxtUu,society-name-WNdRfrCQBFMCArnWGhwBhsRRLFHQtcozMdantnXiWqsuhaFVBl,"1, 2","sect-tag-RoEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSx, sect-tag-CCpxgRxIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZ",2008-01-01,1,Ongoing,0,0,0,0,en,False,5,public,Public\r 0,7190000,,,6,6,disaster-type-xVZxVXLHMxpPrnLyfgiOVMhcLPmmTCgeINvtUEWmIUjcimAJTq,WJwxCOThBeEAHGYbkMrSiscKdYSmVzFRIGekCWGyJXyzMrnlakKnLSaYGDGTUHqtosTrJhkocIpscOjrirYdPpnIhaPwOMxufTJqUiANsudOawoUrlqbIQXXLgUVSyPqOOMJnCournLOZWzjCoUUBxjEfFlDllmKFUlPsbtklzRMmejeBpDPzgUHiUWZaMgyybhaWPcipXfrjOMaYaYgIVvTfmiEWKCktvEjpdISrOIhbcgIsgGAjaoboByjwPsoRyRThFkhogsweNvhxfcMjlBHvMlRBjQRtNswgrFQxqZTZeYajXPjujyCUYYEehKBUrjfuilXywuFBESAMYOviZPpyAJFIIFIIoyfLTAHKXSZVoSfpxanbxJEihdwxXisDjJApnodVihSTjyUbSBxdSgQLeEMkbjxjfpeaKAjWlEViVHStEAUvCYPSashjdPcMWlGkazBRDJTqKGtToBkrfHyiVnzNdozlVJMeSDEuPPzykdZxPBm,en,2008-01-01,4,4,,4,event-fvuzXkBdzWcQPjKdOTZQHsAzRSJtUVuwarHNjSzCPnINYNPCSw,3,zypzxmtfcivyuuvihisnfgjthvwokbbyilqpxtubghudxqogwh,,en,2,2008-01-01T00:00:00.123456Z,,,project-rggexMXvbpskIgenMaWtmJmOcprfKKcKYEcduftawWszGmuWzU,0,Programme,1,sect-uVAlmiYIxHGrkqEZsVvZhDejWoRURzZJxfYzaqIhDxRVRqLyOx,1,Multilateral,5,5,gI,Lwj,country-REShxGUKbqkLdjuDSiwkdrxAOwdssHOeGmXOlWgMWkIuuRZtrR,society-name-aiHsxXFAvkgnjGomYJNSHITJSWZhADehibEwtSxiCMHWvlTtbV,"CefuMjeirN, QWBUdsMtwg","1, 2","False, True","False, True","district-hQbiawYYpLublqdiVAHhVeECXxGLgCGoNcUYQHtDPbdEzBRgFT, district-gYShPPXJUnBCoAvDzAUguBuQqxjREefffBgVVxZiJdLJJvQhAw",0,0,0,0,2,2008-01-01T00:00:00.123456Z,2,2008-01-01T00:00:00.123456Z,regional-project-kjRDfOfTonZRPjXTkGHUMPHXvCYivsxNBcTXRypnNMejKOFgZa,en,False,4,,,,4,at,cRM,country-uTcrAfFpxCtnHtlhxYcXmfCGbZEGjmvEUHtXujXgHRinUcDyTH,society-name-fvDcgHXQVtbKWtOnummsrIuXCQhrjkrhaNJGgnIwJurjTZsKpk,"1, 2","sect-tag-RoEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSx, sect-tag-CCpxgRxIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZ",2008-01-01,1,Ongoing,0,0,0,0,en,False,6,public,Public\r 0,9720000,,,9,9,disaster-type-hYQmOusTYYfwMZFbNLAkxqmGrHbFukdPpStqCBvcrVWQDQfvJc,iNaVKbtymEyycSRrSyvxZGYBATviwUqJmFsrfCQfZQuGhbZiZWgpelxejKZpXfeaUaVZvNejLODOvYQgNhdTimVflfTfaBYRondTfyuOHmEmTFMTlEsURLdClGaflmqjIKmShSWemluWokzOLsMAGOsnBqwVpHaPRqsWkedeFwUdNWBfRWTCaVRfuLXxSRMReKqUuCwVZExFtWFuIVmoLkcSwADDuYzDDCjjVWyAbiYuyOjzxaBYQljLlngbzEjrvmbFzktJromFMUFBBkFQdwgeuTEMsjpHFZnAFatOkvOtRNBNhMiHsvUxZSixKEebCxApnuSouOEYrJvKYvSmiuYOKoTLNppFKEbuGgyWjNufHFDMUreCyXmYXrTjxXdEpoOauwNEJjYruFuMImZPmMMhsUdVmHZGspYyBSatqnjsbbPPWAfxDXjCOyJkMCWugrDrmTMDskLiubhduJExjuUyJbOBPuzluNWcPsuKWKcGdUTTiFee,en,2008-01-01,6,7,,6,event-nDqchHQOlEiDLuxKyQLcuSgOwakAEvvPglwtkDIlWbCZNDLKSB,5,uzepquxmverztcowggabxrkzlbkgktmshmkwiiqvydftyxjzwd,,en,3,2008-01-01T00:00:00.123456Z,,,project-ijgHkTpfWxwvfAvWeFzIdHAPYzSjJfnCkhWqopdPRJbdPSoEcc,0,Programme,1,sect-uVAlmiYIxHGrkqEZsVvZhDejWoRURzZJxfYzaqIhDxRVRqLyOx,0,Bilateral,7,7,we,AMV,country-osqyTwekseIKpHNGtzNdIShLEqPbcvAqmvWdinJUvWQdpFeZKN,society-name-NfJEirUcgcFGoPwBEtYobdbXYZmIMyRRVbJEdyXySiBSBJihCh,"CefuMjeirN, QWBUdsMtwg","1, 2","False, True","False, True","district-hQbiawYYpLublqdiVAHhVeECXxGLgCGoNcUYQHtDPbdEzBRgFT, district-gYShPPXJUnBCoAvDzAUguBuQqxjREefffBgVVxZiJdLJJvQhAw",0,0,0,0,3,2008-01-01T00:00:00.123456Z,3,2008-01-01T00:00:00.123456Z,regional-project-QTSAJecmLcnoLFawSfLxGkznjIaOVNsrJxGykmWMqvmuqzhPsC,en,False,6,,,,6,Rc,NPd,country-ZYfFgDukskerKxwfelTXDqEqWCPihKFcxszANRiCxGNuxfRAGC,society-name-VYpSJajgsykKzeoyDQfwDDPIDgflUgzXBmzveuvMFnSVEhrDcI,"1, 2","sect-tag-RoEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSx, sect-tag-CCpxgRxIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZ",2008-01-01,1,Ongoing,0,0,0,0,en,False,7,public,Public\r @@ -501,523 +346,466 @@ 0,4040000,,,24,24,disaster-type-grNLQtclZmimwJxLowGdSnQVOvPkGHbvbZFucFTQGfLROCZnxq,YYsiwlrTSEFFEqsXrKyqYLpctBsZddBayKIGiytIBiVQDxZxZnFDLoYJwPsPZybLgihbqbDkxqZwUmMBcfWBdKNojOVqDbCKjzixQYgTEsmhRzXdnixdPoVRSXLtpROMGHqrjDJKwjRpBfYFLqKAUqvZtMSVwTNwDUGhlCUmUgFTsRUQZjCUgHoijRrbknMnzQiEygDArTbXQrcrUyvQxgfkJyoGfhbwaiTZiITMkcEXPsROvLwkYHTiCXAFEYrlnNnuSqnWoODmUYiTCHnMAXVLlfwhcaiyaFCWkeqmOOqSHyKQYyYvnFexwEphbwlaJKJmeJDobQZKxdENnoDCogiNEmrfVtHvdXkRSDQxMOSbHjAITbaMdEjlbJPOEfkWhHLWrwlpMPSuKAXcipneuZNXNHUDwhDxCYNbmkmaJHIdYBaMseDvakYUrhobdCGOIBFPwHSYFuvRIvaLvKWgtvcsNClpzANsRziClGBvgIhsXSictYoP,en,2008-01-01,16,22,,16,event-yHiZdtHhYScKpdwtHsTCnHwCWFMCnLZHVjrTvORupHgxfIkFjR,15,mwgibrilwggvlxxpdraxhyhqufvvlcpdghkbuunvtqvgdygrzv,,en,8,2008-01-01T00:00:00.123456Z,,,project-JrWQucRSqzjgFyqQmsMmKsgBYTWyCqcCJRJRSAKGVSxIuCrNeW,0,Programme,1,sect-uVAlmiYIxHGrkqEZsVvZhDejWoRURzZJxfYzaqIhDxRVRqLyOx,0,Bilateral,17,17,hY,sQv,country-dyLxeBuFRfkhhJBdPeIfhQUiQTPXoRNMomdluwLVGXFLUidBYj,society-name-MBJQSGSMgbLTyOgKWzJdswbwkfejWdnYBaHhzYrXgSJXaqqVYZ,"CefuMjeirN, QWBUdsMtwg","1, 2","False, True","False, True","district-hQbiawYYpLublqdiVAHhVeECXxGLgCGoNcUYQHtDPbdEzBRgFT, district-gYShPPXJUnBCoAvDzAUguBuQqxjREefffBgVVxZiJdLJJvQhAw",0,0,0,0,8,2008-01-01T00:00:00.123456Z,8,2008-01-01T00:00:00.123456Z,regional-project-nDEdekrKnhBVrwRQMHjqpCIarCascEOLmyweZGCxzYLlBSLiWd,en,False,16,,,,16,IS,jRx,country-RuHaYbLFerPdJAmplntnbZWzvIXFssSISHJmNPkpDvMUaKFljH,society-name-JvVrwuhnNXhKAYbntHkXWpBFIJnJTFmzKOmjpIbcqSpAqCxHtA,"1, 2","sect-tag-RoEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSx, sect-tag-CCpxgRxIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZ",2008-01-01,1,Ongoing,0,0,0,0,en,False,12,public,Public\r 0,3440000,,,27,27,disaster-type-jYVfDhWksXoxyBGQZpYVdnjwWmyKxTjxuICUVyFnuUaEJWfVdQ,FlHSoPMtZDyrUAVRelRyfqNSOYMnQzQpgXKzlCvzStqoLWcLueOMvzznbdPzmyjThYdwReyqdCGDVZTPdtGgfnVPxWWmSUEVOQOpMAxkEOkWZMuLVIzCDESdvxtHLLTXcEflSLMyMWMgusTJlEadQiKpnXSgnizGKmEqAbkepBWIIsexFEfSiVMeHrlSOPxeULwYAWfEBQxvJMkjoSxxiSIuJFQbBmaYQjXjJXTlMoZpwjICHNFgxUmwZMPAtFkAHQtVFrArRxucDRjHpgWahJwURdHIdIEuzVtwWbVRvIhPauHagaJPJRAFMFZqqFBfLnCIZXUJBymyYOsyWvpootCCrVKAomEKjjYSBkGhNewalnFsnJOFpsudukhMsauOaqEiWAbNEPKBkMerwLFCpAybKIWVuLhMJfCWtFUoyBxnNCPHHwHCZtGVMRRwPxChphZONIqqqYUMyeBpKulvEqEEErpCOkfjoGrGDCxyeYNfJWKHEvxF,en,2008-01-01,18,25,,18,event-mjTqVviSCSvACgLOvdZYUpdxzGDJdDYeiSXzvjsNsYIMeGwkZU,17,mgpggkateuhrldcfarkfpzufawcawigkitzwygkpuqrtkqbikt,,en,9,2008-01-01T00:00:00.123456Z,,,project-LQIoiUlMcOXbduLauswVhCoyuJxscuUKeKortlsAiQVEgimNop,1,Emergency Operation,1,sect-uVAlmiYIxHGrkqEZsVvZhDejWoRURzZJxfYzaqIhDxRVRqLyOx,0,Bilateral,19,19,Dd,Qzr,country-MCpUiJlKbhSJpiaxgfWkemqbBmyIbeNMcxbltczueeREOTrEZe,society-name-IwZCKBGJzmOQfkYYqdCVQMbtOtIRfpIQHhKdhgWrvSAFYSzDCA,"CefuMjeirN, QWBUdsMtwg","1, 2","False, True","False, True","district-hQbiawYYpLublqdiVAHhVeECXxGLgCGoNcUYQHtDPbdEzBRgFT, district-gYShPPXJUnBCoAvDzAUguBuQqxjREefffBgVVxZiJdLJJvQhAw",0,0,0,0,9,2008-01-01T00:00:00.123456Z,9,2008-01-01T00:00:00.123456Z,regional-project-GlUThMzaHFJFWOuOEGPJjXSYEmDBpdLEDoLPGUpByAbKFQKFGZ,en,False,18,,,,18,cS,nbm,country-EnvXFhjxyElejpabJXvDQGKwYLhxojTtlvXyybaLIYUavFZInA,society-name-repOzvPmiLGuBUIrNRMCUZCbVFZcBcbFrygrYppCcdYrULfUQF,"1, 2","sect-tag-RoEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSx, sect-tag-CCpxgRxIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZ",2008-01-01,1,Ongoing,0,0,0,0,en,False,13,public,Public\r 0,7510000,,,30,30,disaster-type-ZHVErDkMfTSoghkywNSCtyandiRngieFHhCYWbtlTpiFuHIJff,IuNZkbAnbqhywiDkzfJKgaKwogcbeDMQlWueozOkjmIPbenQCclbKPJfMtaeWryNyfTpzcDFjFkcOVsxdSTKJaBVnSRwopnxbhzTlAiuectKryhFpcxQeZUvgnoQibLzCmdLYjsaEtfOmvKORAAvppKdoYyoQHxErmoMgLuGbSabYJtgzjRyFxcfTtBHpPhrzxaYboKqXOxxGTRUTsyVsPkdgGgWPMbinkagywgMHJMazVbMhFXwcDvhVLkyDEOwZbrzgzPkQjROGOsmUMRBwBIVOJWOFYkajaqJFfboyYRvosFyWsfqsYjUTVEhRLCsvnesxLxwaJddjONbBULwtEmuBqiZCSiLqnAOfcYNbKHkqudPHhqTBQtCcjmAaCshFdYBaklxkvumQQfmqVfCAllIbKwteFxrRcgypCNcwXJrJkJhCmNnnWNVzNOgbWWIkZLBPQwBgiZdYysyrUAEyqDJwykvdJqwdVRePtpYKLKjwDaLLkGB,en,2008-01-01,20,28,,20,event-nHyvrSLBzdkPufrpvIUcrEfeJTbYctvdfuVpeThKuNOAdjEzMX,19,mzsrywffmbaduqgvyjuewarkltzqwdylqqvsgawhxuwfvqgvhk,,en,10,2008-01-01T00:00:00.123456Z,,,project-hajHwOvWgqpHRjuRvjaplRUIWAvKhIWhKYHcXwlHnZMXcvmaBF,0,Programme,1,sect-uVAlmiYIxHGrkqEZsVvZhDejWoRURzZJxfYzaqIhDxRVRqLyOx,0,Bilateral,21,21,KS,CrP,country-FtFpprSoxPPMEpBWMEcgQBGXxjxpeQZSEZudqaYKnEbfVhHuNz,society-name-bVNwkKbuUYQwcMwEKjGeHrCUjyzGdznVMMOlseBOgfMwrcZSUU,"CefuMjeirN, QWBUdsMtwg","1, 2","False, True","False, True","district-hQbiawYYpLublqdiVAHhVeECXxGLgCGoNcUYQHtDPbdEzBRgFT, district-gYShPPXJUnBCoAvDzAUguBuQqxjREefffBgVVxZiJdLJJvQhAw",0,0,0,0,10,2008-01-01T00:00:00.123456Z,10,2008-01-01T00:00:00.123456Z,regional-project-LjSSeLPhVbvaFgLDcMwFsWtwTrbBLhtpGDZBEnJPtphXSOuVZx,en,False,20,,,,20,un,LJX,country-PsrxQcCTiMzkNUXVbRfbCNoTlSjzwjCHkwsypbvNtQfVwBFheD,society-name-UYCkrZOuJfTLYJDQcGQGtaFvTuWmSJZaxmVzvNOEjBHnNxcXDV,"1, 2","sect-tag-RoEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSx, sect-tag-CCpxgRxIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZ",2008-01-01,1,Ongoing,0,0,0,0,en,False,14,public,Public\r -''' +""" -snapshots['TestProjectAPI::test_project_delete 1'] = b'' +snapshots["TestProjectAPI::test_project_delete 1"] = b"" -snapshots['TestProjectAPI::test_project_list_one 1'] = { - 'count': 1, - 'next': None, - 'previous': None, - 'results': [ +snapshots["TestProjectAPI::test_project_list_one 1"] = { + "count": 1, + "next": None, + "previous": None, + "results": [ { - 'actual_expenditure': 0, - 'annual_splits': [ - ], - 'budget_amount': 6440000, - 'description': '', - 'document': None, - 'dtype': 3, - 'dtype_detail': { - 'id': 3, - 'name': 'disaster-type-MSVGtSJuTVJOnmnNTsRwRiTPlGISOuThWwJELKQTARVIsBZaHg', - 'summary': 'byjdQdmrWYksRqjdSYsnWIcwCgNRVJoVPJypGYYZSsSQdyyAYRuJdaVqmNXCoOTTPxWLIVMmXUmsClRellVGhycBrJqikLqavDTjcjuMdXONQtFYKJweYTuHolHeYGkAIIzfwonQvvxsnWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRhIaPUNeWVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHq', - 'translation_module_original_language': 'en' + "actual_expenditure": 0, + "annual_splits": [], + "budget_amount": 6440000, + "description": "", + "document": None, + "dtype": 3, + "dtype_detail": { + "id": 3, + "name": "disaster-type-MSVGtSJuTVJOnmnNTsRwRiTPlGISOuThWwJELKQTARVIsBZaHg", + "summary": "byjdQdmrWYksRqjdSYsnWIcwCgNRVJoVPJypGYYZSsSQdyyAYRuJdaVqmNXCoOTTPxWLIVMmXUmsClRellVGhycBrJqikLqavDTjcjuMdXONQtFYKJweYTuHolHeYGkAIIzfwonQvvxsnWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRhIaPUNeWVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHq", + "translation_module_original_language": "en", }, - 'end_date': '2008-01-01', - 'event': 2, - 'event_detail': { - 'countries_for_preview': [ - ], - 'dtype': 1, - 'emergency_response_contact_email': None, - 'id': 2, - 'name': 'event-xNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHChRnT', - 'parent_event': 1, - 'slug': 'lffgczddigadkdjdrztubzqavnlecbwseideecsalxixpupaxy', - 'start_date': None, - 'translation_module_original_language': 'en' + "end_date": "2008-01-01", + "event": 2, + "event_detail": { + "countries_for_preview": [], + "dtype": 1, + "emergency_response_contact_email": None, + "id": 2, + "name": "event-xNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHChRnT", + "parent_event": 1, + "slug": "lffgczddigadkdjdrztubzqavnlecbwseideecsalxixpupaxy", + "start_date": None, + "translation_module_original_language": "en", }, - 'id': 1, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'modified_by': None, - 'modified_by_detail': None, - 'name': 'project-yoHzwwFYEMaGiCkoeGPrnjlkxMThQoAZvUhEREEnLkPAbpciKL', - 'operation_type': 0, - 'operation_type_display': 'Programme', - 'primary_sector': 1, - 'primary_sector_display': 'sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf', - 'programme_type': 0, - 'programme_type_display': 'Bilateral', - 'project_admin2': [ - ], - 'project_admin2_detail': [ - ], - 'project_country': 2, - 'project_country_detail': { - 'id': 2, - 'iso': 'Cp', - 'iso3': 'xgR', - 'name': 'country-oEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSxn', - 'society_name': 'society-name-xIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZlhQbia' + "id": 1, + "modified_at": "2008-01-01T00:00:00.123456Z", + "modified_by": None, + "modified_by_detail": None, + "name": "project-yoHzwwFYEMaGiCkoeGPrnjlkxMThQoAZvUhEREEnLkPAbpciKL", + "operation_type": 0, + "operation_type_display": "Programme", + "primary_sector": 1, + "primary_sector_display": "sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf", + "programme_type": 0, + "programme_type_display": "Bilateral", + "project_admin2": [], + "project_admin2_detail": [], + "project_country": 2, + "project_country_detail": { + "id": 2, + "iso": "Cp", + "iso3": "xgR", + "name": "country-oEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSxn", + "society_name": "society-name-xIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZlhQbia", }, - 'project_districts': [ - ], - 'project_districts_detail': [ - ], - 'reached_female': 0, - 'reached_male': 0, - 'reached_other': 0, - 'reached_total': 0, - 'regional_project': 1, - 'regional_project_detail': { - 'created_at': '2008-01-01T00:00:00.123456Z', - 'id': 1, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'name': 'regional-project-fnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGW', - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False + "project_districts": [], + "project_districts_detail": [], + "reached_female": 0, + "reached_male": 0, + "reached_other": 0, + "reached_total": 0, + "regional_project": 1, + "regional_project_detail": { + "created_at": "2008-01-01T00:00:00.123456Z", + "id": 1, + "modified_at": "2008-01-01T00:00:00.123456Z", + "name": "regional-project-fnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGW", + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, }, - 'reporting_ns': 1, - 'reporting_ns_contact_email': None, - 'reporting_ns_contact_name': None, - 'reporting_ns_contact_role': None, - 'reporting_ns_detail': { - 'id': 1, - 'iso': 'yr', - 'iso3': 'OSJ', - 'name': 'country-wMqZcUDIhyfJsONxKmTecQoXsfogyrDOxkxwnQrSRPeMOkIUpk', - 'society_name': 'society-name-oRuXXdocZuzrenKTunPFzPDjqipVJIqVLBLzxoiGFfWdhjOkYR' + "reporting_ns": 1, + "reporting_ns_contact_email": None, + "reporting_ns_contact_name": None, + "reporting_ns_contact_role": None, + "reporting_ns_detail": { + "id": 1, + "iso": "yr", + "iso3": "OSJ", + "name": "country-wMqZcUDIhyfJsONxKmTecQoXsfogyrDOxkxwnQrSRPeMOkIUpk", + "society_name": "society-name-oRuXXdocZuzrenKTunPFzPDjqipVJIqVLBLzxoiGFfWdhjOkYR", }, - 'secondary_sectors': [ - ], - 'secondary_sectors_display': [ - ], - 'start_date': '2008-01-01', - 'status': 1, - 'status_display': 'Ongoing', - 'target_female': 0, - 'target_male': 0, - 'target_other': 0, - 'target_total': 0, - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False, - 'user': 5, - 'visibility': 'public', - 'visibility_display': 'Public' + "secondary_sectors": [], + "secondary_sectors_display": [], + "start_date": "2008-01-01", + "status": 1, + "status_display": "Ongoing", + "target_female": 0, + "target_male": 0, + "target_other": 0, + "target_total": 0, + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, + "user": 5, + "visibility": "public", + "visibility_display": "Public", } - ] + ], } -snapshots['TestProjectAPI::test_project_list_two 1'] = { - 'count': 2, - 'next': None, - 'previous': None, - 'results': [ +snapshots["TestProjectAPI::test_project_list_two 1"] = { + "count": 2, + "next": None, + "previous": None, + "results": [ { - 'actual_expenditure': 0, - 'annual_splits': [ - ], - 'budget_amount': 6440000, - 'description': '', - 'document': None, - 'dtype': 3, - 'dtype_detail': { - 'id': 3, - 'name': 'disaster-type-MSVGtSJuTVJOnmnNTsRwRiTPlGISOuThWwJELKQTARVIsBZaHg', - 'summary': 'byjdQdmrWYksRqjdSYsnWIcwCgNRVJoVPJypGYYZSsSQdyyAYRuJdaVqmNXCoOTTPxWLIVMmXUmsClRellVGhycBrJqikLqavDTjcjuMdXONQtFYKJweYTuHolHeYGkAIIzfwonQvvxsnWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRhIaPUNeWVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHq', - 'translation_module_original_language': 'en' + "actual_expenditure": 0, + "annual_splits": [], + "budget_amount": 6440000, + "description": "", + "document": None, + "dtype": 3, + "dtype_detail": { + "id": 3, + "name": "disaster-type-MSVGtSJuTVJOnmnNTsRwRiTPlGISOuThWwJELKQTARVIsBZaHg", + "summary": "byjdQdmrWYksRqjdSYsnWIcwCgNRVJoVPJypGYYZSsSQdyyAYRuJdaVqmNXCoOTTPxWLIVMmXUmsClRellVGhycBrJqikLqavDTjcjuMdXONQtFYKJweYTuHolHeYGkAIIzfwonQvvxsnWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRhIaPUNeWVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHq", + "translation_module_original_language": "en", }, - 'end_date': '2008-01-01', - 'event': 2, - 'event_detail': { - 'countries_for_preview': [ - ], - 'dtype': 1, - 'emergency_response_contact_email': None, - 'id': 2, - 'name': 'event-xNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHChRnT', - 'parent_event': 1, - 'slug': 'lffgczddigadkdjdrztubzqavnlecbwseideecsalxixpupaxy', - 'start_date': None, - 'translation_module_original_language': 'en' + "end_date": "2008-01-01", + "event": 2, + "event_detail": { + "countries_for_preview": [], + "dtype": 1, + "emergency_response_contact_email": None, + "id": 2, + "name": "event-xNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHChRnT", + "parent_event": 1, + "slug": "lffgczddigadkdjdrztubzqavnlecbwseideecsalxixpupaxy", + "start_date": None, + "translation_module_original_language": "en", }, - 'id': 1, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'modified_by': None, - 'modified_by_detail': None, - 'name': 'project-yoHzwwFYEMaGiCkoeGPrnjlkxMThQoAZvUhEREEnLkPAbpciKL', - 'operation_type': 0, - 'operation_type_display': 'Programme', - 'primary_sector': 1, - 'primary_sector_display': 'sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf', - 'programme_type': 0, - 'programme_type_display': 'Bilateral', - 'project_admin2': [ - ], - 'project_admin2_detail': [ - ], - 'project_country': 2, - 'project_country_detail': { - 'id': 2, - 'iso': 'Cp', - 'iso3': 'xgR', - 'name': 'country-oEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSxn', - 'society_name': 'society-name-xIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZlhQbia' + "id": 1, + "modified_at": "2008-01-01T00:00:00.123456Z", + "modified_by": None, + "modified_by_detail": None, + "name": "project-yoHzwwFYEMaGiCkoeGPrnjlkxMThQoAZvUhEREEnLkPAbpciKL", + "operation_type": 0, + "operation_type_display": "Programme", + "primary_sector": 1, + "primary_sector_display": "sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf", + "programme_type": 0, + "programme_type_display": "Bilateral", + "project_admin2": [], + "project_admin2_detail": [], + "project_country": 2, + "project_country_detail": { + "id": 2, + "iso": "Cp", + "iso3": "xgR", + "name": "country-oEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSxn", + "society_name": "society-name-xIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZlhQbia", }, - 'project_districts': [ - ], - 'project_districts_detail': [ - ], - 'reached_female': 0, - 'reached_male': 0, - 'reached_other': 0, - 'reached_total': 0, - 'regional_project': 1, - 'regional_project_detail': { - 'created_at': '2008-01-01T00:00:00.123456Z', - 'id': 1, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'name': 'regional-project-fnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGW', - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False + "project_districts": [], + "project_districts_detail": [], + "reached_female": 0, + "reached_male": 0, + "reached_other": 0, + "reached_total": 0, + "regional_project": 1, + "regional_project_detail": { + "created_at": "2008-01-01T00:00:00.123456Z", + "id": 1, + "modified_at": "2008-01-01T00:00:00.123456Z", + "name": "regional-project-fnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGW", + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, }, - 'reporting_ns': 1, - 'reporting_ns_contact_email': None, - 'reporting_ns_contact_name': None, - 'reporting_ns_contact_role': None, - 'reporting_ns_detail': { - 'id': 1, - 'iso': 'yr', - 'iso3': 'OSJ', - 'name': 'country-wMqZcUDIhyfJsONxKmTecQoXsfogyrDOxkxwnQrSRPeMOkIUpk', - 'society_name': 'society-name-oRuXXdocZuzrenKTunPFzPDjqipVJIqVLBLzxoiGFfWdhjOkYR' + "reporting_ns": 1, + "reporting_ns_contact_email": None, + "reporting_ns_contact_name": None, + "reporting_ns_contact_role": None, + "reporting_ns_detail": { + "id": 1, + "iso": "yr", + "iso3": "OSJ", + "name": "country-wMqZcUDIhyfJsONxKmTecQoXsfogyrDOxkxwnQrSRPeMOkIUpk", + "society_name": "society-name-oRuXXdocZuzrenKTunPFzPDjqipVJIqVLBLzxoiGFfWdhjOkYR", }, - 'secondary_sectors': [ - ], - 'secondary_sectors_display': [ - ], - 'start_date': '2008-01-01', - 'status': 1, - 'status_display': 'Ongoing', - 'target_female': 0, - 'target_male': 0, - 'target_other': 0, - 'target_total': 0, - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False, - 'user': 5, - 'visibility': 'public', - 'visibility_display': 'Public' + "secondary_sectors": [], + "secondary_sectors_display": [], + "start_date": "2008-01-01", + "status": 1, + "status_display": "Ongoing", + "target_female": 0, + "target_male": 0, + "target_other": 0, + "target_total": 0, + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, + "user": 5, + "visibility": "public", + "visibility_display": "Public", }, { - 'actual_expenditure': 0, - 'annual_splits': [ - ], - 'budget_amount': 6090000, - 'description': '', - 'document': None, - 'dtype': 6, - 'dtype_detail': { - 'id': 6, - 'name': 'disaster-type-blCoqPewfsGGIPfYroghexcImvmRvqtVXRrmTMiWTVIqaXtswY', - 'summary': 'zzLWPaEPGWjzooUVnEoHLYJWDUDvYfumBXSAnCCJbxiKitVaFZQwvoABRWzWXSItuLbKYcijvKOZMMKzynzeIymEgvKCOtfkgRJlcSMFblmeysnosQHeDdxHakuAzkhiIAEVeynintBTQEkMKtLmGTRDrmajCezMZpHvKFDDKcVfsPDwSTYtzNZlAplNUBDyQlSKgzScpkrOIsQeSUUnFAWJhxeWgGXXuACkqnGcDbeOSRVDyvVzmzcaqhTiuQVDFDefJQpTCiErkkbMglshIVzkeQWaRrjCwlnTcRInCSdOZHPQTQgyStCdMadXyXmpxpmfbAbavmRQeogZQkUkcAGguuJOmNnIzBhongwulazPuaynDoeQrPNxcenAtXMFgTIYKkqgMuOSyRXSivlOWSuQEevbMLCyGOVoGLTaobNWhtpVBWpNfdixFsmjynPcpUMCVviruPYWcHYAPsWboUvvpnIdQpZRSUoMyHulCOaeFemdOjni', - 'translation_module_original_language': 'en' + "actual_expenditure": 0, + "annual_splits": [], + "budget_amount": 6090000, + "description": "", + "document": None, + "dtype": 6, + "dtype_detail": { + "id": 6, + "name": "disaster-type-blCoqPewfsGGIPfYroghexcImvmRvqtVXRrmTMiWTVIqaXtswY", + "summary": "zzLWPaEPGWjzooUVnEoHLYJWDUDvYfumBXSAnCCJbxiKitVaFZQwvoABRWzWXSItuLbKYcijvKOZMMKzynzeIymEgvKCOtfkgRJlcSMFblmeysnosQHeDdxHakuAzkhiIAEVeynintBTQEkMKtLmGTRDrmajCezMZpHvKFDDKcVfsPDwSTYtzNZlAplNUBDyQlSKgzScpkrOIsQeSUUnFAWJhxeWgGXXuACkqnGcDbeOSRVDyvVzmzcaqhTiuQVDFDefJQpTCiErkkbMglshIVzkeQWaRrjCwlnTcRInCSdOZHPQTQgyStCdMadXyXmpxpmfbAbavmRQeogZQkUkcAGguuJOmNnIzBhongwulazPuaynDoeQrPNxcenAtXMFgTIYKkqgMuOSyRXSivlOWSuQEevbMLCyGOVoGLTaobNWhtpVBWpNfdixFsmjynPcpUMCVviruPYWcHYAPsWboUvvpnIdQpZRSUoMyHulCOaeFemdOjni", + "translation_module_original_language": "en", }, - 'end_date': '2008-01-01', - 'event': 4, - 'event_detail': { - 'countries_for_preview': [ - ], - 'dtype': 4, - 'emergency_response_contact_email': None, - 'id': 4, - 'name': 'event-ZoHPvALvPPYuFLQSHJCDtKiYtkYqoExsXdjwsDkNkTIsllTSQY', - 'parent_event': 3, - 'slug': 'jkphcukicqxlnjtcquwjxcikithbzfxjdujavigvptseswkqjz', - 'start_date': None, - 'translation_module_original_language': 'en' + "end_date": "2008-01-01", + "event": 4, + "event_detail": { + "countries_for_preview": [], + "dtype": 4, + "emergency_response_contact_email": None, + "id": 4, + "name": "event-ZoHPvALvPPYuFLQSHJCDtKiYtkYqoExsXdjwsDkNkTIsllTSQY", + "parent_event": 3, + "slug": "jkphcukicqxlnjtcquwjxcikithbzfxjdujavigvptseswkqjz", + "start_date": None, + "translation_module_original_language": "en", }, - 'id': 2, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'modified_by': None, - 'modified_by_detail': None, - 'name': 'project-flLJYnpGfBUDtkUmpBlMptsKCOmrYEfxzykECBGNVBWjYEbWyB', - 'operation_type': 1, - 'operation_type_display': 'Emergency Operation', - 'primary_sector': 1, - 'primary_sector_display': 'sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf', - 'programme_type': 0, - 'programme_type_display': 'Bilateral', - 'project_admin2': [ - ], - 'project_admin2_detail': [ - ], - 'project_country': 4, - 'project_country_detail': { - 'id': 4, - 'iso': 'rN', - 'iso3': 'OJn', - 'name': 'country-XkvKQjkjlXTdAttUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMap', - 'society_name': 'society-name-dljdPwcjcQKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEi' + "id": 2, + "modified_at": "2008-01-01T00:00:00.123456Z", + "modified_by": None, + "modified_by_detail": None, + "name": "project-flLJYnpGfBUDtkUmpBlMptsKCOmrYEfxzykECBGNVBWjYEbWyB", + "operation_type": 1, + "operation_type_display": "Emergency Operation", + "primary_sector": 1, + "primary_sector_display": "sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf", + "programme_type": 0, + "programme_type_display": "Bilateral", + "project_admin2": [], + "project_admin2_detail": [], + "project_country": 4, + "project_country_detail": { + "id": 4, + "iso": "rN", + "iso3": "OJn", + "name": "country-XkvKQjkjlXTdAttUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMap", + "society_name": "society-name-dljdPwcjcQKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEi", }, - 'project_districts': [ - ], - 'project_districts_detail': [ - ], - 'reached_female': 0, - 'reached_male': 0, - 'reached_other': 0, - 'reached_total': 0, - 'regional_project': 2, - 'regional_project_detail': { - 'created_at': '2008-01-01T00:00:00.123456Z', - 'id': 2, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'name': 'regional-project-JMEeviTEmjmaaGUUxFzAzVxyFtPLeAchyKkmWBqXWUwGTFOSxS', - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False + "project_districts": [], + "project_districts_detail": [], + "reached_female": 0, + "reached_male": 0, + "reached_other": 0, + "reached_total": 0, + "regional_project": 2, + "regional_project_detail": { + "created_at": "2008-01-01T00:00:00.123456Z", + "id": 2, + "modified_at": "2008-01-01T00:00:00.123456Z", + "name": "regional-project-JMEeviTEmjmaaGUUxFzAzVxyFtPLeAchyKkmWBqXWUwGTFOSxS", + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, }, - 'reporting_ns': 3, - 'reporting_ns_contact_email': None, - 'reporting_ns_contact_name': None, - 'reporting_ns_contact_role': None, - 'reporting_ns_detail': { - 'id': 3, - 'iso': 'yP', - 'iso3': 'nSZ', - 'name': 'country-MIaXRPBHAxcSHBoZEYXywLZVWSKgBiqEXofsMIAqmaTVYaKHhH', - 'society_name': 'society-name-uAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkgnG' + "reporting_ns": 3, + "reporting_ns_contact_email": None, + "reporting_ns_contact_name": None, + "reporting_ns_contact_role": None, + "reporting_ns_detail": { + "id": 3, + "iso": "yP", + "iso3": "nSZ", + "name": "country-MIaXRPBHAxcSHBoZEYXywLZVWSKgBiqEXofsMIAqmaTVYaKHhH", + "society_name": "society-name-uAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkgnG", }, - 'secondary_sectors': [ - ], - 'secondary_sectors_display': [ - ], - 'start_date': '2008-01-01', - 'status': 1, - 'status_display': 'Ongoing', - 'target_female': 0, - 'target_male': 0, - 'target_other': 0, - 'target_total': 0, - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False, - 'user': 6, - 'visibility': 'public', - 'visibility_display': 'Public' - } - ] + "secondary_sectors": [], + "secondary_sectors_display": [], + "start_date": "2008-01-01", + "status": 1, + "status_display": "Ongoing", + "target_female": 0, + "target_male": 0, + "target_other": 0, + "target_total": 0, + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, + "user": 6, + "visibility": "public", + "visibility_display": "Public", + }, + ], } -snapshots['TestProjectAPI::test_project_list_zero 1'] = { - 'count': 0, - 'next': None, - 'previous': None, - 'results': [ - ] -} +snapshots["TestProjectAPI::test_project_list_zero 1"] = {"count": 0, "next": None, "previous": None, "results": []} -snapshots['TestProjectAPI::test_project_read 1'] = { - 'actual_expenditure': 0, - 'annual_splits': [ - ], - 'budget_amount': 6440000, - 'description': '', - 'document': None, - 'dtype': 3, - 'dtype_detail': { - 'id': 3, - 'name': 'disaster-type-MSVGtSJuTVJOnmnNTsRwRiTPlGISOuThWwJELKQTARVIsBZaHg', - 'summary': 'byjdQdmrWYksRqjdSYsnWIcwCgNRVJoVPJypGYYZSsSQdyyAYRuJdaVqmNXCoOTTPxWLIVMmXUmsClRellVGhycBrJqikLqavDTjcjuMdXONQtFYKJweYTuHolHeYGkAIIzfwonQvvxsnWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRhIaPUNeWVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHq', - 'translation_module_original_language': 'en' +snapshots["TestProjectAPI::test_project_read 1"] = { + "actual_expenditure": 0, + "annual_splits": [], + "budget_amount": 6440000, + "description": "", + "document": None, + "dtype": 3, + "dtype_detail": { + "id": 3, + "name": "disaster-type-MSVGtSJuTVJOnmnNTsRwRiTPlGISOuThWwJELKQTARVIsBZaHg", + "summary": "byjdQdmrWYksRqjdSYsnWIcwCgNRVJoVPJypGYYZSsSQdyyAYRuJdaVqmNXCoOTTPxWLIVMmXUmsClRellVGhycBrJqikLqavDTjcjuMdXONQtFYKJweYTuHolHeYGkAIIzfwonQvvxsnWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRhIaPUNeWVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHq", + "translation_module_original_language": "en", }, - 'end_date': '2008-01-01', - 'event': 2, - 'event_detail': { - 'countries_for_preview': [ - ], - 'dtype': 1, - 'emergency_response_contact_email': None, - 'id': 2, - 'name': 'event-xNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHChRnT', - 'parent_event': 1, - 'slug': 'lffgczddigadkdjdrztubzqavnlecbwseideecsalxixpupaxy', - 'start_date': None, - 'translation_module_original_language': 'en' + "end_date": "2008-01-01", + "event": 2, + "event_detail": { + "countries_for_preview": [], + "dtype": 1, + "emergency_response_contact_email": None, + "id": 2, + "name": "event-xNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHChRnT", + "parent_event": 1, + "slug": "lffgczddigadkdjdrztubzqavnlecbwseideecsalxixpupaxy", + "start_date": None, + "translation_module_original_language": "en", }, - 'id': 1, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'modified_by': None, - 'modified_by_detail': None, - 'name': 'project-yoHzwwFYEMaGiCkoeGPrnjlkxMThQoAZvUhEREEnLkPAbpciKL', - 'operation_type': 0, - 'operation_type_display': 'Programme', - 'primary_sector': 1, - 'primary_sector_display': 'sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf', - 'programme_type': 0, - 'programme_type_display': 'Bilateral', - 'project_admin2': [ - ], - 'project_admin2_detail': [ - ], - 'project_country': 2, - 'project_country_detail': { - 'id': 2, - 'iso': 'Cp', - 'iso3': 'xgR', - 'name': 'country-oEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSxn', - 'society_name': 'society-name-xIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZlhQbia' + "id": 1, + "modified_at": "2008-01-01T00:00:00.123456Z", + "modified_by": None, + "modified_by_detail": None, + "name": "project-yoHzwwFYEMaGiCkoeGPrnjlkxMThQoAZvUhEREEnLkPAbpciKL", + "operation_type": 0, + "operation_type_display": "Programme", + "primary_sector": 1, + "primary_sector_display": "sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf", + "programme_type": 0, + "programme_type_display": "Bilateral", + "project_admin2": [], + "project_admin2_detail": [], + "project_country": 2, + "project_country_detail": { + "id": 2, + "iso": "Cp", + "iso3": "xgR", + "name": "country-oEbNJuNoPeODStPAhicctFhgpIiyDxQVSIALVUjAPgFNArcSxn", + "society_name": "society-name-xIPwdzrmhDfQnPOMbdYvpiYKneWJnLnovXjYMarjiIqZlhQbia", }, - 'project_districts': [ - ], - 'project_districts_detail': [ - ], - 'reached_female': 0, - 'reached_male': 0, - 'reached_other': 0, - 'reached_total': 0, - 'regional_project': 1, - 'regional_project_detail': { - 'created_at': '2008-01-01T00:00:00.123456Z', - 'id': 1, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'name': 'regional-project-fnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGW', - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False + "project_districts": [], + "project_districts_detail": [], + "reached_female": 0, + "reached_male": 0, + "reached_other": 0, + "reached_total": 0, + "regional_project": 1, + "regional_project_detail": { + "created_at": "2008-01-01T00:00:00.123456Z", + "id": 1, + "modified_at": "2008-01-01T00:00:00.123456Z", + "name": "regional-project-fnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGW", + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, }, - 'reporting_ns': 1, - 'reporting_ns_contact_email': None, - 'reporting_ns_contact_name': None, - 'reporting_ns_contact_role': None, - 'reporting_ns_detail': { - 'id': 1, - 'iso': 'yr', - 'iso3': 'OSJ', - 'name': 'country-wMqZcUDIhyfJsONxKmTecQoXsfogyrDOxkxwnQrSRPeMOkIUpk', - 'society_name': 'society-name-oRuXXdocZuzrenKTunPFzPDjqipVJIqVLBLzxoiGFfWdhjOkYR' + "reporting_ns": 1, + "reporting_ns_contact_email": None, + "reporting_ns_contact_name": None, + "reporting_ns_contact_role": None, + "reporting_ns_detail": { + "id": 1, + "iso": "yr", + "iso3": "OSJ", + "name": "country-wMqZcUDIhyfJsONxKmTecQoXsfogyrDOxkxwnQrSRPeMOkIUpk", + "society_name": "society-name-oRuXXdocZuzrenKTunPFzPDjqipVJIqVLBLzxoiGFfWdhjOkYR", }, - 'secondary_sectors': [ - ], - 'secondary_sectors_display': [ - ], - 'start_date': '2008-01-01', - 'status': 1, - 'status_display': 'Ongoing', - 'target_female': 0, - 'target_male': 0, - 'target_other': 0, - 'target_total': 0, - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False, - 'user': 5, - 'visibility': 'public', - 'visibility_display': 'Public' + "secondary_sectors": [], + "secondary_sectors_display": [], + "start_date": "2008-01-01", + "status": 1, + "status_display": "Ongoing", + "target_female": 0, + "target_male": 0, + "target_other": 0, + "target_total": 0, + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, + "user": 5, + "visibility": "public", + "visibility_display": "Public", } -snapshots['TestProjectAPI::test_project_update 1'] = { - 'actual_expenditure': 0, - 'annual_splits': [ - ], - 'budget_amount': 6440000, - 'description': '', - 'document': None, - 'dtype': 3, - 'dtype_detail': { - 'id': 3, - 'name': 'disaster-type-MSVGtSJuTVJOnmnNTsRwRiTPlGISOuThWwJELKQTARVIsBZaHg', - 'summary': 'byjdQdmrWYksRqjdSYsnWIcwCgNRVJoVPJypGYYZSsSQdyyAYRuJdaVqmNXCoOTTPxWLIVMmXUmsClRellVGhycBrJqikLqavDTjcjuMdXONQtFYKJweYTuHolHeYGkAIIzfwonQvvxsnWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRhIaPUNeWVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHq', - 'translation_module_original_language': 'en' +snapshots["TestProjectAPI::test_project_update 1"] = { + "actual_expenditure": 0, + "annual_splits": [], + "budget_amount": 6440000, + "description": "", + "document": None, + "dtype": 3, + "dtype_detail": { + "id": 3, + "name": "disaster-type-MSVGtSJuTVJOnmnNTsRwRiTPlGISOuThWwJELKQTARVIsBZaHg", + "summary": "byjdQdmrWYksRqjdSYsnWIcwCgNRVJoVPJypGYYZSsSQdyyAYRuJdaVqmNXCoOTTPxWLIVMmXUmsClRellVGhycBrJqikLqavDTjcjuMdXONQtFYKJweYTuHolHeYGkAIIzfwonQvvxsnWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRhIaPUNeWVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHq", + "translation_module_original_language": "en", }, - 'end_date': '2008-01-01', - 'event': 2, - 'event_detail': { - 'countries_for_preview': [ - ], - 'dtype': 1, - 'emergency_response_contact_email': None, - 'id': 2, - 'name': 'event-xNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHChRnT', - 'parent_event': 1, - 'slug': 'lffgczddigadkdjdrztubzqavnlecbwseideecsalxixpupaxy', - 'start_date': None, - 'translation_module_original_language': 'en' + "end_date": "2008-01-01", + "event": 2, + "event_detail": { + "countries_for_preview": [], + "dtype": 1, + "emergency_response_contact_email": None, + "id": 2, + "name": "event-xNooiEjDVMxASJEWIZQnWpRWMYfHCHTxeKhdJGmKIjkuHChRnT", + "parent_event": 1, + "slug": "lffgczddigadkdjdrztubzqavnlecbwseideecsalxixpupaxy", + "start_date": None, + "translation_module_original_language": "en", }, - 'id': 1, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'modified_by': 3, - 'modified_by_detail': { - 'email': 'jon@dave.com', - 'first_name': 'Jon', - 'id': 3, - 'last_name': 'Mon', - 'username': 'jon@dave.com' + "id": 1, + "modified_at": "2008-01-01T00:00:00.123456Z", + "modified_by": 3, + "modified_by_detail": {"email": "jon@dave.com", "first_name": "Jon", "id": 3, "last_name": "Mon", "username": "jon@dave.com"}, + "name": "Mock Project for Update API Test", + "operation_type": 0, + "operation_type_display": "Programme", + "primary_sector": 1, + "primary_sector_display": "sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf", + "programme_type": 0, + "programme_type_display": "Bilateral", + "project_admin2": [], + "project_admin2_detail": [], + "project_country": 3, + "project_country_detail": { + "id": 3, + "iso": "ay", + "iso3": "PnS", + "name": "country-iMIaXRPBHAxcSHBoZEYXywLZVWSKgBiqEXofsMIAqmaTVYaKHh", + "society_name": "society-name-ZuAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkgn", }, - 'name': 'Mock Project for Update API Test', - 'operation_type': 0, - 'operation_type_display': 'Programme', - 'primary_sector': 1, - 'primary_sector_display': 'sect-OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgf', - 'programme_type': 0, - 'programme_type_display': 'Bilateral', - 'project_admin2': [ - ], - 'project_admin2_detail': [ - ], - 'project_country': 3, - 'project_country_detail': { - 'id': 3, - 'iso': 'ay', - 'iso3': 'PnS', - 'name': 'country-iMIaXRPBHAxcSHBoZEYXywLZVWSKgBiqEXofsMIAqmaTVYaKHh', - 'society_name': 'society-name-ZuAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkgn' + "project_districts": [1], + "project_districts_detail": [{"id": 1, "name": "district-kyJycXkvKQjkjlXTdAttUXCsOlhimaNWqaDFFIZaMFpnLQEDAC"}], + "reached_female": 0, + "reached_male": 0, + "reached_other": 0, + "reached_total": 0, + "regional_project": 1, + "regional_project_detail": { + "created_at": "2008-01-01T00:00:00.123456Z", + "id": 1, + "modified_at": "2008-01-01T00:00:00.123456Z", + "name": "regional-project-fnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGW", + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, }, - 'project_districts': [ - 1 - ], - 'project_districts_detail': [ - { - 'id': 1, - 'name': 'district-kyJycXkvKQjkjlXTdAttUXCsOlhimaNWqaDFFIZaMFpnLQEDAC' - } - ], - 'reached_female': 0, - 'reached_male': 0, - 'reached_other': 0, - 'reached_total': 0, - 'regional_project': 1, - 'regional_project_detail': { - 'created_at': '2008-01-01T00:00:00.123456Z', - 'id': 1, - 'modified_at': '2008-01-01T00:00:00.123456Z', - 'name': 'regional-project-fnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGW', - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False - }, - 'reporting_ns': 3, - 'reporting_ns_contact_email': None, - 'reporting_ns_contact_name': None, - 'reporting_ns_contact_role': None, - 'reporting_ns_detail': { - 'id': 3, - 'iso': 'ay', - 'iso3': 'PnS', - 'name': 'country-iMIaXRPBHAxcSHBoZEYXywLZVWSKgBiqEXofsMIAqmaTVYaKHh', - 'society_name': 'society-name-ZuAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkgn' + "reporting_ns": 3, + "reporting_ns_contact_email": None, + "reporting_ns_contact_name": None, + "reporting_ns_contact_role": None, + "reporting_ns_detail": { + "id": 3, + "iso": "ay", + "iso3": "PnS", + "name": "country-iMIaXRPBHAxcSHBoZEYXywLZVWSKgBiqEXofsMIAqmaTVYaKHh", + "society_name": "society-name-ZuAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkgn", }, - 'secondary_sectors': [ - ], - 'secondary_sectors_display': [ - ], - 'start_date': '2008-01-01', - 'status': 1, - 'status_display': 'Ongoing', - 'target_female': 0, - 'target_male': 0, - 'target_other': 0, - 'target_total': 0, - 'translation_module_original_language': 'en', - 'translation_module_skip_auto_translation': False, - 'user': 5, - 'visibility': 'public', - 'visibility_display': 'Public' + "secondary_sectors": [], + "secondary_sectors_display": [], + "start_date": "2008-01-01", + "status": 1, + "status_display": "Ongoing", + "target_female": 0, + "target_male": 0, + "target_other": 0, + "target_total": 0, + "translation_module_original_language": "en", + "translation_module_skip_auto_translation": False, + "user": 5, + "visibility": "public", + "visibility_display": "Public", } diff --git a/deployments/test.py b/deployments/test.py index 16f36ff66..a81d377c7 100644 --- a/deployments/test.py +++ b/deployments/test.py @@ -1,16 +1,17 @@ from django.test import TestCase + import deployments.models as models class ERUOwnerTest(TestCase): def setUp(self): - country = models.Country.objects.create(name='country') + country = models.Country.objects.create(name="country") eru_owner = models.ERUOwner.objects.create(pk=1, national_society_country=country) models.ERU.objects.create(type=2, units=6, eru_owner=eru_owner) def test_eru_owner_create(self): eru_owner = models.ERUOwner.objects.get(pk=1) - country = models.Country.objects.get(name='country') + country = models.Country.objects.get(name="country") self.assertEqual(eru_owner.national_society_country, country) erus = eru_owner.eru_set.all() self.assertEqual(erus.count(), 1) diff --git a/deployments/test_views.py b/deployments/test_views.py index 0e8dde286..7f34a2dc5 100644 --- a/deployments/test_views.py +++ b/deployments/test_views.py @@ -1,25 +1,23 @@ -import json import datetime -import pytz +import json from unittest import mock -from django.core import management -from modeltranslation.utils import build_localized_fieldname +import pytz from django.conf import settings +from django.core import management +from modeltranslation.utils import build_localized_fieldname +from api.models import Country, DisasterType, District, Region, VisibilityCharChoices from deployments.factories.project import ProjectFactory, SectorFactory -from api.models import Country, District, Region, DisasterType from main.test_case import APITestCase -from api.models import VisibilityCharChoices - from .models import ( AnnualSplit, - Project, + OperationTypes, ProgrammeTypes, + Project, Sector, SectorTag, - OperationTypes, Statuses, ) @@ -619,9 +617,7 @@ def test_translation_api_behaviour(self): resp_body["name"] == names[current_language] ), f"Name ({lang}): <{resp_body['name']}> should be <{names[current_language]}>" else: - translated_text = self.aws_translator._fake_translation( - names[current_language], lang, current_language - ) + translated_text = self.aws_translator._fake_translation(names[current_language], lang, current_language) assert ( resp_body["name"] == translated_text ), f"Name ({lang}): should be <{translated_text}> instead of <{resp_body['name']}>" diff --git a/deployments/tests.py b/deployments/tests.py index 5f8d5b1bd..68358da75 100644 --- a/deployments/tests.py +++ b/deployments/tests.py @@ -1,22 +1,31 @@ -import pydash import json -from main.test_case import SnapshotTestCase, APITestCase -from deployments.factories.user import UserFactory -from deployments.factories.project import SectorFactory, SectorTagFactory, ProjectFactory -from api.factories import country, district -import api.models as models -from deployments.models import Project, VisibilityCharChoices +import pydash -from .factories.personnel import PersonnelFactory +import api.models as models +from api.factories import country, district +from api.factories.event import EventFactory from deployments.factories.emergency_project import ( - EmergencyProjectActivityFactory, EmergencyProjectActivityActionFactory, + EmergencyProjectActivityFactory, EmergencyProjectActivitySectorFactory, EruFactory, ) -from api.factories.event import EventFactory -from deployments.models import EmergencyProject, EmergencyProjectActivity +from deployments.factories.project import ( + ProjectFactory, + SectorFactory, + SectorTagFactory, +) +from deployments.factories.user import UserFactory +from deployments.models import ( + EmergencyProject, + EmergencyProjectActivity, + Project, + VisibilityCharChoices, +) +from main.test_case import APITestCase, SnapshotTestCase + +from .factories.personnel import PersonnelFactory class TestProjectAPI(SnapshotTestCase): @@ -87,7 +96,7 @@ def test_project_create(self): new_project["secondary_sectors"] = [new_sector1.id, new_sector2.id] # submit create request - response = self.client.post("/api/v2/project/", new_project, format='json') + response = self.client.post("/api/v2/project/", new_project, format="json") # check response self.assert_201(response) @@ -97,10 +106,7 @@ def test_project_create(self): def test_project_read(self): # create instance sct = SectorFactory() - new_project = ProjectFactory.create( - visibility=VisibilityCharChoices.PUBLIC, - primary_sector=sct - ) + new_project = ProjectFactory.create(visibility=VisibilityCharChoices.PUBLIC, primary_sector=sct) # submit read request response = self.client.get(f"/api/v2/project/{new_project.pk}/") @@ -112,10 +118,7 @@ def test_project_read(self): def test_project_update(self): # create instance sct = SectorFactory() - new_project = ProjectFactory.create( - visibility=VisibilityCharChoices.PUBLIC, - primary_sector=sct - ) + new_project = ProjectFactory.create(visibility=VisibilityCharChoices.PUBLIC, primary_sector=sct) # authenticate self.authenticate() @@ -136,7 +139,7 @@ def test_project_update(self): new_project["primary_sector"] = sct.id # submit update request - response = self.client.put(f"/api/v2/project/{new_project['id']}/", new_project, format='json') + response = self.client.put(f"/api/v2/project/{new_project['id']}/", new_project, format="json") # check response self.assert_200(response) @@ -146,10 +149,7 @@ def test_project_update(self): def test_project_delete(self): # create instance sct = SectorFactory() - new_project = ProjectFactory.create( - visibility=VisibilityCharChoices.PUBLIC, - primary_sector=sct - ) + new_project = ProjectFactory.create(visibility=VisibilityCharChoices.PUBLIC, primary_sector=sct) # authenticate self.authenticate() @@ -177,7 +177,7 @@ def test_personnel_csv_api(self): # ,,,9,ax,aew,country-BwmmOmYevmQESSDMSvLKvNtAvkgDYcFoaOoSoDNnpEVXvZVynz,society-name-bJhjsCmOLWxcbmmsloqUlvJplmblqgbRiyPYhvntDpxZxQkHZN,,9,,9,True,,,,,,,,,,,,\r # ,,,10,bM,per,country-niMJnLwriUNBeJqqyPkzDfqRBSjIneOUrOSPmTxKQPGMkAjuYB,society-name-hIhRJAevOfxvXrjZoragyoygYhlHUtLZFgHwSKsJrMgdkuWylw,,10,,10,True,,,,,,,,,,,,\r - url = '/api/v2/personnel/?format=csv' + url = "/api/v2/personnel/?format=csv" # Also unaunthenticated user can use this, but without names: # resp = self.client.get(url) # self.assert_401(resp) @@ -185,7 +185,7 @@ def test_personnel_csv_api(self): self.authenticate() resp = self.client.get(url) self.assert_200(resp) - self.assertMatchSnapshot(resp.content.decode('utf-8')) + self.assertMatchSnapshot(resp.content.decode("utf-8")) def test_project_csv_api(self): _country = country.CountryFactory() @@ -199,13 +199,13 @@ def test_project_csv_api(self): project_districts=[district1, district2], primary_sector=sct, secondary_sectors=[sct_1, sct_2], - visibility=VisibilityCharChoices.PUBLIC + visibility=VisibilityCharChoices.PUBLIC, ) - url = '/api/v2/project/?format=csv' + url = "/api/v2/project/?format=csv" resp = self.client.get(url) self.assert_200(resp) - self.assertMatchSnapshot(resp.content.decode('utf-8')) + self.assertMatchSnapshot(resp.content.decode("utf-8")) def test_global_project_api(self): country_1 = country.CountryFactory() @@ -237,61 +237,54 @@ def test_global_project_api(self): for ns in [ns_1, ns_2] ] - url = '/api/v2/global-project/overview/' + url = "/api/v2/global-project/overview/" resp = self.client.get(url) self.assert_200(resp) self.assertMatchSnapshot(resp.json()) - url = '/api/v2/global-project/ns-ongoing-projects-stats/' + url = "/api/v2/global-project/ns-ongoing-projects-stats/" resp = self.client.get(url) self.assert_200(resp) self.assertMatchSnapshot(resp.json()) class TestEmergencyProjectAPI(APITestCase): - fixtures = ['emergency_project_activity_actions.json'] + fixtures = ["emergency_project_activity_actions.json"] def test_emergency_project(self): - supplies = { - '2': 100, - '1': 1, - '4': 3 - } + supplies = {"2": 100, "1": 1, "4": 3} EmergencyProjectActivityFactory.create_batch(5, supplies=supplies) - url = '/api/v2/emergency-project/' + url = "/api/v2/emergency-project/" self.authenticate() response = self.client.get(url) self.assert_200(response) - self.assertEqual(len(response.data['results']), 5) + self.assertEqual(len(response.data["results"]), 5) def test_emergency_project_create(self): old_emergency_project_count = EmergencyProject.objects.count() old_emergency_project_activity_count = EmergencyProjectActivity.objects.count() - country1 = models.Country.objects.create(name='abc') - country2 = models.Country.objects.create(name='xyz') - district1 = models.District.objects.create(name='test district1', country=country1) - district2 = models.District.objects.create(name='test district2', country=country1) + country1 = models.Country.objects.create(name="abc") + country2 = models.Country.objects.create(name="xyz") + district1 = models.District.objects.create(name="test district1", country=country1) + district2 = models.District.objects.create(name="test district2", country=country1) sector = EmergencyProjectActivitySectorFactory.create() action = EmergencyProjectActivityActionFactory.create() - event = EventFactory.create( - countries=[country1.id, country2.id], - districts=[district1.id, district2.id] - ) - reporting_ns = models.Country.objects.create(name='ne') + event = EventFactory.create(countries=[country1.id, country2.id], districts=[district1.id, district2.id]) + reporting_ns = models.Country.objects.create(name="ne") deployed_eru = EruFactory.create() data = { - 'title': "Emergency title", - 'event': event.id, - 'districts': [district1.id, district2.id], - 'reporting_ns': reporting_ns.id, - 'reporting_ns_contact_email': None, - 'reporting_ns_contact_name': None, - 'reporting_ns_contact_role': None, - 'status': EmergencyProject.ActivityStatus.ON_GOING, - 'activity_lead': EmergencyProject.ActivityLead.NATIONAL_SOCIETY, - 'start_date': '2022-01-01', - 'deployed_eru': deployed_eru.id, - 'country': country1.id, + "title": "Emergency title", + "event": event.id, + "districts": [district1.id, district2.id], + "reporting_ns": reporting_ns.id, + "reporting_ns_contact_email": None, + "reporting_ns_contact_name": None, + "reporting_ns_contact_role": None, + "status": EmergencyProject.ActivityStatus.ON_GOING, + "activity_lead": EmergencyProject.ActivityLead.NATIONAL_SOCIETY, + "start_date": "2022-01-01", + "deployed_eru": deployed_eru.id, + "country": country1.id, "activities": [ { "sector": sector.id, @@ -300,18 +293,14 @@ def test_emergency_project_create(self): "male": 3, "female": 5, "people_households": EmergencyProjectActivity.PeopleHouseholds.PEOPLE, - "custom_supplies": { - "test_supplies": 23, - "test_world": 34, - "test_emergency": 56 - }, - "points": [] + "custom_supplies": {"test_supplies": 23, "test_world": 34, "test_emergency": 56}, + "points": [], }, - ] + ], } - url = '/api/v2/emergency-project/' + url = "/api/v2/emergency-project/" self.authenticate() - response = self.client.post(url, data=data, format='json') + response = self.client.post(url, data=data, format="json") self.assert_201(response) self.assertEqual(EmergencyProject.objects.count(), old_emergency_project_count + 1) self.assertEqual(EmergencyProjectActivity.objects.count(), old_emergency_project_activity_count + 1) diff --git a/deployments/translation.py b/deployments/translation.py index 1270bdacc..a9c20dcf6 100644 --- a/deployments/translation.py +++ b/deployments/translation.py @@ -1,18 +1,19 @@ -from modeltranslation.translator import register, TranslationOptions +from modeltranslation.translator import TranslationOptions, register + from .models import ( + DeployedPerson, PartnerSocietyActivities, - PersonnelDeployment, PartnerSocietyDeployment, - DeployedPerson, Personnel, - RegionalProject, + PersonnelDeployment, Project, + RegionalProject, ) @register(DeployedPerson) class DeployedPersonTO(TranslationOptions): - fields = ('role',) + fields = ("role",) @register(Personnel) @@ -29,19 +30,22 @@ class PartnerSocietyDeploymentTO(TranslationOptions): @register(PersonnelDeployment) class PersonnelDeploymentTO(TranslationOptions): - fields = ('comments',) + fields = ("comments",) @register(PartnerSocietyActivities) class PartnerSocietyActivitiesTO(TranslationOptions): - fields = ('activity',) + fields = ("activity",) @register(RegionalProject) class RegionalProjectTO(TranslationOptions): - fields = ('name',) + fields = ("name",) @register(Project) class ProjectTO(TranslationOptions): - fields = ('name', 'description', ) + fields = ( + "name", + "description", + ) diff --git a/deployments/utils.py b/deployments/utils.py index 05519d24f..1a09bc7af 100644 --- a/deployments/utils.py +++ b/deployments/utils.py @@ -2,25 +2,29 @@ def get_previous_months(date, no): - '''Return a list of tuples with - (month, year) + """Return a list of tuples with + (month, year) - Parameters: - date (date): date from which to calculate previous months - no (int): number of months to get + Parameters: + date (date): date from which to calculate previous months + no (int): number of months to get - Returns: - list: List of tuples with (month_string, first_day, last_day) - eg. [ - ('2021-05', datetime, datetime) - ] - ''' + Returns: + list: List of tuples with (month_string, first_day, last_day) + eg. [ + ('2021-05', datetime, datetime) + ] + """ months = [] for i in range(0, no): previous_month = date - relativedelta(months=i) first_day = previous_month - relativedelta(day=1) last_day = previous_month - relativedelta(day=31) - month_string = f'{first_day.year}-{str(first_day.month).zfill(2)}' - month = (month_string, first_day, last_day,) + month_string = f"{first_day.year}-{str(first_day.month).zfill(2)}" + month = ( + month_string, + first_day, + last_day, + ) months.append(month) return months diff --git a/deployments/widgets.py b/deployments/widgets.py index ae60a810c..75214cf32 100644 --- a/deployments/widgets.py +++ b/deployments/widgets.py @@ -22,9 +22,9 @@ def render(self, name, value, attrs=None, renderer=None): html = f'' + """ + html += "" return html diff --git a/dref/admin.py b/dref/admin.py index 5209b54b9..6fbef3135 100644 --- a/dref/admin.py +++ b/dref/admin.py @@ -2,20 +2,21 @@ from reversion_compare.admin import CompareVersionAdmin from lang.admin import TranslationAdmin + from .models import ( Dref, DrefFile, - DrefOperationalUpdate, DrefFinalReport, - NationalSocietyAction, + DrefOperationalUpdate, IdentifiedNeed, + NationalSocietyAction, PlannedIntervention, RiskSecurity, SourceInformation, ) -class ReadOnlyMixin(): +class ReadOnlyMixin: def has_add_permission(self, *args, **kwargs): return False @@ -27,35 +28,23 @@ def has_delete_permission(self, *args, **kwargs): @admin.register(NationalSocietyAction) -class NationalSocietyActionAdmin( - ReadOnlyMixin, - admin.ModelAdmin -): - search_fields = ['title'] +class NationalSocietyActionAdmin(ReadOnlyMixin, admin.ModelAdmin): + search_fields = ["title"] @admin.register(RiskSecurity) -class RiskSecurityAdmin( - ReadOnlyMixin, - admin.ModelAdmin -): - search_fields = ['risk', 'mitigation'] +class RiskSecurityAdmin(ReadOnlyMixin, admin.ModelAdmin): + search_fields = ["risk", "mitigation"] @admin.register(IdentifiedNeed) -class IdentifiedNeedAdmin( - ReadOnlyMixin, - admin.ModelAdmin -): - search_fields = ['title'] +class IdentifiedNeedAdmin(ReadOnlyMixin, admin.ModelAdmin): + search_fields = ["title"] @admin.register(PlannedIntervention) -class PlannedInterventionAdmin( - ReadOnlyMixin, - admin.ModelAdmin -): - search_fields = ['title'] +class PlannedInterventionAdmin(ReadOnlyMixin, admin.ModelAdmin): + search_fields = ["title"] @admin.register(DrefFile) @@ -69,11 +58,7 @@ class SourceInformationAdmin(admin.ModelAdmin): @admin.register(Dref) -class DrefAdmin( - CompareVersionAdmin, - TranslationAdmin, - admin.ModelAdmin -): +class DrefAdmin(CompareVersionAdmin, TranslationAdmin, admin.ModelAdmin): search_fields = ("title", "appeal_code") list_display = ( "title", @@ -116,15 +101,9 @@ def get_queryset(self, request): "cover_image", "country", "field_report", - "supporting_document" - ) - .prefetch_related( - "planned_interventions", - "needs_identified", - "national_society_actions", - "users", - "risk_security" + "supporting_document", ) + .prefetch_related("planned_interventions", "needs_identified", "national_society_actions", "users", "risk_security") ) @@ -179,18 +158,13 @@ def get_queryset(self, request): "district", "photos", "images", - "district" - + "district", ) ) @admin.register(DrefFinalReport) -class DrefFinalReportAdmin( - CompareVersionAdmin, - TranslationAdmin, - admin.ModelAdmin -): +class DrefFinalReportAdmin(CompareVersionAdmin, TranslationAdmin, admin.ModelAdmin): list_display = ("title", "national_society", "disaster_type") autocomplete_fields = ( "national_society", @@ -230,7 +204,7 @@ def get_queryset(self, request): "cover_image", "country", "assessment_report", - "dref" + "dref", ) .prefetch_related( "planned_interventions", diff --git a/dref/apps.py b/dref/apps.py index c83cda251..e0057348a 100644 --- a/dref/apps.py +++ b/dref/apps.py @@ -1,5 +1,5 @@ -from django.utils.translation import gettext_lazy as _ from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class DrefConfig(AppConfig): diff --git a/dref/enums.py b/dref/enums.py index 49c7c391b..765b4b478 100644 --- a/dref/enums.py +++ b/dref/enums.py @@ -1,11 +1,11 @@ from . import models enum_register = { - 'national_society_action_title': models.NationalSocietyAction.Title, - 'identified_need_title': models.IdentifiedNeed.Title, - 'planned_intervention_title': models.PlannedIntervention.Title, - 'dref_dref_type': models.Dref.DrefType, - 'dref_onset_type': models.Dref.OnsetType, - 'dref_disaster_category': models.Dref.DisasterCategory, - 'dref_status': models.Dref.Status, + "national_society_action_title": models.NationalSocietyAction.Title, + "identified_need_title": models.IdentifiedNeed.Title, + "planned_intervention_title": models.PlannedIntervention.Title, + "dref_dref_type": models.Dref.DrefType, + "dref_onset_type": models.Dref.OnsetType, + "dref_disaster_category": models.Dref.DisasterCategory, + "dref_status": models.Dref.Status, } diff --git a/dref/factories/dref.py b/dref/factories/dref.py index 9ed67d733..f13efb5b6 100644 --- a/dref/factories/dref.py +++ b/dref/factories/dref.py @@ -1,17 +1,16 @@ -from django.core.files.base import ContentFile - import factory +from django.core.files.base import ContentFile from factory import fuzzy from api.factories.country import CountryFactory from dref.models import ( Dref, - PlannedIntervention, - IdentifiedNeed, - NationalSocietyAction, DrefFile, - DrefOperationalUpdate, DrefFinalReport, + DrefOperationalUpdate, + IdentifiedNeed, + NationalSocietyAction, + PlannedIntervention, PlannedInterventionIndicators, ) diff --git a/dref/filter_set.py b/dref/filter_set.py index 73f4b3084..c0eff4207 100644 --- a/dref/filter_set.py +++ b/dref/filter_set.py @@ -1,15 +1,8 @@ import django_filters as filters from django.db import models -from dref.models import ( - Dref, - DrefOperationalUpdate, - DrefFinalReport, -) -from api.models import ( - Country, - DisasterType, -) +from api.models import Country, DisasterType +from dref.models import Dref, DrefFinalReport, DrefOperationalUpdate class DrefFilter(filters.FilterSet): @@ -46,18 +39,15 @@ class BaseDrefFilterSet(filters.FilterSet): field_name="disaster_type", queryset=DisasterType.objects.all(), ) - appeal_code = filters.CharFilter( - field_name="appeal_code", - lookup_expr="icontains" - ) + appeal_code = filters.CharFilter(field_name="appeal_code", lookup_expr="icontains") class CompletedDrefOperationsFilterSet(BaseDrefFilterSet): class Type(models.TextChoices): - DREF = 'dref', 'Dref' - OPERATIONAL_UPDATE = 'operational_update', 'Operational Update' - FINAL_REPORT = 'final_report', 'Final Report' + DREF = "dref", "Dref" + OPERATIONAL_UPDATE = "operational_update", "Operational Update" + FINAL_REPORT = "final_report", "Final Report" # type = filters.ChoiceFilter( # label='Tyoe choice', @@ -81,7 +71,7 @@ class Meta: class DrefShareUserFilterSet(filters.FilterSet): - id = filters.NumberFilter(field_name='id', lookup_expr='exact') + id = filters.NumberFilter(field_name="id", lookup_expr="exact") class Meta: model = Dref diff --git a/dref/management/commands/make_dref_regional_permission.py b/dref/management/commands/make_dref_regional_permission.py index 44f779fc4..abad7181e 100644 --- a/dref/management/commands/make_dref_regional_permission.py +++ b/dref/management/commands/make_dref_regional_permission.py @@ -1,28 +1,26 @@ +from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType from django.core.management.base import BaseCommand -from django.contrib.auth.models import Group, Permission from api.models import Region class Command(BaseCommand): - help = 'Create standard dref geographic permissions classes and groups' + help = "Create standard dref geographic permissions classes and groups" def handle(self, *args, **options): - print('- Creating/Updating permissions/groups for Dref regions admin') + print("- Creating/Updating permissions/groups for Dref regions admin") region_content_type = ContentType.objects.get_for_model(Region) regions = Region.objects.all() for region in regions: - codename = 'dref_region_admin_%s' % region.id - name = 'Dref Admin for %s' % region.name + codename = "dref_region_admin_%s" % region.id + name = "Dref Admin for %s" % region.name permission, created = Permission.objects.get_or_create( codename=codename, content_type=region_content_type, defaults=dict(name=name), ) # If it's a new permission, create a group for it - group, created = Group.objects.get_or_create( - name='%s Dref Regional Admins' % region.name - ) + group, created = Group.objects.get_or_create(name="%s Dref Regional Admins" % region.name) group.permissions.add(permission) diff --git a/dref/migrations/0001_initial.py b/dref/migrations/0001_initial.py index 05e3cf9bf..4bdcebd0a 100644 --- a/dref/migrations/0001_initial.py +++ b/dref/migrations/0001_initial.py @@ -1,8 +1,8 @@ # Generated by Django 2.2.26 on 2022-02-03 06:18 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): @@ -10,188 +10,624 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('api', '0142_auto_20220202_0551'), + ("api", "0142_auto_20220202_0551"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( - name='IdentifiedNeed', + name="IdentifiedNeed", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(choices=[('shelter_and_basic_household_items', 'Shelter And Basic Household Items'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inculsion', 'Protection, Gender And Inculsion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, verbose_name='title')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "title", + models.CharField( + choices=[ + ("shelter_and_basic_household_items", "Shelter And Basic Household Items"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inculsion", "Protection, Gender And Inculsion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + verbose_name="title", + ), + ), + ("description", models.TextField(blank=True, null=True, verbose_name="description")), ], options={ - 'verbose_name': 'identified need', - 'verbose_name_plural': 'identified needs', + "verbose_name": "identified need", + "verbose_name_plural": "identified needs", }, ), migrations.CreateModel( - name='NationalSocietyAction', + name="NationalSocietyAction", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(choices=[('national_society_readiness', 'National Society Readiness'), ('assessment', 'Assessment'), ('coordination', 'Coordination'), ('resource_mobilization', 'Resource Mobilization'), ('activation_of_contingency_plans', 'Activation Of Contingency Plans'), ('national_society_eoc', 'National Society EOC'), ('shelter_and_basic_household_items', 'Shelter And Basic Household Items'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inculsion', 'Protection, Gender And Inculsion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('other', 'Other')], max_length=255, verbose_name='title')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "title", + models.CharField( + choices=[ + ("national_society_readiness", "National Society Readiness"), + ("assessment", "Assessment"), + ("coordination", "Coordination"), + ("resource_mobilization", "Resource Mobilization"), + ("activation_of_contingency_plans", "Activation Of Contingency Plans"), + ("national_society_eoc", "National Society EOC"), + ("shelter_and_basic_household_items", "Shelter And Basic Household Items"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inculsion", "Protection, Gender And Inculsion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("other", "Other"), + ], + max_length=255, + verbose_name="title", + ), + ), + ("description", models.TextField(blank=True, null=True, verbose_name="description")), ], options={ - 'verbose_name': 'national society action', - 'verbose_name_plural': 'national society actions', + "verbose_name": "national society action", + "verbose_name_plural": "national society actions", }, ), migrations.CreateModel( - name='PlannedIntervention', + name="PlannedIntervention", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(choices=[('shelter_and_basic_household_items', 'Shelter And Basic Household Items'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inculsion', 'Protection, Gender And Inculsion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, verbose_name='title')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), - ('budget', models.IntegerField(blank=True, null=True, verbose_name='budget')), - ('person_targeted', models.IntegerField(blank=True, null=True, verbose_name='person targeted')), - ('indicator', models.TextField(blank=True, null=True, verbose_name='indicator')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "title", + models.CharField( + choices=[ + ("shelter_and_basic_household_items", "Shelter And Basic Household Items"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inculsion", "Protection, Gender And Inculsion"), + ("education", "Education"), + ("migration", "Migration"), + ( + "risk_reduction_climate_adaptation_and_recovery_", + "Risk Reduction, Climate Adaptation And Recovery", + ), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + verbose_name="title", + ), + ), + ("description", models.TextField(blank=True, null=True, verbose_name="description")), + ("budget", models.IntegerField(blank=True, null=True, verbose_name="budget")), + ("person_targeted", models.IntegerField(blank=True, null=True, verbose_name="person targeted")), + ("indicator", models.TextField(blank=True, null=True, verbose_name="indicator")), ], options={ - 'verbose_name': 'planned intervention', - 'verbose_name_plural': 'planned interventions', + "verbose_name": "planned intervention", + "verbose_name_plural": "planned interventions", }, ), migrations.CreateModel( - name='DrefFile', + name="DrefFile", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.FileField(upload_to='dref/images/', verbose_name='file')), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='created_by')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("file", models.FileField(upload_to="dref/images/", verbose_name="file")), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="created_by", + ), + ), ], options={ - 'verbose_name': 'dref file', - 'verbose_name_plural': 'dref files', + "verbose_name": "dref file", + "verbose_name_plural": "dref files", }, ), migrations.CreateModel( - name='Dref', + name="Dref", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_es', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_fr', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_ar', models.CharField(max_length=255, null=True, verbose_name='title')), - ('type_of_onset', models.IntegerField(blank=True, choices=[(0, 'Imminent'), (1, 'Slow'), (2, 'Sudden')], null=True, verbose_name='onset type')), - ('disaster_category', models.IntegerField(blank=True, choices=[(0, 'Yellow'), (1, 'Orange'), (2, 'Red')], null=True, verbose_name='disaster category')), - ('status', models.IntegerField(blank=True, choices=[(0, 'In Progress'), (1, 'Completed')], null=True, verbose_name='status')), - ('num_assisted', models.IntegerField(blank=True, null=True, verbose_name='number of assisted')), - ('num_affected', models.IntegerField(blank=True, null=True, verbose_name='number of affected')), - ('amount_requested', models.IntegerField(blank=True, null=True, verbose_name='amount requested')), - ('emergency_appeal_planned', models.BooleanField(blank=True, null=True, verbose_name='emergency appeal planned ')), - ('event_date', models.DateField(blank=True, help_text='Date of event/Approximate date of impact', null=True, verbose_name='event date')), - ('event_text', models.TextField(blank=True, null=True, verbose_name='event text')), - ('ns_respond_date', models.DateField(blank=True, help_text='NS anticipatory actions started/NS response', null=True, verbose_name='ns respond date')), - ('affect_same_area', models.BooleanField(blank=True, help_text='Has a similar event affected the same areas in the past?', null=True)), - ('affect_same_population', models.BooleanField(blank=True, help_text='Did it affect the same population?', null=True)), - ('affect_same_population_text', models.TextField(blank=True, null=True, verbose_name='affect same population text')), - ('ns_respond', models.BooleanField(blank=True, default=False, help_text='Did NS respond', null=True)), - ('ns_request_fund', models.BooleanField(blank=True, default=False, help_text='Did the NS request funding from DREF?', null=True)), - ('ns_request_text', models.TextField(blank=True, null=True, verbose_name='ns request text')), - ('dref_recurrent_text', models.TextField(blank=True, null=True, verbose_name='dref recurrent text')), - ('lessons_learned', models.TextField(blank=True, null=True, verbose_name='lessons learned')), - ('event_description', models.TextField(blank=True, null=True, verbose_name='event description')), - ('anticipatory_actions', models.TextField(blank=True, help_text='Description of anticipatory actions or imminent disaster', null=True, verbose_name='anaticipatory actions')), - ('event_scope', models.TextField(blank=True, help_text='Scope and scale of event', null=True, verbose_name='event scope')), - ('government_requested_assistance', models.BooleanField(blank=True, help_text='Has government requested assistance', null=True)), - ('government_requested_assistance_date', models.DateField(blank=True, null=True, verbose_name='government requested assistance date')), - ('national_authorities', models.TextField(blank=True, null=True, verbose_name='national authorities')), - ('ifrc', models.TextField(blank=True, null=True, verbose_name='ifrc')), - ('icrc', models.TextField(blank=True, null=True, verbose_name='icrc')), - ('partner_national_society', models.TextField(blank=True, null=True, verbose_name='partner national society')), - ('un_or_other_actor', models.TextField(blank=True, null=True, verbose_name='un or other')), - ('major_coordination_mechanism', models.TextField(blank=True, help_text='List major coordination mechanisms in place', null=True, verbose_name='major coordination mechanism')), - ('identified_gaps', models.TextField(blank=True, help_text='Any identified gaps/limitations in the assessment', null=True, verbose_name='identified gaps')), - ('people_assisted', models.TextField(blank=True, null=True, verbose_name='people assisted')), - ('selection_criteria', models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria')), - ('entity_affected', models.TextField(blank=True, help_text='Protection, gender, Inclusion affected in this process', null=True, verbose_name='entity affected')), - ('community_involved', models.TextField(blank=True, help_text='Community been involved in the analysis of the process', null=True, verbose_name='community involved')), - ('women', models.IntegerField(blank=True, null=True, verbose_name='women')), - ('men', models.IntegerField(blank=True, null=True, verbose_name='men')), - ('girls', models.IntegerField(blank=True, help_text='Girls under 18', null=True, verbose_name='girls')), - ('boys', models.IntegerField(blank=True, help_text='Boys under 18', null=True, verbose_name='boys')), - ('total_targeted_population', models.IntegerField(blank=True, help_text='Estimated number of targeted people', null=True, verbose_name='total targeted population')), - ('disability_people_per', models.DecimalField(blank=True, decimal_places=2, help_text='Estimated % people disability', max_digits=5, null=True, verbose_name='disability people per')), - ('people_per_urban', models.DecimalField(blank=True, decimal_places=2, help_text='Estimated % people Urban', max_digits=5, null=True, verbose_name='people per urban')), - ('people_per_local', models.DecimalField(blank=True, decimal_places=2, help_text='Estimated % people Rural', max_digits=5, null=True, verbose_name='people per local')), - ('people_targeted_with_early_actions', models.IntegerField(blank=True, help_text='Number of persons targeted with early actions', null=True, verbose_name='people targeted with early actions')), - ('displaced_people', models.IntegerField(blank=True, help_text='Estimated number of displaced people', null=True, verbose_name='displaced people')), - ('operation_objective', models.TextField(blank=True, help_text='Overall objective of the operation', null=True, verbose_name='operation objective')), - ('response_strategy', models.TextField(blank=True, null=True, verbose_name='response strategy')), - ('go_field_report_date', models.DateField(blank=True, null=True, verbose_name='go field report date')), - ('ns_request_date', models.DateField(blank=True, null=True, verbose_name='ns request date')), - ('submission_to_geneva', models.DateField(blank=True, null=True, verbose_name='submission to geneva')), - ('date_of_approval', models.DateField(blank=True, null=True, verbose_name='date of approval')), - ('end_date', models.DateField(blank=True, null=True, verbose_name='end date')), - ('publishing_date', models.DateField(blank=True, null=True, verbose_name='publishing date')), - ('operation_timeframe', models.IntegerField(blank=True, null=True, verbose_name='operation timeframe')), - ('appeal_code', models.CharField(blank=True, max_length=255, null=True, verbose_name='appeal code')), - ('glide_code', models.CharField(blank=True, max_length=255, null=True, verbose_name='glide number')), - ('ifrc_appeal_manager_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc appeal manager name')), - ('ifrc_appeal_manager_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc appeal manager email')), - ('ifrc_appeal_manager_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc appeal manager title')), - ('ifrc_appeal_manager_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc appeal manager phone number')), - ('ifrc_project_manager_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc project manager name')), - ('ifrc_project_manager_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc project manager email')), - ('ifrc_project_manager_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc project manager title')), - ('ifrc_project_manager_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc project manager phone number')), - ('national_society_contact_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='national society contact name')), - ('national_society_contact_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='national society contact email')), - ('national_society_contact_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='national society contact title')), - ('national_society_contact_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='national society contact phone number')), - ('media_contact_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='media contact name')), - ('media_contact_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='media contact email')), - ('media_contact_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='media contact title')), - ('media_contact_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='media_contact phone number')), - ('ifrc_emergency_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc emergency name')), - ('ifrc_emergency_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc emergency email')), - ('ifrc_emergency_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc emergency title')), - ('ifrc_emergency_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc emergency phone number')), - ('originator_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='originator name')), - ('originator_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='originator email')), - ('originator_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='originator title')), - ('originator_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='originator phone number')), - ('human_resource', models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource')), - ('surge_personnel_deployed', models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed')), - ('logistic_capacity_of_ns', models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns')), - ('safety_concerns', models.TextField(blank=True, help_text='Are there any safety/security concerns which may impact the implementation of this operation?', null=True, verbose_name='safety concerns')), - ('pmer', models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer')), - ('communication', models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization')), - ('budget_file_preview', models.FileField(blank=True, null=True, upload_to='dref/images/', verbose_name='budget file preview')), - ('budget_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='budget_file_dref', to='dref.DrefFile', verbose_name='budget file')), - ('cover_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='cover_image_dref', to='dref.DrefFile', verbose_name='cover image')), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_by_dref', to=settings.AUTH_USER_MODEL, verbose_name='created by')), - ('disaster_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType', verbose_name='disaster type')), - ('event_map', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='event_map_dref', to='dref.DrefFile', verbose_name='event map')), - ('field_report', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='field_report_dref', to='api.FieldReport', verbose_name='field report')), - ('images', models.ManyToManyField(blank=True, related_name='image_dref', to='dref.DrefFile', verbose_name='images')), - ('modified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_by_dref', to=settings.AUTH_USER_MODEL, verbose_name='modified by')), - ('national_society', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='national_society')), - ('national_society_actions', models.ManyToManyField(blank=True, to='dref.NationalSocietyAction', verbose_name='national society actions')), - ('needs_identified', models.ManyToManyField(blank=True, to='dref.IdentifiedNeed', verbose_name='needs identified')), - ('planned_interventions', models.ManyToManyField(blank=True, to='dref.PlannedIntervention', verbose_name='planned intervention')), - ('users', models.ManyToManyField(blank=True, related_name='user_dref', to=settings.AUTH_USER_MODEL, verbose_name='users')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="modified at")), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_es", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_fr", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_ar", models.CharField(max_length=255, null=True, verbose_name="title")), + ( + "type_of_onset", + models.IntegerField( + blank=True, choices=[(0, "Imminent"), (1, "Slow"), (2, "Sudden")], null=True, verbose_name="onset type" + ), + ), + ( + "disaster_category", + models.IntegerField( + blank=True, + choices=[(0, "Yellow"), (1, "Orange"), (2, "Red")], + null=True, + verbose_name="disaster category", + ), + ), + ( + "status", + models.IntegerField( + blank=True, choices=[(0, "In Progress"), (1, "Completed")], null=True, verbose_name="status" + ), + ), + ("num_assisted", models.IntegerField(blank=True, null=True, verbose_name="number of assisted")), + ("num_affected", models.IntegerField(blank=True, null=True, verbose_name="number of affected")), + ("amount_requested", models.IntegerField(blank=True, null=True, verbose_name="amount requested")), + ( + "emergency_appeal_planned", + models.BooleanField(blank=True, null=True, verbose_name="emergency appeal planned "), + ), + ( + "event_date", + models.DateField( + blank=True, help_text="Date of event/Approximate date of impact", null=True, verbose_name="event date" + ), + ), + ("event_text", models.TextField(blank=True, null=True, verbose_name="event text")), + ( + "ns_respond_date", + models.DateField( + blank=True, + help_text="NS anticipatory actions started/NS response", + null=True, + verbose_name="ns respond date", + ), + ), + ( + "affect_same_area", + models.BooleanField( + blank=True, help_text="Has a similar event affected the same areas in the past?", null=True + ), + ), + ( + "affect_same_population", + models.BooleanField(blank=True, help_text="Did it affect the same population?", null=True), + ), + ( + "affect_same_population_text", + models.TextField(blank=True, null=True, verbose_name="affect same population text"), + ), + ("ns_respond", models.BooleanField(blank=True, default=False, help_text="Did NS respond", null=True)), + ( + "ns_request_fund", + models.BooleanField(blank=True, default=False, help_text="Did the NS request funding from DREF?", null=True), + ), + ("ns_request_text", models.TextField(blank=True, null=True, verbose_name="ns request text")), + ("dref_recurrent_text", models.TextField(blank=True, null=True, verbose_name="dref recurrent text")), + ("lessons_learned", models.TextField(blank=True, null=True, verbose_name="lessons learned")), + ("event_description", models.TextField(blank=True, null=True, verbose_name="event description")), + ( + "anticipatory_actions", + models.TextField( + blank=True, + help_text="Description of anticipatory actions or imminent disaster", + null=True, + verbose_name="anaticipatory actions", + ), + ), + ( + "event_scope", + models.TextField(blank=True, help_text="Scope and scale of event", null=True, verbose_name="event scope"), + ), + ( + "government_requested_assistance", + models.BooleanField(blank=True, help_text="Has government requested assistance", null=True), + ), + ( + "government_requested_assistance_date", + models.DateField(blank=True, null=True, verbose_name="government requested assistance date"), + ), + ("national_authorities", models.TextField(blank=True, null=True, verbose_name="national authorities")), + ("ifrc", models.TextField(blank=True, null=True, verbose_name="ifrc")), + ("icrc", models.TextField(blank=True, null=True, verbose_name="icrc")), + ("partner_national_society", models.TextField(blank=True, null=True, verbose_name="partner national society")), + ("un_or_other_actor", models.TextField(blank=True, null=True, verbose_name="un or other")), + ( + "major_coordination_mechanism", + models.TextField( + blank=True, + help_text="List major coordination mechanisms in place", + null=True, + verbose_name="major coordination mechanism", + ), + ), + ( + "identified_gaps", + models.TextField( + blank=True, + help_text="Any identified gaps/limitations in the assessment", + null=True, + verbose_name="identified gaps", + ), + ), + ("people_assisted", models.TextField(blank=True, null=True, verbose_name="people assisted")), + ( + "selection_criteria", + models.TextField( + blank=True, + help_text="Selection criteria for affected people", + null=True, + verbose_name="selection criteria", + ), + ), + ( + "entity_affected", + models.TextField( + blank=True, + help_text="Protection, gender, Inclusion affected in this process", + null=True, + verbose_name="entity affected", + ), + ), + ( + "community_involved", + models.TextField( + blank=True, + help_text="Community been involved in the analysis of the process", + null=True, + verbose_name="community involved", + ), + ), + ("women", models.IntegerField(blank=True, null=True, verbose_name="women")), + ("men", models.IntegerField(blank=True, null=True, verbose_name="men")), + ("girls", models.IntegerField(blank=True, help_text="Girls under 18", null=True, verbose_name="girls")), + ("boys", models.IntegerField(blank=True, help_text="Boys under 18", null=True, verbose_name="boys")), + ( + "total_targeted_population", + models.IntegerField( + blank=True, + help_text="Estimated number of targeted people", + null=True, + verbose_name="total targeted population", + ), + ), + ( + "disability_people_per", + models.DecimalField( + blank=True, + decimal_places=2, + help_text="Estimated % people disability", + max_digits=5, + null=True, + verbose_name="disability people per", + ), + ), + ( + "people_per_urban", + models.DecimalField( + blank=True, + decimal_places=2, + help_text="Estimated % people Urban", + max_digits=5, + null=True, + verbose_name="people per urban", + ), + ), + ( + "people_per_local", + models.DecimalField( + blank=True, + decimal_places=2, + help_text="Estimated % people Rural", + max_digits=5, + null=True, + verbose_name="people per local", + ), + ), + ( + "people_targeted_with_early_actions", + models.IntegerField( + blank=True, + help_text="Number of persons targeted with early actions", + null=True, + verbose_name="people targeted with early actions", + ), + ), + ( + "displaced_people", + models.IntegerField( + blank=True, help_text="Estimated number of displaced people", null=True, verbose_name="displaced people" + ), + ), + ( + "operation_objective", + models.TextField( + blank=True, help_text="Overall objective of the operation", null=True, verbose_name="operation objective" + ), + ), + ("response_strategy", models.TextField(blank=True, null=True, verbose_name="response strategy")), + ("go_field_report_date", models.DateField(blank=True, null=True, verbose_name="go field report date")), + ("ns_request_date", models.DateField(blank=True, null=True, verbose_name="ns request date")), + ("submission_to_geneva", models.DateField(blank=True, null=True, verbose_name="submission to geneva")), + ("date_of_approval", models.DateField(blank=True, null=True, verbose_name="date of approval")), + ("end_date", models.DateField(blank=True, null=True, verbose_name="end date")), + ("publishing_date", models.DateField(blank=True, null=True, verbose_name="publishing date")), + ("operation_timeframe", models.IntegerField(blank=True, null=True, verbose_name="operation timeframe")), + ("appeal_code", models.CharField(blank=True, max_length=255, null=True, verbose_name="appeal code")), + ("glide_code", models.CharField(blank=True, max_length=255, null=True, verbose_name="glide number")), + ( + "ifrc_appeal_manager_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc appeal manager name"), + ), + ( + "ifrc_appeal_manager_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc appeal manager email"), + ), + ( + "ifrc_appeal_manager_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc appeal manager title"), + ), + ( + "ifrc_appeal_manager_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc appeal manager phone number"), + ), + ( + "ifrc_project_manager_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc project manager name"), + ), + ( + "ifrc_project_manager_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc project manager email"), + ), + ( + "ifrc_project_manager_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc project manager title"), + ), + ( + "ifrc_project_manager_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc project manager phone number"), + ), + ( + "national_society_contact_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="national society contact name"), + ), + ( + "national_society_contact_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="national society contact email"), + ), + ( + "national_society_contact_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="national society contact title"), + ), + ( + "national_society_contact_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="national society contact phone number"), + ), + ( + "media_contact_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="media contact name"), + ), + ( + "media_contact_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="media contact email"), + ), + ( + "media_contact_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="media contact title"), + ), + ( + "media_contact_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="media_contact phone number"), + ), + ( + "ifrc_emergency_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc emergency name"), + ), + ( + "ifrc_emergency_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc emergency email"), + ), + ( + "ifrc_emergency_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc emergency title"), + ), + ( + "ifrc_emergency_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc emergency phone number"), + ), + ("originator_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="originator name")), + ("originator_email", models.CharField(blank=True, max_length=255, null=True, verbose_name="originator email")), + ("originator_title", models.CharField(blank=True, max_length=255, null=True, verbose_name="originator title")), + ( + "originator_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="originator phone number"), + ), + ( + "human_resource", + models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), + ), + ( + "surge_personnel_deployed", + models.TextField( + blank=True, + help_text="Will a Surge personnel be deployed?", + null=True, + verbose_name="surge personnel deployed", + ), + ), + ( + "logistic_capacity_of_ns", + models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), + ), + ( + "safety_concerns", + models.TextField( + blank=True, + help_text="Are there any safety/security concerns which may impact the implementation of this operation?", + null=True, + verbose_name="safety concerns", + ), + ), + ( + "pmer", + models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), + ), + ( + "communication", + models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), + ), + ( + "budget_file_preview", + models.FileField(blank=True, null=True, upload_to="dref/images/", verbose_name="budget file preview"), + ), + ( + "budget_file", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="budget_file_dref", + to="dref.DrefFile", + verbose_name="budget file", + ), + ), + ( + "cover_image", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="cover_image_dref", + to="dref.DrefFile", + verbose_name="cover image", + ), + ), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="created_by_dref", + to=settings.AUTH_USER_MODEL, + verbose_name="created by", + ), + ), + ( + "disaster_type", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.DisasterType", + verbose_name="disaster type", + ), + ), + ( + "event_map", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="event_map_dref", + to="dref.DrefFile", + verbose_name="event map", + ), + ), + ( + "field_report", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="field_report_dref", + to="api.FieldReport", + verbose_name="field report", + ), + ), + ( + "images", + models.ManyToManyField(blank=True, related_name="image_dref", to="dref.DrefFile", verbose_name="images"), + ), + ( + "modified_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="modified_by_dref", + to=settings.AUTH_USER_MODEL, + verbose_name="modified by", + ), + ), + ( + "national_society", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="api.Country", verbose_name="national_society" + ), + ), + ( + "national_society_actions", + models.ManyToManyField(blank=True, to="dref.NationalSocietyAction", verbose_name="national society actions"), + ), + ( + "needs_identified", + models.ManyToManyField(blank=True, to="dref.IdentifiedNeed", verbose_name="needs identified"), + ), + ( + "planned_interventions", + models.ManyToManyField(blank=True, to="dref.PlannedIntervention", verbose_name="planned intervention"), + ), + ( + "users", + models.ManyToManyField( + blank=True, related_name="user_dref", to=settings.AUTH_USER_MODEL, verbose_name="users" + ), + ), ], options={ - 'verbose_name': 'dref', - 'verbose_name_plural': 'drefs', + "verbose_name": "dref", + "verbose_name_plural": "drefs", }, ), migrations.CreateModel( - name='DrefCountryDistrict', + name="DrefCountryDistrict", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('country', models.ForeignKey(help_text='Affected County', on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='country')), - ('district', models.ManyToManyField(blank=True, to='api.District', verbose_name='district')), - ('dref', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dref.Dref', verbose_name='dref')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "country", + models.ForeignKey( + help_text="Affected County", + on_delete=django.db.models.deletion.CASCADE, + to="api.Country", + verbose_name="country", + ), + ), + ("district", models.ManyToManyField(blank=True, to="api.District", verbose_name="district")), + ("dref", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="dref.Dref", verbose_name="dref")), ], options={ - 'unique_together': {('dref', 'country')}, + "unique_together": {("dref", "country")}, }, ), ] diff --git a/dref/migrations/0002_auto_20220208_1025.py b/dref/migrations/0002_auto_20220208_1025.py index 5a36cc8f3..f1ffc6c31 100644 --- a/dref/migrations/0002_auto_20220208_1025.py +++ b/dref/migrations/0002_auto_20220208_1025.py @@ -6,37 +6,97 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0001_initial'), + ("dref", "0001_initial"), ] operations = [ migrations.RemoveField( - model_name='dref', - name='total_targeted_population', + model_name="dref", + name="total_targeted_population", ), migrations.AddField( - model_name='dref', - name='total_targeted_population', - field=models.IntegerField(blank=True, help_text='Estimated number of targeted people', null=True, verbose_name='total targeted population'), + model_name="dref", + name="total_targeted_population", + field=models.IntegerField( + blank=True, help_text="Estimated number of targeted people", null=True, verbose_name="total targeted population" + ), ), migrations.AlterField( - model_name='dref', - name='anticipatory_actions', - field=models.TextField(blank=True, help_text='Description of anticipatory actions or imminent disaster', null=True, verbose_name='anticipatory actions'), + model_name="dref", + name="anticipatory_actions", + field=models.TextField( + blank=True, + help_text="Description of anticipatory actions or imminent disaster", + null=True, + verbose_name="anticipatory actions", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title', - field=models.CharField(choices=[('shelter_and_basic_household_items', 'Shelter And Basic Household Items'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, verbose_name='title'), + model_name="identifiedneed", + name="title", + field=models.CharField( + choices=[ + ("shelter_and_basic_household_items", "Shelter And Basic Household Items"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='nationalsocietyaction', - name='title', - field=models.CharField(choices=[('national_society_readiness', 'National Society Readiness'), ('assessment', 'Assessment'), ('coordination', 'Coordination'), ('resource_mobilization', 'Resource Mobilization'), ('activation_of_contingency_plans', 'Activation Of Contingency Plans'), ('national_society_eoc', 'National Society EOC'), ('shelter_and_basic_household_items', 'Shelter And Basic Household Items'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('other', 'Other')], max_length=255, verbose_name='title'), + model_name="nationalsocietyaction", + name="title", + field=models.CharField( + choices=[ + ("national_society_readiness", "National Society Readiness"), + ("assessment", "Assessment"), + ("coordination", "Coordination"), + ("resource_mobilization", "Resource Mobilization"), + ("activation_of_contingency_plans", "Activation Of Contingency Plans"), + ("national_society_eoc", "National Society EOC"), + ("shelter_and_basic_household_items", "Shelter And Basic Household Items"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("other", "Other"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title', - field=models.CharField(choices=[('shelter_and_basic_household_items', 'Shelter And Basic Household Items'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, verbose_name='title'), + model_name="plannedintervention", + name="title", + field=models.CharField( + choices=[ + ("shelter_and_basic_household_items", "Shelter And Basic Household Items"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + verbose_name="title", + ), ), ] diff --git a/dref/migrations/0003_auto_20220314_0824.py b/dref/migrations/0003_auto_20220314_0824.py index 55a9a0a51..13ec3562d 100644 --- a/dref/migrations/0003_auto_20220314_0824.py +++ b/dref/migrations/0003_auto_20220314_0824.py @@ -6,18 +6,53 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0002_auto_20220208_1025'), + ("dref", "0002_auto_20220208_1025"), ] operations = [ migrations.AlterField( - model_name='identifiedneed', - name='title', - field=models.CharField(choices=[('shelter_and_basic_household_items', 'Shelter And Basic Household Items'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination'), ('multi-purpose_cash_grants', 'Multi-purpose Cash Grants')], max_length=255, verbose_name='title'), + model_name="identifiedneed", + name="title", + field=models.CharField( + choices=[ + ("shelter_and_basic_household_items", "Shelter And Basic Household Items"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ("multi-purpose_cash_grants", "Multi-purpose Cash Grants"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title', - field=models.CharField(choices=[('shelter_and_basic_household_items', 'Shelter And Basic Household Items'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening'), ('multi-purpose_cash_grants', 'Multi-purpose Cash Grants'), ('environmental_sustainability', 'Environmental Sustainability'), ('community_engagement_and_accountability', 'Community Engagement And Accountability')], max_length=255, verbose_name='title'), + model_name="plannedintervention", + name="title", + field=models.CharField( + choices=[ + ("shelter_and_basic_household_items", "Shelter And Basic Household Items"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ("multi-purpose_cash_grants", "Multi-purpose Cash Grants"), + ("environmental_sustainability", "Environmental Sustainability"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ], + max_length=255, + verbose_name="title", + ), ), ] diff --git a/dref/migrations/0004_dref_is_published.py b/dref/migrations/0004_dref_is_published.py index 7b7a5df32..0360d9941 100644 --- a/dref/migrations/0004_dref_is_published.py +++ b/dref/migrations/0004_dref_is_published.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0003_auto_20220314_0824'), + ("dref", "0003_auto_20220314_0824"), ] operations = [ migrations.AddField( - model_name='dref', - name='is_published', - field=models.BooleanField(default=False, verbose_name='Is published'), + model_name="dref", + name="is_published", + field=models.BooleanField(default=False, verbose_name="Is published"), ), ] diff --git a/dref/migrations/0005_drefoperationalupdate.py b/dref/migrations/0005_drefoperationalupdate.py index d7aa11016..936bcd741 100644 --- a/dref/migrations/0005_drefoperationalupdate.py +++ b/dref/migrations/0005_drefoperationalupdate.py @@ -1,109 +1,316 @@ # Generated by Django 2.2.27 on 2022-04-04 05:09 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('api', '0151_merge_20220325_1027'), - ('dref', '0004_dref_is_published'), + ("api", "0151_merge_20220325_1027"), + ("dref", "0004_dref_is_published"), ] operations = [ migrations.CreateModel( - name='DrefOperationalUpdate', + name="DrefOperationalUpdate", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), - ('title', models.CharField(blank=True, max_length=255, null=True, verbose_name='title')), - ('type_of_onset', models.IntegerField(blank=True, choices=[(0, 'Imminent'), (1, 'Slow'), (2, 'Sudden')], null=True, verbose_name='onset type')), - ('disaster_category', models.IntegerField(blank=True, choices=[(0, 'Yellow'), (1, 'Orange'), (2, 'Red')], null=True, verbose_name='disaster category')), - ('number_of_people_targeted', models.IntegerField(blank=True, null=True, verbose_name='Number of people targeted')), - ('number_of_people_affected', models.IntegerField(blank=True, null=True, verbose_name='number of people affected')), - ('dref_allocated_so_far', models.IntegerField(blank=True, null=True, verbose_name='Dref allocated so far')), - ('additional_allocation', models.IntegerField(blank=True, null=True, verbose_name='Additional allocation')), - ('total_dref_allocation', models.IntegerField(blank=True, null=True, verbose_name='Total dref allocation')), - ('emergency_appeal_planned', models.BooleanField(blank=True, null=True, verbose_name='emergency appeal planned ')), - ('operational_update_number', models.IntegerField(blank=True, null=True, verbose_name='Operational Update Number')), - ('reporting_timeframe', models.DateField(blank=True, null=True, verbose_name='Reporting Timeframe')), - ('update_date', models.DateField(blank=True, null=True, verbose_name='Update Date')), - ('is_timeframe_extension_required', models.BooleanField(blank=True, null=True, verbose_name='Is Timeframe Extension Required')), - ('new_operational_end_date', models.DateField(blank=True, null=True, verbose_name='New Operation End Date')), - ('total_operation_timeframe', models.IntegerField(blank=True, null=True, verbose_name='Total Operation Timeframe')), - ('date_of_approval', models.DateField(blank=True, null=True, verbose_name='Date of Approval')), - ('appeal_code', models.CharField(blank=True, max_length=255, null=True, verbose_name='appeal code')), - ('glide_code', models.CharField(blank=True, max_length=255, null=True, verbose_name='glide number')), - ('ifrc_appeal_manager_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc appeal manager name')), - ('ifrc_appeal_manager_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc appeal manager email')), - ('ifrc_appeal_manager_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc appeal manager title')), - ('ifrc_appeal_manager_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc appeal manager phone number')), - ('ifrc_project_manager_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc project manager name')), - ('ifrc_project_manager_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc project manager email')), - ('ifrc_project_manager_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc project manager title')), - ('ifrc_project_manager_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc project manager phone number')), - ('national_society_contact_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='national society contact name')), - ('national_society_contact_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='national society contact email')), - ('national_society_contact_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='national society contact title')), - ('national_society_contact_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='national society contact phone number')), - ('media_contact_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='media contact name')), - ('media_contact_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='media contact email')), - ('media_contact_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='media contact title')), - ('media_contact_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='media_contact phone number')), - ('ifrc_emergency_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc emergency name')), - ('ifrc_emergency_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc emergency email')), - ('ifrc_emergency_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc emergency title')), - ('ifrc_emergency_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc emergency phone number')), - ('changing_timeframe_operation', models.BooleanField(blank=True, null=True, verbose_name='Changing time operation')), - ('changing_operation_strategy', models.BooleanField(blank=True, null=True, verbose_name='Changing operation strategy')), - ('changing_target_population_of_operation', models.BooleanField(blank=True, null=True, verbose_name='Changing target population of operation')), - ('changing_geographic_location', models.BooleanField(blank=True, null=True, verbose_name='Changing geographic location')), - ('changing_budget', models.BooleanField(blank=True, null=True, verbose_name='Changing budget')), - ('request_for_second_allocation', models.BooleanField(blank=True, null=True, verbose_name='Request for second allocation')), - ('summary_of_change', models.TextField(blank=True, null=True, verbose_name='Summary of change')), - ('change_since_request', models.TextField(blank=True, null=True, verbose_name='Change since request')), - ('ifrc', models.TextField(blank=True, null=True, verbose_name='ifrc')), - ('icrc', models.TextField(blank=True, null=True, verbose_name='icrc')), - ('partner_national_society', models.TextField(blank=True, null=True, verbose_name='partner national society')), - ('government_requested_assistance', models.BooleanField(blank=True, help_text='Has government requested assistance', null=True)), - ('national_authorities', models.TextField(blank=True, null=True, verbose_name='national authorities')), - ('un_or_other_actor', models.TextField(blank=True, null=True, verbose_name='un or other')), - ('major_coordination_mechanism', models.TextField(blank=True, null=True, verbose_name='major coordination mechanism')), - ('people_assisted', models.TextField(blank=True, null=True, verbose_name='people assisted')), - ('selection_criteria', models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria')), - ('community_involved', models.TextField(blank=True, help_text='Community been involved in the analysis of the process', null=True, verbose_name='community involved')), - ('women', models.IntegerField(blank=True, null=True, verbose_name='women')), - ('men', models.IntegerField(blank=True, null=True, verbose_name='men')), - ('girls', models.IntegerField(blank=True, help_text='Girls under 18', null=True, verbose_name='girls')), - ('boys', models.IntegerField(blank=True, help_text='Boys under 18', null=True, verbose_name='boys')), - ('disability_people_per', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='disability people per')), - ('people_per_urban', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='people per urban')), - ('people_per_local', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='people per local')), - ('people_targeted_with_early_actions', models.IntegerField(blank=True, null=True, verbose_name='people targeted with early actions')), - ('displaced_people', models.IntegerField(blank=True, null=True, verbose_name='displaced people')), - ('operation_objective', models.TextField(blank=True, null=True, verbose_name='operation objective')), - ('response_strategy', models.TextField(blank=True, null=True, verbose_name='response strategy')), - ('is_published', models.BooleanField(default=False, verbose_name='Is published')), - ('country', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='country')), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_by_dref_operational_update', to=settings.AUTH_USER_MODEL, verbose_name='created by')), - ('disaster_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType', verbose_name='disaster type')), - ('district', models.ManyToManyField(blank=True, to='api.District', verbose_name='district')), - ('dref', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dref.Dref', verbose_name='Dref')), - ('images', models.ManyToManyField(blank=True, related_name='image_dref_operational_update', to='dref.DrefFile', verbose_name='images')), - ('modified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_by_dref_operational_update', to=settings.AUTH_USER_MODEL, verbose_name='modified by')), - ('national_society', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='national_society_operational_update', to='api.Country', verbose_name='national_society')), - ('national_society_actions', models.ManyToManyField(blank=True, to='dref.NationalSocietyAction', verbose_name='national society actions')), - ('needs_identified', models.ManyToManyField(blank=True, to='dref.IdentifiedNeed', verbose_name='needs identified')), - ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dref.DrefOperationalUpdate')), - ('planned_interventions', models.ManyToManyField(blank=True, to='dref.PlannedIntervention', verbose_name='planned intervention')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="modified at")), + ("title", models.CharField(blank=True, max_length=255, null=True, verbose_name="title")), + ( + "type_of_onset", + models.IntegerField( + blank=True, choices=[(0, "Imminent"), (1, "Slow"), (2, "Sudden")], null=True, verbose_name="onset type" + ), + ), + ( + "disaster_category", + models.IntegerField( + blank=True, + choices=[(0, "Yellow"), (1, "Orange"), (2, "Red")], + null=True, + verbose_name="disaster category", + ), + ), + ( + "number_of_people_targeted", + models.IntegerField(blank=True, null=True, verbose_name="Number of people targeted"), + ), + ( + "number_of_people_affected", + models.IntegerField(blank=True, null=True, verbose_name="number of people affected"), + ), + ("dref_allocated_so_far", models.IntegerField(blank=True, null=True, verbose_name="Dref allocated so far")), + ("additional_allocation", models.IntegerField(blank=True, null=True, verbose_name="Additional allocation")), + ("total_dref_allocation", models.IntegerField(blank=True, null=True, verbose_name="Total dref allocation")), + ( + "emergency_appeal_planned", + models.BooleanField(blank=True, null=True, verbose_name="emergency appeal planned "), + ), + ( + "operational_update_number", + models.IntegerField(blank=True, null=True, verbose_name="Operational Update Number"), + ), + ("reporting_timeframe", models.DateField(blank=True, null=True, verbose_name="Reporting Timeframe")), + ("update_date", models.DateField(blank=True, null=True, verbose_name="Update Date")), + ( + "is_timeframe_extension_required", + models.BooleanField(blank=True, null=True, verbose_name="Is Timeframe Extension Required"), + ), + ("new_operational_end_date", models.DateField(blank=True, null=True, verbose_name="New Operation End Date")), + ( + "total_operation_timeframe", + models.IntegerField(blank=True, null=True, verbose_name="Total Operation Timeframe"), + ), + ("date_of_approval", models.DateField(blank=True, null=True, verbose_name="Date of Approval")), + ("appeal_code", models.CharField(blank=True, max_length=255, null=True, verbose_name="appeal code")), + ("glide_code", models.CharField(blank=True, max_length=255, null=True, verbose_name="glide number")), + ( + "ifrc_appeal_manager_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc appeal manager name"), + ), + ( + "ifrc_appeal_manager_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc appeal manager email"), + ), + ( + "ifrc_appeal_manager_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc appeal manager title"), + ), + ( + "ifrc_appeal_manager_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc appeal manager phone number"), + ), + ( + "ifrc_project_manager_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc project manager name"), + ), + ( + "ifrc_project_manager_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc project manager email"), + ), + ( + "ifrc_project_manager_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc project manager title"), + ), + ( + "ifrc_project_manager_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc project manager phone number"), + ), + ( + "national_society_contact_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="national society contact name"), + ), + ( + "national_society_contact_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="national society contact email"), + ), + ( + "national_society_contact_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="national society contact title"), + ), + ( + "national_society_contact_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="national society contact phone number"), + ), + ( + "media_contact_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="media contact name"), + ), + ( + "media_contact_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="media contact email"), + ), + ( + "media_contact_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="media contact title"), + ), + ( + "media_contact_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="media_contact phone number"), + ), + ( + "ifrc_emergency_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc emergency name"), + ), + ( + "ifrc_emergency_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc emergency email"), + ), + ( + "ifrc_emergency_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc emergency title"), + ), + ( + "ifrc_emergency_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc emergency phone number"), + ), + ( + "changing_timeframe_operation", + models.BooleanField(blank=True, null=True, verbose_name="Changing time operation"), + ), + ( + "changing_operation_strategy", + models.BooleanField(blank=True, null=True, verbose_name="Changing operation strategy"), + ), + ( + "changing_target_population_of_operation", + models.BooleanField(blank=True, null=True, verbose_name="Changing target population of operation"), + ), + ( + "changing_geographic_location", + models.BooleanField(blank=True, null=True, verbose_name="Changing geographic location"), + ), + ("changing_budget", models.BooleanField(blank=True, null=True, verbose_name="Changing budget")), + ( + "request_for_second_allocation", + models.BooleanField(blank=True, null=True, verbose_name="Request for second allocation"), + ), + ("summary_of_change", models.TextField(blank=True, null=True, verbose_name="Summary of change")), + ("change_since_request", models.TextField(blank=True, null=True, verbose_name="Change since request")), + ("ifrc", models.TextField(blank=True, null=True, verbose_name="ifrc")), + ("icrc", models.TextField(blank=True, null=True, verbose_name="icrc")), + ("partner_national_society", models.TextField(blank=True, null=True, verbose_name="partner national society")), + ( + "government_requested_assistance", + models.BooleanField(blank=True, help_text="Has government requested assistance", null=True), + ), + ("national_authorities", models.TextField(blank=True, null=True, verbose_name="national authorities")), + ("un_or_other_actor", models.TextField(blank=True, null=True, verbose_name="un or other")), + ( + "major_coordination_mechanism", + models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), + ), + ("people_assisted", models.TextField(blank=True, null=True, verbose_name="people assisted")), + ( + "selection_criteria", + models.TextField( + blank=True, + help_text="Selection criteria for affected people", + null=True, + verbose_name="selection criteria", + ), + ), + ( + "community_involved", + models.TextField( + blank=True, + help_text="Community been involved in the analysis of the process", + null=True, + verbose_name="community involved", + ), + ), + ("women", models.IntegerField(blank=True, null=True, verbose_name="women")), + ("men", models.IntegerField(blank=True, null=True, verbose_name="men")), + ("girls", models.IntegerField(blank=True, help_text="Girls under 18", null=True, verbose_name="girls")), + ("boys", models.IntegerField(blank=True, help_text="Boys under 18", null=True, verbose_name="boys")), + ( + "disability_people_per", + models.DecimalField( + blank=True, decimal_places=2, max_digits=5, null=True, verbose_name="disability people per" + ), + ), + ( + "people_per_urban", + models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name="people per urban"), + ), + ( + "people_per_local", + models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name="people per local"), + ), + ( + "people_targeted_with_early_actions", + models.IntegerField(blank=True, null=True, verbose_name="people targeted with early actions"), + ), + ("displaced_people", models.IntegerField(blank=True, null=True, verbose_name="displaced people")), + ("operation_objective", models.TextField(blank=True, null=True, verbose_name="operation objective")), + ("response_strategy", models.TextField(blank=True, null=True, verbose_name="response strategy")), + ("is_published", models.BooleanField(default=False, verbose_name="Is published")), + ( + "country", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="api.Country", + verbose_name="country", + ), + ), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="created_by_dref_operational_update", + to=settings.AUTH_USER_MODEL, + verbose_name="created by", + ), + ), + ( + "disaster_type", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.DisasterType", + verbose_name="disaster type", + ), + ), + ("district", models.ManyToManyField(blank=True, to="api.District", verbose_name="district")), + ("dref", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="dref.Dref", verbose_name="Dref")), + ( + "images", + models.ManyToManyField( + blank=True, related_name="image_dref_operational_update", to="dref.DrefFile", verbose_name="images" + ), + ), + ( + "modified_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="modified_by_dref_operational_update", + to=settings.AUTH_USER_MODEL, + verbose_name="modified by", + ), + ), + ( + "national_society", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="national_society_operational_update", + to="api.Country", + verbose_name="national_society", + ), + ), + ( + "national_society_actions", + models.ManyToManyField(blank=True, to="dref.NationalSocietyAction", verbose_name="national society actions"), + ), + ( + "needs_identified", + models.ManyToManyField(blank=True, to="dref.IdentifiedNeed", verbose_name="needs identified"), + ), + ( + "parent", + models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="dref.DrefOperationalUpdate" + ), + ), + ( + "planned_interventions", + models.ManyToManyField(blank=True, to="dref.PlannedIntervention", verbose_name="planned intervention"), + ), ], options={ - 'verbose_name': 'Dref Operational Update', - 'verbose_name_plural': 'Dref Operational Updates', + "verbose_name": "Dref Operational Update", + "verbose_name_plural": "Dref Operational Updates", }, ), ] diff --git a/dref/migrations/0006_auto_20220415_0544.py b/dref/migrations/0006_auto_20220415_0544.py index 1f3f81b01..50b1d7470 100644 --- a/dref/migrations/0006_auto_20220415_0544.py +++ b/dref/migrations/0006_auto_20220415_0544.py @@ -6,17 +6,17 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0005_drefoperationalupdate'), + ("dref", "0005_drefoperationalupdate"), ] operations = [ migrations.RemoveField( - model_name='drefoperationalupdate', - name='number_of_people_targeted', + model_name="drefoperationalupdate", + name="number_of_people_targeted", ), migrations.AddField( - model_name='drefoperationalupdate', - name='number_of_people_targeted', - field=models.IntegerField(blank=True, null=True, verbose_name='Number of people targeted'), + model_name="drefoperationalupdate", + name="number_of_people_targeted", + field=models.IntegerField(blank=True, null=True, verbose_name="Number of people targeted"), ), ] diff --git a/dref/migrations/0007_drefoperationalupdate_entity_affected.py b/dref/migrations/0007_drefoperationalupdate_entity_affected.py index 78ae09760..95d58857d 100644 --- a/dref/migrations/0007_drefoperationalupdate_entity_affected.py +++ b/dref/migrations/0007_drefoperationalupdate_entity_affected.py @@ -6,13 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0006_auto_20220415_0544'), + ("dref", "0006_auto_20220415_0544"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='entity_affected', - field=models.TextField(blank=True, help_text='Protection, gender, Inclusion affected in this process', null=True, verbose_name='entity affected'), + model_name="drefoperationalupdate", + name="entity_affected", + field=models.TextField( + blank=True, + help_text="Protection, gender, Inclusion affected in this process", + null=True, + verbose_name="entity affected", + ), ), ] diff --git a/dref/migrations/0008_auto_20220419_0628.py b/dref/migrations/0008_auto_20220419_0628.py index 4e3a54bfa..29a17bee7 100644 --- a/dref/migrations/0008_auto_20220419_0628.py +++ b/dref/migrations/0008_auto_20220419_0628.py @@ -1,35 +1,50 @@ # Generated by Django 2.2.27 on 2022-04-19 06:28 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0151_merge_20220325_1027'), - ('dref', '0007_drefoperationalupdate_entity_affected'), + ("api", "0151_merge_20220325_1027"), + ("dref", "0007_drefoperationalupdate_entity_affected"), ] operations = [ migrations.RemoveField( - model_name='drefoperationalupdate', - name='country', + model_name="drefoperationalupdate", + name="country", ), migrations.RemoveField( - model_name='drefoperationalupdate', - name='district', + model_name="drefoperationalupdate", + name="district", ), migrations.CreateModel( - name='DrefOperationalUpdateCountryDistrict', + name="DrefOperationalUpdateCountryDistrict", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('country', models.ForeignKey(help_text='Affected County', on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='country')), - ('district', models.ManyToManyField(blank=True, to='api.District', verbose_name='district')), - ('dref_operational_update', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dref.DrefOperationalUpdate', verbose_name='Dref Operational Update')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "country", + models.ForeignKey( + help_text="Affected County", + on_delete=django.db.models.deletion.CASCADE, + to="api.Country", + verbose_name="country", + ), + ), + ("district", models.ManyToManyField(blank=True, to="api.District", verbose_name="district")), + ( + "dref_operational_update", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="dref.DrefOperationalUpdate", + verbose_name="Dref Operational Update", + ), + ), ], options={ - 'unique_together': {('dref_operational_update', 'country')}, + "unique_together": {("dref_operational_update", "country")}, }, ), ] diff --git a/dref/migrations/0009_remove_drefoperationalupdate_parent.py b/dref/migrations/0009_remove_drefoperationalupdate_parent.py index ce118617d..bc4ab849b 100644 --- a/dref/migrations/0009_remove_drefoperationalupdate_parent.py +++ b/dref/migrations/0009_remove_drefoperationalupdate_parent.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0008_auto_20220419_0628'), + ("dref", "0008_auto_20220419_0628"), ] operations = [ migrations.RemoveField( - model_name='drefoperationalupdate', - name='parent', + model_name="drefoperationalupdate", + name="parent", ), ] diff --git a/dref/migrations/0010_auto_20220429_0859.py b/dref/migrations/0010_auto_20220429_0859.py index 6be09cd67..c0aa45140 100644 --- a/dref/migrations/0010_auto_20220429_0859.py +++ b/dref/migrations/0010_auto_20220429_0859.py @@ -6,49 +6,49 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0009_remove_drefoperationalupdate_parent'), + ("dref", "0009_remove_drefoperationalupdate_parent"), ] operations = [ migrations.CreateModel( - name='PlannedInterventionIndicators', + name="PlannedInterventionIndicators", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='Title')), - ('target', models.IntegerField(blank=True, null=True, verbose_name='Target')), - ('actual', models.IntegerField(blank=True, null=True, verbose_name='Actual')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="Title")), + ("target", models.IntegerField(blank=True, null=True, verbose_name="Target")), + ("actual", models.IntegerField(blank=True, null=True, verbose_name="Actual")), ], options={ - 'verbose_name': 'planned intervention indicator', - 'verbose_name_plural': 'planned intervention indicators', + "verbose_name": "planned intervention indicator", + "verbose_name_plural": "planned intervention indicators", }, ), migrations.RemoveField( - model_name='drefoperationalupdate', - name='date_of_approval', + model_name="drefoperationalupdate", + name="date_of_approval", ), migrations.RemoveField( - model_name='plannedintervention', - name='indicator', + model_name="plannedintervention", + name="indicator", ), migrations.AddField( - model_name='drefoperationalupdate', - name='new_operational_start_date', - field=models.DateField(blank=True, null=True, verbose_name='New Operation Start Date'), + model_name="drefoperationalupdate", + name="new_operational_start_date", + field=models.DateField(blank=True, null=True, verbose_name="New Operation Start Date"), ), migrations.AddField( - model_name='plannedintervention', - name='female', - field=models.IntegerField(blank=True, null=True, verbose_name='female'), + model_name="plannedintervention", + name="female", + field=models.IntegerField(blank=True, null=True, verbose_name="female"), ), migrations.AddField( - model_name='plannedintervention', - name='male', - field=models.IntegerField(blank=True, null=True, verbose_name='male'), + model_name="plannedintervention", + name="male", + field=models.IntegerField(blank=True, null=True, verbose_name="male"), ), migrations.AddField( - model_name='plannedintervention', - name='progress_towards_outcome', - field=models.TextField(blank=True, null=True, verbose_name='Progress Towards Outcome'), + model_name="plannedintervention", + name="progress_towards_outcome", + field=models.TextField(blank=True, null=True, verbose_name="Progress Towards Outcome"), ), ] diff --git a/dref/migrations/0011_plannedintervention_indicators.py b/dref/migrations/0011_plannedintervention_indicators.py index c86133653..8255a0c23 100644 --- a/dref/migrations/0011_plannedintervention_indicators.py +++ b/dref/migrations/0011_plannedintervention_indicators.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0010_auto_20220429_0859'), + ("dref", "0010_auto_20220429_0859"), ] operations = [ migrations.AddField( - model_name='plannedintervention', - name='indicators', - field=models.ManyToManyField(blank=True, to='dref.PlannedInterventionIndicators', verbose_name='Indicators'), + model_name="plannedintervention", + name="indicators", + field=models.ManyToManyField(blank=True, to="dref.PlannedInterventionIndicators", verbose_name="Indicators"), ), ] diff --git a/dref/migrations/0012_auto_20220613_0911.py b/dref/migrations/0012_auto_20220613_0911.py index 5329c84e2..9abd1f44a 100644 --- a/dref/migrations/0012_auto_20220613_0911.py +++ b/dref/migrations/0012_auto_20220613_0911.py @@ -1,48 +1,62 @@ # Generated by Django 2.2.27 on 2022-06-13 09:11 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0011_plannedintervention_indicators'), + ("dref", "0011_plannedintervention_indicators"), ] operations = [ migrations.RemoveField( - model_name='drefoperationalupdate', - name='change_since_request', + model_name="drefoperationalupdate", + name="change_since_request", ), migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_actions', - field=models.TextField(blank=True, null=True, verbose_name='Anticipatory actions'), + model_name="drefoperationalupdate", + name="anticipatory_actions", + field=models.TextField(blank=True, null=True, verbose_name="Anticipatory actions"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='budget_file', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='budget_file_dref_operational_update', to='dref.DrefFile', verbose_name='budget file'), + model_name="drefoperationalupdate", + name="budget_file", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="budget_file_dref_operational_update", + to="dref.DrefFile", + verbose_name="budget file", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='cover_image', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='cover_image_dref_operational_update', to='dref.DrefFile', verbose_name='cover image'), + model_name="drefoperationalupdate", + name="cover_image", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="cover_image_dref_operational_update", + to="dref.DrefFile", + verbose_name="cover image", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_description', - field=models.TextField(blank=True, null=True, verbose_name='Event description'), + model_name="drefoperationalupdate", + name="event_description", + field=models.TextField(blank=True, null=True, verbose_name="Event description"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_scope', - field=models.TextField(blank=True, null=True, verbose_name='Event scope'), + model_name="drefoperationalupdate", + name="event_scope", + field=models.TextField(blank=True, null=True, verbose_name="Event scope"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='has_change_since_request', - field=models.BooleanField(blank=True, null=True, verbose_name='Has change since request'), + model_name="drefoperationalupdate", + name="has_change_since_request", + field=models.BooleanField(blank=True, null=True, verbose_name="Has change since request"), ), ] diff --git a/dref/migrations/0013_drefoperationalupdate_photos.py b/dref/migrations/0013_drefoperationalupdate_photos.py index a45a54340..a6d178e09 100644 --- a/dref/migrations/0013_drefoperationalupdate_photos.py +++ b/dref/migrations/0013_drefoperationalupdate_photos.py @@ -6,13 +6,15 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0012_auto_20220613_0911'), + ("dref", "0012_auto_20220613_0911"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='photos', - field=models.ManyToManyField(blank=True, related_name='photos_dref_operational_update', to='dref.DrefFile', verbose_name='images'), + model_name="drefoperationalupdate", + name="photos", + field=models.ManyToManyField( + blank=True, related_name="photos_dref_operational_update", to="dref.DrefFile", verbose_name="images" + ), ), ] diff --git a/dref/migrations/0014_auto_20220616_0913.py b/dref/migrations/0014_auto_20220616_0913.py index 7490b7cc9..5ebe7271c 100644 --- a/dref/migrations/0014_auto_20220616_0913.py +++ b/dref/migrations/0014_auto_20220616_0913.py @@ -1,120 +1,323 @@ # Generated by Django 2.2.27 on 2022-06-16 09:13 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('api', '0154_merge_20220513_0934'), + ("api", "0154_merge_20220513_0934"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('dref', '0013_drefoperationalupdate_photos'), + ("dref", "0013_drefoperationalupdate_photos"), ] operations = [ migrations.AddField( - model_name='plannedintervention', - name='challanges', - field=models.TextField(blank=True, null=True, verbose_name='Challenges'), + model_name="plannedintervention", + name="challanges", + field=models.TextField(blank=True, null=True, verbose_name="Challenges"), ), migrations.AddField( - model_name='plannedintervention', - name='lessons_learnt', - field=models.TextField(blank=True, null=True, verbose_name='Lessons learnt'), + model_name="plannedintervention", + name="lessons_learnt", + field=models.TextField(blank=True, null=True, verbose_name="Lessons learnt"), ), migrations.AddField( - model_name='plannedintervention', - name='narrative_description_of_achievements', - field=models.TextField(blank=True, null=True, verbose_name='Narrative description of achievements'), + model_name="plannedintervention", + name="narrative_description_of_achievements", + field=models.TextField(blank=True, null=True, verbose_name="Narrative description of achievements"), ), migrations.CreateModel( - name='DrefFinalReport', + name="DrefFinalReport", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), - ('title', models.CharField(blank=True, max_length=255, null=True, verbose_name='title')), - ('type_of_onset', models.IntegerField(blank=True, choices=[(0, 'Imminent'), (1, 'Slow'), (2, 'Sudden')], null=True, verbose_name='onset type')), - ('disaster_category', models.IntegerField(blank=True, choices=[(0, 'Yellow'), (1, 'Orange'), (2, 'Red')], null=True, verbose_name='disaster category')), - ('number_of_people_targeted', models.IntegerField(blank=True, null=True, verbose_name='Number of people targeted')), - ('total_dref_allocation', models.IntegerField(blank=True, null=True, verbose_name='Total dref allocation')), - ('date_of_publication', models.DateField(blank=True, null=True, verbose_name='Date of publication')), - ('total_operation_timeframe', models.IntegerField(blank=True, null=True, verbose_name='Total Operation Timeframe')), - ('operation_start_date', models.DateField(blank=True, null=True, verbose_name='Operation Start Date')), - ('appeal_code', models.CharField(blank=True, max_length=255, null=True, verbose_name='appeal code')), - ('glide_code', models.CharField(blank=True, max_length=255, null=True, verbose_name='glide number')), - ('ifrc_appeal_manager_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc appeal manager name')), - ('ifrc_appeal_manager_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc appeal manager email')), - ('ifrc_appeal_manager_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc appeal manager title')), - ('ifrc_appeal_manager_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc appeal manager phone number')), - ('ifrc_project_manager_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc project manager name')), - ('ifrc_project_manager_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc project manager email')), - ('ifrc_project_manager_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc project manager title')), - ('ifrc_project_manager_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc project manager phone number')), - ('national_society_contact_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='national society contact name')), - ('national_society_contact_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='national society contact email')), - ('national_society_contact_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='national society contact title')), - ('national_society_contact_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='national society contact phone number')), - ('ifrc_emergency_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc emergency name')), - ('ifrc_emergency_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc emergency email')), - ('ifrc_emergency_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='ifrc emergency title')), - ('ifrc_emergency_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc emergency phone number')), - ('media_contact_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='media contact name')), - ('media_contact_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='media contact email')), - ('media_contact_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='media contact title')), - ('media_contact_phone_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='media_contact phone number')), - ('event_description', models.TextField(blank=True, null=True, verbose_name='Event description')), - ('anticipatory_actions', models.TextField(blank=True, null=True, verbose_name='Anticipatory actions')), - ('event_scope', models.TextField(blank=True, null=True, verbose_name='Event scope')), - ('ifrc', models.TextField(blank=True, null=True, verbose_name='ifrc')), - ('icrc', models.TextField(blank=True, null=True, verbose_name='icrc')), - ('partner_national_society', models.TextField(blank=True, null=True, verbose_name='partner national society')), - ('government_requested_assistance', models.BooleanField(blank=True, help_text='Has government requested assistance', null=True)), - ('national_authorities', models.TextField(blank=True, null=True, verbose_name='national authorities')), - ('un_or_other_actor', models.TextField(blank=True, null=True, verbose_name='un or other')), - ('major_coordination_mechanism', models.TextField(blank=True, null=True, verbose_name='major coordination mechanism')), - ('people_assisted', models.TextField(blank=True, null=True, verbose_name='people assisted')), - ('selection_criteria', models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria')), - ('community_involved', models.TextField(blank=True, help_text='Community been involved in the analysis of the process', null=True, verbose_name='community involved')), - ('entity_affected', models.TextField(blank=True, help_text='Protection, gender, Inclusion affected in this process', null=True, verbose_name='entity affected')), - ('change_in_operational_strategy', models.BooleanField(default=False, verbose_name='Change in operational strategy')), - ('change_in_operational_strategy_text', models.TextField(blank=True, null=True, verbose_name='Change in operational strategy')), - ('women', models.IntegerField(blank=True, null=True, verbose_name='women')), - ('men', models.IntegerField(blank=True, null=True, verbose_name='men')), - ('girls', models.IntegerField(blank=True, help_text='Girls under 18', null=True, verbose_name='girls')), - ('boys', models.IntegerField(blank=True, help_text='Boys under 18', null=True, verbose_name='boys')), - ('disability_people_per', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='disability people per')), - ('people_per_urban', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='people per urban')), - ('people_per_local', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='people per local')), - ('people_targeted_with_early_actions', models.IntegerField(blank=True, null=True, verbose_name='people targeted with early actions')), - ('displaced_people', models.IntegerField(blank=True, null=True, verbose_name='displaced people')), - ('operation_objective', models.TextField(blank=True, null=True, verbose_name='operation objective')), - ('response_strategy', models.TextField(blank=True, null=True, verbose_name='response strategy')), - ('want_to_report', models.BooleanField(default=False, verbose_name='Want to report')), - ('additional_national_society_actions', models.TextField(blank=True, null=True, verbose_name='Additional National Societies Actions')), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_by_dref_final_report', to=settings.AUTH_USER_MODEL, verbose_name='created by')), - ('disaster_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType', verbose_name='disaster type')), - ('dref', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dref.Dref', verbose_name='Dref')), - ('event_map', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='event_map_dref_final_report', to='dref.DrefFile', verbose_name='event map')), - ('modified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_by_dref_final_report', to=settings.AUTH_USER_MODEL, verbose_name='modified by')), - ('national_society', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='national_society_final_report', to='api.Country', verbose_name='national_society')), - ('needs_identified', models.ManyToManyField(blank=True, to='dref.IdentifiedNeed', verbose_name='needs identified')), - ('photos', models.ManyToManyField(blank=True, related_name='photos_dref_final_report', to='dref.DrefFile', verbose_name='images')), - ('planned_interventions', models.ManyToManyField(blank=True, to='dref.PlannedIntervention', verbose_name='planned intervention')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="modified at")), + ("title", models.CharField(blank=True, max_length=255, null=True, verbose_name="title")), + ( + "type_of_onset", + models.IntegerField( + blank=True, choices=[(0, "Imminent"), (1, "Slow"), (2, "Sudden")], null=True, verbose_name="onset type" + ), + ), + ( + "disaster_category", + models.IntegerField( + blank=True, + choices=[(0, "Yellow"), (1, "Orange"), (2, "Red")], + null=True, + verbose_name="disaster category", + ), + ), + ( + "number_of_people_targeted", + models.IntegerField(blank=True, null=True, verbose_name="Number of people targeted"), + ), + ("total_dref_allocation", models.IntegerField(blank=True, null=True, verbose_name="Total dref allocation")), + ("date_of_publication", models.DateField(blank=True, null=True, verbose_name="Date of publication")), + ( + "total_operation_timeframe", + models.IntegerField(blank=True, null=True, verbose_name="Total Operation Timeframe"), + ), + ("operation_start_date", models.DateField(blank=True, null=True, verbose_name="Operation Start Date")), + ("appeal_code", models.CharField(blank=True, max_length=255, null=True, verbose_name="appeal code")), + ("glide_code", models.CharField(blank=True, max_length=255, null=True, verbose_name="glide number")), + ( + "ifrc_appeal_manager_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc appeal manager name"), + ), + ( + "ifrc_appeal_manager_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc appeal manager email"), + ), + ( + "ifrc_appeal_manager_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc appeal manager title"), + ), + ( + "ifrc_appeal_manager_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc appeal manager phone number"), + ), + ( + "ifrc_project_manager_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc project manager name"), + ), + ( + "ifrc_project_manager_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc project manager email"), + ), + ( + "ifrc_project_manager_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc project manager title"), + ), + ( + "ifrc_project_manager_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc project manager phone number"), + ), + ( + "national_society_contact_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="national society contact name"), + ), + ( + "national_society_contact_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="national society contact email"), + ), + ( + "national_society_contact_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="national society contact title"), + ), + ( + "national_society_contact_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="national society contact phone number"), + ), + ( + "ifrc_emergency_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc emergency name"), + ), + ( + "ifrc_emergency_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc emergency email"), + ), + ( + "ifrc_emergency_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="ifrc emergency title"), + ), + ( + "ifrc_emergency_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc emergency phone number"), + ), + ( + "media_contact_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="media contact name"), + ), + ( + "media_contact_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="media contact email"), + ), + ( + "media_contact_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="media contact title"), + ), + ( + "media_contact_phone_number", + models.CharField(blank=True, max_length=100, null=True, verbose_name="media_contact phone number"), + ), + ("event_description", models.TextField(blank=True, null=True, verbose_name="Event description")), + ("anticipatory_actions", models.TextField(blank=True, null=True, verbose_name="Anticipatory actions")), + ("event_scope", models.TextField(blank=True, null=True, verbose_name="Event scope")), + ("ifrc", models.TextField(blank=True, null=True, verbose_name="ifrc")), + ("icrc", models.TextField(blank=True, null=True, verbose_name="icrc")), + ("partner_national_society", models.TextField(blank=True, null=True, verbose_name="partner national society")), + ( + "government_requested_assistance", + models.BooleanField(blank=True, help_text="Has government requested assistance", null=True), + ), + ("national_authorities", models.TextField(blank=True, null=True, verbose_name="national authorities")), + ("un_or_other_actor", models.TextField(blank=True, null=True, verbose_name="un or other")), + ( + "major_coordination_mechanism", + models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), + ), + ("people_assisted", models.TextField(blank=True, null=True, verbose_name="people assisted")), + ( + "selection_criteria", + models.TextField( + blank=True, + help_text="Selection criteria for affected people", + null=True, + verbose_name="selection criteria", + ), + ), + ( + "community_involved", + models.TextField( + blank=True, + help_text="Community been involved in the analysis of the process", + null=True, + verbose_name="community involved", + ), + ), + ( + "entity_affected", + models.TextField( + blank=True, + help_text="Protection, gender, Inclusion affected in this process", + null=True, + verbose_name="entity affected", + ), + ), + ( + "change_in_operational_strategy", + models.BooleanField(default=False, verbose_name="Change in operational strategy"), + ), + ( + "change_in_operational_strategy_text", + models.TextField(blank=True, null=True, verbose_name="Change in operational strategy"), + ), + ("women", models.IntegerField(blank=True, null=True, verbose_name="women")), + ("men", models.IntegerField(blank=True, null=True, verbose_name="men")), + ("girls", models.IntegerField(blank=True, help_text="Girls under 18", null=True, verbose_name="girls")), + ("boys", models.IntegerField(blank=True, help_text="Boys under 18", null=True, verbose_name="boys")), + ( + "disability_people_per", + models.DecimalField( + blank=True, decimal_places=2, max_digits=5, null=True, verbose_name="disability people per" + ), + ), + ( + "people_per_urban", + models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name="people per urban"), + ), + ( + "people_per_local", + models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name="people per local"), + ), + ( + "people_targeted_with_early_actions", + models.IntegerField(blank=True, null=True, verbose_name="people targeted with early actions"), + ), + ("displaced_people", models.IntegerField(blank=True, null=True, verbose_name="displaced people")), + ("operation_objective", models.TextField(blank=True, null=True, verbose_name="operation objective")), + ("response_strategy", models.TextField(blank=True, null=True, verbose_name="response strategy")), + ("want_to_report", models.BooleanField(default=False, verbose_name="Want to report")), + ( + "additional_national_society_actions", + models.TextField(blank=True, null=True, verbose_name="Additional National Societies Actions"), + ), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="created_by_dref_final_report", + to=settings.AUTH_USER_MODEL, + verbose_name="created by", + ), + ), + ( + "disaster_type", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.DisasterType", + verbose_name="disaster type", + ), + ), + ("dref", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="dref.Dref", verbose_name="Dref")), + ( + "event_map", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="event_map_dref_final_report", + to="dref.DrefFile", + verbose_name="event map", + ), + ), + ( + "modified_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="modified_by_dref_final_report", + to=settings.AUTH_USER_MODEL, + verbose_name="modified by", + ), + ), + ( + "national_society", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="national_society_final_report", + to="api.Country", + verbose_name="national_society", + ), + ), + ( + "needs_identified", + models.ManyToManyField(blank=True, to="dref.IdentifiedNeed", verbose_name="needs identified"), + ), + ( + "photos", + models.ManyToManyField( + blank=True, related_name="photos_dref_final_report", to="dref.DrefFile", verbose_name="images" + ), + ), + ( + "planned_interventions", + models.ManyToManyField(blank=True, to="dref.PlannedIntervention", verbose_name="planned intervention"), + ), ], ), migrations.CreateModel( - name='DrefFinalReportCountryDistrict', + name="DrefFinalReportCountryDistrict", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('country', models.ForeignKey(help_text='Affected County', on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='country')), - ('district', models.ManyToManyField(blank=True, to='api.District', verbose_name='district')), - ('dref_final_report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dref.DrefFinalReport', verbose_name='Dref Final Report')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "country", + models.ForeignKey( + help_text="Affected County", + on_delete=django.db.models.deletion.CASCADE, + to="api.Country", + verbose_name="country", + ), + ), + ("district", models.ManyToManyField(blank=True, to="api.District", verbose_name="district")), + ( + "dref_final_report", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="dref.DrefFinalReport", verbose_name="Dref Final Report" + ), + ), ], options={ - 'unique_together': {('dref_final_report', 'country')}, + "unique_together": {("dref_final_report", "country")}, }, ), ] diff --git a/dref/migrations/0015_auto_20220708_0739.py b/dref/migrations/0015_auto_20220708_0739.py index 26bebf794..df4d42791 100644 --- a/dref/migrations/0015_auto_20220708_0739.py +++ b/dref/migrations/0015_auto_20220708_0739.py @@ -1,39 +1,39 @@ # Generated by Django 2.2.27 on 2022-07-08 07:39 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0014_auto_20220616_0913'), + ("dref", "0014_auto_20220616_0913"), ] operations = [ migrations.RenameField( - model_name='plannedintervention', - old_name='challanges', - new_name='challenges', + model_name="plannedintervention", + old_name="challanges", + new_name="challenges", ), migrations.AddField( - model_name='dref', - name='is_final_report_created', - field=models.BooleanField(default=False, verbose_name='Is final report created'), + model_name="dref", + name="is_final_report_created", + field=models.BooleanField(default=False, verbose_name="Is final report created"), ), migrations.AddField( - model_name='dreffinalreport', - name='is_published', - field=models.BooleanField(default=False, verbose_name='Is Published'), + model_name="dreffinalreport", + name="is_published", + field=models.BooleanField(default=False, verbose_name="Is Published"), ), migrations.AddField( - model_name='dreffinalreport', - name='number_of_people_affected', - field=models.IntegerField(blank=True, null=True, verbose_name='number of people affected'), + model_name="dreffinalreport", + name="number_of_people_affected", + field=models.IntegerField(blank=True, null=True, verbose_name="number of people affected"), ), migrations.AlterField( - model_name='dreffinalreport', - name='dref', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='dref.Dref', verbose_name='Dref'), + model_name="dreffinalreport", + name="dref", + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to="dref.Dref", verbose_name="Dref"), ), ] diff --git a/dref/migrations/0016_auto_20220725_0445.py b/dref/migrations/0016_auto_20220725_0445.py index 657a9ed8c..8fdebdf13 100644 --- a/dref/migrations/0016_auto_20220725_0445.py +++ b/dref/migrations/0016_auto_20220725_0445.py @@ -6,49 +6,49 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0015_auto_20220708_0739'), + ("dref", "0015_auto_20220708_0739"), ] operations = [ migrations.AlterUniqueTogether( - name='dreffinalreportcountrydistrict', + name="dreffinalreportcountrydistrict", unique_together=None, ), migrations.RemoveField( - model_name='dreffinalreportcountrydistrict', - name='country', + model_name="dreffinalreportcountrydistrict", + name="country", ), migrations.RemoveField( - model_name='dreffinalreportcountrydistrict', - name='district', + model_name="dreffinalreportcountrydistrict", + name="district", ), migrations.RemoveField( - model_name='dreffinalreportcountrydistrict', - name='dref_final_report', + model_name="dreffinalreportcountrydistrict", + name="dref_final_report", ), migrations.AlterUniqueTogether( - name='drefoperationalupdatecountrydistrict', + name="drefoperationalupdatecountrydistrict", unique_together=None, ), migrations.RemoveField( - model_name='drefoperationalupdatecountrydistrict', - name='country', + model_name="drefoperationalupdatecountrydistrict", + name="country", ), migrations.RemoveField( - model_name='drefoperationalupdatecountrydistrict', - name='district', + model_name="drefoperationalupdatecountrydistrict", + name="district", ), migrations.RemoveField( - model_name='drefoperationalupdatecountrydistrict', - name='dref_operational_update', + model_name="drefoperationalupdatecountrydistrict", + name="dref_operational_update", ), migrations.DeleteModel( - name='DrefCountryDistrict', + name="DrefCountryDistrict", ), migrations.DeleteModel( - name='DrefFinalReportCountryDistrict', + name="DrefFinalReportCountryDistrict", ), migrations.DeleteModel( - name='DrefOperationalUpdateCountryDistrict', + name="DrefOperationalUpdateCountryDistrict", ), ] diff --git a/dref/migrations/0017_auto_20220725_0538.py b/dref/migrations/0017_auto_20220725_0538.py index 965037ca2..79ac4486c 100644 --- a/dref/migrations/0017_auto_20220725_0538.py +++ b/dref/migrations/0017_auto_20220725_0538.py @@ -1,92 +1,154 @@ # Generated by Django 2.2.27 on 2022-07-25 05:38 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0016_auto_20220725_0445'), + ("dref", "0016_auto_20220725_0445"), ] operations = [ migrations.AlterModelOptions( - name='dreffinalreport', - options={'verbose_name': 'Dref Final Report', 'verbose_name_plural': 'Dref Final Reports'}, + name="dreffinalreport", + options={"verbose_name": "Dref Final Report", "verbose_name_plural": "Dref Final Reports"}, ), migrations.RemoveField( - model_name='dref', - name='go_field_report_date', + model_name="dref", + name="go_field_report_date", ), migrations.AddField( - model_name='dref', - name='assessment_report', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dref_assessment_report', to='dref.DrefFile', verbose_name='Assessment Report'), + model_name="dref", + name="assessment_report", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="dref_assessment_report", + to="dref.DrefFile", + verbose_name="Assessment Report", + ), ), migrations.AddField( - model_name='dref', - name='country', - field=models.ForeignKey(blank=True, help_text='Affected County', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dref_country', to='api.Country', verbose_name='country'), + model_name="dref", + name="country", + field=models.ForeignKey( + blank=True, + help_text="Affected County", + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="dref_country", + to="api.Country", + verbose_name="country", + ), ), migrations.AddField( - model_name='dref', - name='district', - field=models.ManyToManyField(blank=True, to='api.District', verbose_name='district'), + model_name="dref", + name="district", + field=models.ManyToManyField(blank=True, to="api.District", verbose_name="district"), ), migrations.AddField( - model_name='dreffile', - name='caption', + model_name="dreffile", + name="caption", field=models.CharField(blank=True, max_length=225, null=True), ), migrations.AddField( - model_name='dreffile', - name='client_id', + model_name="dreffile", + name="client_id", field=models.CharField(blank=True, max_length=50, null=True), ), migrations.AddField( - model_name='dreffinalreport', - name='assessment_report', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dref_final_report_assessment_report', to='dref.DrefFile', verbose_name='Assessment Report'), + model_name="dreffinalreport", + name="assessment_report", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="dref_final_report_assessment_report", + to="dref.DrefFile", + verbose_name="Assessment Report", + ), ), migrations.AddField( - model_name='dreffinalreport', - name='country', - field=models.ForeignKey(blank=True, help_text='Affected County', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='final_report_country', to='api.Country', verbose_name='country'), + model_name="dreffinalreport", + name="country", + field=models.ForeignKey( + blank=True, + help_text="Affected County", + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="final_report_country", + to="api.Country", + verbose_name="country", + ), ), migrations.AddField( - model_name='dreffinalreport', - name='district', - field=models.ManyToManyField(blank=True, to='api.District', verbose_name='district'), + model_name="dreffinalreport", + name="district", + field=models.ManyToManyField(blank=True, to="api.District", verbose_name="district"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='assessment_report', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dref_operational_update_assessment_report', to='dref.DrefFile', verbose_name='Assessment Report'), + model_name="drefoperationalupdate", + name="assessment_report", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="dref_operational_update_assessment_report", + to="dref.DrefFile", + verbose_name="Assessment Report", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='country', - field=models.ForeignKey(blank=True, help_text='Affected County', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='operational_update_country', to='api.Country', verbose_name='country'), + model_name="drefoperationalupdate", + name="country", + field=models.ForeignKey( + blank=True, + help_text="Affected County", + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="operational_update_country", + to="api.Country", + verbose_name="country", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='district', - field=models.ManyToManyField(blank=True, to='api.District', verbose_name='district'), + model_name="drefoperationalupdate", + name="district", + field=models.ManyToManyField(blank=True, to="api.District", verbose_name="district"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='is_there_major_coordination_mechanism', - field=models.BooleanField(blank=True, help_text='Is there major coordinate mechanism', null=True), + model_name="drefoperationalupdate", + name="is_there_major_coordination_mechanism", + field=models.BooleanField(blank=True, help_text="Is there major coordinate mechanism", null=True), ), migrations.AddField( - model_name='drefoperationalupdate', - name='is_there_un_or_other_actor', - field=models.BooleanField(blank=True, null=True, verbose_name='Is there un_or_other_actor'), + model_name="drefoperationalupdate", + name="is_there_un_or_other_actor", + field=models.BooleanField(blank=True, null=True, verbose_name="Is there un_or_other_actor"), ), migrations.AlterField( - model_name='identifiedneed', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination'), ('multi-purpose_cash', 'Multi-purpose Cash')], max_length=255, verbose_name='title'), + model_name="identifiedneed", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ], + max_length=255, + verbose_name="title", + ), ), ] diff --git a/dref/migrations/0018_dref_is_surge_personnel_deployed.py b/dref/migrations/0018_dref_is_surge_personnel_deployed.py index c4547dece..95ed8d0ae 100644 --- a/dref/migrations/0018_dref_is_surge_personnel_deployed.py +++ b/dref/migrations/0018_dref_is_surge_personnel_deployed.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0017_auto_20220725_0538'), + ("dref", "0017_auto_20220725_0538"), ] operations = [ migrations.AddField( - model_name='dref', - name='is_surge_personnel_deployed', - field=models.BooleanField(blank=True, null=True, verbose_name='Is surge personnel deployed'), + model_name="dref", + name="is_surge_personnel_deployed", + field=models.BooleanField(blank=True, null=True, verbose_name="Is surge personnel deployed"), ), ] diff --git a/dref/migrations/0019_auto_20220725_0835.py b/dref/migrations/0019_auto_20220725_0835.py index bd8edfddb..b689470cc 100644 --- a/dref/migrations/0019_auto_20220725_0835.py +++ b/dref/migrations/0019_auto_20220725_0835.py @@ -6,13 +6,31 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0018_dref_is_surge_personnel_deployed'), + ("dref", "0018_dref_is_surge_personnel_deployed"), ] operations = [ migrations.AlterField( - model_name='plannedintervention', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('environmental_sustainability', 'Environmental Sustainability'), ('community_engagement_and_accountability', 'Community Engagement And Accountability')], max_length=255, verbose_name='title'), + model_name="plannedintervention", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("environmental_sustainability", "Environmental Sustainability"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ], + max_length=255, + verbose_name="title", + ), ), ] diff --git a/dref/migrations/0020_auto_20220725_1001.py b/dref/migrations/0020_auto_20220725_1001.py index fe95fb248..a4966d756 100644 --- a/dref/migrations/0020_auto_20220725_1001.py +++ b/dref/migrations/0020_auto_20220725_1001.py @@ -6,21 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0019_auto_20220725_0835'), + ("dref", "0019_auto_20220725_0835"), ] operations = [ migrations.CreateModel( - name='RiskSecurity', + name="RiskSecurity", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(choices=[('risk', 'Risk'), ('mitigation_action', 'Mitigation Action')], max_length=50, verbose_name='Title')), - ('security_concern', models.TextField(blank=True, null=True, verbose_name='Security Concern')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "title", + models.CharField( + choices=[("risk", "Risk"), ("mitigation_action", "Mitigation Action")], + max_length=50, + verbose_name="Title", + ), + ), + ("security_concern", models.TextField(blank=True, null=True, verbose_name="Security Concern")), ], ), migrations.AddField( - model_name='dref', - name='risk_security', - field=models.ManyToManyField(blank=True, to='dref.RiskSecurity', verbose_name='Risk Security'), + model_name="dref", + name="risk_security", + field=models.ManyToManyField(blank=True, to="dref.RiskSecurity", verbose_name="Risk Security"), ), ] diff --git a/dref/migrations/0021_dref_is_there_major_coordination_mechanism.py b/dref/migrations/0021_dref_is_there_major_coordination_mechanism.py index 01b3b6a59..9e909b252 100644 --- a/dref/migrations/0021_dref_is_there_major_coordination_mechanism.py +++ b/dref/migrations/0021_dref_is_there_major_coordination_mechanism.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0020_auto_20220725_1001'), + ("dref", "0020_auto_20220725_1001"), ] operations = [ migrations.AddField( - model_name='dref', - name='is_there_major_coordination_mechanism', - field=models.BooleanField(blank=True, null=True, verbose_name='Is major coordination mechanism'), + model_name="dref", + name="is_there_major_coordination_mechanism", + field=models.BooleanField(blank=True, null=True, verbose_name="Is major coordination mechanism"), ), ] diff --git a/dref/migrations/0022_auto_20220727_0536.py b/dref/migrations/0022_auto_20220727_0536.py index 5621973bf..2bbe4eb8f 100644 --- a/dref/migrations/0022_auto_20220727_0536.py +++ b/dref/migrations/0022_auto_20220727_0536.py @@ -1,24 +1,31 @@ # Generated by Django 2.2.27 on 2022-07-27 05:36 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0021_dref_is_there_major_coordination_mechanism'), + ("dref", "0021_dref_is_there_major_coordination_mechanism"), ] operations = [ migrations.AddField( - model_name='dref', - name='did_national_society', - field=models.BooleanField(blank=True, null=True, verbose_name='Did National Society'), + model_name="dref", + name="did_national_society", + field=models.BooleanField(blank=True, null=True, verbose_name="Did National Society"), ), migrations.AddField( - model_name='dref', - name='suporting_document', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dref_supporting_document', to='dref.DrefFile', verbose_name='Supporting Document'), + model_name="dref", + name="suporting_document", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="dref_supporting_document", + to="dref.DrefFile", + verbose_name="Supporting Document", + ), ), ] diff --git a/dref/migrations/0023_auto_20220727_0928.py b/dref/migrations/0023_auto_20220727_0928.py index 0acbae325..c5b147836 100644 --- a/dref/migrations/0023_auto_20220727_0928.py +++ b/dref/migrations/0023_auto_20220727_0928.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0022_auto_20220727_0536'), + ("dref", "0022_auto_20220727_0536"), ] operations = [ migrations.AlterField( - model_name='risksecurity', - name='title', - field=models.CharField(max_length=50, verbose_name='Title'), + model_name="risksecurity", + name="title", + field=models.CharField(max_length=50, verbose_name="Title"), ), ] diff --git a/dref/migrations/0024_auto_20220728_0418.py b/dref/migrations/0024_auto_20220728_0418.py index 7d3a74581..de030c944 100644 --- a/dref/migrations/0024_auto_20220728_0418.py +++ b/dref/migrations/0024_auto_20220728_0418.py @@ -6,36 +6,36 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0023_auto_20220727_0928'), + ("dref", "0023_auto_20220727_0928"), ] operations = [ migrations.RemoveField( - model_name='risksecurity', - name='security_concern', + model_name="risksecurity", + name="security_concern", ), migrations.RemoveField( - model_name='risksecurity', - name='title', + model_name="risksecurity", + name="title", ), migrations.AddField( - model_name='dref', - name='risk_security_concern', - field=models.TextField(blank=True, null=True, verbose_name='Security Concern'), + model_name="dref", + name="risk_security_concern", + field=models.TextField(blank=True, null=True, verbose_name="Security Concern"), ), migrations.AddField( - model_name='risksecurity', - name='client_id', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='client_id'), + model_name="risksecurity", + name="client_id", + field=models.CharField(blank=True, max_length=50, null=True, verbose_name="client_id"), ), migrations.AddField( - model_name='risksecurity', - name='mitigation', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Mitigation'), + model_name="risksecurity", + name="mitigation", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Mitigation"), ), migrations.AddField( - model_name='risksecurity', - name='risk', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Risk'), + model_name="risksecurity", + name="risk", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Risk"), ), ] diff --git a/dref/migrations/0025_auto_20220808_0713.py b/dref/migrations/0025_auto_20220808_0713.py index 0d342841f..c7ee375c3 100644 --- a/dref/migrations/0025_auto_20220808_0713.py +++ b/dref/migrations/0025_auto_20220808_0713.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0024_auto_20220728_0418'), + ("dref", "0024_auto_20220728_0418"), ] operations = [ migrations.AddField( - model_name='dref', - name='title_prefix', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dref", + name="title_prefix", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='dreffinalreport', - name='title_prefix', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dreffinalreport", + name="title_prefix", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='title_prefix', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="drefoperationalupdate", + name="title_prefix", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AlterField( - model_name='dref', - name='risk_security_concern', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dref", + name="risk_security_concern", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), ] diff --git a/dref/migrations/0026_auto_20220810_0441.py b/dref/migrations/0026_auto_20220810_0441.py index a2c8e74cc..32ef04cd4 100644 --- a/dref/migrations/0026_auto_20220810_0441.py +++ b/dref/migrations/0026_auto_20220810_0441.py @@ -6,18 +6,57 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0025_auto_20220808_0713'), + ("dref", "0025_auto_20220808_0713"), ] operations = [ migrations.AlterField( - model_name='identifiedneed', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, verbose_name='title'), + model_name="identifiedneed", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='nationalsocietyaction', - name='title', - field=models.CharField(choices=[('national_society_readiness', 'National Society Readiness'), ('assessment', 'Assessment'), ('coordination', 'Coordination'), ('resource_mobilization', 'Resource Mobilization'), ('activation_of_contingency_plans', 'Activation Of Contingency Plans'), ('national_society_eoc', 'National Society EOC'), ('shelter_housing and Settlements', 'Shelter, Housing and Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('other', 'Other')], max_length=255, verbose_name='title'), + model_name="nationalsocietyaction", + name="title", + field=models.CharField( + choices=[ + ("national_society_readiness", "National Society Readiness"), + ("assessment", "Assessment"), + ("coordination", "Coordination"), + ("resource_mobilization", "Resource Mobilization"), + ("activation_of_contingency_plans", "Activation Of Contingency Plans"), + ("national_society_eoc", "National Society EOC"), + ("shelter_housing and Settlements", "Shelter, Housing and Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("other", "Other"), + ], + max_length=255, + verbose_name="title", + ), ), ] diff --git a/dref/migrations/0027_auto_20220810_0831.py b/dref/migrations/0027_auto_20220810_0831.py index e1b5938bc..f8e3e8951 100644 --- a/dref/migrations/0027_auto_20220810_0831.py +++ b/dref/migrations/0027_auto_20220810_0831.py @@ -6,13 +6,36 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0026_auto_20220810_0441'), + ("dref", "0026_auto_20220810_0441"), ] operations = [ migrations.AlterField( - model_name='nationalsocietyaction', - name='title', - field=models.CharField(choices=[('national_society_readiness', 'National Society Readiness'), ('assessment', 'Assessment'), ('coordination', 'Coordination'), ('resource_mobilization', 'Resource Mobilization'), ('activation_of_contingency_plans', 'Activation Of Contingency Plans'), ('national_society_eoc', 'National Society EOC'), ('shelter_housing_and_settlements', 'Shelter, Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('other', 'Other')], max_length=255, verbose_name='title'), + model_name="nationalsocietyaction", + name="title", + field=models.CharField( + choices=[ + ("national_society_readiness", "National Society Readiness"), + ("assessment", "Assessment"), + ("coordination", "Coordination"), + ("resource_mobilization", "Resource Mobilization"), + ("activation_of_contingency_plans", "Activation Of Contingency Plans"), + ("national_society_eoc", "National Society EOC"), + ("shelter_housing_and_settlements", "Shelter, Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("other", "Other"), + ], + max_length=255, + verbose_name="title", + ), ), ] diff --git a/dref/migrations/0028_auto_20220817_1013.py b/dref/migrations/0028_auto_20220817_1013.py index c7e681094..c099204a2 100644 --- a/dref/migrations/0028_auto_20220817_1013.py +++ b/dref/migrations/0028_auto_20220817_1013.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0027_auto_20220810_0831'), + ("dref", "0027_auto_20220810_0831"), ] operations = [ migrations.RenameField( - model_name='dref', - old_name='suporting_document', - new_name='supporting_document', + model_name="dref", + old_name="suporting_document", + new_name="supporting_document", ), migrations.AddField( - model_name='dref', - name='people_in_need', - field=models.IntegerField(blank=True, null=True, verbose_name='people in need'), + model_name="dref", + name="people_in_need", + field=models.IntegerField(blank=True, null=True, verbose_name="people in need"), ), ] diff --git a/dref/migrations/0029_dref_is_man_made_event.py b/dref/migrations/0029_dref_is_man_made_event.py index 849877002..bb8b40fe2 100644 --- a/dref/migrations/0029_dref_is_man_made_event.py +++ b/dref/migrations/0029_dref_is_man_made_event.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0028_auto_20220817_1013'), + ("dref", "0028_auto_20220817_1013"), ] operations = [ migrations.AddField( - model_name='dref', - name='is_man_made_event', - field=models.BooleanField(default=False, verbose_name='Is Man-made Event'), + model_name="dref", + name="is_man_made_event", + field=models.BooleanField(default=False, verbose_name="Is Man-made Event"), ), ] diff --git a/dref/migrations/0030_dref_is_assessment_report.py b/dref/migrations/0030_dref_is_assessment_report.py index 7f4af4134..3725d3e7b 100644 --- a/dref/migrations/0030_dref_is_assessment_report.py +++ b/dref/migrations/0030_dref_is_assessment_report.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0029_dref_is_man_made_event'), + ("dref", "0029_dref_is_man_made_event"), ] operations = [ migrations.AddField( - model_name='dref', - name='is_assessment_report', - field=models.BooleanField(default=False, verbose_name='Is assessment Report'), + model_name="dref", + name="is_assessment_report", + field=models.BooleanField(default=False, verbose_name="Is assessment Report"), ), ] diff --git a/dref/migrations/0031_auto_20220819_0844.py b/dref/migrations/0031_auto_20220819_0844.py index 07cdd764f..0af01080d 100644 --- a/dref/migrations/0031_auto_20220819_0844.py +++ b/dref/migrations/0031_auto_20220819_0844.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0030_dref_is_assessment_report'), + ("dref", "0030_dref_is_assessment_report"), ] operations = [ migrations.AlterField( - model_name='dref', - name='is_man_made_event', - field=models.BooleanField(blank=True, null=True, verbose_name='Is Man-made Event'), + model_name="dref", + name="is_man_made_event", + field=models.BooleanField(blank=True, null=True, verbose_name="Is Man-made Event"), ), ] diff --git a/dref/migrations/0032_auto_20220824_0446.py b/dref/migrations/0032_auto_20220824_0446.py index 64bb514e1..a861d267f 100644 --- a/dref/migrations/0032_auto_20220824_0446.py +++ b/dref/migrations/0032_auto_20220824_0446.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0031_auto_20220819_0844'), + ("dref", "0031_auto_20220819_0844"), ] operations = [ migrations.AlterField( - model_name='risksecurity', - name='mitigation', - field=models.TextField(blank=True, null=True, verbose_name='Mitigation'), + model_name="risksecurity", + name="mitigation", + field=models.TextField(blank=True, null=True, verbose_name="Mitigation"), ), migrations.AlterField( - model_name='risksecurity', - name='risk', - field=models.TextField(blank=True, null=True, verbose_name='Risk'), + model_name="risksecurity", + name="risk", + field=models.TextField(blank=True, null=True, verbose_name="Risk"), ), ] diff --git a/dref/migrations/0033_auto_20220907_1029.py b/dref/migrations/0033_auto_20220907_1029.py index df2a4fd41..8849618c8 100644 --- a/dref/migrations/0033_auto_20220907_1029.py +++ b/dref/migrations/0033_auto_20220907_1029.py @@ -1,51 +1,64 @@ # Generated by Django 2.2.27 on 2022-09-07 10:29 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('dref', '0032_auto_20220824_0446'), + ("dref", "0032_auto_20220824_0446"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_to_response', - field=models.TextField(blank=True, null=True, verbose_name='Please explain how is the operation is transitioning from Anticipatory to Response'), + model_name="drefoperationalupdate", + name="anticipatory_to_response", + field=models.TextField( + blank=True, + null=True, + verbose_name="Please explain how is the operation is transitioning from Anticipatory to Response", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_map', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='event_map_dref_operational_update', to='dref.DrefFile', verbose_name='event map'), + model_name="drefoperationalupdate", + name="event_map", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="event_map_dref_operational_update", + to="dref.DrefFile", + verbose_name="event map", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='has_forcasted_event_materialize', - field=models.BooleanField(blank=True, null=True, verbose_name='Has Forcasted Event Materialize'), + model_name="drefoperationalupdate", + name="has_forcasted_event_materialize", + field=models.BooleanField(blank=True, null=True, verbose_name="Has Forcasted Event Materialize"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='risk_security', - field=models.ManyToManyField(blank=True, to='dref.RiskSecurity', verbose_name='Risk Security'), + model_name="drefoperationalupdate", + name="risk_security", + field=models.ManyToManyField(blank=True, to="dref.RiskSecurity", verbose_name="Risk Security"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='risk_security_concern', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="drefoperationalupdate", + name="risk_security_concern", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='specified_trigger_met', - field=models.TextField(blank=True, null=True, verbose_name='Specified Trigger Met'), + model_name="drefoperationalupdate", + name="specified_trigger_met", + field=models.TextField(blank=True, null=True, verbose_name="Specified Trigger Met"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='users', - field=models.ManyToManyField(blank=True, related_name='user_dref_operational_update', to=settings.AUTH_USER_MODEL, verbose_name='users'), + model_name="drefoperationalupdate", + name="users", + field=models.ManyToManyField( + blank=True, related_name="user_dref_operational_update", to=settings.AUTH_USER_MODEL, verbose_name="users" + ), ), ] diff --git a/dref/migrations/0033_dreffileupload.py b/dref/migrations/0033_dreffileupload.py index 1dfc75a2e..00637b29b 100644 --- a/dref/migrations/0033_dreffileupload.py +++ b/dref/migrations/0033_dreffileupload.py @@ -1,28 +1,36 @@ # Generated by Django 2.2.27 on 2022-08-26 04:38 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('dref', '0032_auto_20220824_0446'), + ("dref", "0032_auto_20220824_0446"), ] operations = [ migrations.CreateModel( - name='DrefFileUpload', + name="DrefFileUpload", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.FileField(upload_to='dref/file-upload/', verbose_name='file')), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='created_by')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("file", models.FileField(upload_to="dref/file-upload/", verbose_name="file")), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="created_by", + ), + ), ], options={ - 'verbose_name': 'dref file upload', - 'verbose_name_plural': 'dref files upload', + "verbose_name": "dref file upload", + "verbose_name_plural": "dref files upload", }, ), ] diff --git a/dref/migrations/0034_dreffileupload_dref.py b/dref/migrations/0034_dreffileupload_dref.py index dc426c6ab..488441464 100644 --- a/dref/migrations/0034_dreffileupload_dref.py +++ b/dref/migrations/0034_dreffileupload_dref.py @@ -1,19 +1,21 @@ # Generated by Django 2.2.27 on 2022-08-26 05:33 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0033_dreffileupload'), + ("dref", "0033_dreffileupload"), ] operations = [ migrations.AddField( - model_name='dreffileupload', - name='dref', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dref.Dref', verbose_name='Dref'), + model_name="dreffileupload", + name="dref", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="dref.Dref", verbose_name="Dref" + ), ), ] diff --git a/dref/migrations/0034_drefoperationalupdate_is_assessment_report.py b/dref/migrations/0034_drefoperationalupdate_is_assessment_report.py index b0ad01cf7..5e3c18130 100644 --- a/dref/migrations/0034_drefoperationalupdate_is_assessment_report.py +++ b/dref/migrations/0034_drefoperationalupdate_is_assessment_report.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0033_auto_20220907_1029'), + ("dref", "0033_auto_20220907_1029"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='is_assessment_report', - field=models.BooleanField(blank=True, null=True, verbose_name='Is assessment Report'), + model_name="drefoperationalupdate", + name="is_assessment_report", + field=models.BooleanField(blank=True, null=True, verbose_name="Is assessment Report"), ), ] diff --git a/dref/migrations/0035_merge_20220914_0638.py b/dref/migrations/0035_merge_20220914_0638.py index a99a8555e..e8ce8d8de 100644 --- a/dref/migrations/0035_merge_20220914_0638.py +++ b/dref/migrations/0035_merge_20220914_0638.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0034_dreffileupload_dref'), - ('dref', '0034_drefoperationalupdate_is_assessment_report'), + ("dref", "0034_dreffileupload_dref"), + ("dref", "0034_drefoperationalupdate_is_assessment_report"), ] - operations = [ - ] + operations = [] diff --git a/dref/migrations/0036_auto_20220914_1340.py b/dref/migrations/0036_auto_20220914_1340.py index 5d5bc62d0..c254a7308 100644 --- a/dref/migrations/0036_auto_20220914_1340.py +++ b/dref/migrations/0036_auto_20220914_1340.py @@ -1,19 +1,25 @@ # Generated by Django 2.2.28 on 2022-09-14 13:40 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0035_merge_20220914_0638'), + ("dref", "0035_merge_20220914_0638"), ] operations = [ migrations.AlterField( - model_name='dref', - name='national_society', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='national_society'), + model_name="dref", + name="national_society", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="api.Country", + verbose_name="national_society", + ), ), ] diff --git a/dref/migrations/0037_auto_20220915_1237.py b/dref/migrations/0037_auto_20220915_1237.py index 051390189..20468ae56 100644 --- a/dref/migrations/0037_auto_20220915_1237.py +++ b/dref/migrations/0037_auto_20220915_1237.py @@ -6,13 +6,30 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0036_auto_20220914_1340'), + ("dref", "0036_auto_20220914_1340"), ] operations = [ migrations.AlterField( - model_name='identifiedneed', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, verbose_name='title'), + model_name="identifiedneed", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + verbose_name="title", + ), ), ] diff --git a/dref/migrations/0038_auto_20220915_1520.py b/dref/migrations/0038_auto_20220915_1520.py index 9b94b28be..9fd7eb61d 100644 --- a/dref/migrations/0038_auto_20220915_1520.py +++ b/dref/migrations/0038_auto_20220915_1520.py @@ -1,20 +1,22 @@ # Generated by Django 2.2.28 on 2022-09-15 15:20 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0037_auto_20220915_1237'), + ("dref", "0037_auto_20220915_1237"), ] operations = [ migrations.AlterField( - model_name='dref', - name='national_society', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='api.Country', verbose_name='national_society'), + model_name="dref", + name="national_society", + field=models.ForeignKey( + default=1, on_delete=django.db.models.deletion.CASCADE, to="api.Country", verbose_name="national_society" + ), preserve_default=False, ), ] diff --git a/dref/migrations/0039_alter_dref_field_report.py b/dref/migrations/0039_alter_dref_field_report.py index 8f910525c..8ee064f04 100644 --- a/dref/migrations/0039_alter_dref_field_report.py +++ b/dref/migrations/0039_alter_dref_field_report.py @@ -1,29 +1,36 @@ # Generated by Django 3.2.15 on 2022-09-29 07:39 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0038_auto_20220915_1520'), + ("dref", "0038_auto_20220915_1520"), ] operations = [ migrations.AlterField( - model_name='dref', - name='field_report', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='field_report_dref', to='api.fieldreport', verbose_name='field report'), + model_name="dref", + name="field_report", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="field_report_dref", + to="api.fieldreport", + verbose_name="field report", + ), ), migrations.RenameField( - model_name='drefoperationalupdate', - old_name='has_forcasted_event_materialize', - new_name='has_forecasted_event_materialize', + model_name="drefoperationalupdate", + old_name="has_forcasted_event_materialize", + new_name="has_forecasted_event_materialize", ), migrations.AlterField( - model_name='drefoperationalupdate', - name='has_forecasted_event_materialize', - field=models.BooleanField(blank=True, null=True, verbose_name='Has Forecasted Event Materialize'), + model_name="drefoperationalupdate", + name="has_forecasted_event_materialize", + field=models.BooleanField(blank=True, null=True, verbose_name="Has Forecasted Event Materialize"), ), ] diff --git a/dref/migrations/0040_auto_20221010_0621.py b/dref/migrations/0040_auto_20221010_0621.py index edb5d2fb1..c33013557 100644 --- a/dref/migrations/0040_auto_20221010_0621.py +++ b/dref/migrations/0040_auto_20221010_0621.py @@ -6,48 +6,54 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0039_alter_dref_field_report'), + ("dref", "0039_alter_dref_field_report"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='event_date', - field=models.DateField(blank=True, help_text='Date of event/Approximate date of impact', null=True, verbose_name='event date'), + model_name="drefoperationalupdate", + name="event_date", + field=models.DateField( + blank=True, help_text="Date of event/Approximate date of impact", null=True, verbose_name="event date" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='has_event_occured', - field=models.BooleanField(blank=True, help_text='Has Event occured', null=True), + model_name="drefoperationalupdate", + name="has_event_occured", + field=models.BooleanField(blank=True, help_text="Has Event occured", null=True), ), migrations.AddField( - model_name='drefoperationalupdate', - name='ns_respond', - field=models.BooleanField(blank=True, default=False, help_text='Did NS respond', null=True), + model_name="drefoperationalupdate", + name="ns_respond", + field=models.BooleanField(blank=True, default=False, help_text="Did NS respond", null=True), ), migrations.AddField( - model_name='drefoperationalupdate', - name='ns_respond_date', - field=models.DateField(blank=True, help_text='NS anticipatory actions started/NS response', null=True, verbose_name='ns respond date'), + model_name="drefoperationalupdate", + name="ns_respond_date", + field=models.DateField( + blank=True, help_text="NS anticipatory actions started/NS response", null=True, verbose_name="ns respond date" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='people_in_need', - field=models.IntegerField(blank=True, null=True, verbose_name='people in need'), + model_name="drefoperationalupdate", + name="people_in_need", + field=models.IntegerField(blank=True, null=True, verbose_name="people in need"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='reporting_end_date', - field=models.DateField(blank=True, null=True, verbose_name='Reporting Time End Date'), + model_name="drefoperationalupdate", + name="reporting_end_date", + field=models.DateField(blank=True, null=True, verbose_name="Reporting Time End Date"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='reporting_start_date', - field=models.DateField(blank=True, null=True, verbose_name='Reporting Time Start Date'), + model_name="drefoperationalupdate", + name="reporting_start_date", + field=models.DateField(blank=True, null=True, verbose_name="Reporting Time Start Date"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='total_targeted_population', - field=models.IntegerField(blank=True, help_text='Estimated number of targeted people', null=True, verbose_name='total targeted population'), + model_name="drefoperationalupdate", + name="total_targeted_population", + field=models.IntegerField( + blank=True, help_text="Estimated number of targeted people", null=True, verbose_name="total targeted population" + ), ), ] diff --git a/dref/migrations/0041_auto_20221010_0650.py b/dref/migrations/0041_auto_20221010_0650.py index f26658e42..6b5eae1bf 100644 --- a/dref/migrations/0041_auto_20221010_0650.py +++ b/dref/migrations/0041_auto_20221010_0650.py @@ -6,58 +6,77 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0040_auto_20221010_0621'), + ("dref", "0040_auto_20221010_0621"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='communication', - field=models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization'), + model_name="drefoperationalupdate", + name="communication", + field=models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='human_resource', - field=models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource'), + model_name="drefoperationalupdate", + name="human_resource", + field=models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='is_surge_personnel_deployed', - field=models.BooleanField(blank=True, null=True, verbose_name='Is surge personnel deployed'), + model_name="drefoperationalupdate", + name="is_surge_personnel_deployed", + field=models.BooleanField(blank=True, null=True, verbose_name="Is surge personnel deployed"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='logistic_capacity_of_ns', - field=models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns'), + model_name="drefoperationalupdate", + name="logistic_capacity_of_ns", + field=models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='pmer', - field=models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer'), + model_name="drefoperationalupdate", + name="pmer", + field=models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='safety_concerns', - field=models.TextField(blank=True, help_text='Are there any safety/security concerns which may impact the implementation of this operation?', null=True, verbose_name='safety concerns'), + model_name="drefoperationalupdate", + name="safety_concerns", + field=models.TextField( + blank=True, + help_text="Are there any safety/security concerns which may impact the implementation of this operation?", + null=True, + verbose_name="safety concerns", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='surge_personnel_deployed', - field=models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed'), + model_name="drefoperationalupdate", + name="surge_personnel_deployed", + field=models.TextField( + blank=True, help_text="Will a Surge personnel be deployed?", null=True, verbose_name="surge personnel deployed" + ), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='event_date', - field=models.DateField(blank=True, null=True, verbose_name='event date'), + model_name="drefoperationalupdate", + name="event_date", + field=models.DateField(blank=True, null=True, verbose_name="event date"), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='ns_respond_date', - field=models.DateField(blank=True, null=True, verbose_name='ns respond date'), + model_name="drefoperationalupdate", + name="ns_respond_date", + field=models.DateField(blank=True, null=True, verbose_name="ns respond date"), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='total_targeted_population', - field=models.IntegerField(blank=True, null=True, verbose_name='total targeted population'), + model_name="drefoperationalupdate", + name="total_targeted_population", + field=models.IntegerField(blank=True, null=True, verbose_name="total targeted population"), ), ] diff --git a/dref/migrations/0042_auto_20221012_0434.py b/dref/migrations/0042_auto_20221012_0434.py index fdb9dc507..3ce5a2881 100644 --- a/dref/migrations/0042_auto_20221012_0434.py +++ b/dref/migrations/0042_auto_20221012_0434.py @@ -6,17 +6,17 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0041_auto_20221010_0650'), + ("dref", "0041_auto_20221010_0650"), ] operations = [ migrations.RemoveField( - model_name='drefoperationalupdate', - name='has_event_occured', + model_name="drefoperationalupdate", + name="has_event_occured", ), migrations.AddField( - model_name='drefoperationalupdate', - name='has_event_occurred', - field=models.BooleanField(blank=True, help_text='Has Event occurred', null=True), + model_name="drefoperationalupdate", + name="has_event_occurred", + field=models.BooleanField(blank=True, help_text="Has Event occurred", null=True), ), ] diff --git a/dref/migrations/0043_delete_dreffileupload.py b/dref/migrations/0043_delete_dreffileupload.py index 27d6185b4..e7be4350c 100644 --- a/dref/migrations/0043_delete_dreffileupload.py +++ b/dref/migrations/0043_delete_dreffileupload.py @@ -6,11 +6,11 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0042_auto_20221012_0434'), + ("dref", "0042_auto_20221012_0434"), ] operations = [ migrations.DeleteModel( - name='DrefFileUpload', + name="DrefFileUpload", ), ] diff --git a/dref/migrations/0044_alter_dref_modified_at.py b/dref/migrations/0044_alter_dref_modified_at.py index 741d6c323..47fd002bc 100644 --- a/dref/migrations/0044_alter_dref_modified_at.py +++ b/dref/migrations/0044_alter_dref_modified_at.py @@ -1,19 +1,20 @@ # Generated by Django 3.2.16 on 2022-10-18 07:32 import datetime + from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0043_delete_dreffileupload'), + ("dref", "0043_delete_dreffileupload"), ] operations = [ migrations.AlterField( - model_name='dref', - name='modified_at', - field=models.DateTimeField(blank=True, default=datetime.datetime.now, verbose_name='modified at'), + model_name="dref", + name="modified_at", + field=models.DateTimeField(blank=True, default=datetime.datetime.now, verbose_name="modified at"), ), ] diff --git a/dref/migrations/0045_alter_dref_modified_at.py b/dref/migrations/0045_alter_dref_modified_at.py index 31c6fb714..65bdc28c1 100644 --- a/dref/migrations/0045_alter_dref_modified_at.py +++ b/dref/migrations/0045_alter_dref_modified_at.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0044_alter_dref_modified_at'), + ("dref", "0044_alter_dref_modified_at"), ] operations = [ migrations.AlterField( - model_name='dref', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='modified at'), + model_name="dref", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="modified at"), ), ] diff --git a/dref/migrations/0046_auto_20221202_1030.py b/dref/migrations/0046_auto_20221202_1030.py index f2c6ae682..786cbe5ff 100644 --- a/dref/migrations/0046_auto_20221202_1030.py +++ b/dref/migrations/0046_auto_20221202_1030.py @@ -1,56 +1,67 @@ # Generated by Django 3.2.16 on 2022-12-02 10:30 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('dref', '0045_alter_dref_modified_at'), + ("dref", "0045_alter_dref_modified_at"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='cover_image', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='cover_image_dref_final_report', to='dref.dreffile', verbose_name='cover image'), + model_name="dreffinalreport", + name="cover_image", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="cover_image_dref_final_report", + to="dref.dreffile", + verbose_name="cover image", + ), ), migrations.AddField( - model_name='dreffinalreport', - name='images', - field=models.ManyToManyField(blank=True, related_name='image_dref_final_report', to='dref.DrefFile', verbose_name='images'), + model_name="dreffinalreport", + name="images", + field=models.ManyToManyField( + blank=True, related_name="image_dref_final_report", to="dref.DrefFile", verbose_name="images" + ), ), migrations.AddField( - model_name='dreffinalreport', - name='is_assessment_report', - field=models.BooleanField(blank=True, null=True, verbose_name='Is assessment Report'), + model_name="dreffinalreport", + name="is_assessment_report", + field=models.BooleanField(blank=True, null=True, verbose_name="Is assessment Report"), ), migrations.AddField( - model_name='dreffinalreport', - name='is_there_major_coordination_mechanism', - field=models.BooleanField(blank=True, help_text='Is there major coordinate mechanism', null=True), + model_name="dreffinalreport", + name="is_there_major_coordination_mechanism", + field=models.BooleanField(blank=True, help_text="Is there major coordinate mechanism", null=True), ), migrations.AddField( - model_name='dreffinalreport', - name='risk_security', - field=models.ManyToManyField(blank=True, to='dref.RiskSecurity', verbose_name='Risk Security'), + model_name="dreffinalreport", + name="risk_security", + field=models.ManyToManyField(blank=True, to="dref.RiskSecurity", verbose_name="Risk Security"), ), migrations.AddField( - model_name='dreffinalreport', - name='risk_security_concern', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dreffinalreport", + name="risk_security_concern", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='dreffinalreport', - name='total_targeted_population', - field=models.IntegerField(blank=True, null=True, verbose_name='total targeted population'), + model_name="dreffinalreport", + name="total_targeted_population", + field=models.IntegerField(blank=True, null=True, verbose_name="total targeted population"), ), migrations.AddField( - model_name='dreffinalreport', - name='users', - field=models.ManyToManyField(blank=True, related_name='user_dref_final_report', to=settings.AUTH_USER_MODEL, verbose_name='users'), + model_name="dreffinalreport", + name="users", + field=models.ManyToManyField( + blank=True, related_name="user_dref_final_report", to=settings.AUTH_USER_MODEL, verbose_name="users" + ), ), ] diff --git a/dref/migrations/0047_auto_20221212_0750.py b/dref/migrations/0047_auto_20221212_0750.py index 1a7d5c5c6..50b238408 100644 --- a/dref/migrations/0047_auto_20221212_0750.py +++ b/dref/migrations/0047_auto_20221212_0750.py @@ -6,23 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0046_auto_20221202_1030'), + ("dref", "0046_auto_20221202_1030"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='event_date', - field=models.DateField(blank=True, help_text='Date of event/Approximate date of impact', null=True, verbose_name='event date'), + model_name="dreffinalreport", + name="event_date", + field=models.DateField( + blank=True, help_text="Date of event/Approximate date of impact", null=True, verbose_name="event date" + ), ), migrations.AddField( - model_name='dreffinalreport', - name='national_society_actions', - field=models.ManyToManyField(blank=True, to='dref.NationalSocietyAction', verbose_name='national society actions'), + model_name="dreffinalreport", + name="national_society_actions", + field=models.ManyToManyField(blank=True, to="dref.NationalSocietyAction", verbose_name="national society actions"), ), migrations.AddField( - model_name='dreffinalreport', - name='people_in_need', - field=models.IntegerField(blank=True, null=True, verbose_name='people in need'), + model_name="dreffinalreport", + name="people_in_need", + field=models.IntegerField(blank=True, null=True, verbose_name="people in need"), ), ] diff --git a/dref/migrations/0048_auto_20221213_0402.py b/dref/migrations/0048_auto_20221213_0402.py index 0e7d47c54..d39ddb9ec 100644 --- a/dref/migrations/0048_auto_20221213_0402.py +++ b/dref/migrations/0048_auto_20221213_0402.py @@ -1,34 +1,43 @@ # Generated by Django 3.2.16 on 2022-12-13 04:02 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0047_auto_20221212_0750'), + ("dref", "0047_auto_20221212_0750"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='budget_file', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='budget_file_dref_final_report', to='dref.dreffile', verbose_name='budget file'), + model_name="dreffinalreport", + name="budget_file", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="budget_file_dref_final_report", + to="dref.dreffile", + verbose_name="budget file", + ), ), migrations.AddField( - model_name='dreffinalreport', - name='did_national_society', - field=models.BooleanField(blank=True, null=True, verbose_name='Did National Society'), + model_name="dreffinalreport", + name="did_national_society", + field=models.BooleanField(blank=True, null=True, verbose_name="Did National Society"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_text', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="dreffinalreport", + name="event_text", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='dreffinalreport', - name='ns_respond_date', - field=models.DateField(blank=True, help_text='NS anticipatory actions started/NS response', null=True, verbose_name='ns respond date'), + model_name="dreffinalreport", + name="ns_respond_date", + field=models.DateField( + blank=True, help_text="NS anticipatory actions started/NS response", null=True, verbose_name="ns respond date" + ), ), ] diff --git a/dref/migrations/0049_auto_20221227_0501.py b/dref/migrations/0049_auto_20221227_0501.py index 5a583a5a4..962601802 100644 --- a/dref/migrations/0049_auto_20221227_0501.py +++ b/dref/migrations/0049_auto_20221227_0501.py @@ -1,48 +1,55 @@ # Generated by Django 3.2.16 on 2022-12-27 05:01 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0048_auto_20221213_0402'), + ("dref", "0048_auto_20221213_0402"), ] operations = [ migrations.RemoveField( - model_name='dreffinalreport', - name='budget_file', + model_name="dreffinalreport", + name="budget_file", ), migrations.AddField( - model_name='dreffinalreport', - name='financial_report', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='financial_report_dref_final_report', to='dref.dreffile', verbose_name='financial report'), + model_name="dreffinalreport", + name="financial_report", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="financial_report_dref_final_report", + to="dref.dreffile", + verbose_name="financial report", + ), ), migrations.AddField( - model_name='dreffinalreport', - name='financial_report_description', - field=models.TextField(blank=True, null=True, verbose_name='Financial Report Description'), + model_name="dreffinalreport", + name="financial_report_description", + field=models.TextField(blank=True, null=True, verbose_name="Financial Report Description"), ), migrations.AddField( - model_name='dreffinalreport', - name='has_national_society_conducted', - field=models.BooleanField(blank=True, null=True, verbose_name='Has national society conducted any intervention'), + model_name="dreffinalreport", + name="has_national_society_conducted", + field=models.BooleanField(blank=True, null=True, verbose_name="Has national society conducted any intervention"), ), migrations.AddField( - model_name='dreffinalreport', - name='national_society_conducted_description', - field=models.TextField(blank=True, null=True, verbose_name='National Society conducted description'), + model_name="dreffinalreport", + name="national_society_conducted_description", + field=models.TextField(blank=True, null=True, verbose_name="National Society conducted description"), ), migrations.AddField( - model_name='dreffinalreport', - name='num_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='number of assisted'), + model_name="dreffinalreport", + name="num_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="number of assisted"), ), migrations.AddField( - model_name='plannedintervention', - name='person_assisted', - field=models.IntegerField(blank=True, null=True, verbose_name='person assisted'), + model_name="plannedintervention", + name="person_assisted", + field=models.IntegerField(blank=True, null=True, verbose_name="person assisted"), ), ] diff --git a/dref/migrations/0050_dref_type_of_dref.py b/dref/migrations/0050_dref_type_of_dref.py index 81117d6fb..064c1ff7f 100644 --- a/dref/migrations/0050_dref_type_of_dref.py +++ b/dref/migrations/0050_dref_type_of_dref.py @@ -6,19 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0049_auto_20221227_0501'), + ("dref", "0049_auto_20221227_0501"), ] operations = [ migrations.AddField( - model_name='dref', - name='type_of_dref', - field=models.IntegerField(blank=True, choices=[(0, 'Imminent'), (1, 'Assessment'), (2, 'Response')], null=True, verbose_name='dref type'), + model_name="dref", + name="type_of_dref", + field=models.IntegerField( + blank=True, choices=[(0, "Imminent"), (1, "Assessment"), (2, "Response")], null=True, verbose_name="dref type" + ), ), migrations.RunSQL( - sql=[("update dref_dref set type_of_dref = 2"), - ("update dref_dref set type_of_dref = 0 where type_of_onset=0"), - ("update dref_dref set type_of_dref = 1 where is_assessment_report"),], + sql=[ + ("update dref_dref set type_of_dref = 2"), + ("update dref_dref set type_of_dref = 0 where type_of_onset=0"), + ("update dref_dref set type_of_dref = 1 where is_assessment_report"), + ], reverse_sql=[("update dref_dref set type_of_dref = NULL")], - ) + ), ] diff --git a/dref/migrations/0051_drefoperationalupdate_type_of_dref.py b/dref/migrations/0051_drefoperationalupdate_type_of_dref.py index 334deb9ad..036e14b61 100644 --- a/dref/migrations/0051_drefoperationalupdate_type_of_dref.py +++ b/dref/migrations/0051_drefoperationalupdate_type_of_dref.py @@ -6,19 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0050_dref_type_of_dref'), + ("dref", "0050_dref_type_of_dref"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='type_of_dref', - field=models.IntegerField(blank=True, choices=[(0, 'Imminent'), (1, 'Assessment'), (2, 'Response')], null=True, verbose_name='dref type'), + model_name="drefoperationalupdate", + name="type_of_dref", + field=models.IntegerField( + blank=True, choices=[(0, "Imminent"), (1, "Assessment"), (2, "Response")], null=True, verbose_name="dref type" + ), ), migrations.RunSQL( - sql=[("update dref_drefoperationalupdate set type_of_dref = 2"), - ("update dref_drefoperationalupdate set type_of_dref = 0 where type_of_onset=0"), - ("update dref_drefoperationalupdate set type_of_dref = 1 where is_assessment_report"),], + sql=[ + ("update dref_drefoperationalupdate set type_of_dref = 2"), + ("update dref_drefoperationalupdate set type_of_dref = 0 where type_of_onset=0"), + ("update dref_drefoperationalupdate set type_of_dref = 1 where is_assessment_report"), + ], reverse_sql=[("update dref_drefoperationalupdate set type_of_dref = NULL")], - ) + ), ] diff --git a/dref/migrations/0052_dreffinalreport_type_of_dref.py b/dref/migrations/0052_dreffinalreport_type_of_dref.py index 93a39695d..6c580d154 100644 --- a/dref/migrations/0052_dreffinalreport_type_of_dref.py +++ b/dref/migrations/0052_dreffinalreport_type_of_dref.py @@ -6,19 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0051_drefoperationalupdate_type_of_dref'), + ("dref", "0051_drefoperationalupdate_type_of_dref"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='type_of_dref', - field=models.IntegerField(blank=True, choices=[(0, 'Imminent'), (1, 'Assessment'), (2, 'Response')], null=True, verbose_name='dref type'), + model_name="dreffinalreport", + name="type_of_dref", + field=models.IntegerField( + blank=True, choices=[(0, "Imminent"), (1, "Assessment"), (2, "Response")], null=True, verbose_name="dref type" + ), ), migrations.RunSQL( - sql=[("update dref_dreffinalreport set type_of_dref = 2"), - ("update dref_dreffinalreport set type_of_dref = 0 where type_of_onset=0"), - ("update dref_dreffinalreport set type_of_dref = 1 where is_assessment_report"),], + sql=[ + ("update dref_dreffinalreport set type_of_dref = 2"), + ("update dref_dreffinalreport set type_of_dref = 0 where type_of_onset=0"), + ("update dref_dreffinalreport set type_of_dref = 1 where is_assessment_report"), + ], reverse_sql=[("update dref_dreffinalreport set type_of_dref = NULL")], - ) + ), ] diff --git a/dref/migrations/0053_auto_20230313_0834.py b/dref/migrations/0053_auto_20230313_0834.py index a71249b75..524ce3537 100644 --- a/dref/migrations/0053_auto_20230313_0834.py +++ b/dref/migrations/0053_auto_20230313_0834.py @@ -6,60 +6,60 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0052_dreffinalreport_type_of_dref'), + ("dref", "0052_dreffinalreport_type_of_dref"), ] operations = [ migrations.RenameField( - model_name='dref', - old_name='affect_same_area', - new_name='did_it_affect_same_area', + model_name="dref", + old_name="affect_same_area", + new_name="did_it_affect_same_area", ), migrations.RenameField( - model_name='dref', - old_name='affect_same_population', - new_name='did_it_affect_same_population', + model_name="dref", + old_name="affect_same_population", + new_name="did_it_affect_same_population", ), migrations.RenameField( - model_name='dref', - old_name='ns_request_fund', - new_name='did_ns_request_fund', + model_name="dref", + old_name="ns_request_fund", + new_name="did_ns_request_fund", ), migrations.RenameField( - model_name='dref', - old_name='ns_respond', - new_name='did_ns_respond', + model_name="dref", + old_name="ns_respond", + new_name="did_ns_respond", ), migrations.RenameField( - model_name='drefoperationalupdate', - old_name='ns_respond', - new_name='did_ns_respond', + model_name="drefoperationalupdate", + old_name="ns_respond", + new_name="did_ns_respond", ), migrations.RemoveField( - model_name='dref', - name='is_assessment_report', + model_name="dref", + name="is_assessment_report", ), migrations.RemoveField( - model_name='dreffinalreport', - name='is_assessment_report', + model_name="dreffinalreport", + name="is_assessment_report", ), migrations.RemoveField( - model_name='drefoperationalupdate', - name='is_assessment_report', + model_name="drefoperationalupdate", + name="is_assessment_report", ), migrations.AlterField( - model_name='dref', - name='type_of_onset', - field=models.IntegerField(blank=True, choices=[(1, 'Slow'), (2, 'Sudden')], null=True, verbose_name='onset type'), + model_name="dref", + name="type_of_onset", + field=models.IntegerField(blank=True, choices=[(1, "Slow"), (2, "Sudden")], null=True, verbose_name="onset type"), ), migrations.AlterField( - model_name='dreffinalreport', - name='type_of_onset', - field=models.IntegerField(blank=True, choices=[(1, 'Slow'), (2, 'Sudden')], null=True, verbose_name='onset type'), + model_name="dreffinalreport", + name="type_of_onset", + field=models.IntegerField(blank=True, choices=[(1, "Slow"), (2, "Sudden")], null=True, verbose_name="onset type"), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='type_of_onset', - field=models.IntegerField(blank=True, choices=[(1, 'Slow'), (2, 'Sudden')], null=True, verbose_name='onset type'), + model_name="drefoperationalupdate", + name="type_of_onset", + field=models.IntegerField(blank=True, choices=[(1, "Slow"), (2, "Sudden")], null=True, verbose_name="onset type"), ), ] diff --git a/dref/migrations/0054_auto_20230329_1409.py b/dref/migrations/0054_auto_20230329_1409.py index b08e3968d..0bc793ef7 100644 --- a/dref/migrations/0054_auto_20230329_1409.py +++ b/dref/migrations/0054_auto_20230329_1409.py @@ -6,23 +6,38 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0053_auto_20230313_0834'), + ("dref", "0053_auto_20230313_0834"), ] operations = [ migrations.AlterField( - model_name='dref', - name='type_of_dref', - field=models.IntegerField(blank=True, choices=[(0, 'Imminent'), (1, 'Assessment'), (2, 'Response'), (3, 'Loan')], null=True, verbose_name='dref type'), + model_name="dref", + name="type_of_dref", + field=models.IntegerField( + blank=True, + choices=[(0, "Imminent"), (1, "Assessment"), (2, "Response"), (3, "Loan")], + null=True, + verbose_name="dref type", + ), ), migrations.AlterField( - model_name='dreffinalreport', - name='type_of_dref', - field=models.IntegerField(blank=True, choices=[(0, 'Imminent'), (1, 'Assessment'), (2, 'Response'), (3, 'Loan')], null=True, verbose_name='dref type'), + model_name="dreffinalreport", + name="type_of_dref", + field=models.IntegerField( + blank=True, + choices=[(0, "Imminent"), (1, "Assessment"), (2, "Response"), (3, "Loan")], + null=True, + verbose_name="dref type", + ), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='type_of_dref', - field=models.IntegerField(blank=True, choices=[(0, 'Imminent'), (1, 'Assessment'), (2, 'Response'), (3, 'Loan')], null=True, verbose_name='dref type'), + model_name="drefoperationalupdate", + name="type_of_dref", + field=models.IntegerField( + blank=True, + choices=[(0, "Imminent"), (1, "Assessment"), (2, "Response"), (3, "Loan")], + null=True, + verbose_name="dref type", + ), ), ] diff --git a/dref/migrations/0055_auto_20230406_1010.py b/dref/migrations/0055_auto_20230406_1010.py index 9d68f189f..d291df68f 100644 --- a/dref/migrations/0055_auto_20230406_1010.py +++ b/dref/migrations/0055_auto_20230406_1010.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0054_auto_20230329_1409'), + ("dref", "0054_auto_20230329_1409"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='date_of_approval', - field=models.DateField(blank=True, null=True, verbose_name='Date of Approval'), + model_name="drefoperationalupdate", + name="date_of_approval", + field=models.DateField(blank=True, null=True, verbose_name="Date of Approval"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='ns_request_date', - field=models.DateField(blank=True, null=True, verbose_name='Ns request date'), + model_name="drefoperationalupdate", + name="ns_request_date", + field=models.DateField(blank=True, null=True, verbose_name="Ns request date"), ), ] diff --git a/dref/migrations/0056_auto_20230410_0720.py b/dref/migrations/0056_auto_20230410_0720.py index c6e5c8b0b..f2a0b86b7 100644 --- a/dref/migrations/0056_auto_20230410_0720.py +++ b/dref/migrations/0056_auto_20230410_0720.py @@ -6,18 +6,26 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0055_auto_20230406_1010'), + ("dref", "0055_auto_20230406_1010"), ] operations = [ migrations.AddField( - model_name='dref', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="dref", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='dref', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="dref", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/dref/migrations/0056_auto_20230418_0703.py b/dref/migrations/0056_auto_20230418_0703.py index 1aa9b2f7c..243e70d63 100644 --- a/dref/migrations/0056_auto_20230418_0703.py +++ b/dref/migrations/0056_auto_20230418_0703.py @@ -6,48 +6,48 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0055_auto_20230406_1010'), + ("dref", "0055_auto_20230406_1010"), ] operations = [ migrations.AddField( - model_name='dref', - name='regional_focal_point_email', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='regional focal point email'), + model_name="dref", + name="regional_focal_point_email", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="regional focal point email"), ), migrations.AddField( - model_name='dref', - name='regional_focal_point_name', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='regional focal point name'), + model_name="dref", + name="regional_focal_point_name", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="regional focal point name"), ), migrations.AddField( - model_name='dref', - name='regional_focal_point_phone_number', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='regional focal point phone number'), + model_name="dref", + name="regional_focal_point_phone_number", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="regional focal point phone number"), ), migrations.AddField( - model_name='dref', - name='regional_focal_point_title', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='regional focal point title'), + model_name="dref", + name="regional_focal_point_title", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="regional focal point title"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='regional_focal_point_email', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='regional focal point email'), + model_name="drefoperationalupdate", + name="regional_focal_point_email", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="regional focal point email"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='regional_focal_point_name', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='regional focal point name'), + model_name="drefoperationalupdate", + name="regional_focal_point_name", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="regional focal point name"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='regional_focal_point_phone_number', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='regional focal point phone number'), + model_name="drefoperationalupdate", + name="regional_focal_point_phone_number", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="regional focal point phone number"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='regional_focal_point_title', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='regional focal point title'), + model_name="drefoperationalupdate", + name="regional_focal_point_title", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="regional focal point title"), ), ] diff --git a/dref/migrations/0057_auto_20230526_0414.py b/dref/migrations/0057_auto_20230526_0414.py index 21f3dd526..a70a5443b 100644 --- a/dref/migrations/0057_auto_20230526_0414.py +++ b/dref/migrations/0057_auto_20230526_0414.py @@ -6,18 +6,22 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0056_auto_20230418_0703'), + ("dref", "0056_auto_20230418_0703"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='status', - field=models.IntegerField(blank=True, choices=[(0, 'In Progress'), (1, 'Completed')], null=True, verbose_name='status'), + model_name="dreffinalreport", + name="status", + field=models.IntegerField( + blank=True, choices=[(0, "In Progress"), (1, "Completed")], null=True, verbose_name="status" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='status', - field=models.IntegerField(blank=True, choices=[(0, 'In Progress'), (1, 'Completed')], null=True, verbose_name='status'), + model_name="drefoperationalupdate", + name="status", + field=models.IntegerField( + blank=True, choices=[(0, "In Progress"), (1, "Completed")], null=True, verbose_name="status" + ), ), ] diff --git a/dref/migrations/0057_merge_0056_auto_20230410_0720_0056_auto_20230418_0703.py b/dref/migrations/0057_merge_0056_auto_20230410_0720_0056_auto_20230418_0703.py index 2c943b253..c3311ae25 100644 --- a/dref/migrations/0057_merge_0056_auto_20230410_0720_0056_auto_20230418_0703.py +++ b/dref/migrations/0057_merge_0056_auto_20230410_0720_0056_auto_20230418_0703.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0056_auto_20230410_0720'), - ('dref', '0056_auto_20230418_0703'), + ("dref", "0056_auto_20230410_0720"), + ("dref", "0056_auto_20230418_0703"), ] - operations = [ - ] + operations = [] diff --git a/dref/migrations/0058_auto_20230425_0428.py b/dref/migrations/0058_auto_20230425_0428.py index 465e2b796..3695ffb35 100644 --- a/dref/migrations/0058_auto_20230425_0428.py +++ b/dref/migrations/0058_auto_20230425_0428.py @@ -6,1648 +6,2080 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0057_merge_0056_auto_20230410_0720_0056_auto_20230418_0703'), + ("dref", "0057_merge_0056_auto_20230410_0720_0056_auto_20230418_0703"), ] operations = [ migrations.AddField( - model_name='dref', - name='anticipatory_actions_ar', - field=models.TextField(blank=True, help_text='Description of anticipatory actions or imminent disaster', null=True, verbose_name='anticipatory actions'), + model_name="dref", + name="anticipatory_actions_ar", + field=models.TextField( + blank=True, + help_text="Description of anticipatory actions or imminent disaster", + null=True, + verbose_name="anticipatory actions", + ), ), migrations.AddField( - model_name='dref', - name='anticipatory_actions_en', - field=models.TextField(blank=True, help_text='Description of anticipatory actions or imminent disaster', null=True, verbose_name='anticipatory actions'), + model_name="dref", + name="anticipatory_actions_en", + field=models.TextField( + blank=True, + help_text="Description of anticipatory actions or imminent disaster", + null=True, + verbose_name="anticipatory actions", + ), ), migrations.AddField( - model_name='dref', - name='anticipatory_actions_es', - field=models.TextField(blank=True, help_text='Description of anticipatory actions or imminent disaster', null=True, verbose_name='anticipatory actions'), + model_name="dref", + name="anticipatory_actions_es", + field=models.TextField( + blank=True, + help_text="Description of anticipatory actions or imminent disaster", + null=True, + verbose_name="anticipatory actions", + ), ), migrations.AddField( - model_name='dref', - name='anticipatory_actions_fr', - field=models.TextField(blank=True, help_text='Description of anticipatory actions or imminent disaster', null=True, verbose_name='anticipatory actions'), + model_name="dref", + name="anticipatory_actions_fr", + field=models.TextField( + blank=True, + help_text="Description of anticipatory actions or imminent disaster", + null=True, + verbose_name="anticipatory actions", + ), ), migrations.AddField( - model_name='dref', - name='communication_ar', - field=models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization'), + model_name="dref", + name="communication_ar", + field=models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), ), migrations.AddField( - model_name='dref', - name='communication_en', - field=models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization'), + model_name="dref", + name="communication_en", + field=models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), ), migrations.AddField( - model_name='dref', - name='communication_es', - field=models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization'), + model_name="dref", + name="communication_es", + field=models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), ), migrations.AddField( - model_name='dref', - name='communication_fr', - field=models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization'), + model_name="dref", + name="communication_fr", + field=models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), ), migrations.AddField( - model_name='dref', - name='dref_recurrent_text_ar', - field=models.TextField(blank=True, null=True, verbose_name='dref recurrent text'), + model_name="dref", + name="dref_recurrent_text_ar", + field=models.TextField(blank=True, null=True, verbose_name="dref recurrent text"), ), migrations.AddField( - model_name='dref', - name='dref_recurrent_text_en', - field=models.TextField(blank=True, null=True, verbose_name='dref recurrent text'), + model_name="dref", + name="dref_recurrent_text_en", + field=models.TextField(blank=True, null=True, verbose_name="dref recurrent text"), ), migrations.AddField( - model_name='dref', - name='dref_recurrent_text_es', - field=models.TextField(blank=True, null=True, verbose_name='dref recurrent text'), + model_name="dref", + name="dref_recurrent_text_es", + field=models.TextField(blank=True, null=True, verbose_name="dref recurrent text"), ), migrations.AddField( - model_name='dref', - name='dref_recurrent_text_fr', - field=models.TextField(blank=True, null=True, verbose_name='dref recurrent text'), + model_name="dref", + name="dref_recurrent_text_fr", + field=models.TextField(blank=True, null=True, verbose_name="dref recurrent text"), ), migrations.AddField( - model_name='dref', - name='event_description_ar', - field=models.TextField(blank=True, null=True, verbose_name='event description'), + model_name="dref", + name="event_description_ar", + field=models.TextField(blank=True, null=True, verbose_name="event description"), ), migrations.AddField( - model_name='dref', - name='event_description_en', - field=models.TextField(blank=True, null=True, verbose_name='event description'), + model_name="dref", + name="event_description_en", + field=models.TextField(blank=True, null=True, verbose_name="event description"), ), migrations.AddField( - model_name='dref', - name='event_description_es', - field=models.TextField(blank=True, null=True, verbose_name='event description'), + model_name="dref", + name="event_description_es", + field=models.TextField(blank=True, null=True, verbose_name="event description"), ), migrations.AddField( - model_name='dref', - name='event_description_fr', - field=models.TextField(blank=True, null=True, verbose_name='event description'), + model_name="dref", + name="event_description_fr", + field=models.TextField(blank=True, null=True, verbose_name="event description"), ), migrations.AddField( - model_name='dref', - name='event_scope_ar', - field=models.TextField(blank=True, help_text='Scope and scale of event', null=True, verbose_name='event scope'), + model_name="dref", + name="event_scope_ar", + field=models.TextField(blank=True, help_text="Scope and scale of event", null=True, verbose_name="event scope"), ), migrations.AddField( - model_name='dref', - name='event_scope_en', - field=models.TextField(blank=True, help_text='Scope and scale of event', null=True, verbose_name='event scope'), + model_name="dref", + name="event_scope_en", + field=models.TextField(blank=True, help_text="Scope and scale of event", null=True, verbose_name="event scope"), ), migrations.AddField( - model_name='dref', - name='event_scope_es', - field=models.TextField(blank=True, help_text='Scope and scale of event', null=True, verbose_name='event scope'), + model_name="dref", + name="event_scope_es", + field=models.TextField(blank=True, help_text="Scope and scale of event", null=True, verbose_name="event scope"), ), migrations.AddField( - model_name='dref', - name='event_scope_fr', - field=models.TextField(blank=True, help_text='Scope and scale of event', null=True, verbose_name='event scope'), + model_name="dref", + name="event_scope_fr", + field=models.TextField(blank=True, help_text="Scope and scale of event", null=True, verbose_name="event scope"), ), migrations.AddField( - model_name='dref', - name='event_text_ar', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="dref", + name="event_text_ar", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='dref', - name='event_text_en', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="dref", + name="event_text_en", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='dref', - name='event_text_es', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="dref", + name="event_text_es", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='dref', - name='event_text_fr', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="dref", + name="event_text_fr", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='dref', - name='human_resource_ar', - field=models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource'), + model_name="dref", + name="human_resource_ar", + field=models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), ), migrations.AddField( - model_name='dref', - name='human_resource_en', - field=models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource'), + model_name="dref", + name="human_resource_en", + field=models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), ), migrations.AddField( - model_name='dref', - name='human_resource_es', - field=models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource'), + model_name="dref", + name="human_resource_es", + field=models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), ), migrations.AddField( - model_name='dref', - name='human_resource_fr', - field=models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource'), + model_name="dref", + name="human_resource_fr", + field=models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), ), migrations.AddField( - model_name='dref', - name='icrc_ar', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="dref", + name="icrc_ar", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='dref', - name='icrc_en', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="dref", + name="icrc_en", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='dref', - name='icrc_es', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="dref", + name="icrc_es", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='dref', - name='icrc_fr', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="dref", + name="icrc_fr", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='dref', - name='identified_gaps_ar', - field=models.TextField(blank=True, help_text='Any identified gaps/limitations in the assessment', null=True, verbose_name='identified gaps'), + model_name="dref", + name="identified_gaps_ar", + field=models.TextField( + blank=True, + help_text="Any identified gaps/limitations in the assessment", + null=True, + verbose_name="identified gaps", + ), ), migrations.AddField( - model_name='dref', - name='identified_gaps_en', - field=models.TextField(blank=True, help_text='Any identified gaps/limitations in the assessment', null=True, verbose_name='identified gaps'), + model_name="dref", + name="identified_gaps_en", + field=models.TextField( + blank=True, + help_text="Any identified gaps/limitations in the assessment", + null=True, + verbose_name="identified gaps", + ), ), migrations.AddField( - model_name='dref', - name='identified_gaps_es', - field=models.TextField(blank=True, help_text='Any identified gaps/limitations in the assessment', null=True, verbose_name='identified gaps'), + model_name="dref", + name="identified_gaps_es", + field=models.TextField( + blank=True, + help_text="Any identified gaps/limitations in the assessment", + null=True, + verbose_name="identified gaps", + ), ), migrations.AddField( - model_name='dref', - name='identified_gaps_fr', - field=models.TextField(blank=True, help_text='Any identified gaps/limitations in the assessment', null=True, verbose_name='identified gaps'), + model_name="dref", + name="identified_gaps_fr", + field=models.TextField( + blank=True, + help_text="Any identified gaps/limitations in the assessment", + null=True, + verbose_name="identified gaps", + ), ), migrations.AddField( - model_name='dref', - name='ifrc_ar', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="dref", + name="ifrc_ar", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='dref', - name='ifrc_en', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="dref", + name="ifrc_en", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='dref', - name='ifrc_es', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="dref", + name="ifrc_es", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='dref', - name='ifrc_fr', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="dref", + name="ifrc_fr", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='dref', - name='lessons_learned_ar', - field=models.TextField(blank=True, null=True, verbose_name='lessons learned'), + model_name="dref", + name="lessons_learned_ar", + field=models.TextField(blank=True, null=True, verbose_name="lessons learned"), ), migrations.AddField( - model_name='dref', - name='lessons_learned_en', - field=models.TextField(blank=True, null=True, verbose_name='lessons learned'), + model_name="dref", + name="lessons_learned_en", + field=models.TextField(blank=True, null=True, verbose_name="lessons learned"), ), migrations.AddField( - model_name='dref', - name='lessons_learned_es', - field=models.TextField(blank=True, null=True, verbose_name='lessons learned'), + model_name="dref", + name="lessons_learned_es", + field=models.TextField(blank=True, null=True, verbose_name="lessons learned"), ), migrations.AddField( - model_name='dref', - name='lessons_learned_fr', - field=models.TextField(blank=True, null=True, verbose_name='lessons learned'), + model_name="dref", + name="lessons_learned_fr", + field=models.TextField(blank=True, null=True, verbose_name="lessons learned"), ), migrations.AddField( - model_name='dref', - name='logistic_capacity_of_ns_ar', - field=models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns'), + model_name="dref", + name="logistic_capacity_of_ns_ar", + field=models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), ), migrations.AddField( - model_name='dref', - name='logistic_capacity_of_ns_en', - field=models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns'), + model_name="dref", + name="logistic_capacity_of_ns_en", + field=models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), ), migrations.AddField( - model_name='dref', - name='logistic_capacity_of_ns_es', - field=models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns'), + model_name="dref", + name="logistic_capacity_of_ns_es", + field=models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), ), migrations.AddField( - model_name='dref', - name='logistic_capacity_of_ns_fr', - field=models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns'), + model_name="dref", + name="logistic_capacity_of_ns_fr", + field=models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), ), migrations.AddField( - model_name='dref', - name='major_coordination_mechanism_ar', - field=models.TextField(blank=True, help_text='List major coordination mechanisms in place', null=True, verbose_name='major coordination mechanism'), + model_name="dref", + name="major_coordination_mechanism_ar", + field=models.TextField( + blank=True, + help_text="List major coordination mechanisms in place", + null=True, + verbose_name="major coordination mechanism", + ), ), migrations.AddField( - model_name='dref', - name='major_coordination_mechanism_en', - field=models.TextField(blank=True, help_text='List major coordination mechanisms in place', null=True, verbose_name='major coordination mechanism'), + model_name="dref", + name="major_coordination_mechanism_en", + field=models.TextField( + blank=True, + help_text="List major coordination mechanisms in place", + null=True, + verbose_name="major coordination mechanism", + ), ), migrations.AddField( - model_name='dref', - name='major_coordination_mechanism_es', - field=models.TextField(blank=True, help_text='List major coordination mechanisms in place', null=True, verbose_name='major coordination mechanism'), + model_name="dref", + name="major_coordination_mechanism_es", + field=models.TextField( + blank=True, + help_text="List major coordination mechanisms in place", + null=True, + verbose_name="major coordination mechanism", + ), ), migrations.AddField( - model_name='dref', - name='major_coordination_mechanism_fr', - field=models.TextField(blank=True, help_text='List major coordination mechanisms in place', null=True, verbose_name='major coordination mechanism'), + model_name="dref", + name="major_coordination_mechanism_fr", + field=models.TextField( + blank=True, + help_text="List major coordination mechanisms in place", + null=True, + verbose_name="major coordination mechanism", + ), ), migrations.AddField( - model_name='dref', - name='national_authorities_ar', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="dref", + name="national_authorities_ar", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='dref', - name='national_authorities_en', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="dref", + name="national_authorities_en", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='dref', - name='national_authorities_es', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="dref", + name="national_authorities_es", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='dref', - name='national_authorities_fr', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="dref", + name="national_authorities_fr", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='dref', - name='ns_request_text_ar', - field=models.TextField(blank=True, null=True, verbose_name='ns request text'), + model_name="dref", + name="ns_request_text_ar", + field=models.TextField(blank=True, null=True, verbose_name="ns request text"), ), migrations.AddField( - model_name='dref', - name='ns_request_text_en', - field=models.TextField(blank=True, null=True, verbose_name='ns request text'), + model_name="dref", + name="ns_request_text_en", + field=models.TextField(blank=True, null=True, verbose_name="ns request text"), ), migrations.AddField( - model_name='dref', - name='ns_request_text_es', - field=models.TextField(blank=True, null=True, verbose_name='ns request text'), + model_name="dref", + name="ns_request_text_es", + field=models.TextField(blank=True, null=True, verbose_name="ns request text"), ), migrations.AddField( - model_name='dref', - name='ns_request_text_fr', - field=models.TextField(blank=True, null=True, verbose_name='ns request text'), + model_name="dref", + name="ns_request_text_fr", + field=models.TextField(blank=True, null=True, verbose_name="ns request text"), ), migrations.AddField( - model_name='dref', - name='operation_objective_ar', - field=models.TextField(blank=True, help_text='Overall objective of the operation', null=True, verbose_name='operation objective'), + model_name="dref", + name="operation_objective_ar", + field=models.TextField( + blank=True, help_text="Overall objective of the operation", null=True, verbose_name="operation objective" + ), ), migrations.AddField( - model_name='dref', - name='operation_objective_en', - field=models.TextField(blank=True, help_text='Overall objective of the operation', null=True, verbose_name='operation objective'), + model_name="dref", + name="operation_objective_en", + field=models.TextField( + blank=True, help_text="Overall objective of the operation", null=True, verbose_name="operation objective" + ), ), migrations.AddField( - model_name='dref', - name='operation_objective_es', - field=models.TextField(blank=True, help_text='Overall objective of the operation', null=True, verbose_name='operation objective'), + model_name="dref", + name="operation_objective_es", + field=models.TextField( + blank=True, help_text="Overall objective of the operation", null=True, verbose_name="operation objective" + ), ), migrations.AddField( - model_name='dref', - name='operation_objective_fr', - field=models.TextField(blank=True, help_text='Overall objective of the operation', null=True, verbose_name='operation objective'), + model_name="dref", + name="operation_objective_fr", + field=models.TextField( + blank=True, help_text="Overall objective of the operation", null=True, verbose_name="operation objective" + ), ), migrations.AddField( - model_name='dref', - name='partner_national_society_ar', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="dref", + name="partner_national_society_ar", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='dref', - name='partner_national_society_en', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="dref", + name="partner_national_society_en", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='dref', - name='partner_national_society_es', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="dref", + name="partner_national_society_es", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='dref', - name='partner_national_society_fr', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="dref", + name="partner_national_society_fr", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='dref', - name='people_assisted_ar', - field=models.TextField(blank=True, null=True, verbose_name='people assisted'), + model_name="dref", + name="people_assisted_ar", + field=models.TextField(blank=True, null=True, verbose_name="people assisted"), ), migrations.AddField( - model_name='dref', - name='people_assisted_en', - field=models.TextField(blank=True, null=True, verbose_name='people assisted'), + model_name="dref", + name="people_assisted_en", + field=models.TextField(blank=True, null=True, verbose_name="people assisted"), ), migrations.AddField( - model_name='dref', - name='people_assisted_es', - field=models.TextField(blank=True, null=True, verbose_name='people assisted'), + model_name="dref", + name="people_assisted_es", + field=models.TextField(blank=True, null=True, verbose_name="people assisted"), ), migrations.AddField( - model_name='dref', - name='people_assisted_fr', - field=models.TextField(blank=True, null=True, verbose_name='people assisted'), + model_name="dref", + name="people_assisted_fr", + field=models.TextField(blank=True, null=True, verbose_name="people assisted"), ), migrations.AddField( - model_name='dref', - name='pmer_ar', - field=models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer'), + model_name="dref", + name="pmer_ar", + field=models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), ), migrations.AddField( - model_name='dref', - name='pmer_en', - field=models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer'), + model_name="dref", + name="pmer_en", + field=models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), ), migrations.AddField( - model_name='dref', - name='pmer_es', - field=models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer'), + model_name="dref", + name="pmer_es", + field=models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), ), migrations.AddField( - model_name='dref', - name='pmer_fr', - field=models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer'), + model_name="dref", + name="pmer_fr", + field=models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), ), migrations.AddField( - model_name='dref', - name='response_strategy_ar', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="dref", + name="response_strategy_ar", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='dref', - name='response_strategy_en', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="dref", + name="response_strategy_en", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='dref', - name='response_strategy_es', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="dref", + name="response_strategy_es", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='dref', - name='response_strategy_fr', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="dref", + name="response_strategy_fr", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='dref', - name='risk_security_concern_ar', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dref", + name="risk_security_concern_ar", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='dref', - name='risk_security_concern_en', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dref", + name="risk_security_concern_en", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='dref', - name='risk_security_concern_es', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dref", + name="risk_security_concern_es", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='dref', - name='risk_security_concern_fr', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dref", + name="risk_security_concern_fr", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='dref', - name='selection_criteria_ar', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="dref", + name="selection_criteria_ar", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='dref', - name='selection_criteria_en', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="dref", + name="selection_criteria_en", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='dref', - name='selection_criteria_es', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="dref", + name="selection_criteria_es", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='dref', - name='selection_criteria_fr', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="dref", + name="selection_criteria_fr", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='dref', - name='surge_personnel_deployed_ar', - field=models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed'), + model_name="dref", + name="surge_personnel_deployed_ar", + field=models.TextField( + blank=True, help_text="Will a Surge personnel be deployed?", null=True, verbose_name="surge personnel deployed" + ), ), migrations.AddField( - model_name='dref', - name='surge_personnel_deployed_en', - field=models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed'), + model_name="dref", + name="surge_personnel_deployed_en", + field=models.TextField( + blank=True, help_text="Will a Surge personnel be deployed?", null=True, verbose_name="surge personnel deployed" + ), ), migrations.AddField( - model_name='dref', - name='surge_personnel_deployed_es', - field=models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed'), + model_name="dref", + name="surge_personnel_deployed_es", + field=models.TextField( + blank=True, help_text="Will a Surge personnel be deployed?", null=True, verbose_name="surge personnel deployed" + ), ), migrations.AddField( - model_name='dref', - name='surge_personnel_deployed_fr', - field=models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed'), + model_name="dref", + name="surge_personnel_deployed_fr", + field=models.TextField( + blank=True, help_text="Will a Surge personnel be deployed?", null=True, verbose_name="surge personnel deployed" + ), ), migrations.AddField( - model_name='dref', - name='title_prefix_ar', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dref", + name="title_prefix_ar", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='dref', - name='title_prefix_en', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dref", + name="title_prefix_en", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='dref', - name='title_prefix_es', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dref", + name="title_prefix_es", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='dref', - name='title_prefix_fr', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dref", + name="title_prefix_fr", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='dref', - name='un_or_other_actor_ar', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="dref", + name="un_or_other_actor_ar", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='dref', - name='un_or_other_actor_en', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="dref", + name="un_or_other_actor_en", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='dref', - name='un_or_other_actor_es', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="dref", + name="un_or_other_actor_es", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='dref', - name='un_or_other_actor_fr', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="dref", + name="un_or_other_actor_fr", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='dreffile', - name='caption_ar', + model_name="dreffile", + name="caption_ar", field=models.CharField(blank=True, max_length=225, null=True), ), migrations.AddField( - model_name='dreffile', - name='caption_en', + model_name="dreffile", + name="caption_en", field=models.CharField(blank=True, max_length=225, null=True), ), migrations.AddField( - model_name='dreffile', - name='caption_es', + model_name="dreffile", + name="caption_es", field=models.CharField(blank=True, max_length=225, null=True), ), migrations.AddField( - model_name='dreffile', - name='caption_fr', + model_name="dreffile", + name="caption_fr", field=models.CharField(blank=True, max_length=225, null=True), ), migrations.AddField( - model_name='dreffile', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="dreffile", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='dreffile', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="dreffile", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='dreffinalreport', - name='anticipatory_actions_ar', - field=models.TextField(blank=True, null=True, verbose_name='Anticipatory actions'), + model_name="dreffinalreport", + name="anticipatory_actions_ar", + field=models.TextField(blank=True, null=True, verbose_name="Anticipatory actions"), ), migrations.AddField( - model_name='dreffinalreport', - name='anticipatory_actions_en', - field=models.TextField(blank=True, null=True, verbose_name='Anticipatory actions'), + model_name="dreffinalreport", + name="anticipatory_actions_en", + field=models.TextField(blank=True, null=True, verbose_name="Anticipatory actions"), ), migrations.AddField( - model_name='dreffinalreport', - name='anticipatory_actions_es', - field=models.TextField(blank=True, null=True, verbose_name='Anticipatory actions'), + model_name="dreffinalreport", + name="anticipatory_actions_es", + field=models.TextField(blank=True, null=True, verbose_name="Anticipatory actions"), ), migrations.AddField( - model_name='dreffinalreport', - name='anticipatory_actions_fr', - field=models.TextField(blank=True, null=True, verbose_name='Anticipatory actions'), + model_name="dreffinalreport", + name="anticipatory_actions_fr", + field=models.TextField(blank=True, null=True, verbose_name="Anticipatory actions"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_description_ar', - field=models.TextField(blank=True, null=True, verbose_name='Event description'), + model_name="dreffinalreport", + name="event_description_ar", + field=models.TextField(blank=True, null=True, verbose_name="Event description"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_description_en', - field=models.TextField(blank=True, null=True, verbose_name='Event description'), + model_name="dreffinalreport", + name="event_description_en", + field=models.TextField(blank=True, null=True, verbose_name="Event description"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_description_es', - field=models.TextField(blank=True, null=True, verbose_name='Event description'), + model_name="dreffinalreport", + name="event_description_es", + field=models.TextField(blank=True, null=True, verbose_name="Event description"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_description_fr', - field=models.TextField(blank=True, null=True, verbose_name='Event description'), + model_name="dreffinalreport", + name="event_description_fr", + field=models.TextField(blank=True, null=True, verbose_name="Event description"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_scope_ar', - field=models.TextField(blank=True, null=True, verbose_name='Event scope'), + model_name="dreffinalreport", + name="event_scope_ar", + field=models.TextField(blank=True, null=True, verbose_name="Event scope"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_scope_en', - field=models.TextField(blank=True, null=True, verbose_name='Event scope'), + model_name="dreffinalreport", + name="event_scope_en", + field=models.TextField(blank=True, null=True, verbose_name="Event scope"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_scope_es', - field=models.TextField(blank=True, null=True, verbose_name='Event scope'), + model_name="dreffinalreport", + name="event_scope_es", + field=models.TextField(blank=True, null=True, verbose_name="Event scope"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_scope_fr', - field=models.TextField(blank=True, null=True, verbose_name='Event scope'), + model_name="dreffinalreport", + name="event_scope_fr", + field=models.TextField(blank=True, null=True, verbose_name="Event scope"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_text_ar', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="dreffinalreport", + name="event_text_ar", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_text_en', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="dreffinalreport", + name="event_text_en", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_text_es', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="dreffinalreport", + name="event_text_es", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='dreffinalreport', - name='event_text_fr', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="dreffinalreport", + name="event_text_fr", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='dreffinalreport', - name='financial_report_description_ar', - field=models.TextField(blank=True, null=True, verbose_name='Financial Report Description'), + model_name="dreffinalreport", + name="financial_report_description_ar", + field=models.TextField(blank=True, null=True, verbose_name="Financial Report Description"), ), migrations.AddField( - model_name='dreffinalreport', - name='financial_report_description_en', - field=models.TextField(blank=True, null=True, verbose_name='Financial Report Description'), + model_name="dreffinalreport", + name="financial_report_description_en", + field=models.TextField(blank=True, null=True, verbose_name="Financial Report Description"), ), migrations.AddField( - model_name='dreffinalreport', - name='financial_report_description_es', - field=models.TextField(blank=True, null=True, verbose_name='Financial Report Description'), + model_name="dreffinalreport", + name="financial_report_description_es", + field=models.TextField(blank=True, null=True, verbose_name="Financial Report Description"), ), migrations.AddField( - model_name='dreffinalreport', - name='financial_report_description_fr', - field=models.TextField(blank=True, null=True, verbose_name='Financial Report Description'), + model_name="dreffinalreport", + name="financial_report_description_fr", + field=models.TextField(blank=True, null=True, verbose_name="Financial Report Description"), ), migrations.AddField( - model_name='dreffinalreport', - name='icrc_ar', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="dreffinalreport", + name="icrc_ar", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='dreffinalreport', - name='icrc_en', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="dreffinalreport", + name="icrc_en", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='dreffinalreport', - name='icrc_es', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="dreffinalreport", + name="icrc_es", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='dreffinalreport', - name='icrc_fr', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="dreffinalreport", + name="icrc_fr", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='dreffinalreport', - name='ifrc_ar', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="dreffinalreport", + name="ifrc_ar", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='dreffinalreport', - name='ifrc_en', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="dreffinalreport", + name="ifrc_en", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='dreffinalreport', - name='ifrc_es', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="dreffinalreport", + name="ifrc_es", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='dreffinalreport', - name='ifrc_fr', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="dreffinalreport", + name="ifrc_fr", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='dreffinalreport', - name='major_coordination_mechanism_ar', - field=models.TextField(blank=True, null=True, verbose_name='major coordination mechanism'), + model_name="dreffinalreport", + name="major_coordination_mechanism_ar", + field=models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), ), migrations.AddField( - model_name='dreffinalreport', - name='major_coordination_mechanism_en', - field=models.TextField(blank=True, null=True, verbose_name='major coordination mechanism'), + model_name="dreffinalreport", + name="major_coordination_mechanism_en", + field=models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), ), migrations.AddField( - model_name='dreffinalreport', - name='major_coordination_mechanism_es', - field=models.TextField(blank=True, null=True, verbose_name='major coordination mechanism'), + model_name="dreffinalreport", + name="major_coordination_mechanism_es", + field=models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), ), migrations.AddField( - model_name='dreffinalreport', - name='major_coordination_mechanism_fr', - field=models.TextField(blank=True, null=True, verbose_name='major coordination mechanism'), + model_name="dreffinalreport", + name="major_coordination_mechanism_fr", + field=models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), ), migrations.AddField( - model_name='dreffinalreport', - name='national_authorities_ar', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="dreffinalreport", + name="national_authorities_ar", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='dreffinalreport', - name='national_authorities_en', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="dreffinalreport", + name="national_authorities_en", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='dreffinalreport', - name='national_authorities_es', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="dreffinalreport", + name="national_authorities_es", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='dreffinalreport', - name='national_authorities_fr', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="dreffinalreport", + name="national_authorities_fr", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='dreffinalreport', - name='national_society_conducted_description_ar', - field=models.TextField(blank=True, null=True, verbose_name='National Society conducted description'), + model_name="dreffinalreport", + name="national_society_conducted_description_ar", + field=models.TextField(blank=True, null=True, verbose_name="National Society conducted description"), ), migrations.AddField( - model_name='dreffinalreport', - name='national_society_conducted_description_en', - field=models.TextField(blank=True, null=True, verbose_name='National Society conducted description'), + model_name="dreffinalreport", + name="national_society_conducted_description_en", + field=models.TextField(blank=True, null=True, verbose_name="National Society conducted description"), ), migrations.AddField( - model_name='dreffinalreport', - name='national_society_conducted_description_es', - field=models.TextField(blank=True, null=True, verbose_name='National Society conducted description'), + model_name="dreffinalreport", + name="national_society_conducted_description_es", + field=models.TextField(blank=True, null=True, verbose_name="National Society conducted description"), ), migrations.AddField( - model_name='dreffinalreport', - name='national_society_conducted_description_fr', - field=models.TextField(blank=True, null=True, verbose_name='National Society conducted description'), + model_name="dreffinalreport", + name="national_society_conducted_description_fr", + field=models.TextField(blank=True, null=True, verbose_name="National Society conducted description"), ), migrations.AddField( - model_name='dreffinalreport', - name='operation_objective_ar', - field=models.TextField(blank=True, null=True, verbose_name='operation objective'), + model_name="dreffinalreport", + name="operation_objective_ar", + field=models.TextField(blank=True, null=True, verbose_name="operation objective"), ), migrations.AddField( - model_name='dreffinalreport', - name='operation_objective_en', - field=models.TextField(blank=True, null=True, verbose_name='operation objective'), + model_name="dreffinalreport", + name="operation_objective_en", + field=models.TextField(blank=True, null=True, verbose_name="operation objective"), ), migrations.AddField( - model_name='dreffinalreport', - name='operation_objective_es', - field=models.TextField(blank=True, null=True, verbose_name='operation objective'), + model_name="dreffinalreport", + name="operation_objective_es", + field=models.TextField(blank=True, null=True, verbose_name="operation objective"), ), migrations.AddField( - model_name='dreffinalreport', - name='operation_objective_fr', - field=models.TextField(blank=True, null=True, verbose_name='operation objective'), + model_name="dreffinalreport", + name="operation_objective_fr", + field=models.TextField(blank=True, null=True, verbose_name="operation objective"), ), migrations.AddField( - model_name='dreffinalreport', - name='partner_national_society_ar', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="dreffinalreport", + name="partner_national_society_ar", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='dreffinalreport', - name='partner_national_society_en', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="dreffinalreport", + name="partner_national_society_en", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='dreffinalreport', - name='partner_national_society_es', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="dreffinalreport", + name="partner_national_society_es", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='dreffinalreport', - name='partner_national_society_fr', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="dreffinalreport", + name="partner_national_society_fr", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='dreffinalreport', - name='response_strategy_ar', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="dreffinalreport", + name="response_strategy_ar", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='dreffinalreport', - name='response_strategy_en', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="dreffinalreport", + name="response_strategy_en", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='dreffinalreport', - name='response_strategy_es', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="dreffinalreport", + name="response_strategy_es", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='dreffinalreport', - name='response_strategy_fr', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="dreffinalreport", + name="response_strategy_fr", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='dreffinalreport', - name='risk_security_concern_ar', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dreffinalreport", + name="risk_security_concern_ar", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='dreffinalreport', - name='risk_security_concern_en', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dreffinalreport", + name="risk_security_concern_en", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='dreffinalreport', - name='risk_security_concern_es', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dreffinalreport", + name="risk_security_concern_es", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='dreffinalreport', - name='risk_security_concern_fr', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="dreffinalreport", + name="risk_security_concern_fr", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='dreffinalreport', - name='selection_criteria_ar', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="dreffinalreport", + name="selection_criteria_ar", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='dreffinalreport', - name='selection_criteria_en', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="dreffinalreport", + name="selection_criteria_en", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='dreffinalreport', - name='selection_criteria_es', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="dreffinalreport", + name="selection_criteria_es", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='dreffinalreport', - name='selection_criteria_fr', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="dreffinalreport", + name="selection_criteria_fr", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='dreffinalreport', - name='title_ar', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title'), + model_name="dreffinalreport", + name="title_ar", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title"), ), migrations.AddField( - model_name='dreffinalreport', - name='title_en', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title'), + model_name="dreffinalreport", + name="title_en", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title"), ), migrations.AddField( - model_name='dreffinalreport', - name='title_es', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title'), + model_name="dreffinalreport", + name="title_es", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title"), ), migrations.AddField( - model_name='dreffinalreport', - name='title_fr', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title'), + model_name="dreffinalreport", + name="title_fr", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title"), ), migrations.AddField( - model_name='dreffinalreport', - name='title_prefix_ar', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dreffinalreport", + name="title_prefix_ar", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='dreffinalreport', - name='title_prefix_en', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dreffinalreport", + name="title_prefix_en", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='dreffinalreport', - name='title_prefix_es', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dreffinalreport", + name="title_prefix_es", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='dreffinalreport', - name='title_prefix_fr', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="dreffinalreport", + name="title_prefix_fr", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='dreffinalreport', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="dreffinalreport", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='dreffinalreport', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="dreffinalreport", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='dreffinalreport', - name='un_or_other_actor_ar', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="dreffinalreport", + name="un_or_other_actor_ar", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='dreffinalreport', - name='un_or_other_actor_en', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="dreffinalreport", + name="un_or_other_actor_en", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='dreffinalreport', - name='un_or_other_actor_es', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="dreffinalreport", + name="un_or_other_actor_es", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='dreffinalreport', - name='un_or_other_actor_fr', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="dreffinalreport", + name="un_or_other_actor_fr", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_actions_ar', - field=models.TextField(blank=True, null=True, verbose_name='Anticipatory actions'), + model_name="drefoperationalupdate", + name="anticipatory_actions_ar", + field=models.TextField(blank=True, null=True, verbose_name="Anticipatory actions"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_actions_en', - field=models.TextField(blank=True, null=True, verbose_name='Anticipatory actions'), + model_name="drefoperationalupdate", + name="anticipatory_actions_en", + field=models.TextField(blank=True, null=True, verbose_name="Anticipatory actions"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_actions_es', - field=models.TextField(blank=True, null=True, verbose_name='Anticipatory actions'), + model_name="drefoperationalupdate", + name="anticipatory_actions_es", + field=models.TextField(blank=True, null=True, verbose_name="Anticipatory actions"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_actions_fr', - field=models.TextField(blank=True, null=True, verbose_name='Anticipatory actions'), + model_name="drefoperationalupdate", + name="anticipatory_actions_fr", + field=models.TextField(blank=True, null=True, verbose_name="Anticipatory actions"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_to_response_ar', - field=models.TextField(blank=True, null=True, verbose_name='Please explain how is the operation is transitioning from Anticipatory to Response'), + model_name="drefoperationalupdate", + name="anticipatory_to_response_ar", + field=models.TextField( + blank=True, + null=True, + verbose_name="Please explain how is the operation is transitioning from Anticipatory to Response", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_to_response_en', - field=models.TextField(blank=True, null=True, verbose_name='Please explain how is the operation is transitioning from Anticipatory to Response'), + model_name="drefoperationalupdate", + name="anticipatory_to_response_en", + field=models.TextField( + blank=True, + null=True, + verbose_name="Please explain how is the operation is transitioning from Anticipatory to Response", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_to_response_es', - field=models.TextField(blank=True, null=True, verbose_name='Please explain how is the operation is transitioning from Anticipatory to Response'), + model_name="drefoperationalupdate", + name="anticipatory_to_response_es", + field=models.TextField( + blank=True, + null=True, + verbose_name="Please explain how is the operation is transitioning from Anticipatory to Response", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='anticipatory_to_response_fr', - field=models.TextField(blank=True, null=True, verbose_name='Please explain how is the operation is transitioning from Anticipatory to Response'), + model_name="drefoperationalupdate", + name="anticipatory_to_response_fr", + field=models.TextField( + blank=True, + null=True, + verbose_name="Please explain how is the operation is transitioning from Anticipatory to Response", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='communication_ar', - field=models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization'), + model_name="drefoperationalupdate", + name="communication_ar", + field=models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='communication_en', - field=models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization'), + model_name="drefoperationalupdate", + name="communication_en", + field=models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='communication_es', - field=models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization'), + model_name="drefoperationalupdate", + name="communication_es", + field=models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='communication_fr', - field=models.TextField(blank=True, help_text='Does the NS have Communications capacity?', null=True, verbose_name='organization'), + model_name="drefoperationalupdate", + name="communication_fr", + field=models.TextField( + blank=True, help_text="Does the NS have Communications capacity?", null=True, verbose_name="organization" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_description_ar', - field=models.TextField(blank=True, null=True, verbose_name='Event description'), + model_name="drefoperationalupdate", + name="event_description_ar", + field=models.TextField(blank=True, null=True, verbose_name="Event description"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_description_en', - field=models.TextField(blank=True, null=True, verbose_name='Event description'), + model_name="drefoperationalupdate", + name="event_description_en", + field=models.TextField(blank=True, null=True, verbose_name="Event description"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_description_es', - field=models.TextField(blank=True, null=True, verbose_name='Event description'), + model_name="drefoperationalupdate", + name="event_description_es", + field=models.TextField(blank=True, null=True, verbose_name="Event description"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_description_fr', - field=models.TextField(blank=True, null=True, verbose_name='Event description'), + model_name="drefoperationalupdate", + name="event_description_fr", + field=models.TextField(blank=True, null=True, verbose_name="Event description"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_scope_ar', - field=models.TextField(blank=True, null=True, verbose_name='Event scope'), + model_name="drefoperationalupdate", + name="event_scope_ar", + field=models.TextField(blank=True, null=True, verbose_name="Event scope"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_scope_en', - field=models.TextField(blank=True, null=True, verbose_name='Event scope'), + model_name="drefoperationalupdate", + name="event_scope_en", + field=models.TextField(blank=True, null=True, verbose_name="Event scope"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_scope_es', - field=models.TextField(blank=True, null=True, verbose_name='Event scope'), + model_name="drefoperationalupdate", + name="event_scope_es", + field=models.TextField(blank=True, null=True, verbose_name="Event scope"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_scope_fr', - field=models.TextField(blank=True, null=True, verbose_name='Event scope'), + model_name="drefoperationalupdate", + name="event_scope_fr", + field=models.TextField(blank=True, null=True, verbose_name="Event scope"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='human_resource_ar', - field=models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource'), + model_name="drefoperationalupdate", + name="human_resource_ar", + field=models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='human_resource_en', - field=models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource'), + model_name="drefoperationalupdate", + name="human_resource_en", + field=models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='human_resource_es', - field=models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource'), + model_name="drefoperationalupdate", + name="human_resource_es", + field=models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='human_resource_fr', - field=models.TextField(blank=True, help_text='how many volunteers and staff involved in the response?', null=True, verbose_name='human resource'), + model_name="drefoperationalupdate", + name="human_resource_fr", + field=models.TextField( + blank=True, + help_text="how many volunteers and staff involved in the response?", + null=True, + verbose_name="human resource", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='icrc_ar', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="drefoperationalupdate", + name="icrc_ar", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='icrc_en', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="drefoperationalupdate", + name="icrc_en", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='icrc_es', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="drefoperationalupdate", + name="icrc_es", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='icrc_fr', - field=models.TextField(blank=True, null=True, verbose_name='icrc'), + model_name="drefoperationalupdate", + name="icrc_fr", + field=models.TextField(blank=True, null=True, verbose_name="icrc"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='ifrc_ar', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="drefoperationalupdate", + name="ifrc_ar", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='ifrc_en', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="drefoperationalupdate", + name="ifrc_en", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='ifrc_es', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="drefoperationalupdate", + name="ifrc_es", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='ifrc_fr', - field=models.TextField(blank=True, null=True, verbose_name='ifrc'), + model_name="drefoperationalupdate", + name="ifrc_fr", + field=models.TextField(blank=True, null=True, verbose_name="ifrc"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='logistic_capacity_of_ns_ar', - field=models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns'), + model_name="drefoperationalupdate", + name="logistic_capacity_of_ns_ar", + field=models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='logistic_capacity_of_ns_en', - field=models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns'), + model_name="drefoperationalupdate", + name="logistic_capacity_of_ns_en", + field=models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='logistic_capacity_of_ns_es', - field=models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns'), + model_name="drefoperationalupdate", + name="logistic_capacity_of_ns_es", + field=models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='logistic_capacity_of_ns_fr', - field=models.TextField(blank=True, help_text='what is the logistics capacity of the National Society?', null=True, verbose_name='logistic capacity of ns'), + model_name="drefoperationalupdate", + name="logistic_capacity_of_ns_fr", + field=models.TextField( + blank=True, + help_text="what is the logistics capacity of the National Society?", + null=True, + verbose_name="logistic capacity of ns", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='major_coordination_mechanism_ar', - field=models.TextField(blank=True, null=True, verbose_name='major coordination mechanism'), + model_name="drefoperationalupdate", + name="major_coordination_mechanism_ar", + field=models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='major_coordination_mechanism_en', - field=models.TextField(blank=True, null=True, verbose_name='major coordination mechanism'), + model_name="drefoperationalupdate", + name="major_coordination_mechanism_en", + field=models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='major_coordination_mechanism_es', - field=models.TextField(blank=True, null=True, verbose_name='major coordination mechanism'), + model_name="drefoperationalupdate", + name="major_coordination_mechanism_es", + field=models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='major_coordination_mechanism_fr', - field=models.TextField(blank=True, null=True, verbose_name='major coordination mechanism'), + model_name="drefoperationalupdate", + name="major_coordination_mechanism_fr", + field=models.TextField(blank=True, null=True, verbose_name="major coordination mechanism"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='national_authorities_ar', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="drefoperationalupdate", + name="national_authorities_ar", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='national_authorities_en', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="drefoperationalupdate", + name="national_authorities_en", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='national_authorities_es', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="drefoperationalupdate", + name="national_authorities_es", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='national_authorities_fr', - field=models.TextField(blank=True, null=True, verbose_name='national authorities'), + model_name="drefoperationalupdate", + name="national_authorities_fr", + field=models.TextField(blank=True, null=True, verbose_name="national authorities"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='operation_objective_ar', - field=models.TextField(blank=True, null=True, verbose_name='operation objective'), + model_name="drefoperationalupdate", + name="operation_objective_ar", + field=models.TextField(blank=True, null=True, verbose_name="operation objective"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='operation_objective_en', - field=models.TextField(blank=True, null=True, verbose_name='operation objective'), + model_name="drefoperationalupdate", + name="operation_objective_en", + field=models.TextField(blank=True, null=True, verbose_name="operation objective"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='operation_objective_es', - field=models.TextField(blank=True, null=True, verbose_name='operation objective'), + model_name="drefoperationalupdate", + name="operation_objective_es", + field=models.TextField(blank=True, null=True, verbose_name="operation objective"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='operation_objective_fr', - field=models.TextField(blank=True, null=True, verbose_name='operation objective'), + model_name="drefoperationalupdate", + name="operation_objective_fr", + field=models.TextField(blank=True, null=True, verbose_name="operation objective"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='partner_national_society_ar', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="drefoperationalupdate", + name="partner_national_society_ar", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='partner_national_society_en', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="drefoperationalupdate", + name="partner_national_society_en", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='partner_national_society_es', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="drefoperationalupdate", + name="partner_national_society_es", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='partner_national_society_fr', - field=models.TextField(blank=True, null=True, verbose_name='partner national society'), + model_name="drefoperationalupdate", + name="partner_national_society_fr", + field=models.TextField(blank=True, null=True, verbose_name="partner national society"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='people_assisted_ar', - field=models.TextField(blank=True, null=True, verbose_name='people assisted'), + model_name="drefoperationalupdate", + name="people_assisted_ar", + field=models.TextField(blank=True, null=True, verbose_name="people assisted"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='people_assisted_en', - field=models.TextField(blank=True, null=True, verbose_name='people assisted'), + model_name="drefoperationalupdate", + name="people_assisted_en", + field=models.TextField(blank=True, null=True, verbose_name="people assisted"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='people_assisted_es', - field=models.TextField(blank=True, null=True, verbose_name='people assisted'), + model_name="drefoperationalupdate", + name="people_assisted_es", + field=models.TextField(blank=True, null=True, verbose_name="people assisted"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='people_assisted_fr', - field=models.TextField(blank=True, null=True, verbose_name='people assisted'), + model_name="drefoperationalupdate", + name="people_assisted_fr", + field=models.TextField(blank=True, null=True, verbose_name="people assisted"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='pmer_ar', - field=models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer'), + model_name="drefoperationalupdate", + name="pmer_ar", + field=models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='pmer_en', - field=models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer'), + model_name="drefoperationalupdate", + name="pmer_en", + field=models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='pmer_es', - field=models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer'), + model_name="drefoperationalupdate", + name="pmer_es", + field=models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='pmer_fr', - field=models.TextField(blank=True, help_text='Does the NS have PMER capacity?', null=True, verbose_name='pmer'), + model_name="drefoperationalupdate", + name="pmer_fr", + field=models.TextField(blank=True, help_text="Does the NS have PMER capacity?", null=True, verbose_name="pmer"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='response_strategy_ar', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="drefoperationalupdate", + name="response_strategy_ar", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='response_strategy_en', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="drefoperationalupdate", + name="response_strategy_en", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='response_strategy_es', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="drefoperationalupdate", + name="response_strategy_es", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='response_strategy_fr', - field=models.TextField(blank=True, null=True, verbose_name='response strategy'), + model_name="drefoperationalupdate", + name="response_strategy_fr", + field=models.TextField(blank=True, null=True, verbose_name="response strategy"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='risk_security_concern_ar', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="drefoperationalupdate", + name="risk_security_concern_ar", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='risk_security_concern_en', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="drefoperationalupdate", + name="risk_security_concern_en", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='risk_security_concern_es', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="drefoperationalupdate", + name="risk_security_concern_es", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='risk_security_concern_fr', - field=models.TextField(blank=True, null=True, verbose_name='Risk Security Concern'), + model_name="drefoperationalupdate", + name="risk_security_concern_fr", + field=models.TextField(blank=True, null=True, verbose_name="Risk Security Concern"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='selection_criteria_ar', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="drefoperationalupdate", + name="selection_criteria_ar", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='selection_criteria_en', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="drefoperationalupdate", + name="selection_criteria_en", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='selection_criteria_es', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="drefoperationalupdate", + name="selection_criteria_es", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='selection_criteria_fr', - field=models.TextField(blank=True, help_text='Selection criteria for affected people', null=True, verbose_name='selection criteria'), + model_name="drefoperationalupdate", + name="selection_criteria_fr", + field=models.TextField( + blank=True, help_text="Selection criteria for affected people", null=True, verbose_name="selection criteria" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='surge_personnel_deployed_ar', - field=models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed'), + model_name="drefoperationalupdate", + name="surge_personnel_deployed_ar", + field=models.TextField( + blank=True, help_text="Will a Surge personnel be deployed?", null=True, verbose_name="surge personnel deployed" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='surge_personnel_deployed_en', - field=models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed'), + model_name="drefoperationalupdate", + name="surge_personnel_deployed_en", + field=models.TextField( + blank=True, help_text="Will a Surge personnel be deployed?", null=True, verbose_name="surge personnel deployed" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='surge_personnel_deployed_es', - field=models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed'), + model_name="drefoperationalupdate", + name="surge_personnel_deployed_es", + field=models.TextField( + blank=True, help_text="Will a Surge personnel be deployed?", null=True, verbose_name="surge personnel deployed" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='surge_personnel_deployed_fr', - field=models.TextField(blank=True, help_text='Will a Surge personnel be deployed?', null=True, verbose_name='surge personnel deployed'), + model_name="drefoperationalupdate", + name="surge_personnel_deployed_fr", + field=models.TextField( + blank=True, help_text="Will a Surge personnel be deployed?", null=True, verbose_name="surge personnel deployed" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='title_ar', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title'), + model_name="drefoperationalupdate", + name="title_ar", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='title_en', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title'), + model_name="drefoperationalupdate", + name="title_en", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='title_es', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title'), + model_name="drefoperationalupdate", + name="title_es", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='title_fr', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title'), + model_name="drefoperationalupdate", + name="title_fr", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='title_prefix_ar', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="drefoperationalupdate", + name="title_prefix_ar", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='title_prefix_en', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="drefoperationalupdate", + name="title_prefix_en", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='title_prefix_es', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="drefoperationalupdate", + name="title_prefix_es", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='title_prefix_fr', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title prefix'), + model_name="drefoperationalupdate", + name="title_prefix_fr", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="title prefix"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="drefoperationalupdate", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="drefoperationalupdate", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='un_or_other_actor_ar', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="drefoperationalupdate", + name="un_or_other_actor_ar", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='un_or_other_actor_en', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="drefoperationalupdate", + name="un_or_other_actor_en", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='un_or_other_actor_es', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="drefoperationalupdate", + name="un_or_other_actor_es", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='un_or_other_actor_fr', - field=models.TextField(blank=True, null=True, verbose_name='un or other'), + model_name="drefoperationalupdate", + name="un_or_other_actor_fr", + field=models.TextField(blank=True, null=True, verbose_name="un or other"), ), migrations.AddField( - model_name='identifiedneed', - name='description_ar', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="identifiedneed", + name="description_ar", + field=models.TextField(blank=True, null=True, verbose_name="description"), + ), + migrations.AddField( + model_name="identifiedneed", + name="description_en", + field=models.TextField(blank=True, null=True, verbose_name="description"), + ), + migrations.AddField( + model_name="identifiedneed", + name="description_es", + field=models.TextField(blank=True, null=True, verbose_name="description"), + ), + migrations.AddField( + model_name="identifiedneed", + name="description_fr", + field=models.TextField(blank=True, null=True, verbose_name="description"), + ), + migrations.AddField( + model_name="identifiedneed", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + null=True, + verbose_name="title", + ), + ), + migrations.AddField( + model_name="identifiedneed", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + null=True, + verbose_name="title", + ), + ), + migrations.AddField( + model_name="identifiedneed", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + null=True, + verbose_name="title", + ), + ), + migrations.AddField( + model_name="identifiedneed", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + null=True, + verbose_name="title", + ), + ), + migrations.AddField( + model_name="identifiedneed", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="identifiedneed", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="nationalsocietyaction", + name="description_ar", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='identifiedneed', - name='description_en', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="nationalsocietyaction", + name="description_en", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='identifiedneed', - name='description_es', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="nationalsocietyaction", + name="description_es", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='identifiedneed', - name='description_fr', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="nationalsocietyaction", + name="description_fr", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='identifiedneed', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, null=True, verbose_name='title'), + model_name="nationalsocietyaction", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='identifiedneed', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, null=True, verbose_name='title'), + model_name="nationalsocietyaction", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='identifiedneed', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="challenges_ar", + field=models.TextField(blank=True, null=True, verbose_name="Challenges"), ), migrations.AddField( - model_name='identifiedneed', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="challenges_en", + field=models.TextField(blank=True, null=True, verbose_name="Challenges"), ), migrations.AddField( - model_name='identifiedneed', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="plannedintervention", + name="challenges_es", + field=models.TextField(blank=True, null=True, verbose_name="Challenges"), ), migrations.AddField( - model_name='identifiedneed', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="plannedintervention", + name="challenges_fr", + field=models.TextField(blank=True, null=True, verbose_name="Challenges"), ), migrations.AddField( - model_name='nationalsocietyaction', - name='description_ar', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="plannedintervention", + name="description_ar", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='nationalsocietyaction', - name='description_en', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="plannedintervention", + name="description_en", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='nationalsocietyaction', - name='description_es', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="plannedintervention", + name="description_es", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='nationalsocietyaction', - name='description_fr', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="plannedintervention", + name="description_fr", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='nationalsocietyaction', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="plannedintervention", + name="lessons_learnt_ar", + field=models.TextField(blank=True, null=True, verbose_name="Lessons learnt"), ), migrations.AddField( - model_name='nationalsocietyaction', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="plannedintervention", + name="lessons_learnt_en", + field=models.TextField(blank=True, null=True, verbose_name="Lessons learnt"), ), migrations.AddField( - model_name='plannedintervention', - name='challenges_ar', - field=models.TextField(blank=True, null=True, verbose_name='Challenges'), + model_name="plannedintervention", + name="lessons_learnt_es", + field=models.TextField(blank=True, null=True, verbose_name="Lessons learnt"), ), migrations.AddField( - model_name='plannedintervention', - name='challenges_en', - field=models.TextField(blank=True, null=True, verbose_name='Challenges'), + model_name="plannedintervention", + name="lessons_learnt_fr", + field=models.TextField(blank=True, null=True, verbose_name="Lessons learnt"), ), migrations.AddField( - model_name='plannedintervention', - name='challenges_es', - field=models.TextField(blank=True, null=True, verbose_name='Challenges'), + model_name="plannedintervention", + name="narrative_description_of_achievements_ar", + field=models.TextField(blank=True, null=True, verbose_name="Narrative description of achievements"), ), migrations.AddField( - model_name='plannedintervention', - name='challenges_fr', - field=models.TextField(blank=True, null=True, verbose_name='Challenges'), + model_name="plannedintervention", + name="narrative_description_of_achievements_en", + field=models.TextField(blank=True, null=True, verbose_name="Narrative description of achievements"), ), migrations.AddField( - model_name='plannedintervention', - name='description_ar', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="plannedintervention", + name="narrative_description_of_achievements_es", + field=models.TextField(blank=True, null=True, verbose_name="Narrative description of achievements"), ), migrations.AddField( - model_name='plannedintervention', - name='description_en', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="plannedintervention", + name="narrative_description_of_achievements_fr", + field=models.TextField(blank=True, null=True, verbose_name="Narrative description of achievements"), ), migrations.AddField( - model_name='plannedintervention', - name='description_es', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="plannedintervention", + name="progress_towards_outcome_ar", + field=models.TextField(blank=True, null=True, verbose_name="Progress Towards Outcome"), ), migrations.AddField( - model_name='plannedintervention', - name='description_fr', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="plannedintervention", + name="progress_towards_outcome_en", + field=models.TextField(blank=True, null=True, verbose_name="Progress Towards Outcome"), ), migrations.AddField( - model_name='plannedintervention', - name='lessons_learnt_ar', - field=models.TextField(blank=True, null=True, verbose_name='Lessons learnt'), + model_name="plannedintervention", + name="progress_towards_outcome_es", + field=models.TextField(blank=True, null=True, verbose_name="Progress Towards Outcome"), + ), + migrations.AddField( + model_name="plannedintervention", + name="progress_towards_outcome_fr", + field=models.TextField(blank=True, null=True, verbose_name="Progress Towards Outcome"), ), - migrations.AddField( - model_name='plannedintervention', - name='lessons_learnt_en', - field=models.TextField(blank=True, null=True, verbose_name='Lessons learnt'), - ), - migrations.AddField( - model_name='plannedintervention', - name='lessons_learnt_es', - field=models.TextField(blank=True, null=True, verbose_name='Lessons learnt'), - ), - migrations.AddField( - model_name='plannedintervention', - name='lessons_learnt_fr', - field=models.TextField(blank=True, null=True, verbose_name='Lessons learnt'), - ), - migrations.AddField( - model_name='plannedintervention', - name='narrative_description_of_achievements_ar', - field=models.TextField(blank=True, null=True, verbose_name='Narrative description of achievements'), - ), - migrations.AddField( - model_name='plannedintervention', - name='narrative_description_of_achievements_en', - field=models.TextField(blank=True, null=True, verbose_name='Narrative description of achievements'), - ), - migrations.AddField( - model_name='plannedintervention', - name='narrative_description_of_achievements_es', - field=models.TextField(blank=True, null=True, verbose_name='Narrative description of achievements'), - ), - migrations.AddField( - model_name='plannedintervention', - name='narrative_description_of_achievements_fr', - field=models.TextField(blank=True, null=True, verbose_name='Narrative description of achievements'), - ), - migrations.AddField( - model_name='plannedintervention', - name='progress_towards_outcome_ar', - field=models.TextField(blank=True, null=True, verbose_name='Progress Towards Outcome'), - ), - migrations.AddField( - model_name='plannedintervention', - name='progress_towards_outcome_en', - field=models.TextField(blank=True, null=True, verbose_name='Progress Towards Outcome'), - ), - migrations.AddField( - model_name='plannedintervention', - name='progress_towards_outcome_es', - field=models.TextField(blank=True, null=True, verbose_name='Progress Towards Outcome'), - ), - migrations.AddField( - model_name='plannedintervention', - name='progress_towards_outcome_fr', - field=models.TextField(blank=True, null=True, verbose_name='Progress Towards Outcome'), - ), - migrations.AddField( - model_name='plannedintervention', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('environmental_sustainability', 'Environmental Sustainability'), ('community_engagement_and_accountability', 'Community Engagement And Accountability')], max_length=255, null=True, verbose_name='title'), - ), - migrations.AddField( - model_name='plannedintervention', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('environmental_sustainability', 'Environmental Sustainability'), ('community_engagement_and_accountability', 'Community Engagement And Accountability')], max_length=255, null=True, verbose_name='title'), - ), - migrations.AddField( - model_name='plannedintervention', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('environmental_sustainability', 'Environmental Sustainability'), ('community_engagement_and_accountability', 'Community Engagement And Accountability')], max_length=255, null=True, verbose_name='title'), - ), - migrations.AddField( - model_name='plannedintervention', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('environmental_sustainability', 'Environmental Sustainability'), ('community_engagement_and_accountability', 'Community Engagement And Accountability')], max_length=255, null=True, verbose_name='title'), - ), - migrations.AddField( - model_name='plannedintervention', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='plannedintervention', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='plannedinterventionindicators', - name='title_ar', - field=models.CharField(max_length=255, null=True, verbose_name='Title'), - ), - migrations.AddField( - model_name='plannedinterventionindicators', - name='title_en', - field=models.CharField(max_length=255, null=True, verbose_name='Title'), - ), - migrations.AddField( - model_name='plannedinterventionindicators', - name='title_es', - field=models.CharField(max_length=255, null=True, verbose_name='Title'), - ), - migrations.AddField( - model_name='plannedinterventionindicators', - name='title_fr', - field=models.CharField(max_length=255, null=True, verbose_name='Title'), - ), - migrations.AddField( - model_name='plannedinterventionindicators', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), - ), - migrations.AddField( - model_name='plannedinterventionindicators', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), - ), - migrations.AddField( - model_name='risksecurity', - name='mitigation_ar', - field=models.TextField(blank=True, null=True, verbose_name='Mitigation'), + migrations.AddField( + model_name="plannedintervention", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("environmental_sustainability", "Environmental Sustainability"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), + ), + migrations.AddField( + model_name="plannedintervention", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("environmental_sustainability", "Environmental Sustainability"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), + ), + migrations.AddField( + model_name="plannedintervention", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("environmental_sustainability", "Environmental Sustainability"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), + ), + migrations.AddField( + model_name="plannedintervention", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("environmental_sustainability", "Environmental Sustainability"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), + ), + migrations.AddField( + model_name="plannedintervention", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="plannedintervention", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="plannedinterventionindicators", + name="title_ar", + field=models.CharField(max_length=255, null=True, verbose_name="Title"), + ), + migrations.AddField( + model_name="plannedinterventionindicators", + name="title_en", + field=models.CharField(max_length=255, null=True, verbose_name="Title"), + ), + migrations.AddField( + model_name="plannedinterventionindicators", + name="title_es", + field=models.CharField(max_length=255, null=True, verbose_name="Title"), + ), + migrations.AddField( + model_name="plannedinterventionindicators", + name="title_fr", + field=models.CharField(max_length=255, null=True, verbose_name="Title"), + ), + migrations.AddField( + model_name="plannedinterventionindicators", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + migrations.AddField( + model_name="plannedinterventionindicators", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), + ), + migrations.AddField( + model_name="risksecurity", + name="mitigation_ar", + field=models.TextField(blank=True, null=True, verbose_name="Mitigation"), ), migrations.AddField( - model_name='risksecurity', - name='mitigation_en', - field=models.TextField(blank=True, null=True, verbose_name='Mitigation'), + model_name="risksecurity", + name="mitigation_en", + field=models.TextField(blank=True, null=True, verbose_name="Mitigation"), ), migrations.AddField( - model_name='risksecurity', - name='mitigation_es', - field=models.TextField(blank=True, null=True, verbose_name='Mitigation'), + model_name="risksecurity", + name="mitigation_es", + field=models.TextField(blank=True, null=True, verbose_name="Mitigation"), ), migrations.AddField( - model_name='risksecurity', - name='mitigation_fr', - field=models.TextField(blank=True, null=True, verbose_name='Mitigation'), + model_name="risksecurity", + name="mitigation_fr", + field=models.TextField(blank=True, null=True, verbose_name="Mitigation"), ), migrations.AddField( - model_name='risksecurity', - name='risk_ar', - field=models.TextField(blank=True, null=True, verbose_name='Risk'), + model_name="risksecurity", + name="risk_ar", + field=models.TextField(blank=True, null=True, verbose_name="Risk"), ), migrations.AddField( - model_name='risksecurity', - name='risk_en', - field=models.TextField(blank=True, null=True, verbose_name='Risk'), + model_name="risksecurity", + name="risk_en", + field=models.TextField(blank=True, null=True, verbose_name="Risk"), ), migrations.AddField( - model_name='risksecurity', - name='risk_es', - field=models.TextField(blank=True, null=True, verbose_name='Risk'), + model_name="risksecurity", + name="risk_es", + field=models.TextField(blank=True, null=True, verbose_name="Risk"), ), migrations.AddField( - model_name='risksecurity', - name='risk_fr', - field=models.TextField(blank=True, null=True, verbose_name='Risk'), + model_name="risksecurity", + name="risk_fr", + field=models.TextField(blank=True, null=True, verbose_name="Risk"), ), migrations.AddField( - model_name='risksecurity', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="risksecurity", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='risksecurity', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="risksecurity", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/dref/migrations/0058_auto_20230529_0806.py b/dref/migrations/0058_auto_20230529_0806.py index eb12b5410..35086d7ef 100644 --- a/dref/migrations/0058_auto_20230529_0806.py +++ b/dref/migrations/0058_auto_20230529_0806.py @@ -1,16 +1,18 @@ # Generated by Django 3.2.19 on 2023-05-29 08:06 from django.db import migrations + from dref.models import Dref as Status + class Migration(migrations.Migration): def update_dref_status(apps, schema_editor): # Update all the `is_published` dref to status completed # – all other to in_progress (ongoing) - Dref = apps.get_model('dref', 'Dref') - DrefOperationalUpdate = apps.get_model('dref', 'DrefOperationalUpdate') - DrefFinalReport = apps.get_model('dref', 'DrefFinalReport') + Dref = apps.get_model("dref", "Dref") + DrefOperationalUpdate = apps.get_model("dref", "DrefOperationalUpdate") + DrefFinalReport = apps.get_model("dref", "DrefFinalReport") drefs = Dref.objects.all() op_updates = DrefOperationalUpdate.objects.all() final_reports = DrefFinalReport.objects.all() @@ -20,7 +22,7 @@ def update_dref_status(apps, schema_editor): dref.status = Status.Status.COMPLETED else: dref.status = Status.Status.IN_PROGRESS - dref.save(update_fields=['status']) + dref.save(update_fields=["status"]) # dref operational update for op in op_updates: @@ -28,7 +30,7 @@ def update_dref_status(apps, schema_editor): op.status = Status.Status.COMPLETED else: op.status = Status.Status.IN_PROGRESS - op.save(update_fields=['status']) + op.save(update_fields=["status"]) # dref final report for final_report in final_reports: @@ -36,15 +38,12 @@ def update_dref_status(apps, schema_editor): final_report.status = Status.Status.COMPLETED else: final_report.status = Status.Status.IN_PROGRESS - final_report.save(update_fields=['status']) + final_report.save(update_fields=["status"]) dependencies = [ - ('dref', '0057_auto_20230526_0414'), + ("dref", "0057_auto_20230526_0414"), ] operations = [ - migrations.RunPython( - update_dref_status, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(update_dref_status, reverse_code=migrations.RunPython.noop), ] diff --git a/dref/migrations/0059_drefoperationalupdate_identified_gaps.py b/dref/migrations/0059_drefoperationalupdate_identified_gaps.py index 28fc87b3d..321577618 100644 --- a/dref/migrations/0059_drefoperationalupdate_identified_gaps.py +++ b/dref/migrations/0059_drefoperationalupdate_identified_gaps.py @@ -6,13 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0058_auto_20230529_0806'), + ("dref", "0058_auto_20230529_0806"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='identified_gaps', - field=models.TextField(blank=True, help_text='Any identified gaps/limitations in the assessment', null=True, verbose_name='identified gaps'), + model_name="drefoperationalupdate", + name="identified_gaps", + field=models.TextField( + blank=True, + help_text="Any identified gaps/limitations in the assessment", + null=True, + verbose_name="identified gaps", + ), ), ] diff --git a/dref/migrations/0060_dreffinalreport_date_of_approval.py b/dref/migrations/0060_dreffinalreport_date_of_approval.py index 787e44559..77a11755c 100644 --- a/dref/migrations/0060_dreffinalreport_date_of_approval.py +++ b/dref/migrations/0060_dreffinalreport_date_of_approval.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0059_drefoperationalupdate_identified_gaps'), + ("dref", "0059_drefoperationalupdate_identified_gaps"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='date_of_approval', - field=models.DateField(blank=True, null=True, verbose_name='Date of Approval'), + model_name="dreffinalreport", + name="date_of_approval", + field=models.DateField(blank=True, null=True, verbose_name="Date of Approval"), ), ] diff --git a/dref/migrations/0061_dref_is_active.py b/dref/migrations/0061_dref_is_active.py index 57e28ee51..0dbb56820 100644 --- a/dref/migrations/0061_dref_is_active.py +++ b/dref/migrations/0061_dref_is_active.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0060_dreffinalreport_date_of_approval'), + ("dref", "0060_dreffinalreport_date_of_approval"), ] operations = [ migrations.AddField( - model_name='dref', - name='is_active', - field=models.BooleanField(blank=True, null=True, verbose_name='Is Active'), + model_name="dref", + name="is_active", + field=models.BooleanField(blank=True, null=True, verbose_name="Is Active"), ), ] diff --git a/dref/migrations/0061_merge_20230614_0804.py b/dref/migrations/0061_merge_20230614_0804.py index b712dd1a6..e4c8d1b2b 100644 --- a/dref/migrations/0061_merge_20230614_0804.py +++ b/dref/migrations/0061_merge_20230614_0804.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0056_auto_20230410_0720'), - ('dref', '0060_dreffinalreport_date_of_approval'), + ("dref", "0056_auto_20230410_0720"), + ("dref", "0060_dreffinalreport_date_of_approval"), ] - operations = [ - ] + operations = [] diff --git a/dref/migrations/0062_auto_20230619_0931.py b/dref/migrations/0062_auto_20230619_0931.py index f7aebbdf1..fb297e17c 100644 --- a/dref/migrations/0062_auto_20230619_0931.py +++ b/dref/migrations/0062_auto_20230619_0931.py @@ -6,25 +6,22 @@ class Migration(migrations.Migration): def update_dref(apps, schema_editor): - Dref = apps.get_model('dref', 'Dref') + Dref = apps.get_model("dref", "Dref") drefs = Dref.objects.all() for dref in drefs: - if hasattr(dref, 'dreffinalreport'): + if hasattr(dref, "dreffinalreport"): if dref.dreffinalreport.is_published == True: dref.is_active = False else: dref.is_active = True else: dref.is_active = True - dref.save(update_fields=['is_active']) + dref.save(update_fields=["is_active"]) dependencies = [ - ('dref', '0061_dref_is_active'), + ("dref", "0061_dref_is_active"), ] operations = [ - migrations.RunPython( - update_dref, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(update_dref, reverse_code=migrations.RunPython.noop), ] diff --git a/dref/migrations/0062_merge_20230614_0818.py b/dref/migrations/0062_merge_20230614_0818.py index 7e0b69646..80b0329b9 100644 --- a/dref/migrations/0062_merge_20230614_0818.py +++ b/dref/migrations/0062_merge_20230614_0818.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0058_auto_20230425_0428'), - ('dref', '0061_merge_20230614_0804'), + ("dref", "0058_auto_20230425_0428"), + ("dref", "0061_merge_20230614_0804"), ] - operations = [ - ] + operations = [] diff --git a/dref/migrations/0063_merge_20230628_1022.py b/dref/migrations/0063_merge_20230628_1022.py index 9444696e9..cbe8a07c1 100644 --- a/dref/migrations/0063_merge_20230628_1022.py +++ b/dref/migrations/0063_merge_20230628_1022.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0062_auto_20230619_0931'), - ('dref', '0062_merge_20230614_0818'), + ("dref", "0062_auto_20230619_0931"), + ("dref", "0062_merge_20230614_0818"), ] - operations = [ - ] + operations = [] diff --git a/dref/migrations/0064_auto_20230713_0601.py b/dref/migrations/0064_auto_20230713_0601.py index 58b153ea1..8212ecaa5 100644 --- a/dref/migrations/0064_auto_20230713_0601.py +++ b/dref/migrations/0064_auto_20230713_0601.py @@ -6,23 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0063_merge_20230628_1022'), + ("dref", "0063_merge_20230628_1022"), ] operations = [ migrations.AlterField( - model_name='dref', - name='disability_people_per', - field=models.FloatField(blank=True, help_text='Estimated % people disability', null=True, verbose_name='disability people per'), + model_name="dref", + name="disability_people_per", + field=models.FloatField( + blank=True, help_text="Estimated % people disability", null=True, verbose_name="disability people per" + ), ), migrations.AlterField( - model_name='dref', - name='people_per_local', - field=models.FloatField(blank=True, help_text='Estimated % people Rural', null=True, verbose_name='people per local'), + model_name="dref", + name="people_per_local", + field=models.FloatField(blank=True, help_text="Estimated % people Rural", null=True, verbose_name="people per local"), ), migrations.AlterField( - model_name='dref', - name='people_per_urban', - field=models.FloatField(blank=True, help_text='Estimated % people Urban', null=True, verbose_name='people per urban'), + model_name="dref", + name="people_per_urban", + field=models.FloatField(blank=True, help_text="Estimated % people Urban", null=True, verbose_name="people per urban"), ), ] diff --git a/dref/migrations/0064_dreffinalreport_financial_report_preview.py b/dref/migrations/0064_dreffinalreport_financial_report_preview.py index c52205288..92c7315cb 100644 --- a/dref/migrations/0064_dreffinalreport_financial_report_preview.py +++ b/dref/migrations/0064_dreffinalreport_financial_report_preview.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0063_merge_20230628_1022'), + ("dref", "0063_merge_20230628_1022"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='financial_report_preview', - field=models.FileField(blank=True, null=True, upload_to='dref/images/', verbose_name='financial preview'), + model_name="dreffinalreport", + name="financial_report_preview", + field=models.FileField(blank=True, null=True, upload_to="dref/images/", verbose_name="financial preview"), ), ] diff --git a/dref/migrations/0065_auto_20230728_0405.py b/dref/migrations/0065_auto_20230728_0405.py index 1a2f38a9e..af96424e1 100644 --- a/dref/migrations/0065_auto_20230728_0405.py +++ b/dref/migrations/0065_auto_20230728_0405.py @@ -1,29 +1,29 @@ # Generated by Django 3.2.20 on 2023-07-28 04:05 -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('dref', '0064_dreffinalreport_financial_report_preview'), + ("dref", "0064_dreffinalreport_financial_report_preview"), ] operations = [ migrations.AlterField( - model_name='dref', - name='modified_at', - field=models.DateTimeField(default=django.utils.timezone.now, null=True, verbose_name='modified at'), + model_name="dref", + name="modified_at", + field=models.DateTimeField(default=django.utils.timezone.now, null=True, verbose_name="modified at"), ), migrations.AlterField( - model_name='dreffinalreport', - name='modified_at', - field=models.DateTimeField(default=django.utils.timezone.now, null=True, verbose_name='modified at'), + model_name="dreffinalreport", + name="modified_at", + field=models.DateTimeField(default=django.utils.timezone.now, null=True, verbose_name="modified at"), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='modified_at', - field=models.DateTimeField(default=django.utils.timezone.now, null=True, verbose_name='modified at'), + model_name="drefoperationalupdate", + name="modified_at", + field=models.DateTimeField(default=django.utils.timezone.now, null=True, verbose_name="modified at"), ), ] diff --git a/dref/migrations/0066_dreffinalreport_main_donors.py b/dref/migrations/0066_dreffinalreport_main_donors.py index a34e779a4..106de2bf4 100644 --- a/dref/migrations/0066_dreffinalreport_main_donors.py +++ b/dref/migrations/0066_dreffinalreport_main_donors.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0065_auto_20230728_0405'), + ("dref", "0065_auto_20230728_0405"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='main_donors', - field=models.TextField(blank=True, null=True, verbose_name='Main Donors'), + model_name="dreffinalreport", + name="main_donors", + field=models.TextField(blank=True, null=True, verbose_name="Main Donors"), ), ] diff --git a/dref/migrations/0066_merge_0064_auto_20230713_0601_0065_auto_20230728_0405.py b/dref/migrations/0066_merge_0064_auto_20230713_0601_0065_auto_20230728_0405.py index 8ab710267..0e0f00b2a 100644 --- a/dref/migrations/0066_merge_0064_auto_20230713_0601_0065_auto_20230728_0405.py +++ b/dref/migrations/0066_merge_0064_auto_20230713_0601_0065_auto_20230728_0405.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0064_auto_20230713_0601'), - ('dref', '0065_auto_20230728_0405'), + ("dref", "0064_auto_20230713_0601"), + ("dref", "0065_auto_20230728_0405"), ] - operations = [ - ] + operations = [] diff --git a/dref/migrations/0067_merge_20230811_0605.py b/dref/migrations/0067_merge_20230811_0605.py index aba4b0a3d..f277b7539 100644 --- a/dref/migrations/0067_merge_20230811_0605.py +++ b/dref/migrations/0067_merge_20230811_0605.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0066_dreffinalreport_main_donors'), - ('dref', '0066_merge_0064_auto_20230713_0601_0065_auto_20230728_0405'), + ("dref", "0066_dreffinalreport_main_donors"), + ("dref", "0066_merge_0064_auto_20230713_0601_0065_auto_20230728_0405"), ] - operations = [ - ] + operations = [] diff --git a/dref/migrations/0068_auto_20230905_0845.py b/dref/migrations/0068_auto_20230905_0845.py index 14238e9cd..082fb6cc9 100644 --- a/dref/migrations/0068_auto_20230905_0845.py +++ b/dref/migrations/0068_auto_20230905_0845.py @@ -6,38 +6,40 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0067_merge_20230811_0605'), + ("dref", "0067_merge_20230811_0605"), ] operations = [ migrations.AddField( - model_name='drefoperationalupdate', - name='did_national_society', - field=models.BooleanField(blank=True, null=True, verbose_name='Did National Society'), + model_name="drefoperationalupdate", + name="did_national_society", + field=models.BooleanField(blank=True, null=True, verbose_name="Did National Society"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='event_text', - field=models.TextField(blank=True, null=True, verbose_name='event text'), + model_name="drefoperationalupdate", + name="event_text", + field=models.TextField(blank=True, null=True, verbose_name="event text"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='is_man_made_event', - field=models.BooleanField(blank=True, null=True, verbose_name='Is Man-made Event'), + model_name="drefoperationalupdate", + name="is_man_made_event", + field=models.BooleanField(blank=True, null=True, verbose_name="Is Man-made Event"), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='disability_people_per', - field=models.FloatField(blank=True, help_text='Estimated % people disability', null=True, verbose_name='disability people per'), + model_name="drefoperationalupdate", + name="disability_people_per", + field=models.FloatField( + blank=True, help_text="Estimated % people disability", null=True, verbose_name="disability people per" + ), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='people_per_local', - field=models.FloatField(blank=True, help_text='Estimated % people Rural', null=True, verbose_name='people per local'), + model_name="drefoperationalupdate", + name="people_per_local", + field=models.FloatField(blank=True, help_text="Estimated % people Rural", null=True, verbose_name="people per local"), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='people_per_urban', - field=models.FloatField(blank=True, help_text='Estimated % people Urban', null=True, verbose_name='people per urban'), + model_name="drefoperationalupdate", + name="people_per_urban", + field=models.FloatField(blank=True, help_text="Estimated % people Urban", null=True, verbose_name="people per urban"), ), ] diff --git a/dref/migrations/0069_auto_20230907_1021.py b/dref/migrations/0069_auto_20230907_1021.py index c25f0c709..6257f5bd9 100644 --- a/dref/migrations/0069_auto_20230907_1021.py +++ b/dref/migrations/0069_auto_20230907_1021.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0068_auto_20230905_0845'), + ("dref", "0068_auto_20230905_0845"), ] operations = [ migrations.AlterField( - model_name='dreffinalreport', - name='disability_people_per', - field=models.FloatField(blank=True, null=True, verbose_name='disability people per'), + model_name="dreffinalreport", + name="disability_people_per", + field=models.FloatField(blank=True, null=True, verbose_name="disability people per"), ), migrations.AlterField( - model_name='dreffinalreport', - name='people_per_local', - field=models.FloatField(blank=True, null=True, verbose_name='people per local'), + model_name="dreffinalreport", + name="people_per_local", + field=models.FloatField(blank=True, null=True, verbose_name="people per local"), ), migrations.AlterField( - model_name='dreffinalreport', - name='people_per_urban', - field=models.FloatField(blank=True, null=True, verbose_name='people per urban'), + model_name="dreffinalreport", + name="people_per_urban", + field=models.FloatField(blank=True, null=True, verbose_name="people per urban"), ), ] diff --git a/dref/migrations/0070_dreffinalreport_operation_end_date.py b/dref/migrations/0070_dreffinalreport_operation_end_date.py index 64c21cd0f..337870eff 100644 --- a/dref/migrations/0070_dreffinalreport_operation_end_date.py +++ b/dref/migrations/0070_dreffinalreport_operation_end_date.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0069_auto_20230907_1021'), + ("dref", "0069_auto_20230907_1021"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='operation_end_date', - field=models.DateField(blank=True, null=True, verbose_name='Operation End Date'), + model_name="dreffinalreport", + name="operation_end_date", + field=models.DateField(blank=True, null=True, verbose_name="Operation End Date"), ), ] diff --git a/dref/migrations/0071_auto_20230912_0438.py b/dref/migrations/0071_auto_20230912_0438.py index ef582df73..19ef3d0b5 100644 --- a/dref/migrations/0071_auto_20230912_0438.py +++ b/dref/migrations/0071_auto_20230912_0438.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0070_dreffinalreport_operation_end_date'), + ("dref", "0070_dreffinalreport_operation_end_date"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='regional_focal_point_email', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='regional focal point email'), + model_name="dreffinalreport", + name="regional_focal_point_email", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="regional focal point email"), ), migrations.AddField( - model_name='dreffinalreport', - name='regional_focal_point_name', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='regional focal point name'), + model_name="dreffinalreport", + name="regional_focal_point_name", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="regional focal point name"), ), migrations.AddField( - model_name='dreffinalreport', - name='regional_focal_point_phone_number', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='regional focal point phone number'), + model_name="dreffinalreport", + name="regional_focal_point_phone_number", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="regional focal point phone number"), ), migrations.AddField( - model_name='dreffinalreport', - name='regional_focal_point_title', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='regional focal point title'), + model_name="dreffinalreport", + name="regional_focal_point_title", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="regional focal point title"), ), ] diff --git a/dref/migrations/0072_auto_20231117_0602_squashed_0077_auto_20231211_0426.py b/dref/migrations/0072_auto_20231117_0602_squashed_0077_auto_20231211_0426.py index 8b563d933..c7d277c79 100644 --- a/dref/migrations/0072_auto_20231117_0602_squashed_0077_auto_20231211_0426.py +++ b/dref/migrations/0072_auto_20231117_0602_squashed_0077_auto_20231211_0426.py @@ -1,290 +1,1146 @@ # Generated by Django 3.2.23 on 2023-12-13 10:47 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): - replaces = [('dref', '0072_auto_20231117_0602'), ('dref', '0073_auto_20231120_0944'), ('dref', '0074_dref_targeting_strategy_support_file'), ('dref', '0075_auto_20231208_0654'), ('dref', '0076_auto_20231208_1006'), ('dref', '0077_auto_20231211_0426')] + replaces = [ + ("dref", "0072_auto_20231117_0602"), + ("dref", "0073_auto_20231120_0944"), + ("dref", "0074_dref_targeting_strategy_support_file"), + ("dref", "0075_auto_20231208_0654"), + ("dref", "0076_auto_20231208_1006"), + ("dref", "0077_auto_20231211_0426"), + ] dependencies = [ - ('dref', '0071_auto_20230912_0438'), + ("dref", "0071_auto_20230912_0438"), ] operations = [ migrations.CreateModel( - name='SourceInformation', + name="SourceInformation", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('client_id', models.CharField(blank=True, max_length=50, null=True, verbose_name='client_id')), - ('source_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Source Name')), - ('source_link', models.CharField(blank=True, max_length=255, null=True, verbose_name='Source Link')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("client_id", models.CharField(blank=True, max_length=50, null=True, verbose_name="client_id")), + ("source_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="Source Name")), + ("source_link", models.CharField(blank=True, max_length=255, null=True, verbose_name="Source Link")), ], ), migrations.AddField( - model_name='dref', - name='disaster_category_analysis', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dref_disaster_category_file', to='dref.dreffile', verbose_name='If available please upload Disaster categorization Analysis'), + model_name="dref", + name="disaster_category_analysis", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="dref_disaster_category_file", + to="dref.dreffile", + verbose_name="If available please upload Disaster categorization Analysis", + ), ), migrations.AddField( - model_name='dref', - name='has_child_safeguarding_risk_analysis_assessment', - field=models.BooleanField(blank=True, null=True, verbose_name='Has the child safeguarding risk analysis assessment been completed?'), + model_name="dref", + name="has_child_safeguarding_risk_analysis_assessment", + field=models.BooleanField( + blank=True, null=True, verbose_name="Has the child safeguarding risk analysis assessment been completed?" + ), ), migrations.AddField( - model_name='dreffinalreport', - name='has_child_safeguarding_risk_analysis_assessment', - field=models.BooleanField(blank=True, null=True, verbose_name='Has the child safeguarding risk analysis assessment been completed?'), + model_name="dreffinalreport", + name="has_child_safeguarding_risk_analysis_assessment", + field=models.BooleanField( + blank=True, null=True, verbose_name="Has the child safeguarding risk analysis assessment been completed?" + ), ), migrations.AddField( - model_name='drefoperationalupdate', - name='budget_file_preview', - field=models.FileField(blank=True, null=True, upload_to='dref-op-update/images/', verbose_name='budget file preview'), + model_name="drefoperationalupdate", + name="budget_file_preview", + field=models.FileField(blank=True, null=True, upload_to="dref-op-update/images/", verbose_name="budget file preview"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='has_child_safeguarding_risk_analysis_assessment', - field=models.BooleanField(blank=True, null=True, verbose_name='Has the child safeguarding risk analysis assessment been completed?'), + model_name="drefoperationalupdate", + name="has_child_safeguarding_risk_analysis_assessment", + field=models.BooleanField( + blank=True, null=True, verbose_name="Has the child safeguarding risk analysis assessment been completed?" + ), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='reporting_end_date', - field=models.DateField(blank=True, null=True, verbose_name='Reporting End Date'), + model_name="drefoperationalupdate", + name="reporting_end_date", + field=models.DateField(blank=True, null=True, verbose_name="Reporting End Date"), ), migrations.AlterField( - model_name='drefoperationalupdate', - name='reporting_start_date', - field=models.DateField(blank=True, null=True, verbose_name='Reporting Start Date'), + model_name="drefoperationalupdate", + name="reporting_start_date", + field=models.DateField(blank=True, null=True, verbose_name="Reporting Start Date"), ), migrations.AlterField( - model_name='identifiedneed', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, verbose_name='title'), + model_name="identifiedneed", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('shelter_cluster_coordination', 'Shelter Cluster Coordination')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("shelter_cluster_coordination", "Shelter Cluster Coordination"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='nationalsocietyaction', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter, Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('coordination', 'Coordination'), ('national_society_readiness', 'National Society Readiness'), ('assessment', 'Assessment'), ('resource_mobilization', 'Resource Mobilization'), ('activation_of_contingency_plans', 'Activation Of Contingency Plans'), ('national_society_eoc', 'National Society EOC'), ('other', 'Other')], max_length=255, verbose_name='title'), + model_name="nationalsocietyaction", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter, Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("coordination", "Coordination"), + ("national_society_readiness", "National Society Readiness"), + ("assessment", "Assessment"), + ("resource_mobilization", "Resource Mobilization"), + ("activation_of_contingency_plans", "Activation Of Contingency Plans"), + ("national_society_eoc", "National Society EOC"), + ("other", "Other"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, verbose_name='title'), + model_name="plannedintervention", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AddField( - model_name='dref', - name='source_information', - field=models.ManyToManyField(blank=True, to='dref.SourceInformation', verbose_name='Source Information'), + model_name="dref", + name="source_information", + field=models.ManyToManyField(blank=True, to="dref.SourceInformation", verbose_name="Source Information"), ), migrations.AlterField( - model_name='identifiedneed', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, verbose_name='title'), + model_name="identifiedneed", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration', 'Migration'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration", "Migration"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AddField( - model_name='dref', - name='targeting_strategy_support_file', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dref_targeting_strategy_support_file', to='dref.dreffile', verbose_name='If available please upload additional support documentation for targeting strategy'), + model_name="dref", + name="targeting_strategy_support_file", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="dref_targeting_strategy_support_file", + to="dref.dreffile", + verbose_name="If available please upload additional support documentation for targeting strategy", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, verbose_name='title'), + model_name="identifiedneed", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='nationalsocietyaction', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter, Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and _accountability', 'Community Engagement And Accountability'), ('environment_sustainability ', 'Environment Sustainability'), ('coordination', 'Coordination'), ('national_society_readiness', 'National Society Readiness'), ('assessment', 'Assessment'), ('resource_mobilization', 'Resource Mobilization'), ('activation_of_contingency_plans', 'Activation Of Contingency Plans'), ('national_society_eoc', 'National Society EOC'), ('other', 'Other')], max_length=255, verbose_name='title'), + model_name="nationalsocietyaction", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter, Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and _accountability", "Community Engagement And Accountability"), + ("environment_sustainability ", "Environment Sustainability"), + ("coordination", "Coordination"), + ("national_society_readiness", "National Society Readiness"), + ("assessment", "Assessment"), + ("resource_mobilization", "Resource Mobilization"), + ("activation_of_contingency_plans", "Activation Of Contingency Plans"), + ("national_society_eoc", "National Society EOC"), + ("other", "Other"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, verbose_name='title'), + model_name="plannedintervention", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery_', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery_", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environment_sustainability', 'Environment Sustainability')], max_length=255, verbose_name='title'), + model_name="identifiedneed", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environment_sustainability", "Environment Sustainability"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environment_sustainability', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environment_sustainability", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environment_sustainability', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environment_sustainability", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environment_sustainability', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environment_sustainability", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='identifiedneed', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash_grants', 'Multi purpose cash grants'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environment_sustainability', 'Environment Sustainability')], max_length=255, null=True, verbose_name='title'), + model_name="identifiedneed", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash_grants", "Multi purpose cash grants"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environment_sustainability", "Environment Sustainability"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='nationalsocietyaction', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter, Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environment_sustainability', 'Environment Sustainability'), ('coordination', 'Coordination'), ('national_society_readiness', 'National Society Readiness'), ('assessment', 'Assessment'), ('resource_mobilization', 'Resource Mobilization'), ('activation_of_contingency_plans', 'Activation Of Contingency Plans'), ('national_society_eoc', 'National Society EOC'), ('other', 'Other')], max_length=255, verbose_name='title'), + model_name="nationalsocietyaction", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter, Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environment_sustainability", "Environment Sustainability"), + ("coordination", "Coordination"), + ("national_society_readiness", "National Society Readiness"), + ("assessment", "Assessment"), + ("resource_mobilization", "Resource Mobilization"), + ("activation_of_contingency_plans", "Activation Of Contingency Plans"), + ("national_society_eoc", "National Society EOC"), + ("other", "Other"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, verbose_name='title'), + model_name="plannedintervention", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi-purpose_cash', 'Multi-purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi-purpose_cash", "Multi-purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='nationalsocietyaction', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter, Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash', 'Multi Purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environment_sustainability', 'Environment Sustainability'), ('coordination', 'Coordination'), ('national_society_readiness', 'National Society Readiness'), ('assessment', 'Assessment'), ('resource_mobilization', 'Resource Mobilization'), ('activation_of_contingency_plans', 'Activation Of Contingency Plans'), ('national_society_eoc', 'National Society EOC'), ('other', 'Other')], max_length=255, verbose_name='title'), + model_name="nationalsocietyaction", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter, Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash", "Multi Purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environment_sustainability", "Environment Sustainability"), + ("coordination", "Coordination"), + ("national_society_readiness", "National Society Readiness"), + ("assessment", "Assessment"), + ("resource_mobilization", "Resource Mobilization"), + ("activation_of_contingency_plans", "Activation Of Contingency Plans"), + ("national_society_eoc", "National Society EOC"), + ("other", "Other"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash', 'Multi Purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, verbose_name='title'), + model_name="plannedintervention", + name="title", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash", "Multi Purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_ar', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash', 'Multi Purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_ar", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash", "Multi Purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_en', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash', 'Multi Purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_en", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash", "Multi Purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_es', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash', 'Multi Purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_es", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash", "Multi Purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), migrations.AlterField( - model_name='plannedintervention', - name='title_fr', - field=models.CharField(choices=[('shelter_housing_and_settlements', 'Shelter Housing And Settlements'), ('livelihoods_and_basic_needs', 'Livelihoods And Basic Needs'), ('multi_purpose_cash', 'Multi Purpose Cash'), ('health', 'Health'), ('water_sanitation_and_hygiene', 'Water, Sanitation And Hygiene'), ('protection_gender_and_inclusion', 'Protection, Gender And Inclusion'), ('education', 'Education'), ('migration_and_displacement', 'Migration And Displacement'), ('risk_reduction_climate_adaptation_and_recovery', 'Risk Reduction, Climate Adaptation And Recovery'), ('community_engagement_and_accountability', 'Community Engagement And Accountability'), ('environmental_sustainability', 'Environmental Sustainability'), ('coordination_and_partnerships', 'Coordination And Partnerships'), ('secretariat_services', 'Secretariat Services'), ('national_society_strengthening', 'National Society Strengthening')], max_length=255, null=True, verbose_name='title'), + model_name="plannedintervention", + name="title_fr", + field=models.CharField( + choices=[ + ("shelter_housing_and_settlements", "Shelter Housing And Settlements"), + ("livelihoods_and_basic_needs", "Livelihoods And Basic Needs"), + ("multi_purpose_cash", "Multi Purpose Cash"), + ("health", "Health"), + ("water_sanitation_and_hygiene", "Water, Sanitation And Hygiene"), + ("protection_gender_and_inclusion", "Protection, Gender And Inclusion"), + ("education", "Education"), + ("migration_and_displacement", "Migration And Displacement"), + ("risk_reduction_climate_adaptation_and_recovery", "Risk Reduction, Climate Adaptation And Recovery"), + ("community_engagement_and_accountability", "Community Engagement And Accountability"), + ("environmental_sustainability", "Environmental Sustainability"), + ("coordination_and_partnerships", "Coordination And Partnerships"), + ("secretariat_services", "Secretariat Services"), + ("national_society_strengthening", "National Society Strengthening"), + ], + max_length=255, + null=True, + verbose_name="title", + ), ), ] diff --git a/dref/migrations/0073_auto_20231214_0358.py b/dref/migrations/0073_auto_20231214_0358.py index 1508ca255..b646f87d9 100644 --- a/dref/migrations/0073_auto_20231214_0358.py +++ b/dref/migrations/0073_auto_20231214_0358.py @@ -1,45 +1,43 @@ # Generated by Django 3.2.23 on 2023-12-14 03:58 from django.db import migrations + class Migration(migrations.Migration): def update_dref_sectors(apps, schema_editor): - NationalSocietyAction = apps.get_model('dref', 'NationalSocietyAction') - IdentifiedNeed = apps.get_model('dref', 'IdentifiedNeed') - PlannedIntervention = apps.get_model('dref', 'PlannedIntervention') + NationalSocietyAction = apps.get_model("dref", "NationalSocietyAction") + IdentifiedNeed = apps.get_model("dref", "IdentifiedNeed") + PlannedIntervention = apps.get_model("dref", "PlannedIntervention") # update the sector key for old_value, new_value in [ - ('multi-purpose_cash', 'multi_purpose_cash'), - ('community_engagement_and _accountability', 'community_engagement_and_accountability'), - ('migration', 'migration_and_displacement'), + ("multi-purpose_cash", "multi_purpose_cash"), + ("community_engagement_and _accountability", "community_engagement_and_accountability"), + ("migration", "migration_and_displacement"), ]: NationalSocietyAction.objects.filter(title=old_value).update(title=new_value) for old_value, new_value in [ - ('migration', 'migration_and_displacement'), - ('community_engagement_and _accountability', 'community_engagement_and_accountability'), - ('environment_sustainability ', 'environment_sustainability'), + ("migration", "migration_and_displacement"), + ("community_engagement_and _accountability", "community_engagement_and_accountability"), + ("environment_sustainability ", "environment_sustainability"), ]: IdentifiedNeed.objects.filter(title=old_value).update(title=new_value) for old_value, new_value in [ - ('migration', 'migration_and_displacement'), - ('risk_reduction_climate_adaptation_and_recovery_', 'risk_reduction_climate_adaptation_and_recovery'), - ('multi-purpose_cash', 'multi_purpose_cash'), + ("migration", "migration_and_displacement"), + ("risk_reduction_climate_adaptation_and_recovery_", "risk_reduction_climate_adaptation_and_recovery"), + ("multi-purpose_cash", "multi_purpose_cash"), ]: PlannedIntervention.objects.filter(title=old_value).update(title=new_value) # Removing IdentifiedNeed.SHELTER_CLUSTER_COORDINATION - print(IdentifiedNeed.objects.filter(title='shelter_cluster_coordination').delete()) + print(IdentifiedNeed.objects.filter(title="shelter_cluster_coordination").delete()) dependencies = [ - ('dref', '0072_auto_20231117_0602_squashed_0077_auto_20231211_0426'), + ("dref", "0072_auto_20231117_0602_squashed_0077_auto_20231211_0426"), ] operations = [ - migrations.RunPython( - update_dref_sectors, - reverse_code=migrations.RunPython.noop - ), - ] \ No newline at end of file + migrations.RunPython(update_dref_sectors, reverse_code=migrations.RunPython.noop), + ] diff --git a/dref/migrations/0074_auto_20240129_0909.py b/dref/migrations/0074_auto_20240129_0909.py index a3ab02445..ce9174f03 100644 --- a/dref/migrations/0074_auto_20240129_0909.py +++ b/dref/migrations/0074_auto_20240129_0909.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('dref', '0073_auto_20231214_0358'), + ("dref", "0073_auto_20231214_0358"), ] operations = [ migrations.AddField( - model_name='dreffinalreport', - name='source_information', - field=models.ManyToManyField(blank=True, to='dref.SourceInformation', verbose_name='Source Information'), + model_name="dreffinalreport", + name="source_information", + field=models.ManyToManyField(blank=True, to="dref.SourceInformation", verbose_name="Source Information"), ), migrations.AddField( - model_name='drefoperationalupdate', - name='source_information', - field=models.ManyToManyField(blank=True, to='dref.SourceInformation', verbose_name='Source Information'), + model_name="drefoperationalupdate", + name="source_information", + field=models.ManyToManyField(blank=True, to="dref.SourceInformation", verbose_name="Source Information"), ), ] diff --git a/dref/models.py b/dref/models.py index 7db6624b7..11b5dd24b 100644 --- a/dref/models.py +++ b/dref/models.py @@ -1,16 +1,15 @@ -import reversion -import os import copy +import os -from pdf2image import convert_from_bytes - -from django.db import models +import reversion from django.conf import settings -from django.utils.translation import gettext_lazy as _ -from django.templatetags.static import static -from django.core.exceptions import ValidationError from django.contrib.postgres.aggregates import ArrayAgg +from django.core.exceptions import ValidationError +from django.db import models +from django.templatetags.static import static from django.utils import timezone +from django.utils.translation import gettext_lazy as _ +from pdf2image import convert_from_bytes from api.models import Country, DisasterType, District, FieldReport @@ -191,7 +190,7 @@ def get_image_map(title, request): PlannedIntervention.Title.MULTI_PURPOSE_CASH: "cash.png", PlannedIntervention.Title.ENVIRONMENTAL_SUSTAINABILITY: "environment.png", PlannedIntervention.Title.COMMUNITY_ENGAGEMENT_AND_ACCOUNTABILITY: "participation_team.png", - PlannedIntervention.Title.COORDINATION_AND_PARTNERSHIPS: "coordination.png" + PlannedIntervention.Title.COORDINATION_AND_PARTNERSHIPS: "coordination.png", } return request.build_absolute_uri(static(os.path.join("images/dref", title_static_map.get(title, "favicon.png")))) @@ -277,7 +276,7 @@ class Status(models.IntegerChoices): null=True, blank=True, verbose_name=_("If available please upload Disaster categorization Analysis"), - related_name="dref_disaster_category_file" + related_name="dref_disaster_category_file", ) targeting_strategy_support_file = models.ForeignKey( "DrefFile", @@ -285,7 +284,7 @@ class Status(models.IntegerChoices): null=True, blank=True, verbose_name=_("If available please upload additional support documentation for targeting strategy"), - related_name="dref_targeting_strategy_support_file" + related_name="dref_targeting_strategy_support_file", ) status = models.IntegerField(choices=Status.choices, verbose_name=_("status"), null=True, blank=True) num_assisted = models.IntegerField(verbose_name=_("number of assisted"), blank=True, null=True) @@ -319,9 +318,7 @@ class Status(models.IntegerChoices): verbose_name=_("anticipatory actions"), help_text=_("Description of anticipatory actions or imminent disaster"), ) - event_scope = models.TextField( - blank=True, null=True, verbose_name=_("event scope"), help_text=_("Scope and scale of event") - ) + event_scope = models.TextField(blank=True, null=True, verbose_name=_("event scope"), help_text=_("Scope and scale of event")) national_society_actions = models.ManyToManyField( NationalSocietyAction, verbose_name=_("national society actions"), blank=True ) @@ -428,9 +425,7 @@ class Status(models.IntegerChoices): operation_timeframe = models.IntegerField(verbose_name=_("operation timeframe"), null=True, blank=True) appeal_code = models.CharField(verbose_name=_("appeal code"), max_length=255, null=True, blank=True) glide_code = models.CharField(verbose_name=_("glide number"), max_length=255, null=True, blank=True) - ifrc_appeal_manager_name = models.CharField( - verbose_name=_("ifrc appeal manager name"), max_length=255, null=True, blank=True - ) + ifrc_appeal_manager_name = models.CharField(verbose_name=_("ifrc appeal manager name"), max_length=255, null=True, blank=True) ifrc_appeal_manager_email = models.CharField( verbose_name=_("ifrc appeal manager email"), max_length=255, null=True, blank=True ) @@ -479,9 +474,7 @@ class Status(models.IntegerChoices): originator_name = models.CharField(verbose_name=_("originator name"), max_length=255, null=True, blank=True) originator_email = models.CharField(verbose_name=_("originator email"), max_length=255, null=True, blank=True) originator_title = models.CharField(verbose_name=_("originator title"), max_length=255, null=True, blank=True) - originator_phone_number = models.CharField( - verbose_name=_("originator phone number"), max_length=100, null=True, blank=True - ) + originator_phone_number = models.CharField(verbose_name=_("originator phone number"), max_length=100, null=True, blank=True) regional_focal_point_name = models.CharField( verbose_name=_("regional focal point name"), max_length=255, null=True, blank=True ) @@ -543,9 +536,7 @@ class Status(models.IntegerChoices): verbose_name=_("budget file"), related_name="budget_file_dref", ) - budget_file_preview = models.FileField( - verbose_name=_("budget file preview"), null=True, blank=True, upload_to="dref/images/" - ) + budget_file_preview = models.FileField(verbose_name=_("budget file preview"), null=True, blank=True, upload_to="dref/images/") assessment_report = models.ForeignKey( "DrefFile", on_delete=models.SET_NULL, @@ -590,8 +581,7 @@ class Status(models.IntegerChoices): district = models.ManyToManyField(District, blank=True, verbose_name=_("district")) risk_security = models.ManyToManyField(RiskSecurity, blank=True, verbose_name=_("Risk Security")) has_child_safeguarding_risk_analysis_assessment = models.BooleanField( - verbose_name=_("Has the child safeguarding risk analysis assessment been completed?"), - null=True, blank=True + verbose_name=_("Has the child safeguarding risk analysis assessment been completed?"), null=True, blank=True ) risk_security_concern = models.TextField(blank=True, null=True, verbose_name=_("Risk Security Concern")) is_man_made_event = models.BooleanField(verbose_name=_("Is Man-made Event"), null=True, blank=True) @@ -628,29 +618,33 @@ def get_for(user): user_id = user.id current_user_list = [] current_user_list.append(user_id) - return Dref.objects.annotate( - created_user_list=models.F("created_by"), - users_list=ArrayAgg("users", filter=models.Q(users__isnull=False)), - op_users=models.Subquery( - DrefOperationalUpdate.objects.filter(dref=models.OuterRef("id")) - .order_by() - .values("id") - .annotate(c=ArrayAgg("users", filter=models.Q(users__isnull=False))) - .values("c")[:1] - ), - fr_users=models.Subquery( - DrefFinalReport.objects.filter(dref=models.OuterRef("id")) - .order_by() - .values("id") - .annotate(c=ArrayAgg("users", filter=models.Q(users__isnull=False))) - .values("c")[:1], - ), - ).filter( - models.Q(created_user_list=user_id) | - models.Q(users_list__contains=current_user_list) | - models.Q(op_users__contains=current_user_list) | - models.Q(fr_users__contains=current_user_list) - ).distinct() + return ( + Dref.objects.annotate( + created_user_list=models.F("created_by"), + users_list=ArrayAgg("users", filter=models.Q(users__isnull=False)), + op_users=models.Subquery( + DrefOperationalUpdate.objects.filter(dref=models.OuterRef("id")) + .order_by() + .values("id") + .annotate(c=ArrayAgg("users", filter=models.Q(users__isnull=False))) + .values("c")[:1] + ), + fr_users=models.Subquery( + DrefFinalReport.objects.filter(dref=models.OuterRef("id")) + .order_by() + .values("id") + .annotate(c=ArrayAgg("users", filter=models.Q(users__isnull=False))) + .values("c")[:1], + ), + ) + .filter( + models.Q(created_user_list=user_id) + | models.Q(users_list__contains=current_user_list) + | models.Q(op_users__contains=current_user_list) + | models.Q(fr_users__contains=current_user_list) + ) + .distinct() + ) class DrefFile(models.Model): @@ -785,9 +779,7 @@ class DrefOperationalUpdate(models.Model): total_operation_timeframe = models.IntegerField(verbose_name=_("Total Operation Timeframe"), null=True, blank=True) appeal_code = models.CharField(verbose_name=_("appeal code"), max_length=255, null=True, blank=True) glide_code = models.CharField(verbose_name=_("glide number"), max_length=255, null=True, blank=True) - ifrc_appeal_manager_name = models.CharField( - verbose_name=_("ifrc appeal manager name"), max_length=255, null=True, blank=True - ) + ifrc_appeal_manager_name = models.CharField(verbose_name=_("ifrc appeal manager name"), max_length=255, null=True, blank=True) ifrc_appeal_manager_email = models.CharField( verbose_name=_("ifrc appeal manager email"), max_length=255, null=True, blank=True ) @@ -852,9 +844,7 @@ class DrefOperationalUpdate(models.Model): ) changing_geographic_location = models.BooleanField(null=True, blank=True, verbose_name=_("Changing geographic location")) changing_budget = models.BooleanField(null=True, blank=True, verbose_name=_("Changing budget")) - request_for_second_allocation = models.BooleanField( - null=True, blank=True, verbose_name=_("Request for second allocation") - ) + request_for_second_allocation = models.BooleanField(null=True, blank=True, verbose_name=_("Request for second allocation")) summary_of_change = models.TextField(verbose_name=_("Summary of change"), null=True, blank=True) has_change_since_request = models.BooleanField(verbose_name=_("Has change since request"), null=True, blank=True) event_description = models.TextField(verbose_name=_("Event description"), null=True, blank=True) @@ -954,8 +944,7 @@ class DrefOperationalUpdate(models.Model): risk_security = models.ManyToManyField(RiskSecurity, blank=True, verbose_name=_("Risk Security")) risk_security_concern = models.TextField(blank=True, null=True, verbose_name=_("Risk Security Concern")) has_child_safeguarding_risk_analysis_assessment = models.BooleanField( - verbose_name=_("Has the child safeguarding risk analysis assessment been completed?"), - null=True, blank=True + verbose_name=_("Has the child safeguarding risk analysis assessment been completed?"), null=True, blank=True ) has_forecasted_event_materialize = models.BooleanField( @@ -1126,9 +1115,7 @@ class DrefFinalReport(models.Model): operation_start_date = models.DateField(verbose_name=_("Operation Start Date"), null=True, blank=True) appeal_code = models.CharField(verbose_name=_("appeal code"), max_length=255, null=True, blank=True) glide_code = models.CharField(verbose_name=_("glide number"), max_length=255, null=True, blank=True) - ifrc_appeal_manager_name = models.CharField( - verbose_name=_("ifrc appeal manager name"), max_length=255, null=True, blank=True - ) + ifrc_appeal_manager_name = models.CharField(verbose_name=_("ifrc appeal manager name"), max_length=255, null=True, blank=True) ifrc_appeal_manager_email = models.CharField( verbose_name=_("ifrc appeal manager email"), max_length=255, null=True, blank=True ) @@ -1194,9 +1181,7 @@ class DrefFinalReport(models.Model): verbose_name=_("event map"), related_name="event_map_dref_final_report", ) - photos = models.ManyToManyField( - "DrefFile", blank=True, verbose_name=_("images"), related_name="photos_dref_final_report" - ) + photos = models.ManyToManyField("DrefFile", blank=True, verbose_name=_("images"), related_name="photos_dref_final_report") assessment_report = models.ForeignKey( "DrefFile", on_delete=models.SET_NULL, @@ -1249,18 +1234,9 @@ class DrefFinalReport(models.Model): men = models.IntegerField(verbose_name=_("men"), blank=True, null=True) girls = models.IntegerField(verbose_name=_("girls"), help_text=_("Girls under 18"), blank=True, null=True) boys = models.IntegerField(verbose_name=_("boys"), help_text=_("Boys under 18"), blank=True, null=True) - disability_people_per = models.FloatField( - verbose_name=_("disability people per"), - blank=True, null=True - ) - people_per_urban = models.FloatField( - verbose_name=_("people per urban"), - blank=True, null=True - ) - people_per_local = models.FloatField( - verbose_name=_("people per local"), - blank=True, null=True - ) + disability_people_per = models.FloatField(verbose_name=_("disability people per"), blank=True, null=True) + people_per_urban = models.FloatField(verbose_name=_("people per urban"), blank=True, null=True) + people_per_local = models.FloatField(verbose_name=_("people per local"), blank=True, null=True) people_targeted_with_early_actions = models.IntegerField( verbose_name=_("people targeted with early actions"), blank=True, null=True ) @@ -1317,8 +1293,7 @@ class DrefFinalReport(models.Model): total_targeted_population = models.IntegerField(verbose_name=_("total targeted population"), blank=True, null=True) risk_security = models.ManyToManyField(RiskSecurity, blank=True, verbose_name=_("Risk Security")) has_child_safeguarding_risk_analysis_assessment = models.BooleanField( - verbose_name=_("Has the child safeguarding risk analysis assessment been completed?"), - null=True, blank=True + verbose_name=_("Has the child safeguarding risk analysis assessment been completed?"), null=True, blank=True ) risk_security_concern = models.TextField(blank=True, null=True, verbose_name=_("Risk Security Concern")) event_date = models.DateField( @@ -1357,15 +1332,8 @@ class DrefFinalReport(models.Model): null=True, blank=True, ) - main_donors = models.TextField( - verbose_name=_("Main Donors"), - null=True, - blank=True - ) - operation_end_date = models.DateField( - verbose_name=_("Operation End Date"), - null=True, blank=True - ) + main_donors = models.TextField(verbose_name=_("Main Donors"), null=True, blank=True) + operation_end_date = models.DateField(verbose_name=_("Operation End Date"), null=True, blank=True) source_information = models.ManyToManyField(SourceInformation, blank=True, verbose_name=_("Source Information")) __financial_report_id = None diff --git a/dref/permissions.py b/dref/permissions.py index 7aff2fe16..d22e40ecb 100644 --- a/dref/permissions.py +++ b/dref/permissions.py @@ -1,8 +1,7 @@ -from rest_framework import permissions - from django.contrib.auth.models import Permission +from rest_framework import permissions -from dref.models import DrefOperationalUpdate, DrefFinalReport +from dref.models import DrefFinalReport, DrefOperationalUpdate from dref.utils import get_dref_users @@ -41,7 +40,7 @@ class PublishDrefPermission(permissions.BasePermission): def has_object_permission(self, request, view, obj): region = obj.country.region.name - codename = f'dref_region_admin_{region}' + codename = f"dref_region_admin_{region}" user = request.user if Permission.objects.filter(user=user, codename=codename).exists() and not obj.is_published: return True diff --git a/dref/search_indexes.py b/dref/search_indexes.py index 6e8ca7400..a95e82946 100644 --- a/dref/search_indexes.py +++ b/dref/search_indexes.py @@ -5,12 +5,12 @@ class DrefIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='title') - created_at = indexes.DateTimeField(model_attr='created_at') - code = indexes.CharField(model_attr='appeal_code', null=True) - country_name = indexes.CharField(model_attr='national_society__name', null=True) - country_id = indexes.CharField(model_attr='national_society__id', null=True) - iso3 = indexes.CharField(model_attr='national_society__iso3', null=True) + name = indexes.EdgeNgramField(model_attr="title") + created_at = indexes.DateTimeField(model_attr="created_at") + code = indexes.CharField(model_attr="appeal_code", null=True) + country_name = indexes.CharField(model_attr="national_society__name", null=True) + country_id = indexes.CharField(model_attr="national_society__id", null=True) + iso3 = indexes.CharField(model_attr="national_society__iso3", null=True) def get_model(self): return Dref @@ -21,12 +21,12 @@ def index_queryset(self, using=None): class DrefOperationalUpdateIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True, null=True) - name = indexes.EdgeNgramField(model_attr='title') - created_at = indexes.DateTimeField(model_attr='created_at') - code = indexes.CharField(model_attr='appeal_code', null=True) - country_name = indexes.CharField(model_attr='national_society__name', null=True) - country_id = indexes.CharField(model_attr='national_society__id', null=True) - iso3 = indexes.CharField(model_attr='national_society__iso3', null=True) + name = indexes.EdgeNgramField(model_attr="title") + created_at = indexes.DateTimeField(model_attr="created_at") + code = indexes.CharField(model_attr="appeal_code", null=True) + country_name = indexes.CharField(model_attr="national_society__name", null=True) + country_id = indexes.CharField(model_attr="national_society__id", null=True) + iso3 = indexes.CharField(model_attr="national_society__iso3", null=True) def get_model(self): return DrefOperationalUpdate diff --git a/dref/serializers.py b/dref/serializers.py index 2b196d5a6..994b5af4d 100644 --- a/dref/serializers.py +++ b/dref/serializers.py @@ -1,37 +1,40 @@ -import os import datetime +import os from typing import List -from django.utils.translation import gettext -from django.db import models, transaction from django.conf import settings from django.contrib.auth.models import User +from django.db import models, transaction from django.utils import timezone - -from rest_framework import serializers +from django.utils.translation import gettext from drf_spectacular.utils import extend_schema_field +from rest_framework import serializers -from lang.serializers import ModelSerializer -from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin -from api.serializers import UserNameSerializer, DisasterTypeSerializer, MiniDistrictSerializer, MiniCountrySerializer - +from api.serializers import ( + DisasterTypeSerializer, + MiniCountrySerializer, + MiniDistrictSerializer, + UserNameSerializer, +) from dref.models import ( Dref, + DrefFile, + DrefFinalReport, + DrefOperationalUpdate, + IdentifiedNeed, + NationalSocietyAction, PlannedIntervention, PlannedInterventionIndicators, - NationalSocietyAction, - IdentifiedNeed, RiskSecurity, - DrefFile, - DrefOperationalUpdate, - DrefFinalReport, SourceInformation, ) - -from .tasks import send_dref_email from dref.utils import get_dref_users +from lang.serializers import ModelSerializer +from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin from utils.file_check import validate_file_type +from .tasks import send_dref_email + class RiskSecuritySerializer(ModelSerializer): class Meta: @@ -52,9 +55,7 @@ class Meta: class DrefFileInputSerializer(serializers.Serializer): - file = serializers.ListField( - child=serializers.FileField() - ) + file = serializers.ListField(child=serializers.FileField()) class DrefFileSerializer(ModelSerializer): @@ -107,7 +108,7 @@ class Meta: "is_published", "status", "status_display", - "date_of_approval" + "date_of_approval", ] def get_application_type(self, obj) -> str: @@ -143,7 +144,7 @@ class Meta: "application_type_display", "status", "status_display", - "date_of_approval" + "date_of_approval", ] def get_application_type(self, obj) -> str: @@ -196,12 +197,12 @@ class Meta: "unpublished_final_report_count", "status", "status_display", - "date_of_approval" + "date_of_approval", ] @extend_schema_field(MiniOperationalUpdateActiveSerializer(many=True)) def get_operational_update_details(self, obj): - queryset = DrefOperationalUpdate.objects.filter(dref_id=obj.id).order_by('-created_at') + queryset = DrefOperationalUpdate.objects.filter(dref_id=obj.id).order_by("-created_at") return MiniOperationalUpdateActiveSerializer(queryset, many=True).data @extend_schema_field(MiniDrefFinalReportActiveSerializer) @@ -216,7 +217,7 @@ def get_has_ops_update(self, obj) -> bool: return False def get_has_final_report(self, obj) -> bool: - if hasattr(obj, 'dreffinalreport'): + if hasattr(obj, "dreffinalreport"): return True return False @@ -346,9 +347,11 @@ class DrefSerializer(NestedUpdateMixin, NestedCreateMixin, ModelSerializer): modified_by_details = UserNameSerializer(source="modified_by", read_only=True) event_map_file = DrefFileSerializer(source="event_map", required=False, allow_null=True) disaster_category_analysis_details = DrefFileSerializer( - source="disaster_category_analysis", read_only=True, required=False, allow_null=True) + source="disaster_category_analysis", read_only=True, required=False, allow_null=True + ) targeting_strategy_support_file_details = DrefFileSerializer( - source="targeting_strategy_support_file", read_only=True, required=False, allow_null=True) + source="targeting_strategy_support_file", read_only=True, required=False, allow_null=True + ) images_file = DrefFileSerializer(many=True, required=False, allow_null=True, source="images") # field_report_details = MiniFieldReportSerializer(source='field_report', read_only=True) created_by_details = UserNameSerializer(source="created_by", read_only=True) @@ -356,18 +359,13 @@ class DrefSerializer(NestedUpdateMixin, NestedCreateMixin, ModelSerializer): budget_file_details = DrefFileSerializer(source="budget_file", read_only=True) cover_image_file = DrefFileSerializer(source="cover_image", required=False, allow_null=True) disaster_type_details = DisasterTypeSerializer(source="disaster_type", read_only=True) - operational_update_details = MiniOperationalUpdateSerializer( - source="drefoperationalupdate_set", many=True, read_only=True - ) + operational_update_details = MiniOperationalUpdateSerializer(source="drefoperationalupdate_set", many=True, read_only=True) final_report_details = MiniDrefFinalReportSerializer(source="dreffinalreport", read_only=True) country_details = MiniCountrySerializer(source="country", read_only=True) district_details = MiniDistrictSerializer(source="district", read_only=True, many=True) assessment_report_details = DrefFileSerializer(source="assessment_report", read_only=True) supporting_document_details = DrefFileSerializer( - source="supporting_document", - read_only=True, - required=False, - allow_null=True + source="supporting_document", read_only=True, required=False, allow_null=True ) risk_security = RiskSecuritySerializer(many=True, required=False) modified_at = serializers.DateTimeField(required=False) @@ -377,7 +375,12 @@ class DrefSerializer(NestedUpdateMixin, NestedCreateMixin, ModelSerializer): class Meta: model = Dref read_only_fields = ("modified_by", "created_by", "budget_file_preview") - exclude = ("cover_image", "event_map", "images", "users",) + exclude = ( + "cover_image", + "event_map", + "images", + "users", + ) def get_dref_access_user_list(self, obj) -> List[int]: dref_users_list = get_dref_users() @@ -445,8 +448,7 @@ def validate_images(self, images): if images_id_without_access: raise serializers.ValidationError( gettext( - "Only image owner can attach image. Not allowed image ids: %s" - % ",".join(map(str, images_id_without_access)) + "Only image owner can attach image. Not allowed image ids: %s" % ",".join(map(str, images_id_without_access)) ) ) return images @@ -595,9 +597,7 @@ def validate(self, data): dref = data.get("dref") if not self.instance and dref: if not dref.is_published: - raise serializers.ValidationError( - gettext("Can't create Operational Update for not published %s dref." % dref.id) - ) + raise serializers.ValidationError(gettext("Can't create Operational Update for not published %s dref." % dref.id)) # get the latest dref_operation_update and # check whether it is published or not, exclude no operational object created so far dref_operational_update = ( @@ -632,9 +632,7 @@ def validate_budget_file_preview(self, budget_file_preview): def create(self, validated_data): dref = validated_data["dref"] - dref_operational_update = ( - DrefOperationalUpdate.objects.filter(dref=dref).order_by("-operational_update_number").first() - ) + dref_operational_update = DrefOperationalUpdate.objects.filter(dref=dref).order_by("-operational_update_number").first() validated_data["created_by"] = self.context["request"].user if not dref_operational_update: validated_data["title"] = dref.title @@ -704,7 +702,9 @@ def create(self, validated_data): validated_data["budget_file"] = dref.budget_file validated_data["country"] = dref.country validated_data["risk_security_concern"] = dref.risk_security_concern - validated_data["has_child_safeguarding_risk_analysis_assessment"] = dref.has_child_safeguarding_risk_analysis_assessment + validated_data["has_child_safeguarding_risk_analysis_assessment"] = ( + dref.has_child_safeguarding_risk_analysis_assessment + ) validated_data["event_date"] = dref.event_date validated_data["ns_respond_date"] = dref.ns_respond_date validated_data["did_ns_respond"] = dref.did_ns_respond @@ -771,9 +771,9 @@ def create(self, validated_data): validated_data["national_society_contact_name"] = dref_operational_update.national_society_contact_name validated_data["national_society_contact_email"] = dref_operational_update.national_society_contact_email validated_data["national_society_contact_title"] = dref_operational_update.national_society_contact_title - validated_data[ - "national_society_contact_phone_number" - ] = dref_operational_update.national_society_contact_phone_number + validated_data["national_society_contact_phone_number"] = ( + dref_operational_update.national_society_contact_phone_number + ) validated_data["media_contact_name"] = dref_operational_update.media_contact_name validated_data["media_contact_email"] = dref_operational_update.media_contact_email validated_data["media_contact_title"] = dref_operational_update.media_contact_title @@ -818,14 +818,16 @@ def create(self, validated_data): validated_data["assessment_report"] = dref_operational_update.assessment_report validated_data["country"] = dref_operational_update.country validated_data["risk_security_concern"] = dref_operational_update.risk_security_concern - validated_data["has_child_safeguarding_risk_analysis_assessment"] = dref_operational_update.has_child_safeguarding_risk_analysis_assessment + validated_data["has_child_safeguarding_risk_analysis_assessment"] = ( + dref_operational_update.has_child_safeguarding_risk_analysis_assessment + ) validated_data["event_date"] = dref_operational_update.event_date validated_data["ns_respond_date"] = dref_operational_update.ns_respond_date validated_data["did_ns_respond"] = dref_operational_update.did_ns_respond validated_data["total_targeted_population"] = dref_operational_update.total_targeted_population - validated_data[ - "is_there_major_coordination_mechanism" - ] = dref_operational_update.is_there_major_coordination_mechanism + validated_data["is_there_major_coordination_mechanism"] = ( + dref_operational_update.is_there_major_coordination_mechanism + ) validated_data["human_resource"] = dref_operational_update.human_resource validated_data["is_surge_personnel_deployed"] = dref_operational_update.is_surge_personnel_deployed validated_data["surge_personnel_deployed"] = dref_operational_update.surge_personnel_deployed @@ -976,9 +978,9 @@ def create(self, validated_data): validated_data["national_society_contact_name"] = dref_operational_update.national_society_contact_name validated_data["national_society_contact_email"] = dref_operational_update.national_society_contact_email validated_data["national_society_contact_title"] = dref_operational_update.national_society_contact_title - validated_data[ - "national_society_contact_phone_number" - ] = dref_operational_update.national_society_contact_phone_number + validated_data["national_society_contact_phone_number"] = ( + dref_operational_update.national_society_contact_phone_number + ) validated_data["media_contact_name"] = dref_operational_update.media_contact_name validated_data["media_contact_email"] = dref_operational_update.media_contact_email validated_data["media_contact_title"] = dref_operational_update.media_contact_title @@ -1019,11 +1021,13 @@ def create(self, validated_data): validated_data["event_scope"] = dref_operational_update.event_scope validated_data["country"] = dref_operational_update.country validated_data["risk_security_concern"] = dref_operational_update.risk_security_concern - validated_data["has_child_safeguarding_risk_analysis_assessment"] = dref_operational_update.has_child_safeguarding_risk_analysis_assessment + validated_data["has_child_safeguarding_risk_analysis_assessment"] = ( + dref_operational_update.has_child_safeguarding_risk_analysis_assessment + ) validated_data["total_targeted_population"] = dref_operational_update.total_targeted_population - validated_data[ - "is_there_major_coordination_mechanism" - ] = dref_operational_update.is_there_major_coordination_mechanism + validated_data["is_there_major_coordination_mechanism"] = ( + dref_operational_update.is_there_major_coordination_mechanism + ) validated_data["event_date"] = dref_operational_update.event_date validated_data["people_in_need"] = dref_operational_update.people_in_need validated_data["ns_respond_date"] = dref_operational_update.ns_respond_date @@ -1118,7 +1122,9 @@ def create(self, validated_data): validated_data["assessment_report"] = dref.assessment_report validated_data["country"] = dref.country validated_data["risk_security_concern"] = dref.risk_security_concern - validated_data["has_child_safeguarding_risk_analysis_assessment"] = dref.has_child_safeguarding_risk_analysis_assessment + validated_data["has_child_safeguarding_risk_analysis_assessment"] = ( + dref.has_child_safeguarding_risk_analysis_assessment + ) validated_data["total_targeted_population"] = dref.total_targeted_population validated_data["is_there_major_coordination_mechanism"] = dref.is_there_major_coordination_mechanism validated_data["event_date"] = dref.event_date @@ -1196,15 +1202,12 @@ def get_application_type_display(self, obj) -> str: class AddDrefUserSerializer(serializers.Serializer): - users = serializers.ListField( - child=serializers.IntegerField(), - write_only=True - ) + users = serializers.ListField(child=serializers.IntegerField(), write_only=True) dref = serializers.IntegerField(write_only=True) def save(self): - users_list = self.validated_data['users'] - dref = self.validated_data['dref'] + users_list = self.validated_data["users"] + dref = self.validated_data["dref"] users = [User.objects.get(id=user_id) for user_id in users_list] @@ -1230,8 +1233,4 @@ class DrefShareUserSerializer(serializers.ModelSerializer): class Meta: model = Dref - fields = ( - 'id', - 'users', - 'users_details' - ) + fields = ("id", "users", "users_details") diff --git a/dref/tasks.py b/dref/tasks.py index 70e1b51f7..25a289817 100644 --- a/dref/tasks.py +++ b/dref/tasks.py @@ -1,6 +1,8 @@ from celery import shared_task from django.template.loader import render_to_string + from notifications.notification import send_notification + from .models import Dref from .utils import get_email_context diff --git a/dref/test_views.py b/dref/test_views.py index 143b7ba05..f84c397ab 100644 --- a/dref/test_views.py +++ b/dref/test_views.py @@ -1,38 +1,22 @@ import os -from unittest import mock from datetime import datetime, timedelta - +from unittest import mock from django.conf import settings -from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Permission +from django.contrib.contenttypes.models import ContentType -from main.test_case import APITestCase - -from dref.models import ( - Dref, - DrefFile, - DrefFinalReport, -) - +from api.models import Country, DisasterType, District, Region, RegionName +from deployments.factories.user import UserFactory from dref.factories.dref import ( DrefFactory, DrefFileFactory, - DrefOperationalUpdateFactory, DrefFinalReportFactory, + DrefOperationalUpdateFactory, ) -from dref.models import DrefOperationalUpdate - -from deployments.factories.user import UserFactory - -from api.models import ( - Country, - DisasterType, - District, - Region, - RegionName, -) +from dref.models import Dref, DrefFile, DrefFinalReport, DrefOperationalUpdate from dref.tasks import send_dref_email +from main.test_case import APITestCase class DrefTestCase(APITestCase): @@ -430,9 +414,9 @@ def test_dref_is_published(self, mock_now): # add permission to request user self.dref_permission = Permission.objects.create( - codename='dref_region_admin_0', + codename="dref_region_admin_0", content_type=ContentType.objects.get_for_model(Region), - name='Dref Admin for 0', + name="Dref Admin for 0", ) self.user.user_permissions.add(self.dref_permission) response = self.client.post(url, data) @@ -673,9 +657,9 @@ def test_final_report_update_once_published(self): self.assert_403(response) # add permission to request user self.dref_permission = Permission.objects.create( - codename='dref_region_admin_0', + codename="dref_region_admin_0", content_type=ContentType.objects.get_for_model(Region), - name='Dref Admin for 0', + name="Dref Admin for 0", ) user1.user_permissions.add(self.dref_permission) self.client.force_authenticate(user1) @@ -818,9 +802,7 @@ def test_dref_for_super_user(self): self.assertEqual(len(response.data["results"]), 0) def test_dref_latest_update(self): - dref = DrefFactory.create( - title="Test Title", created_by=self.user, modified_at=datetime(2022, 4, 18, 2, 29, 39, 793615) - ) + dref = DrefFactory.create(title="Test Title", created_by=self.user, modified_at=datetime(2022, 4, 18, 2, 29, 39, 793615)) url = f"/api/v2/dref/{dref.id}/" data = { "title": "New title", @@ -851,9 +833,7 @@ def test_dref_op_update_locking(self): is_published=True, ) dref.users.add(user1) - DrefOperationalUpdateFactory.create( - dref=dref, is_published=True, operational_update_number=1, modified_at=datetime.now() - ) + DrefOperationalUpdateFactory.create(dref=dref, is_published=True, operational_update_number=1, modified_at=datetime.now()) url = "/api/v2/dref-op-update/" data = { "dref": dref.id, @@ -1079,12 +1059,7 @@ def test_concurrent_dref_operational_update(self): def test_dref_type_loan(self): user1, _ = UserFactory.create_batch(2) - dref = DrefFactory.create( - title="Test Title", - created_by=self.user, - is_published=True, - type_of_dref=Dref.DrefType.LOAN - ) + dref = DrefFactory.create(title="Test Title", created_by=self.user, is_published=True, type_of_dref=Dref.DrefType.LOAN) dref.users.add(user1) old_count = DrefFinalReport.objects.count() url = "/api/v2/dref-final-report/" @@ -1097,7 +1072,7 @@ def test_dref_type_loan(self): # update the dref type to other dref.type_of_dref = Dref.DrefType.ASSESSMENT - dref.save(update_fields=['type_of_dref']) + dref.save(update_fields=["type_of_dref"]) self.authenticate(self.user) response = self.client.post(url, data=data) @@ -1147,26 +1122,22 @@ def test_dref_share(self): created_by=user1, ) self.client.force_authenticate(user1) - data = { - "users": [user2.id, user3.id, user4.id], - "dref": dref1.id - } + data = {"users": [user2.id, user3.id, user4.id], "dref": dref1.id} # share url - url = '/api/v2/dref-share/' + url = "/api/v2/dref-share/" response = self.client.post(url, data=data) self.assertEqual(response.status_code, 200) self.assertEqual( - set(list(DrefFinalReport.objects.filter(id=final_report.id).values_list('users', flat=True))), - set([user2.id, user3.id, user4.id]) + set(list(DrefFinalReport.objects.filter(id=final_report.id).values_list("users", flat=True))), + set([user2.id, user3.id, user4.id]), ) self.assertEqual( - set(list(Dref.objects.filter(id=dref1.id).values_list('users', flat=True))), - set([user2.id, user3.id, user4.id]) + set(list(Dref.objects.filter(id=dref1.id).values_list("users", flat=True))), set([user2.id, user3.id, user4.id]) ) self.assertEqual( - set(list(DrefOperationalUpdate.objects.filter(id=op_update.id).values_list('users', flat=True))), - set([user2.id, user3.id, user4.id]) + set(list(DrefOperationalUpdate.objects.filter(id=op_update.id).values_list("users", flat=True))), + set([user2.id, user3.id, user4.id]), ) def test_completed_dref_operations(self): @@ -1176,43 +1147,29 @@ def test_completed_dref_operations(self): # create some dref final report DrefFinalReport.objects.all().delete() - DrefFinalReportFactory.create( - is_published=True, - country=country_1, - type_of_dref=Dref.DrefType.ASSESSMENT - ) - DrefFinalReportFactory.create( - is_published=True, - country=country_3, - type_of_dref=Dref.DrefType.ASSESSMENT - ) + DrefFinalReportFactory.create(is_published=True, country=country_1, type_of_dref=Dref.DrefType.ASSESSMENT) + DrefFinalReportFactory.create(is_published=True, country=country_3, type_of_dref=Dref.DrefType.ASSESSMENT) final_report_1, final_report_2 = DrefFinalReportFactory.create_batch( - 2, - is_published=True, - country=country_2, - type_of_dref=Dref.DrefType.LOAN + 2, is_published=True, country=country_2, type_of_dref=Dref.DrefType.LOAN ) DrefFinalReportFactory.create(country=country_2) - url = '/api/v2/completed-dref/' + url = "/api/v2/completed-dref/" self.client.force_authenticate(self.root_user) response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.data['results']), 4) + self.assertEqual(len(response.data["results"]), 4) # filter by national society url = f"/api/v2/completed-dref/?country={country_2.id}" response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.data['results']), 2) - self.assertEqual( - set([item['id'] for item in response.data['results']]), - set([final_report_1.id, final_report_2.id]) - ) + self.assertEqual(len(response.data["results"]), 2) + self.assertEqual(set([item["id"] for item in response.data["results"]]), set([final_report_1.id, final_report_2.id])) url = "/api/v2/completed-dref/?type_of_dref=1" response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.data['results']), 2) + self.assertEqual(len(response.data["results"]), 2) def test_filter_active_dref(self): country_1 = Country.objects.create(name="country1") @@ -1220,50 +1177,34 @@ def test_filter_active_dref(self): # create some dref dref_1 = DrefFactory.create( - is_active=True, - type_of_dref=Dref.DrefType.ASSESSMENT, - country=country_1, - created_by=self.root_user - ) - dref_2 = DrefFactory.create( - is_active=True, - type_of_dref=Dref.DrefType.LOAN, - country=country_2, - created_by=self.root_user + is_active=True, type_of_dref=Dref.DrefType.ASSESSMENT, country=country_1, created_by=self.root_user ) + dref_2 = DrefFactory.create(is_active=True, type_of_dref=Dref.DrefType.LOAN, country=country_2, created_by=self.root_user) # some dref final report dref_final_report = DrefFinalReportFactory.create( - is_published=False, - country=country_1, - type_of_dref=Dref.DrefType.ASSESSMENT, - dref=dref_1, - created_by=self.root_user + is_published=False, country=country_1, type_of_dref=Dref.DrefType.ASSESSMENT, dref=dref_1, created_by=self.root_user ) DrefFinalReportFactory.create( - is_published=False, - country=country_2, - type_of_dref=Dref.DrefType.LOAN, - dref=dref_2, - created_by=self.root_user + is_published=False, country=country_2, type_of_dref=Dref.DrefType.LOAN, dref=dref_2, created_by=self.root_user ) - url = '/api/v2/active-dref/' + url = "/api/v2/active-dref/" self.client.force_authenticate(self.root_user) response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.data['results']), 2) + self.assertEqual(len(response.data["results"]), 2) # filter by national society url = f"/api/v2/active-dref/?country={country_1.id}" response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.data['results']), 1) + self.assertEqual(len(response.data["results"]), 1) url = f"/api/v2/active-dref/?type_of_dref={Dref.DrefType.ASSESSMENT}" response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.data['results']), 1) - self.assertEqual(response.data['results'][0]['final_report_details']["id"], dref_final_report.id) + self.assertEqual(len(response.data["results"]), 1) + self.assertEqual(response.data["results"][0]["final_report_details"]["id"], dref_final_report.id) def test_dref_share_users(self): user1 = UserFactory.create( @@ -1300,12 +1241,9 @@ def test_dref_share_users(self): created_by=user1, ) dref.users.set([user2, user3, user4]) - url = '/api/v2/dref-share-user/' + url = "/api/v2/dref-share-user/" self.client.force_authenticate(user1) response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.data['results']), 1) - self.assertEqual( - set(response.data['results'][0]['users']), - set([user2.id, user3.id, user4.id]) - ) + self.assertEqual(len(response.data["results"]), 1) + self.assertEqual(set(response.data["results"][0]["users"]), set([user2.id, user3.id, user4.id])) diff --git a/dref/translation.py b/dref/translation.py index 45bd14d29..77d4f1394 100644 --- a/dref/translation.py +++ b/dref/translation.py @@ -1,4 +1,4 @@ -from modeltranslation.translator import register, TranslationOptions +from modeltranslation.translator import TranslationOptions, register from dref.models import ( Dref, @@ -47,9 +47,7 @@ class DrefTO(TranslationOptions): @register(DrefFile) class DrefFileTO(TranslationOptions): - fields = ( - "caption", - ) + fields = ("caption",) @register(DrefFinalReport) @@ -114,9 +112,7 @@ class IdentifiedNeedTO(TranslationOptions): @register(NationalSocietyAction) class NationalSocietyActionTO(TranslationOptions): - fields = ( - "description", - ) + fields = ("description",) @register(PlannedIntervention) @@ -133,9 +129,7 @@ class PlannedInterventionTO(TranslationOptions): @register(PlannedInterventionIndicators) class PlannedInterventionIndicatorsTO(TranslationOptions): - fields = ( - "title", - ) + fields = ("title",) @register(RiskSecurity) diff --git a/dref/utils.py b/dref/utils.py index eafc42c29..d552547aa 100644 --- a/dref/utils.py +++ b/dref/utils.py @@ -1,12 +1,8 @@ from django.conf import settings - -from dref.models import ( - Dref, - DrefOperationalUpdate, - DrefFinalReport, -) -from django.db import models from django.contrib.postgres.aggregates import ArrayAgg +from django.db import models + +from dref.models import Dref, DrefFinalReport, DrefOperationalUpdate def get_email_context(instance): diff --git a/dref/views.py b/dref/views.py index 917980ebe..f8e774d78 100644 --- a/dref/views.py +++ b/dref/views.py @@ -1,48 +1,43 @@ from itertools import chain from operator import attrgetter -from django.utils.translation import gettext import django.utils.timezone as timezone -from reversion.views import RevisionMixin from django.contrib.auth.models import Permission from django.db import models - -from drf_spectacular.utils import extend_schema_view, extend_schema +from django.utils.translation import gettext +from drf_spectacular.utils import extend_schema, extend_schema_view from rest_framework import ( - views, - viewsets, - response, - permissions, - status, mixins, + permissions, + response, serializers, + status, + views, + viewsets, ) from rest_framework.decorators import action -from dref.models import ( - Dref, - DrefFile, - DrefOperationalUpdate, - DrefFinalReport, -) -from dref.serializers import ( - DrefSerializer, - DrefFileSerializer, - DrefOperationalUpdateSerializer, - DrefFinalReportSerializer, - CompletedDrefOperationsSerializer, - MiniDrefSerializer, - AddDrefUserSerializer, - DrefShareUserSerializer, - DrefFileInputSerializer -) +from reversion.views import RevisionMixin + from dref.filter_set import ( + ActiveDrefFilterSet, + CompletedDrefOperationsFilterSet, DrefFilter, DrefOperationalUpdateFilter, - CompletedDrefOperationsFilterSet, - ActiveDrefFilterSet, DrefShareUserFilterSet, ) +from dref.models import Dref, DrefFile, DrefFinalReport, DrefOperationalUpdate from dref.permissions import PublishDrefPermission +from dref.serializers import ( + AddDrefUserSerializer, + CompletedDrefOperationsSerializer, + DrefFileInputSerializer, + DrefFileSerializer, + DrefFinalReportSerializer, + DrefOperationalUpdateSerializer, + DrefSerializer, + DrefShareUserSerializer, + MiniDrefSerializer, +) def filter_dref_queryset_by_user_access(user, queryset): @@ -50,17 +45,15 @@ def filter_dref_queryset_by_user_access(user, queryset): return queryset # Check if regional admin dref_admin_regions_id = [ - codename.replace('dref_region_admin_', '') + codename.replace("dref_region_admin_", "") for codename in Permission.objects.filter( group__user=user, - codename__startswith='dref_region_admin_', - ).values_list('codename', flat=True) + codename__startswith="dref_region_admin_", + ).values_list("codename", flat=True) ] if len(dref_admin_regions_id): return queryset.filter( - models.Q(created_by=user) | - models.Q(country__region__in=dref_admin_regions_id) | - models.Q(users=user) + models.Q(created_by=user) | models.Q(country__region__in=dref_admin_regions_id) | models.Q(users=user) ).distinct() # Normal access return queryset.model.get_for(user) @@ -189,10 +182,7 @@ def get_queryset(self): return DrefFile.objects.none() return DrefFile.objects.filter(created_by=self.request.user) - @extend_schema( - request=DrefFileInputSerializer, - responses=DrefFileSerializer(many=True) - ) + @extend_schema(request=DrefFileInputSerializer, responses=DrefFileSerializer(many=True)) @action( detail=False, url_path="multiple", @@ -201,10 +191,7 @@ def get_queryset(self): ) def multiple_file(self, request, pk=None, version=None): # converts querydict to original dict - files = [ - files[0] - for files in dict((request.data).lists()).values() - ] + files = [files[0] for files in dict((request.data).lists()).values()] data = [{"file": file} for file in files] file_serializer = DrefFileSerializer(data=data, context={"request": request}, many=True) if file_serializer.is_valid(): @@ -229,26 +216,21 @@ class ActiveDrefOperationsViewSet(viewsets.ReadOnlyModelViewSet): permission_classes = [permissions.IsAuthenticated] filterset_class = ActiveDrefFilterSet queryset = ( - Dref.objects.prefetch_related( - "planned_interventions", - "needs_identified", - "national_society_actions", - "users" - ).order_by("-created_at").filter(is_active=True).distinct() + Dref.objects.prefetch_related("planned_interventions", "needs_identified", "national_society_actions", "users") + .order_by("-created_at") + .filter(is_active=True) + .distinct() ) def get_queryset(self): # user = self.request.user - return filter_dref_queryset_by_user_access(self.request.user, super().get_queryset()).order_by('-created_at') + return filter_dref_queryset_by_user_access(self.request.user, super().get_queryset()).order_by("-created_at") class DrefShareView(views.APIView): permission_classes = [permissions.IsAuthenticated] - @extend_schema( - request=AddDrefUserSerializer, - responses=None - ) + @extend_schema(request=AddDrefUserSerializer, responses=None) def post(self, request): serializer = AddDrefUserSerializer( data=request.data, @@ -265,10 +247,7 @@ class DrefShareUserViewSet(viewsets.ReadOnlyModelViewSet): def get_queryset(self): return ( - Dref.objects.prefetch_related( - "planned_interventions", - "needs_identified", - "national_society_actions", - "users" - ).order_by("-created_at").distinct() + Dref.objects.prefetch_related("planned_interventions", "needs_identified", "national_society_actions", "users") + .order_by("-created_at") + .distinct() ) diff --git a/eap/apps.py b/eap/apps.py index ed629120a..b72a8e303 100644 --- a/eap/apps.py +++ b/eap/apps.py @@ -2,4 +2,4 @@ class EapConfig(AppConfig): - name = 'eap' + name = "eap" diff --git a/eap/migrations/0001_initial.py b/eap/migrations/0001_initial.py index 5c5d3e98f..b621c4e72 100644 --- a/eap/migrations/0001_initial.py +++ b/eap/migrations/0001_initial.py @@ -1,9 +1,10 @@ # Generated by Django 2.2.28 on 2022-07-08 05:56 -import deployments.models +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion + +import deployments.models import eap.models @@ -13,127 +14,256 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('api', '0150_admin2_admin2geoms'), + ("api", "0150_admin2_admin2geoms"), ] operations = [ migrations.CreateModel( - name='EAP', + name="EAP", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('eap_number', models.CharField(max_length=50, verbose_name='EAP Number')), - ('approval_date', models.DateField(verbose_name='Date of EAP Approval')), - ('status', models.CharField(choices=[('approved', 'Approved'), ('in_process', 'In Process')], default=eap.models.EAP.Status('in_process'), max_length=255, verbose_name='EAP Status')), - ('operational_timeframe', models.IntegerField(verbose_name='Operational Timeframe (Months)')), - ('lead_time', models.IntegerField(verbose_name='Lead Time')), - ('eap_timeframe', models.IntegerField(verbose_name='EAP Timeframe (Years)')), - ('num_of_people', models.IntegerField(verbose_name='Number of People Targeted')), - ('total_budget', models.IntegerField(verbose_name='Total Budget (CHF)')), - ('readiness_budget', models.IntegerField(blank=True, null=True, verbose_name='Readiness Budget (CHF)')), - ('pre_positioning_budget', models.IntegerField(blank=True, null=True, verbose_name='Pre-positioning Budget (CHF)')), - ('early_action_budget', models.IntegerField(blank=True, null=True, verbose_name='Early Actions Budget (CHF)')), - ('trigger_statement', models.TextField(verbose_name='Trigger Statement (Threshold for Activation)')), - ('overview', models.TextField(verbose_name='EAP Overview')), - ('document', models.FileField(blank=True, null=True, upload_to='eap/documents/', verbose_name='EAP Documents')), - ('originator_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Originator Name')), - ('originator_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='Originator Title')), - ('originator_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='Originator Email')), - ('originator_phone', models.CharField(blank=True, max_length=255, null=True, verbose_name='Origingator Phone')), - ('nsc_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='National Society Contact Name')), - ('nsc_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='National Society Contact Title')), - ('nsc_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='National Society Contact Email')), - ('nsc_phone', models.CharField(blank=True, max_length=255, null=True, verbose_name='National Society Contact Phone')), - ('ifrc_focal_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Ifrc Focal Point Name')), - ('ifrc_focal_title', models.CharField(blank=True, max_length=255, null=True, verbose_name='Ifrc Focal Point Title')), - ('ifrc_focal_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='Ifrc Focal Point Email')), - ('ifrc_focal_phone', models.CharField(blank=True, max_length=255, null=True, verbose_name='Ifrc Focal Point Phone')), - ('country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_country', to='api.Country', verbose_name='Country')), - ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created by')), - ('disaster_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_disaster_type', to='api.DisasterType', verbose_name='Disaster Type')), - ('district', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_district', to='api.District', verbose_name='Provience/Region')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="updated at")), + ("eap_number", models.CharField(max_length=50, verbose_name="EAP Number")), + ("approval_date", models.DateField(verbose_name="Date of EAP Approval")), + ( + "status", + models.CharField( + choices=[("approved", "Approved"), ("in_process", "In Process")], + default=eap.models.EAP.Status("in_process"), + max_length=255, + verbose_name="EAP Status", + ), + ), + ("operational_timeframe", models.IntegerField(verbose_name="Operational Timeframe (Months)")), + ("lead_time", models.IntegerField(verbose_name="Lead Time")), + ("eap_timeframe", models.IntegerField(verbose_name="EAP Timeframe (Years)")), + ("num_of_people", models.IntegerField(verbose_name="Number of People Targeted")), + ("total_budget", models.IntegerField(verbose_name="Total Budget (CHF)")), + ("readiness_budget", models.IntegerField(blank=True, null=True, verbose_name="Readiness Budget (CHF)")), + ( + "pre_positioning_budget", + models.IntegerField(blank=True, null=True, verbose_name="Pre-positioning Budget (CHF)"), + ), + ("early_action_budget", models.IntegerField(blank=True, null=True, verbose_name="Early Actions Budget (CHF)")), + ("trigger_statement", models.TextField(verbose_name="Trigger Statement (Threshold for Activation)")), + ("overview", models.TextField(verbose_name="EAP Overview")), + ("document", models.FileField(blank=True, null=True, upload_to="eap/documents/", verbose_name="EAP Documents")), + ("originator_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="Originator Name")), + ("originator_title", models.CharField(blank=True, max_length=255, null=True, verbose_name="Originator Title")), + ("originator_email", models.CharField(blank=True, max_length=255, null=True, verbose_name="Originator Email")), + ("originator_phone", models.CharField(blank=True, max_length=255, null=True, verbose_name="Origingator Phone")), + ( + "nsc_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="National Society Contact Name"), + ), + ( + "nsc_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="National Society Contact Title"), + ), + ( + "nsc_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="National Society Contact Email"), + ), + ( + "nsc_phone", + models.CharField(blank=True, max_length=255, null=True, verbose_name="National Society Contact Phone"), + ), + ( + "ifrc_focal_name", + models.CharField(blank=True, max_length=255, null=True, verbose_name="Ifrc Focal Point Name"), + ), + ( + "ifrc_focal_title", + models.CharField(blank=True, max_length=255, null=True, verbose_name="Ifrc Focal Point Title"), + ), + ( + "ifrc_focal_email", + models.CharField(blank=True, max_length=255, null=True, verbose_name="Ifrc Focal Point Email"), + ), + ( + "ifrc_focal_phone", + models.CharField(blank=True, max_length=255, null=True, verbose_name="Ifrc Focal Point Phone"), + ), + ( + "country", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="eap_country", + to="api.Country", + verbose_name="Country", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="eap_created_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Created by", + ), + ), + ( + "disaster_type", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="eap_disaster_type", + to="api.DisasterType", + verbose_name="Disaster Type", + ), + ), + ( + "district", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="eap_district", + to="api.District", + verbose_name="Provience/Region", + ), + ), ], options={ - 'verbose_name': 'Early Action Protocol', - 'verbose_name_plural': 'Early Actions Protocols', + "verbose_name": "Early Action Protocol", + "verbose_name_plural": "Early Actions Protocols", }, ), migrations.CreateModel( - name='EarlyActionIndicator', + name="EarlyActionIndicator", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('indicator', models.CharField(blank=True, default=eap.models.EarlyActionIndicator.IndicatorChoices('indicator_1'), max_length=255, null=True, verbose_name=[('indicator_1', 'Indicator 1'), ('indicator_2', 'Indicator 2')])), - ('indicator_value', models.IntegerField(blank=True, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "indicator", + models.CharField( + blank=True, + default=eap.models.EarlyActionIndicator.IndicatorChoices("indicator_1"), + max_length=255, + null=True, + verbose_name=[("indicator_1", "Indicator 1"), ("indicator_2", "Indicator 2")], + ), + ), + ("indicator_value", models.IntegerField(blank=True, null=True)), ], options={ - 'verbose_name': 'Early Action Indicator', - 'verbose_name_plural': 'Early Actions Indicators', + "verbose_name": "Early Action Indicator", + "verbose_name_plural": "Early Actions Indicators", }, ), migrations.CreateModel( - name='EarlyAction', + name="EarlyAction", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('sector', models.IntegerField(choices=[(0, 'Shelter, Housing And Settlements'), (1, 'Livelihoods'), (2, 'Multi-purpose Cash'), (3, 'Health And Care'), (4, 'Water, Sanitation And Hygiene'), (5, 'Protection, Gender And Inclusion'), (6, 'Education'), (7, 'Migration'), (8, 'Risk Reduction, Climate Adaptation And Recovery'), (9, 'Community Engagement And Accountability'), (10, 'Environment Sustainability'), (11, 'Shelter Cluster Coordination')], verbose_name='sector')), - ('budget_per_sector', models.IntegerField(blank=True, null=True, verbose_name='Budget per sector (CHF)')), - ('prioritized_risk', models.TextField(blank=True, null=True, verbose_name='Prioritized risk')), - ('targeted_people', models.IntegerField(blank=True, null=True, verbose_name='Targeted people')), - ('readiness_activities', models.TextField(blank=True, null=True, verbose_name='Readiness Activities')), - ('prepositioning_activities', models.TextField(blank=True, null=True, verbose_name='Pre-positioning Activities')), - ('indicators', models.ManyToManyField(blank=True, to='eap.EarlyActionIndicator', verbose_name='Indicators')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "sector", + models.IntegerField( + choices=[ + (0, "Shelter, Housing And Settlements"), + (1, "Livelihoods"), + (2, "Multi-purpose Cash"), + (3, "Health And Care"), + (4, "Water, Sanitation And Hygiene"), + (5, "Protection, Gender And Inclusion"), + (6, "Education"), + (7, "Migration"), + (8, "Risk Reduction, Climate Adaptation And Recovery"), + (9, "Community Engagement And Accountability"), + (10, "Environment Sustainability"), + (11, "Shelter Cluster Coordination"), + ], + verbose_name="sector", + ), + ), + ("budget_per_sector", models.IntegerField(blank=True, null=True, verbose_name="Budget per sector (CHF)")), + ("prioritized_risk", models.TextField(blank=True, null=True, verbose_name="Prioritized risk")), + ("targeted_people", models.IntegerField(blank=True, null=True, verbose_name="Targeted people")), + ("readiness_activities", models.TextField(blank=True, null=True, verbose_name="Readiness Activities")), + ("prepositioning_activities", models.TextField(blank=True, null=True, verbose_name="Pre-positioning Activities")), + ("indicators", models.ManyToManyField(blank=True, to="eap.EarlyActionIndicator", verbose_name="Indicators")), ], options={ - 'verbose_name': 'Early Action', - 'verbose_name_plural': 'Early Actions', + "verbose_name": "Early Action", + "verbose_name_plural": "Early Actions", }, ), migrations.CreateModel( - name='EAPRefrence', + name="EAPRefrence", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('source', models.CharField(blank=True, max_length=255, null=True, verbose_name='Name')), - ('url', models.URLField(blank=True, null=True, verbose_name='URL')), - ('eap', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='eap_reference', to='eap.EAP', verbose_name='EAP')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("source", models.CharField(blank=True, max_length=255, null=True, verbose_name="Name")), + ("url", models.URLField(blank=True, null=True, verbose_name="URL")), + ( + "eap", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="eap_reference", + to="eap.EAP", + verbose_name="EAP", + ), + ), ], options={ - 'verbose_name': 'EAP Refrence', - 'verbose_name_plural': 'EAP Refrences', + "verbose_name": "EAP Refrence", + "verbose_name_plural": "EAP Refrences", }, ), migrations.CreateModel( - name='EAPPartner', + name="EAPPartner", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Name')), - ('url', models.URLField(blank=True, null=True, verbose_name='URL')), - ('eap', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='eap_partner', to='eap.EAP', verbose_name='EAP')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(blank=True, max_length=255, null=True, verbose_name="Name")), + ("url", models.URLField(blank=True, null=True, verbose_name="URL")), + ( + "eap", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="eap_partner", to="eap.EAP", verbose_name="EAP" + ), + ), ], options={ - 'verbose_name': 'EAP Partner', - 'verbose_name_plural': 'EAP Partners', + "verbose_name": "EAP Partner", + "verbose_name_plural": "EAP Partners", }, ), migrations.AddField( - model_name='eap', - name='early_actions', - field=models.ManyToManyField(blank=True, to='eap.EarlyAction', verbose_name='Early actions'), + model_name="eap", + name="early_actions", + field=models.ManyToManyField(blank=True, to="eap.EarlyAction", verbose_name="Early actions"), ), migrations.AddField( - model_name='eap', - name='modified_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eap_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='Modified by'), + model_name="eap", + name="modified_by", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="eap_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified by", + ), ), migrations.CreateModel( - name='Action', + name="Action", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('early_act', models.TextField(blank=True, null=True, verbose_name='Early Actions')), - ('early_action', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action', to='eap.EarlyAction', verbose_name='Early Actions')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("early_act", models.TextField(blank=True, null=True, verbose_name="Early Actions")), + ( + "early_action", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="action", + to="eap.EarlyAction", + verbose_name="Early Actions", + ), + ), ], options={ - 'verbose_name': 'Action', - 'verbose_name_plural': 'Actions', + "verbose_name": "Action", + "verbose_name_plural": "Actions", }, ), ] diff --git a/eap/migrations/0002_auto_20220708_0747.py b/eap/migrations/0002_auto_20220708_0747.py index 588afbe3c..939aa2a32 100644 --- a/eap/migrations/0002_auto_20220708_0747.py +++ b/eap/migrations/0002_auto_20220708_0747.py @@ -6,16 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('eap', '0001_initial'), + ("eap", "0001_initial"), ] operations = [ migrations.RenameModel( - old_name='EAPRefrence', - new_name='EAPReference', + old_name="EAPRefrence", + new_name="EAPReference", ), migrations.AlterModelOptions( - name='eapreference', - options={'verbose_name': 'EAP Reference', 'verbose_name_plural': 'EAP References'}, + name="eapreference", + options={"verbose_name": "EAP Reference", "verbose_name_plural": "EAP References"}, ), ] diff --git a/eap/models.py b/eap/models.py index 7b618cbe9..dce1df67b 100644 --- a/eap/models.py +++ b/eap/models.py @@ -1,179 +1,176 @@ -from django.db import models from django.conf import settings +from django.db import models from django.utils.translation import gettext_lazy as _ -from api.models import ( - Country, - District, - DisasterType, -) + +from api.models import Country, DisasterType, District class EarlyActionIndicator(models.Model): class IndicatorChoices(models.TextChoices): # TODO these indicator are yet to be provided by client. - INDICATOR_1 = 'indicator_1', _('Indicator 1') - INDICATOR_2 = 'indicator_2', _('Indicator 2') + INDICATOR_1 = "indicator_1", _("Indicator 1") + INDICATOR_2 = "indicator_2", _("Indicator 2") indicator = models.CharField( - IndicatorChoices.choices, max_length=255, - default=IndicatorChoices.INDICATOR_1, null=True, blank=True + IndicatorChoices.choices, max_length=255, default=IndicatorChoices.INDICATOR_1, null=True, blank=True ) indicator_value = models.IntegerField(null=True, blank=True) class Meta: - verbose_name = _('Early Action Indicator') - verbose_name_plural = _('Early Actions Indicators') + verbose_name = _("Early Action Indicator") + verbose_name_plural = _("Early Actions Indicators") def __str__(self): - return f'{self.indicator}' + return f"{self.indicator}" class EarlyAction(models.Model): class Sector(models.IntegerChoices): - SHELTER_HOUSING_AND_SETTLEMENTS = 0, _('Shelter, Housing And Settlements') - LIVELIHOODS = 1, _('Livelihoods') - MULTI_PURPOSE_CASH = 2, _('Multi-purpose Cash') - HEALTH_AND_CARE = 3, _('Health And Care') - WATER_SANITATION_AND_HYGIENE = 4, _('Water, Sanitation And Hygiene') - PROTECTION_GENDER_AND_INCLUSION = 5, _('Protection, Gender And Inclusion') - EDUCATION = 6, _('Education') - MIGRATION = 7, _('Migration') - RISK_REDUCTION_CLIMATE_ADAPTATION_AND_RECOVERY = \ - 8, _('Risk Reduction, Climate Adaptation And Recovery') - COMMUNITY_ENGAGEMENT_AND_ACCOUNTABILITY = \ - 9, _('Community Engagement And Accountability') - ENVIRONMENT_SUSTAINABILITY = 10, _('Environment Sustainability') - SHELTER_CLUSTER_COORDINATION = 11, _('Shelter Cluster Coordination') - - sector = models.IntegerField(choices=Sector.choices, verbose_name=_('sector')) - budget_per_sector = models.IntegerField(verbose_name=_('Budget per sector (CHF)'), null=True, blank=True) - indicators = models.ManyToManyField(EarlyActionIndicator, verbose_name=_('Indicators'), blank=True) - - prioritized_risk = models.TextField(verbose_name=_('Prioritized risk'), null=True, blank=True) - targeted_people = models.IntegerField(verbose_name=_('Targeted people'), null=True, blank=True,) - - readiness_activities = models.TextField(verbose_name=_('Readiness Activities'), null=True, blank=True) - prepositioning_activities = models.TextField(verbose_name=_('Pre-positioning Activities'), null=True, blank=True) + SHELTER_HOUSING_AND_SETTLEMENTS = 0, _("Shelter, Housing And Settlements") + LIVELIHOODS = 1, _("Livelihoods") + MULTI_PURPOSE_CASH = 2, _("Multi-purpose Cash") + HEALTH_AND_CARE = 3, _("Health And Care") + WATER_SANITATION_AND_HYGIENE = 4, _("Water, Sanitation And Hygiene") + PROTECTION_GENDER_AND_INCLUSION = 5, _("Protection, Gender And Inclusion") + EDUCATION = 6, _("Education") + MIGRATION = 7, _("Migration") + RISK_REDUCTION_CLIMATE_ADAPTATION_AND_RECOVERY = 8, _("Risk Reduction, Climate Adaptation And Recovery") + COMMUNITY_ENGAGEMENT_AND_ACCOUNTABILITY = 9, _("Community Engagement And Accountability") + ENVIRONMENT_SUSTAINABILITY = 10, _("Environment Sustainability") + SHELTER_CLUSTER_COORDINATION = 11, _("Shelter Cluster Coordination") + + sector = models.IntegerField(choices=Sector.choices, verbose_name=_("sector")) + budget_per_sector = models.IntegerField(verbose_name=_("Budget per sector (CHF)"), null=True, blank=True) + indicators = models.ManyToManyField(EarlyActionIndicator, verbose_name=_("Indicators"), blank=True) + + prioritized_risk = models.TextField(verbose_name=_("Prioritized risk"), null=True, blank=True) + targeted_people = models.IntegerField( + verbose_name=_("Targeted people"), + null=True, + blank=True, + ) + + readiness_activities = models.TextField(verbose_name=_("Readiness Activities"), null=True, blank=True) + prepositioning_activities = models.TextField(verbose_name=_("Pre-positioning Activities"), null=True, blank=True) class Meta: - verbose_name = _('Early Action') - verbose_name_plural = _('Early Actions') + verbose_name = _("Early Action") + verbose_name_plural = _("Early Actions") def __str__(self): - return f'{self.sector}' + return f"{self.sector}" class EAP(models.Model): class Status(models.TextChoices): # TODO some more status choices are to be expected by client. - APPROVED = 'approved', _('Approved') - IN_PROCESS = 'in_process', _('In Process') + APPROVED = "approved", _("Approved") + IN_PROCESS = "in_process", _("In Process") created_by = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('Created by'), related_name='eap_created_by', - null=True, blank=True, on_delete=models.SET_NULL, + settings.AUTH_USER_MODEL, + verbose_name=_("Created by"), + related_name="eap_created_by", + null=True, + blank=True, + on_delete=models.SET_NULL, ) modified_by = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('Modified by'), related_name='eap_modified_by', - null=True, blank=True, on_delete=models.SET_NULL, + settings.AUTH_USER_MODEL, + verbose_name=_("Modified by"), + related_name="eap_modified_by", + null=True, + blank=True, + on_delete=models.SET_NULL, ) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - modified_at = models.DateTimeField(verbose_name=_('updated at'), auto_now=True) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + modified_at = models.DateTimeField(verbose_name=_("updated at"), auto_now=True) country = models.ForeignKey( - Country, on_delete=models.SET_NULL, verbose_name=_('Country'), - related_name='eap_country', null=True + Country, on_delete=models.SET_NULL, verbose_name=_("Country"), related_name="eap_country", null=True ) district = models.ForeignKey( - District, on_delete=models.SET_NULL, verbose_name=_('Provience/Region'), - related_name='eap_district', null=True, blank=True + District, + on_delete=models.SET_NULL, + verbose_name=_("Provience/Region"), + related_name="eap_district", + null=True, + blank=True, ) disaster_type = models.ForeignKey( - DisasterType, on_delete=models.SET_NULL, verbose_name=_('Disaster Type'), - related_name='eap_disaster_type', null=True + DisasterType, on_delete=models.SET_NULL, verbose_name=_("Disaster Type"), related_name="eap_disaster_type", null=True ) - eap_number = models.CharField(max_length=50, verbose_name=_('EAP Number')) - approval_date = models.DateField(verbose_name=_('Date of EAP Approval')) - status = models.CharField( - max_length=255, choices=Status.choices, default=Status.IN_PROCESS, - verbose_name=_('EAP Status') - ) - operational_timeframe = models.IntegerField(verbose_name=_('Operational Timeframe (Months)')) - lead_time = models.IntegerField(verbose_name=_('Lead Time')) - eap_timeframe = models.IntegerField(verbose_name=_('EAP Timeframe (Years)')) - num_of_people = models.IntegerField(verbose_name=_('Number of People Targeted')) - total_budget = models.IntegerField(verbose_name=_('Total Budget (CHF)')) - readiness_budget = models.IntegerField(verbose_name=_('Readiness Budget (CHF)'), null=True, blank=True) - pre_positioning_budget = models.IntegerField(verbose_name=_('Pre-positioning Budget (CHF)'), null=True, blank=True) - early_action_budget = models.IntegerField(verbose_name=_('Early Actions Budget (CHF)'), null=True, blank=True) - trigger_statement = models.TextField(verbose_name=_('Trigger Statement (Threshold for Activation)')) - overview = models.TextField(verbose_name=_('EAP Overview')) - document = models.FileField( - verbose_name=_('EAP Documents'), upload_to='eap/documents/', - null=True, blank=True - ) - early_actions = models.ManyToManyField( - EarlyAction, - verbose_name=_('Early actions'), - blank=True - ) - originator_name = models.CharField(verbose_name=_('Originator Name'), max_length=255, null=True, blank=True) - originator_title = models.CharField(verbose_name=_('Originator Title'), max_length=255, null=True, blank=True) - originator_email = models.CharField(verbose_name=_('Originator Email'), max_length=255, null=True, blank=True) - originator_phone = models.CharField(verbose_name=_('Origingator Phone'), max_length=255, null=True, blank=True) - - nsc_name = models.CharField(verbose_name=_('National Society Contact Name'), max_length=255, null=True, blank=True) - nsc_title = models.CharField(verbose_name=_('National Society Contact Title'), max_length=255, null=True, blank=True) - nsc_email = models.CharField(verbose_name=_('National Society Contact Email'), max_length=255, null=True, blank=True) - nsc_phone = models.CharField(verbose_name=_('National Society Contact Phone'), max_length=255, null=True, blank=True) - - ifrc_focal_name = models.CharField(verbose_name=_('Ifrc Focal Point Name'), max_length=255, null=True, blank=True) - ifrc_focal_title = models.CharField(verbose_name=_('Ifrc Focal Point Title'), max_length=255, null=True, blank=True) - ifrc_focal_email = models.CharField(verbose_name=_('Ifrc Focal Point Email'), max_length=255, null=True, blank=True) - ifrc_focal_phone = models.CharField(verbose_name=_('Ifrc Focal Point Phone'), max_length=255, null=True, blank=True) + eap_number = models.CharField(max_length=50, verbose_name=_("EAP Number")) + approval_date = models.DateField(verbose_name=_("Date of EAP Approval")) + status = models.CharField(max_length=255, choices=Status.choices, default=Status.IN_PROCESS, verbose_name=_("EAP Status")) + operational_timeframe = models.IntegerField(verbose_name=_("Operational Timeframe (Months)")) + lead_time = models.IntegerField(verbose_name=_("Lead Time")) + eap_timeframe = models.IntegerField(verbose_name=_("EAP Timeframe (Years)")) + num_of_people = models.IntegerField(verbose_name=_("Number of People Targeted")) + total_budget = models.IntegerField(verbose_name=_("Total Budget (CHF)")) + readiness_budget = models.IntegerField(verbose_name=_("Readiness Budget (CHF)"), null=True, blank=True) + pre_positioning_budget = models.IntegerField(verbose_name=_("Pre-positioning Budget (CHF)"), null=True, blank=True) + early_action_budget = models.IntegerField(verbose_name=_("Early Actions Budget (CHF)"), null=True, blank=True) + trigger_statement = models.TextField(verbose_name=_("Trigger Statement (Threshold for Activation)")) + overview = models.TextField(verbose_name=_("EAP Overview")) + document = models.FileField(verbose_name=_("EAP Documents"), upload_to="eap/documents/", null=True, blank=True) + early_actions = models.ManyToManyField(EarlyAction, verbose_name=_("Early actions"), blank=True) + originator_name = models.CharField(verbose_name=_("Originator Name"), max_length=255, null=True, blank=True) + originator_title = models.CharField(verbose_name=_("Originator Title"), max_length=255, null=True, blank=True) + originator_email = models.CharField(verbose_name=_("Originator Email"), max_length=255, null=True, blank=True) + originator_phone = models.CharField(verbose_name=_("Origingator Phone"), max_length=255, null=True, blank=True) + + nsc_name = models.CharField(verbose_name=_("National Society Contact Name"), max_length=255, null=True, blank=True) + nsc_title = models.CharField(verbose_name=_("National Society Contact Title"), max_length=255, null=True, blank=True) + nsc_email = models.CharField(verbose_name=_("National Society Contact Email"), max_length=255, null=True, blank=True) + nsc_phone = models.CharField(verbose_name=_("National Society Contact Phone"), max_length=255, null=True, blank=True) + + ifrc_focal_name = models.CharField(verbose_name=_("Ifrc Focal Point Name"), max_length=255, null=True, blank=True) + ifrc_focal_title = models.CharField(verbose_name=_("Ifrc Focal Point Title"), max_length=255, null=True, blank=True) + ifrc_focal_email = models.CharField(verbose_name=_("Ifrc Focal Point Email"), max_length=255, null=True, blank=True) + ifrc_focal_phone = models.CharField(verbose_name=_("Ifrc Focal Point Phone"), max_length=255, null=True, blank=True) class Meta: - verbose_name = _('Early Action Protocol') - verbose_name_plural = _('Early Actions Protocols') + verbose_name = _("Early Action Protocol") + verbose_name_plural = _("Early Actions Protocols") def __str__(self): - return f'{self.eap_number}' + return f"{self.eap_number}" class EAPPartner(models.Model): - eap = models.ForeignKey(EAP, on_delete=models.CASCADE, related_name='eap_partner', verbose_name=_('EAP')) - name = models.CharField(max_length=255, verbose_name=_('Name'), null=True, blank=True) - url = models.URLField(verbose_name=_('URL'), null=True, blank=True) + eap = models.ForeignKey(EAP, on_delete=models.CASCADE, related_name="eap_partner", verbose_name=_("EAP")) + name = models.CharField(max_length=255, verbose_name=_("Name"), null=True, blank=True) + url = models.URLField(verbose_name=_("URL"), null=True, blank=True) class Meta: - verbose_name = _('EAP Partner') - verbose_name_plural = _('EAP Partners') + verbose_name = _("EAP Partner") + verbose_name_plural = _("EAP Partners") def __str__(self): - return f'{self.name}' + return f"{self.name}" class EAPReference(models.Model): - eap = models.ForeignKey(EAP, on_delete=models.CASCADE, related_name='eap_reference', verbose_name=_('EAP')) - source = models.CharField(max_length=255, verbose_name=_('Name'), null=True, blank=True) - url = models.URLField(verbose_name=_('URL'), null=True, blank=True) + eap = models.ForeignKey(EAP, on_delete=models.CASCADE, related_name="eap_reference", verbose_name=_("EAP")) + source = models.CharField(max_length=255, verbose_name=_("Name"), null=True, blank=True) + url = models.URLField(verbose_name=_("URL"), null=True, blank=True) class Meta: - verbose_name = _('EAP Reference') - verbose_name_plural = _('EAP References') + verbose_name = _("EAP Reference") + verbose_name_plural = _("EAP References") def __str__(self): - return f'{self.source}' + return f"{self.source}" class Action(models.Model): early_action = models.ForeignKey( - EarlyAction, on_delete=models.CASCADE, - related_name="action", verbose_name=_('Early Actions') + EarlyAction, on_delete=models.CASCADE, related_name="action", verbose_name=_("Early Actions") ) - early_act = models.TextField(verbose_name=_('Early Actions'), null=True, blank=True) + early_act = models.TextField(verbose_name=_("Early Actions"), null=True, blank=True) class Meta: - verbose_name = _('Action') - verbose_name_plural = _('Actions') + verbose_name = _("Action") + verbose_name_plural = _("Actions") def __str__(self): - return f'{self.id}' + return f"{self.id}" diff --git a/flash_update/admin.py b/flash_update/admin.py index f1a6933db..1c4c5b11a 100644 --- a/flash_update/admin.py +++ b/flash_update/admin.py @@ -2,25 +2,28 @@ from lang.admin import TranslationAdmin +from .forms import ActionForm from .models import ( - FlashUpdate, - FlashGraphicMap, - FlashReferences, + DonorGroup, + Donors, FlashAction, FlashActionsTaken, FlashCountryDistrict, FlashEmailSubscriptions, - Donors, - DonorGroup, + FlashGraphicMap, + FlashReferences, + FlashUpdate, FlashUpdateShare, ) -from .forms import ActionForm - class FlashActionAdmin(admin.ModelAdmin): form = ActionForm - list_display = ('__str__', 'organizations', 'category',) + list_display = ( + "__str__", + "organizations", + "category", + ) @admin.register(FlashGraphicMap) @@ -35,7 +38,7 @@ class FlashReferencesAdmin(admin.ModelAdmin): @admin.register(FlashEmailSubscriptions) class FlashEmailSubscriptionsAdmin(admin.ModelAdmin): - autocomplete_fields = ('group',) + autocomplete_fields = ("group",) def has_add_permission(self, request, obj=None): return False @@ -64,14 +67,17 @@ class ShareFlashUpdateAdmin(admin.ModelAdmin): class FlashCountryDistrictAdminInline(admin.TabularInline): model = FlashCountryDistrict extra = 0 - autocomplete_fields = ('country', 'district',) + autocomplete_fields = ( + "country", + "district", + ) @admin.register(FlashUpdate) class FlashUpdateAdmin(TranslationAdmin): inlines = [FlashCountryDistrictAdminInline, FlashActionTakenAdminInline] - search_fields = ('title',) - list_filter = ('hazard_type', 'share_with', 'flash_country_district__country') + search_fields = ("title",) + list_filter = ("hazard_type", "share_with", "flash_country_district__country") admin.site.register(FlashAction, FlashActionAdmin) diff --git a/flash_update/apps.py b/flash_update/apps.py index 118367e36..ea88312a5 100644 --- a/flash_update/apps.py +++ b/flash_update/apps.py @@ -1,7 +1,7 @@ -from django.utils.translation import gettext_lazy as _ from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class FlashUpdateConfig(AppConfig): - name = 'flash_update' - verbose_name = _('flash update') + name = "flash_update" + verbose_name = _("flash update") diff --git a/flash_update/enums.py b/flash_update/enums.py index 8797e39c3..59127a1ad 100644 --- a/flash_update/enums.py +++ b/flash_update/enums.py @@ -1,5 +1,5 @@ from . import models enum_register = { - 'flash_update_flash_share_with': models.FlashUpdate.FlashShareWith, + "flash_update_flash_share_with": models.FlashUpdate.FlashShareWith, } diff --git a/flash_update/factories.py b/flash_update/factories.py index 8dfd70571..4b77fd853 100644 --- a/flash_update/factories.py +++ b/flash_update/factories.py @@ -1,33 +1,24 @@ import factory +from django.core.files.base import ContentFile from factory import fuzzy from api.factories import disaster_type -from api.models import ( - ActionOrg, - ActionType, - ActionCategory -) +from api.models import ActionCategory, ActionOrg, ActionType from flash_update.models import ( - FlashUpdate, - FlashGraphicMap, - FlashAction, - Donors, DonorGroup, + Donors, + FlashAction, + FlashGraphicMap, + FlashUpdate, ) -from django.core.files.base import ContentFile - class FlashGraphicMapFactory(factory.django.DjangoModelFactory): class Meta: model = FlashGraphicMap file = factory.LazyAttribute( - lambda _: ContentFile( - factory.django.ImageField()._make_data( - {'width': 1024, 'height': 768} - ), 'flash_update.jpg' - ) + lambda _: ContentFile(factory.django.ImageField()._make_data({"width": 1024, "height": 768}), "flash_update.jpg") ) diff --git a/flash_update/filter_set.py b/flash_update/filter_set.py index 60a691346..c9661a4f5 100644 --- a/flash_update/filter_set.py +++ b/flash_update/filter_set.py @@ -1,12 +1,13 @@ from django_filters import rest_framework as filters + from .models import FlashUpdate class FlashUpdateFilter(filters.FilterSet): - hazard_type = filters.NumberFilter(field_name='hazard_type', lookup_expr='exact') + hazard_type = filters.NumberFilter(field_name="hazard_type", lookup_expr="exact") class Meta: model = FlashUpdate fields = { - 'created_at': ('exact', 'gt', 'gte', 'lt', 'lte'), + "created_at": ("exact", "gt", "gte", "lt", "lte"), } diff --git a/flash_update/forms.py b/flash_update/forms.py index 4200c4f14..351719e71 100644 --- a/flash_update/forms.py +++ b/flash_update/forms.py @@ -1,14 +1,15 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from .models import FlashAction from api.models import ActionOrg, ActionType +from .models import FlashAction + class ActionForm(forms.ModelForm): - organizations = forms.MultipleChoiceField(label=_('organizations'), choices=ActionOrg.choices) - Flash_update_types = forms.MultipleChoiceField(label=_('flash update types'), choices=ActionType.choices) + organizations = forms.MultipleChoiceField(label=_("organizations"), choices=ActionOrg.choices) + Flash_update_types = forms.MultipleChoiceField(label=_("flash update types"), choices=ActionType.choices) class Meta: model = FlashAction - fields = '__all__' + fields = "__all__" diff --git a/flash_update/migrations/0001_initial.py b/flash_update/migrations/0001_initial.py index c18d50c9f..c629f7469 100644 --- a/flash_update/migrations/0001_initial.py +++ b/flash_update/migrations/0001_initial.py @@ -1,9 +1,10 @@ # Generated by Django 2.2.27 on 2022-02-24 07:55 -from django.conf import settings import django.contrib.postgres.fields -from django.db import migrations, models import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + import flash_update.models @@ -13,141 +14,306 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('auth', '0011_update_proxy_permissions'), - ('api', '0145_auto_20220218_1338'), + ("auth", "0011_update_proxy_permissions"), + ("api", "0145_auto_20220218_1338"), ] operations = [ migrations.CreateModel( - name='Donors', + name="Donors", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('organization_name', models.CharField(blank=True, max_length=500, null=True)), - ('first_name', models.CharField(blank=True, max_length=300, null=True)), - ('last_name', models.CharField(blank=True, max_length=300, null=True)), - ('email', models.EmailField(blank=True, max_length=254, null=True)), - ('position', models.CharField(blank=True, max_length=300, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("organization_name", models.CharField(blank=True, max_length=500, null=True)), + ("first_name", models.CharField(blank=True, max_length=300, null=True)), + ("last_name", models.CharField(blank=True, max_length=300, null=True)), + ("email", models.EmailField(blank=True, max_length=254, null=True)), + ("position", models.CharField(blank=True, max_length=300, null=True)), ], ), migrations.CreateModel( - name='FlashAction', + name="FlashAction", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=400, verbose_name='name')), - ('organizations', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'Foreign Society'), ('FDRN', 'Federation'), ('GOV', 'Government')], max_length=4), blank=True, default=list, size=None, verbose_name='organizations')), - ('flash_update_types', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('EVT', 'Event'), ('EW', 'Early Warning'), ('EPI', 'Epidemic'), ('COVID', 'COVID-19')], max_length=16), default=list, size=None, verbose_name='flash update types')), - ('category', models.CharField(choices=[('General', 'General'), ('Health', 'Health'), ('NS Institutional Strengthening', 'NS Institutional Strengthening'), ('Socioeconomic Interventions', 'Socioeconomic Interventions')], default='General', max_length=255, verbose_name='category')), - ('is_disabled', models.BooleanField(default=False, help_text='Disable in form', verbose_name='is disabled?')), - ('tooltip_text', models.TextField(blank='true', null=True, verbose_name='tooltip text')), - ('client_id', models.CharField(blank=True, max_length=50, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=400, verbose_name="name")), + ( + "organizations", + django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[ + ("NTLS", "National Society"), + ("PNS", "Foreign Society"), + ("FDRN", "Federation"), + ("GOV", "Government"), + ], + max_length=4, + ), + blank=True, + default=list, + size=None, + verbose_name="organizations", + ), + ), + ( + "flash_update_types", + django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[("EVT", "Event"), ("EW", "Early Warning"), ("EPI", "Epidemic"), ("COVID", "COVID-19")], + max_length=16, + ), + default=list, + size=None, + verbose_name="flash update types", + ), + ), + ( + "category", + models.CharField( + choices=[ + ("General", "General"), + ("Health", "Health"), + ("NS Institutional Strengthening", "NS Institutional Strengthening"), + ("Socioeconomic Interventions", "Socioeconomic Interventions"), + ], + default="General", + max_length=255, + verbose_name="category", + ), + ), + ("is_disabled", models.BooleanField(default=False, help_text="Disable in form", verbose_name="is disabled?")), + ("tooltip_text", models.TextField(blank="true", null=True, verbose_name="tooltip text")), + ("client_id", models.CharField(blank=True, max_length=50, null=True)), ], options={ - 'verbose_name': 'flash action', - 'verbose_name_plural': 'flash actions', + "verbose_name": "flash action", + "verbose_name_plural": "flash actions", }, ), migrations.CreateModel( - name='FlashGraphicMap', + name="FlashGraphicMap", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.FileField(upload_to='flash_update/images/', verbose_name='file')), - ('caption', models.CharField(blank=True, max_length=225, null=True)), - ('client_id', models.CharField(blank=True, max_length=50, null=True)), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='created_by')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("file", models.FileField(upload_to="flash_update/images/", verbose_name="file")), + ("caption", models.CharField(blank=True, max_length=225, null=True)), + ("client_id", models.CharField(blank=True, max_length=50, null=True)), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="created_by", + ), + ), ], options={ - 'verbose_name': 'flash graphic map', - 'verbose_name_plural': 'flash graphic maps', + "verbose_name": "flash graphic map", + "verbose_name_plural": "flash graphic maps", }, ), migrations.CreateModel( - name='FlashReferences', + name="FlashReferences", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(blank=True, verbose_name='date')), - ('source_description', models.CharField(blank=True, max_length=225, verbose_name='Name or Source Description')), - ('url', models.TextField(blank=True)), - ('client_id', models.CharField(blank=True, max_length=50, null=True)), - ('document', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='flash_document', to='flash_update.FlashGraphicMap', verbose_name='document')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("date", models.DateField(blank=True, verbose_name="date")), + ("source_description", models.CharField(blank=True, max_length=225, verbose_name="Name or Source Description")), + ("url", models.TextField(blank=True)), + ("client_id", models.CharField(blank=True, max_length=50, null=True)), + ( + "document", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="flash_document", + to="flash_update.FlashGraphicMap", + verbose_name="document", + ), + ), ], options={ - 'verbose_name': 'flash reference', - 'verbose_name_plural': 'flash references', + "verbose_name": "flash reference", + "verbose_name_plural": "flash references", }, ), migrations.CreateModel( - name='FlashUpdate', + name="FlashUpdate", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('title', models.CharField(max_length=300)), - ('title_en', models.CharField(max_length=300, null=True)), - ('title_es', models.CharField(max_length=300, null=True)), - ('title_fr', models.CharField(max_length=300, null=True)), - ('title_ar', models.CharField(max_length=300, null=True)), - ('situational_overview', models.TextField(verbose_name='Situational Overview')), - ('situational_overview_en', models.TextField(null=True, verbose_name='Situational Overview')), - ('situational_overview_es', models.TextField(null=True, verbose_name='Situational Overview')), - ('situational_overview_fr', models.TextField(null=True, verbose_name='Situational Overview')), - ('situational_overview_ar', models.TextField(null=True, verbose_name='Situational Overview')), - ('originator_name', models.CharField(blank=True, max_length=100, null=True, verbose_name='originator_name')), - ('originator_title', models.CharField(blank=True, max_length=300, null=True, verbose_name='originator_title')), - ('originator_email', models.CharField(blank=True, max_length=300, null=True, verbose_name='originator_email')), - ('originator_phone', models.CharField(blank=True, max_length=50, null=True, verbose_name='originator_phone')), - ('ifrc_name', models.CharField(blank=True, max_length=100, null=True, verbose_name='ifrc_name')), - ('ifrc_title', models.CharField(blank=True, max_length=300, null=True, verbose_name='ifrc_title')), - ('ifrc_email', models.CharField(blank=True, max_length=300, null=True, verbose_name='ifrc_email')), - ('ifrc_phone', models.CharField(blank=True, max_length=50, null=True, verbose_name='ifrc_phone')), - ('share_with', models.CharField(blank=True, choices=[('ifrc_secretariat', 'IFRC Secretariat'), ('rcrc_network', 'RCRC Network'), ('rcrc_network_and_donors', 'RCRC Network and Donors')], max_length=50, null=True, verbose_name='share with')), - ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='flash_update_created_by', to=settings.AUTH_USER_MODEL, verbose_name='created by')), - ('graphics', models.ManyToManyField(blank=True, related_name='flash_graphics', to='flash_update.FlashGraphicMap', verbose_name='graphics')), - ('hazard_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='flash_update_hazard_type', to='api.DisasterType', verbose_name='hazard type')), - ('map', models.ManyToManyField(blank=True, related_name='flash_map', to='flash_update.FlashGraphicMap', verbose_name='map')), - ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='flash_update_modified_by', to=settings.AUTH_USER_MODEL, verbose_name='modified by')), - ('references', models.ManyToManyField(blank=True, to='flash_update.FlashReferences', verbose_name='references')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="updated at")), + ("title", models.CharField(max_length=300)), + ("title_en", models.CharField(max_length=300, null=True)), + ("title_es", models.CharField(max_length=300, null=True)), + ("title_fr", models.CharField(max_length=300, null=True)), + ("title_ar", models.CharField(max_length=300, null=True)), + ("situational_overview", models.TextField(verbose_name="Situational Overview")), + ("situational_overview_en", models.TextField(null=True, verbose_name="Situational Overview")), + ("situational_overview_es", models.TextField(null=True, verbose_name="Situational Overview")), + ("situational_overview_fr", models.TextField(null=True, verbose_name="Situational Overview")), + ("situational_overview_ar", models.TextField(null=True, verbose_name="Situational Overview")), + ("originator_name", models.CharField(blank=True, max_length=100, null=True, verbose_name="originator_name")), + ("originator_title", models.CharField(blank=True, max_length=300, null=True, verbose_name="originator_title")), + ("originator_email", models.CharField(blank=True, max_length=300, null=True, verbose_name="originator_email")), + ("originator_phone", models.CharField(blank=True, max_length=50, null=True, verbose_name="originator_phone")), + ("ifrc_name", models.CharField(blank=True, max_length=100, null=True, verbose_name="ifrc_name")), + ("ifrc_title", models.CharField(blank=True, max_length=300, null=True, verbose_name="ifrc_title")), + ("ifrc_email", models.CharField(blank=True, max_length=300, null=True, verbose_name="ifrc_email")), + ("ifrc_phone", models.CharField(blank=True, max_length=50, null=True, verbose_name="ifrc_phone")), + ( + "share_with", + models.CharField( + blank=True, + choices=[ + ("ifrc_secretariat", "IFRC Secretariat"), + ("rcrc_network", "RCRC Network"), + ("rcrc_network_and_donors", "RCRC Network and Donors"), + ], + max_length=50, + null=True, + verbose_name="share with", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="flash_update_created_by", + to=settings.AUTH_USER_MODEL, + verbose_name="created by", + ), + ), + ( + "graphics", + models.ManyToManyField( + blank=True, related_name="flash_graphics", to="flash_update.FlashGraphicMap", verbose_name="graphics" + ), + ), + ( + "hazard_type", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="flash_update_hazard_type", + to="api.DisasterType", + verbose_name="hazard type", + ), + ), + ( + "map", + models.ManyToManyField( + blank=True, related_name="flash_map", to="flash_update.FlashGraphicMap", verbose_name="map" + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="flash_update_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="modified by", + ), + ), + ("references", models.ManyToManyField(blank=True, to="flash_update.FlashReferences", verbose_name="references")), ], options={ - 'verbose_name': 'Flash update', - 'verbose_name_plural': 'Flash updates', + "verbose_name": "Flash update", + "verbose_name_plural": "Flash updates", }, ), migrations.CreateModel( - name='FlashEmailSubscriptions', + name="FlashEmailSubscriptions", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('share_with', models.CharField(choices=[('ifrc_secretariat', 'IFRC Secretariat'), ('rcrc_network', 'RCRC Network'), ('rcrc_network_and_donors', 'RCRC Network and Donors')], default=flash_update.models.FlashUpdate.FlashShareWith('ifrc_secretariat'), max_length=50, verbose_name='share with')), - ('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='flash_email_subscription', to='auth.Group')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "share_with", + models.CharField( + choices=[ + ("ifrc_secretariat", "IFRC Secretariat"), + ("rcrc_network", "RCRC Network"), + ("rcrc_network_and_donors", "RCRC Network and Donors"), + ], + default=flash_update.models.FlashUpdate.FlashShareWith("ifrc_secretariat"), + max_length=50, + verbose_name="share with", + ), + ), + ( + "group", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="flash_email_subscription", + to="auth.Group", + ), + ), ], ), migrations.CreateModel( - name='FlashActionsTaken', + name="FlashActionsTaken", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('organization', models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'Foreign Society'), ('FDRN', 'Federation'), ('GOV', 'Government')], max_length=16, verbose_name='organization')), - ('summary', models.TextField(blank=True, null=True, verbose_name='summary')), - ('client_id', models.CharField(blank=True, max_length=50, null=True)), - ('actions', models.ManyToManyField(blank=True, to='flash_update.FlashAction', verbose_name='actions')), - ('flash_update', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions_taken_flash', to='flash_update.FlashUpdate', verbose_name='flash update')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "organization", + models.CharField( + choices=[ + ("NTLS", "National Society"), + ("PNS", "Foreign Society"), + ("FDRN", "Federation"), + ("GOV", "Government"), + ], + max_length=16, + verbose_name="organization", + ), + ), + ("summary", models.TextField(blank=True, null=True, verbose_name="summary")), + ("client_id", models.CharField(blank=True, max_length=50, null=True)), + ("actions", models.ManyToManyField(blank=True, to="flash_update.FlashAction", verbose_name="actions")), + ( + "flash_update", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="actions_taken_flash", + to="flash_update.FlashUpdate", + verbose_name="flash update", + ), + ), ], options={ - 'verbose_name': 'actions taken flash', - 'verbose_name_plural': 'all actions taken flash', + "verbose_name": "actions taken flash", + "verbose_name_plural": "all actions taken flash", }, ), migrations.CreateModel( - name='FlashCountryDistrict', + name="FlashCountryDistrict", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('client_id', models.CharField(blank=True, max_length=50, null=True)), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='flash_country', to='api.Country', verbose_name='country')), - ('district', models.ManyToManyField(related_name='flash_district', to='api.District', verbose_name='district')), - ('flash_update', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='flash_update.FlashUpdate', verbose_name='Flash update')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("client_id", models.CharField(blank=True, max_length=50, null=True)), + ( + "country", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="flash_country", + to="api.Country", + verbose_name="country", + ), + ), + ("district", models.ManyToManyField(related_name="flash_district", to="api.District", verbose_name="district")), + ( + "flash_update", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="flash_update.FlashUpdate", verbose_name="Flash update" + ), + ), ], options={ - 'verbose_name': 'flash country district', - 'verbose_name_plural': 'flash countries districts', - 'unique_together': {('flash_update', 'country')}, + "verbose_name": "flash country district", + "verbose_name_plural": "flash countries districts", + "unique_together": {("flash_update", "country")}, }, ), ] diff --git a/flash_update/migrations/0002_auto_20220228_0544.py b/flash_update/migrations/0002_auto_20220228_0544.py index efb2095d0..dfac9e69a 100644 --- a/flash_update/migrations/0002_auto_20220228_0544.py +++ b/flash_update/migrations/0002_auto_20220228_0544.py @@ -6,20 +6,20 @@ class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0001_initial'), + ("flash_update", "0001_initial"), ] operations = [ migrations.CreateModel( - name='DonorGroup', + name="DonorGroup", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='name')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=255, verbose_name="name")), ], ), migrations.AddField( - model_name='donors', - name='groups', - field=models.ManyToManyField(blank=True, to='flash_update.DonorGroup', verbose_name='donor group'), + model_name="donors", + name="groups", + field=models.ManyToManyField(blank=True, to="flash_update.DonorGroup", verbose_name="donor group"), ), ] diff --git a/flash_update/migrations/0003_flashupdateshare.py b/flash_update/migrations/0003_flashupdateshare.py index c6c3ef9fe..f325bb70a 100644 --- a/flash_update/migrations/0003_flashupdateshare.py +++ b/flash_update/migrations/0003_flashupdateshare.py @@ -1,24 +1,31 @@ # Generated by Django 2.2.27 on 2022-03-02 11:54 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0002_auto_20220228_0544'), + ("flash_update", "0002_auto_20220228_0544"), ] operations = [ migrations.CreateModel( - name='FlashUpdateShare', + name="FlashUpdateShare", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('donor_groups', models.ManyToManyField(blank=True, null=True, to='flash_update.DonorGroup')), - ('donors', models.ManyToManyField(blank=True, null=True, to='flash_update.Donors')), - ('flash_update', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='flash_update_share', to='flash_update.FlashUpdate')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("donor_groups", models.ManyToManyField(blank=True, null=True, to="flash_update.DonorGroup")), + ("donors", models.ManyToManyField(blank=True, null=True, to="flash_update.Donors")), + ( + "flash_update", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="flash_update_share", + to="flash_update.FlashUpdate", + ), + ), ], ), ] diff --git a/flash_update/migrations/0004_auto_20220303_0633.py b/flash_update/migrations/0004_auto_20220303_0633.py index 7255140d0..472754261 100644 --- a/flash_update/migrations/0004_auto_20220303_0633.py +++ b/flash_update/migrations/0004_auto_20220303_0633.py @@ -1,34 +1,46 @@ # Generated by Django 2.2.27 on 2022-03-03 06:33 from django.db import migrations, models + import flash_update.models class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0003_flashupdateshare'), + ("flash_update", "0003_flashupdateshare"), ] operations = [ migrations.AlterField( - model_name='flashemailsubscriptions', - name='share_with', - field=models.CharField(choices=[('ifrc_secretariat', 'IFRC Secretariat'), ('rcrc_network', 'RCRC Network')], default=flash_update.models.FlashUpdate.FlashShareWith('ifrc_secretariat'), max_length=50, verbose_name='share with'), + model_name="flashemailsubscriptions", + name="share_with", + field=models.CharField( + choices=[("ifrc_secretariat", "IFRC Secretariat"), ("rcrc_network", "RCRC Network")], + default=flash_update.models.FlashUpdate.FlashShareWith("ifrc_secretariat"), + max_length=50, + verbose_name="share with", + ), ), migrations.AlterField( - model_name='flashupdate', - name='share_with', - field=models.CharField(blank=True, choices=[('ifrc_secretariat', 'IFRC Secretariat'), ('rcrc_network', 'RCRC Network')], max_length=50, null=True, verbose_name='share with'), + model_name="flashupdate", + name="share_with", + field=models.CharField( + blank=True, + choices=[("ifrc_secretariat", "IFRC Secretariat"), ("rcrc_network", "RCRC Network")], + max_length=50, + null=True, + verbose_name="share with", + ), ), migrations.AlterField( - model_name='flashupdateshare', - name='donor_groups', - field=models.ManyToManyField(blank=True, to='flash_update.DonorGroup'), + model_name="flashupdateshare", + name="donor_groups", + field=models.ManyToManyField(blank=True, to="flash_update.DonorGroup"), ), migrations.AlterField( - model_name='flashupdateshare', - name='donors', - field=models.ManyToManyField(blank=True, to='flash_update.Donors'), + model_name="flashupdateshare", + name="donors", + field=models.ManyToManyField(blank=True, to="flash_update.Donors"), ), ] diff --git a/flash_update/migrations/0005_auto_20220303_0834.py b/flash_update/migrations/0005_auto_20220303_0834.py index 72a36d84e..bd83f65d9 100644 --- a/flash_update/migrations/0005_auto_20220303_0834.py +++ b/flash_update/migrations/0005_auto_20220303_0834.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0004_auto_20220303_0633'), + ("flash_update", "0004_auto_20220303_0633"), ] operations = [ migrations.AlterModelOptions( - name='donors', - options={'verbose_name': 'donor'}, + name="donors", + options={"verbose_name": "donor"}, ), ] diff --git a/flash_update/migrations/0006_auto_20220303_0906.py b/flash_update/migrations/0006_auto_20220303_0906.py index d28c934e8..2188dc0fa 100644 --- a/flash_update/migrations/0006_auto_20220303_0906.py +++ b/flash_update/migrations/0006_auto_20220303_0906.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0005_auto_20220303_0834'), + ("flash_update", "0005_auto_20220303_0834"), ] operations = [ migrations.AlterModelOptions( - name='flashemailsubscriptions', - options={'verbose_name': 'flash email subscription'}, + name="flashemailsubscriptions", + options={"verbose_name": "flash email subscription"}, ), ] diff --git a/flash_update/migrations/0007_auto_20220303_1116.py b/flash_update/migrations/0007_auto_20220303_1116.py index c1d58ae6d..12dcb58ab 100644 --- a/flash_update/migrations/0007_auto_20220303_1116.py +++ b/flash_update/migrations/0007_auto_20220303_1116.py @@ -1,39 +1,39 @@ # Generated by Django 2.2.27 on 2022-03-03 11:16 -from django.db import models, migrations import tinymce.models +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0006_auto_20220303_0906'), + ("flash_update", "0006_auto_20220303_0906"), ] operations = [ migrations.AlterField( - model_name='flashupdate', - name='situational_overview', - field=tinymce.models.HTMLField(blank=True, default='', verbose_name='Situational Overview'), + model_name="flashupdate", + name="situational_overview", + field=tinymce.models.HTMLField(blank=True, default="", verbose_name="Situational Overview"), ), migrations.AlterField( - model_name='flashupdate', - name='situational_overview_ar', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='Situational Overview'), + model_name="flashupdate", + name="situational_overview_ar", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="Situational Overview"), ), migrations.AlterField( - model_name='flashupdate', - name='situational_overview_en', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='Situational Overview'), + model_name="flashupdate", + name="situational_overview_en", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="Situational Overview"), ), migrations.AlterField( - model_name='flashupdate', - name='situational_overview_es', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='Situational Overview'), + model_name="flashupdate", + name="situational_overview_es", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="Situational Overview"), ), migrations.AlterField( - model_name='flashupdate', - name='situational_overview_fr', - field=tinymce.models.HTMLField(blank=True, default='', null=True, verbose_name='Situational Overview'), + model_name="flashupdate", + name="situational_overview_fr", + field=tinymce.models.HTMLField(blank=True, default="", null=True, verbose_name="Situational Overview"), ), ] diff --git a/flash_update/migrations/0008_auto_20220311_1023.py b/flash_update/migrations/0008_auto_20220311_1023.py index 295b287e3..57a84ec76 100644 --- a/flash_update/migrations/0008_auto_20220311_1023.py +++ b/flash_update/migrations/0008_auto_20220311_1023.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0007_auto_20220303_1116'), + ("flash_update", "0007_auto_20220303_1116"), ] operations = [ migrations.AddField( - model_name='flashupdate', - name='extracted_at', - field=models.DateTimeField(blank=True, null=True, verbose_name='extracted at'), + model_name="flashupdate", + name="extracted_at", + field=models.DateTimeField(blank=True, null=True, verbose_name="extracted at"), ), migrations.AddField( - model_name='flashupdate', - name='extracted_file', - field=models.FileField(blank=True, null=True, upload_to='flash_update/pdf/', verbose_name='extracted file'), + model_name="flashupdate", + name="extracted_file", + field=models.FileField(blank=True, null=True, upload_to="flash_update/pdf/", verbose_name="extracted file"), ), ] diff --git a/flash_update/migrations/0009_auto_20220513_0633.py b/flash_update/migrations/0009_auto_20220513_0633.py index 806f24d01..58894d1d6 100644 --- a/flash_update/migrations/0009_auto_20220513_0633.py +++ b/flash_update/migrations/0009_auto_20220513_0633.py @@ -7,23 +7,36 @@ class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0008_auto_20220311_1023'), + ("flash_update", "0008_auto_20220311_1023"), ] operations = [ migrations.AlterField( - model_name='flashaction', - name='organizations', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'RCRC'), ('FDRN', 'Federation'), ('GOV', 'Government')], max_length=4), blank=True, default=list, size=None, verbose_name='organizations'), + model_name="flashaction", + name="organizations", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "RCRC"), ("FDRN", "Federation"), ("GOV", "Government")], + max_length=4, + ), + blank=True, + default=list, + size=None, + verbose_name="organizations", + ), ), migrations.AlterField( - model_name='flashactionstaken', - name='organization', - field=models.CharField(choices=[('NTLS', 'National Society'), ('PNS', 'RCRC'), ('FDRN', 'Federation'), ('GOV', 'Government')], max_length=16, verbose_name='organization'), + model_name="flashactionstaken", + name="organization", + field=models.CharField( + choices=[("NTLS", "National Society"), ("PNS", "RCRC"), ("FDRN", "Federation"), ("GOV", "Government")], + max_length=16, + verbose_name="organization", + ), ), migrations.AlterField( - model_name='flashcountrydistrict', - name='district', - field=models.ManyToManyField(blank=True, related_name='flash_district', to='api.District', verbose_name='district'), + model_name="flashcountrydistrict", + name="district", + field=models.ManyToManyField(blank=True, related_name="flash_district", to="api.District", verbose_name="district"), ), ] diff --git a/flash_update/migrations/0010_auto_20220607_1157.py b/flash_update/migrations/0010_auto_20220607_1157.py index 6eaf0b0ed..033f62458 100644 --- a/flash_update/migrations/0010_auto_20220607_1157.py +++ b/flash_update/migrations/0010_auto_20220607_1157.py @@ -1,24 +1,37 @@ # Generated by Django 2.2.28 on 2022-06-07 11:57 from django.db import migrations, models + import flash_update.models class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0009_auto_20220513_0633'), + ("flash_update", "0009_auto_20220513_0633"), ] operations = [ migrations.AlterField( - model_name='flashemailsubscriptions', - name='share_with', - field=models.CharField(choices=[('ifrc_secretariat', 'IFRC Secretariat')], default=flash_update.models.FlashUpdate.FlashShareWith('ifrc_secretariat'), max_length=50, verbose_name='share with'), + model_name="flashemailsubscriptions", + name="share_with", + field=models.CharField( + choices=[("ifrc_secretariat", "IFRC Secretariat")], + default=flash_update.models.FlashUpdate.FlashShareWith("ifrc_secretariat"), + max_length=50, + verbose_name="share with", + ), ), migrations.AlterField( - model_name='flashupdate', - name='share_with', - field=models.CharField(blank=True, choices=[('ifrc_secretariat', 'IFRC Secretariat')], default=flash_update.models.FlashUpdate.FlashShareWith('ifrc_secretariat'), max_length=50, null=True, verbose_name='share with'), + model_name="flashupdate", + name="share_with", + field=models.CharField( + blank=True, + choices=[("ifrc_secretariat", "IFRC Secretariat")], + default=flash_update.models.FlashUpdate.FlashShareWith("ifrc_secretariat"), + max_length=50, + null=True, + verbose_name="share with", + ), ), ] diff --git a/flash_update/migrations/0011_auto_20220805_1047.py b/flash_update/migrations/0011_auto_20220805_1047.py index c6a58d7b4..0ff3359ac 100644 --- a/flash_update/migrations/0011_auto_20220805_1047.py +++ b/flash_update/migrations/0011_auto_20220805_1047.py @@ -1,19 +1,24 @@ # Generated by Django 2.2.28 on 2022-08-05 10:47 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0010_auto_20220607_1157'), + ("flash_update", "0010_auto_20220607_1157"), ] operations = [ migrations.AlterField( - model_name='flashcountrydistrict', - name='flash_update', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='flash_country_district', to='flash_update.FlashUpdate', verbose_name='Flash update'), + model_name="flashcountrydistrict", + name="flash_update", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="flash_country_district", + to="flash_update.FlashUpdate", + verbose_name="Flash update", + ), ), ] diff --git a/flash_update/migrations/0012_auto_20230410_0720.py b/flash_update/migrations/0012_auto_20230410_0720.py index 2f9f14e4a..ea32511d5 100644 --- a/flash_update/migrations/0012_auto_20230410_0720.py +++ b/flash_update/migrations/0012_auto_20230410_0720.py @@ -6,18 +6,26 @@ class Migration(migrations.Migration): dependencies = [ - ('flash_update', '0011_auto_20220805_1047'), + ("flash_update", "0011_auto_20220805_1047"), ] operations = [ migrations.AddField( - model_name='flashupdate', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="flashupdate", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='flashupdate', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="flashupdate", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/flash_update/models.py b/flash_update/models.py index 06be98b80..3de787818 100644 --- a/flash_update/models.py +++ b/flash_update/models.py @@ -1,187 +1,173 @@ import reversion -from tinymce.models import HTMLField - -from django.db import models from django.conf import settings -from django.utils.translation import gettext_lazy as _ -from django.contrib.postgres.fields import ArrayField from django.contrib.auth.models import Group +from django.contrib.postgres.fields import ArrayField +from django.db import models +from django.utils.translation import gettext_lazy as _ +from tinymce.models import HTMLField from api.models import ( - Country, - District, - DisasterType, + ActionCategory, ActionOrg, ActionType, - ActionCategory, + Country, + DisasterType, + District, ) @reversion.register() class FlashGraphicMap(models.Model): - file = models.FileField( - verbose_name=_('file'), - upload_to='flash_update/images/' - ) + file = models.FileField(verbose_name=_("file"), upload_to="flash_update/images/") caption = models.CharField(max_length=225, blank=True, null=True) created_by = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('created_by'), - on_delete=models.SET_NULL, null=True, + settings.AUTH_USER_MODEL, + verbose_name=_("created_by"), + on_delete=models.SET_NULL, + null=True, ) client_id = models.CharField(max_length=50, null=True, blank=True) class Meta: - verbose_name = _('flash graphic map') - verbose_name_plural = _('flash graphic maps') + verbose_name = _("flash graphic map") + verbose_name_plural = _("flash graphic maps") @reversion.register() class FlashReferences(models.Model): - date = models.DateField(verbose_name=_('date'), blank=True) - source_description = models.CharField(verbose_name=_('Name or Source Description'), max_length=225, blank=True) + date = models.DateField(verbose_name=_("date"), blank=True) + source_description = models.CharField(verbose_name=_("Name or Source Description"), max_length=225, blank=True) url = models.TextField(blank=True) document = models.ForeignKey( - FlashGraphicMap, on_delete=models.SET_NULL, - null=True, blank=True, - verbose_name=_('document'), - related_name='flash_document' + FlashGraphicMap, + on_delete=models.SET_NULL, + null=True, + blank=True, + verbose_name=_("document"), + related_name="flash_document", ) client_id = models.CharField(max_length=50, null=True, blank=True) class Meta: - verbose_name = _('flash reference') - verbose_name_plural = _('flash references') + verbose_name = _("flash reference") + verbose_name_plural = _("flash references") def __str__(self): - return f'{self.source_description} - {self.date}' + return f"{self.source_description} - {self.date}" @reversion.register() class FlashUpdate(models.Model): - ''' + """ This is a base model for Flash Update - ''' + """ class FlashShareWith(models.TextChoices): - IFRC_SECRETARIAT = 'ifrc_secretariat', _('IFRC Secretariat') + IFRC_SECRETARIAT = "ifrc_secretariat", _("IFRC Secretariat") created_by = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('created by'), related_name='flash_update_created_by', - null=True, blank=True, on_delete=models.SET_NULL, + settings.AUTH_USER_MODEL, + verbose_name=_("created by"), + related_name="flash_update_created_by", + null=True, + blank=True, + on_delete=models.SET_NULL, ) modified_by = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('modified by'), related_name='flash_update_modified_by', - null=True, blank=True, on_delete=models.SET_NULL, + settings.AUTH_USER_MODEL, + verbose_name=_("modified by"), + related_name="flash_update_modified_by", + null=True, + blank=True, + on_delete=models.SET_NULL, ) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - modified_at = models.DateTimeField(verbose_name=_('updated at'), auto_now=True) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + modified_at = models.DateTimeField(verbose_name=_("updated at"), auto_now=True) # context hazard_type = models.ForeignKey( - DisasterType, verbose_name=_('hazard type'), related_name='flash_update_hazard_type', - null=True, on_delete=models.SET_NULL + DisasterType, verbose_name=_("hazard type"), related_name="flash_update_hazard_type", null=True, on_delete=models.SET_NULL ) title = models.CharField(max_length=300) - situational_overview = HTMLField(verbose_name=_('Situational Overview'), blank=True, default='') + situational_overview = HTMLField(verbose_name=_("Situational Overview"), blank=True, default="") # map/graphics - map = models.ManyToManyField( - FlashGraphicMap, blank=True, - verbose_name=_('map'), - related_name='flash_map' - ) - graphics = models.ManyToManyField( - FlashGraphicMap, blank=True, - verbose_name=_('graphics'), - related_name='flash_graphics' - ) + map = models.ManyToManyField(FlashGraphicMap, blank=True, verbose_name=_("map"), related_name="flash_map") + graphics = models.ManyToManyField(FlashGraphicMap, blank=True, verbose_name=_("graphics"), related_name="flash_graphics") # Focal Point - originator_name = models.CharField(verbose_name=_('originator_name'), max_length=100, null=True, blank=True) - originator_title = models.CharField(verbose_name=_('originator_title'), max_length=300, null=True, blank=True) - originator_email = models.CharField(verbose_name=_('originator_email'), max_length=300, null=True, blank=True) - originator_phone = models.CharField(verbose_name=_('originator_phone'), max_length=50, null=True, blank=True) + originator_name = models.CharField(verbose_name=_("originator_name"), max_length=100, null=True, blank=True) + originator_title = models.CharField(verbose_name=_("originator_title"), max_length=300, null=True, blank=True) + originator_email = models.CharField(verbose_name=_("originator_email"), max_length=300, null=True, blank=True) + originator_phone = models.CharField(verbose_name=_("originator_phone"), max_length=50, null=True, blank=True) - ifrc_name = models.CharField(verbose_name=_('ifrc_name'), max_length=100, null=True, blank=True) - ifrc_title = models.CharField(verbose_name=_('ifrc_title'), max_length=300, null=True, blank=True) - ifrc_email = models.CharField(verbose_name=_('ifrc_email'), max_length=300, null=True, blank=True) - ifrc_phone = models.CharField(verbose_name=_('ifrc_phone'), max_length=50, null=True, blank=True) + ifrc_name = models.CharField(verbose_name=_("ifrc_name"), max_length=100, null=True, blank=True) + ifrc_title = models.CharField(verbose_name=_("ifrc_title"), max_length=300, null=True, blank=True) + ifrc_email = models.CharField(verbose_name=_("ifrc_email"), max_length=300, null=True, blank=True) + ifrc_phone = models.CharField(verbose_name=_("ifrc_phone"), max_length=50, null=True, blank=True) # Share with share_with = models.CharField( - max_length=50, choices=FlashShareWith.choices, default=FlashShareWith.IFRC_SECRETARIAT, - null=True, blank=True, verbose_name=_('share with') - ) - references = models.ManyToManyField( - FlashReferences, blank=True, - verbose_name=_('references') - ) - extracted_file = models.FileField( - verbose_name=_('extracted file'), - upload_to='flash_update/pdf/', + max_length=50, + choices=FlashShareWith.choices, + default=FlashShareWith.IFRC_SECRETARIAT, + null=True, blank=True, - null=True + verbose_name=_("share with"), ) - extracted_at = models.DateTimeField(verbose_name=_('extracted at'), blank=True, null=True) + references = models.ManyToManyField(FlashReferences, blank=True, verbose_name=_("references")) + extracted_file = models.FileField(verbose_name=_("extracted file"), upload_to="flash_update/pdf/", blank=True, null=True) + extracted_at = models.DateTimeField(verbose_name=_("extracted at"), blank=True, null=True) class Meta: - verbose_name = _('Flash update') - verbose_name_plural = _('Flash updates') + verbose_name = _("Flash update") + verbose_name_plural = _("Flash updates") def __str__(self): - return f'{self.title}' + return f"{self.title}" @reversion.register() class FlashCountryDistrict(models.Model): flash_update = models.ForeignKey( - FlashUpdate, on_delete=models.CASCADE, - verbose_name=_('Flash update'), - related_name='flash_country_district' - ) - country = models.ForeignKey( - Country, verbose_name=_('country'), on_delete=models.CASCADE, - related_name='flash_country' - ) - district = models.ManyToManyField( - District, verbose_name=_('district'), - related_name='flash_district', - blank=True + FlashUpdate, on_delete=models.CASCADE, verbose_name=_("Flash update"), related_name="flash_country_district" ) + country = models.ForeignKey(Country, verbose_name=_("country"), on_delete=models.CASCADE, related_name="flash_country") + district = models.ManyToManyField(District, verbose_name=_("district"), related_name="flash_district", blank=True) client_id = models.CharField(max_length=50, null=True, blank=True) class Meta: - unique_together = ('flash_update', 'country') - verbose_name = _('flash country district') - verbose_name_plural = _('flash countries districts') + unique_together = ("flash_update", "country") + verbose_name = _("flash country district") + verbose_name_plural = _("flash countries districts") def __str__(self): - return f'{self.country} - {self.district}' + return f"{self.country} - {self.district}" @reversion.register() class FlashAction(models.Model): - """ Action taken for Flash Update """ + """Action taken for Flash Update""" - name = models.CharField(verbose_name=_('name'), max_length=400) + name = models.CharField(verbose_name=_("name"), max_length=400) organizations = ArrayField( - models.CharField(choices=ActionOrg.choices, max_length=4), - verbose_name=_('organizations'), default=list, blank=True + models.CharField(choices=ActionOrg.choices, max_length=4), verbose_name=_("organizations"), default=list, blank=True ) flash_update_types = ArrayField( models.CharField(choices=ActionType.choices, max_length=16), - verbose_name=_('flash update types'), default=list, + verbose_name=_("flash update types"), + default=list, ) category = models.CharField( - max_length=255, verbose_name=_('category'), choices=ActionCategory.choices, default=ActionCategory.GENERAL + max_length=255, verbose_name=_("category"), choices=ActionCategory.choices, default=ActionCategory.GENERAL ) - is_disabled = models.BooleanField(verbose_name=_('is disabled?'), default=False, help_text=_('Disable in form')) - tooltip_text = models.TextField(verbose_name=_('tooltip text'), null=True, blank='true') + is_disabled = models.BooleanField(verbose_name=_("is disabled?"), default=False, help_text=_("Disable in form")) + tooltip_text = models.TextField(verbose_name=_("tooltip text"), null=True, blank="true") client_id = models.CharField(max_length=50, null=True, blank=True) class Meta: - verbose_name = _('flash action') - verbose_name_plural = _('flash actions') + verbose_name = _("flash action") + verbose_name_plural = _("flash actions") def __str__(self): return self.name @@ -189,38 +175,40 @@ def __str__(self): @reversion.register() class FlashActionsTaken(models.Model): - """ All the actions taken by an organization in Flash Update """ + """All the actions taken by an organization in Flash Update""" organization = models.CharField( choices=ActionOrg.choices, - verbose_name=_('organization'), max_length=16, + verbose_name=_("organization"), + max_length=16, ) - actions = models.ManyToManyField(FlashAction, verbose_name=_('actions'), blank=True) - summary = models.TextField(verbose_name=_('summary'), null=True, blank=True) + actions = models.ManyToManyField(FlashAction, verbose_name=_("actions"), blank=True) + summary = models.TextField(verbose_name=_("summary"), null=True, blank=True) flash_update = models.ForeignKey( - FlashUpdate, verbose_name=_('flash update'), related_name='actions_taken_flash', on_delete=models.CASCADE + FlashUpdate, verbose_name=_("flash update"), related_name="actions_taken_flash", on_delete=models.CASCADE ) client_id = models.CharField(max_length=50, null=True, blank=True) class Meta: - verbose_name = _('actions taken flash') - verbose_name_plural = _('all actions taken flash') + verbose_name = _("actions taken flash") + verbose_name_plural = _("all actions taken flash") def __str__(self): - return f'{self.organization} - {self.actions}' + return f"{self.organization} - {self.actions}" @reversion.register() class FlashEmailSubscriptions(models.Model): share_with = models.CharField( - max_length=50, choices=FlashUpdate.FlashShareWith.choices, + max_length=50, + choices=FlashUpdate.FlashShareWith.choices, default=FlashUpdate.FlashShareWith.IFRC_SECRETARIAT, - verbose_name=_('share with') + verbose_name=_("share with"), ) - group = models.ForeignKey(Group, on_delete=models.CASCADE, null=True, blank=True, related_name='flash_email_subscription') + group = models.ForeignKey(Group, on_delete=models.CASCADE, null=True, blank=True, related_name="flash_email_subscription") class Meta: - verbose_name = _('flash email subscription') + verbose_name = _("flash email subscription") def __str__(self): return self.share_with @@ -228,7 +216,7 @@ def __str__(self): @reversion.register() class DonorGroup(models.Model): - name = models.CharField(max_length=255, verbose_name=_('name')) + name = models.CharField(max_length=255, verbose_name=_("name")) def __str__(self): return self.name @@ -241,10 +229,10 @@ class Donors(models.Model): last_name = models.CharField(max_length=300, blank=True, null=True) email = models.EmailField(blank=True, null=True) position = models.CharField(max_length=300, blank=True, null=True) - groups = models.ManyToManyField(DonorGroup, verbose_name=_('donor group'), blank=True) + groups = models.ManyToManyField(DonorGroup, verbose_name=_("donor group"), blank=True) class Meta: - verbose_name = _('donor') + verbose_name = _("donor") def __str__(self): return self.organization_name @@ -252,10 +240,10 @@ def __str__(self): @reversion.register() class FlashUpdateShare(models.Model): - flash_update = models.ForeignKey(FlashUpdate, on_delete=models.CASCADE, related_name='flash_update_share') + flash_update = models.ForeignKey(FlashUpdate, on_delete=models.CASCADE, related_name="flash_update_share") donors = models.ManyToManyField(Donors, blank=True) donor_groups = models.ManyToManyField(DonorGroup, blank=True) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) def __str__(self): return self.flash_update.title diff --git a/flash_update/search_indexes.py b/flash_update/search_indexes.py index 855bb8dcb..8278c8363 100644 --- a/flash_update/search_indexes.py +++ b/flash_update/search_indexes.py @@ -5,8 +5,8 @@ class FlashUpdateIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='title') - created_at = indexes.DateTimeField(model_attr='created_at') + name = indexes.EdgeNgramField(model_attr="title") + created_at = indexes.DateTimeField(model_attr="created_at") def get_model(self): return FlashUpdate diff --git a/flash_update/serializers.py b/flash_update/serializers.py index f3ea50df3..2c6072879 100644 --- a/flash_update/serializers.py +++ b/flash_update/serializers.py @@ -1,138 +1,121 @@ from django.db import transaction from django.utils.translation import gettext from rest_framework import serializers -from utils.file_check import validate_file_type -from .tasks import share_flash_update, send_flash_update_email from api.serializers import ( - UserNameSerializer, - DisasterTypeSerializer, CountrySerializer, + DisasterTypeSerializer, MiniDistrictSerializer, + UserNameSerializer, ) from flash_update.models import ( - FlashReferences, - FlashUpdate, - FlashCountryDistrict, - FlashGraphicMap, - FlashAction, - FlashActionsTaken, DonorGroup, Donors, + FlashAction, + FlashActionsTaken, + FlashCountryDistrict, + FlashGraphicMap, + FlashReferences, + FlashUpdate, FlashUpdateShare, ) +from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin +from utils.file_check import validate_file_type -from main.writable_nested_serializers import ( - NestedCreateMixin, - NestedUpdateMixin, -) +from .tasks import send_flash_update_email, share_flash_update class DonorGroupSerializer(serializers.ModelSerializer): class Meta: model = DonorGroup - fields = '__all__' + fields = "__all__" class DonorsSerializer(serializers.ModelSerializer): - groups_details = DonorGroupSerializer(source='groups', many=True, required=False, read_only=True) + groups_details = DonorGroupSerializer(source="groups", many=True, required=False, read_only=True) class Meta: model = Donors - fields = '__all__' + fields = "__all__" class FlashGraphicMapFileInputSerializer(serializers.Serializer): - file = serializers.ListField( - child=serializers.FileField() - ) + file = serializers.ListField(child=serializers.FileField()) class FlashGraphicMapSerializer(serializers.ModelSerializer): - created_by_details = UserNameSerializer(source='created_by', read_only=True) + created_by_details = UserNameSerializer(source="created_by", read_only=True) file = serializers.FileField(required=False) class Meta: model = FlashGraphicMap - fields = '__all__' - read_only_fields = ('created_by',) + fields = "__all__" + read_only_fields = ("created_by",) def validate_file(self, file): validate_file_type(file) return file def create(self, validated_data): - validated_data['created_by'] = self.context['request'].user + validated_data["created_by"] = self.context["request"].user return super().create(validated_data) class FlashActionSerializer(serializers.ModelSerializer): class Meta: model = FlashAction - fields = ('name', 'id', 'organizations', 'category', 'tooltip_text', 'client_id') + fields = ("name", "id", "organizations", "category", "tooltip_text", "client_id") -class FlashActionsTakenSerializer( - NestedUpdateMixin, - NestedCreateMixin, - serializers.ModelSerializer -): - action_details = FlashActionSerializer(source='actions', many=True, required=False, read_only=True) - organization_display = serializers.CharField(source='get_organization_display', read_only=True) +class FlashActionsTakenSerializer(NestedUpdateMixin, NestedCreateMixin, serializers.ModelSerializer): + action_details = FlashActionSerializer(source="actions", many=True, required=False, read_only=True) + organization_display = serializers.CharField(source="get_organization_display", read_only=True) class Meta: model = FlashActionsTaken - fields = ('organization', 'organization_display', 'actions', 'action_details', 'summary', 'id', 'client_id') - read_only_fields = ('flash_update',) + fields = ("organization", "organization_display", "actions", "action_details", "summary", "id", "client_id") + read_only_fields = ("flash_update",) -class FlashReferencesSerializer( - serializers.ModelSerializer -): - document_details = FlashGraphicMapSerializer(source='document', read_only=True) +class FlashReferencesSerializer(serializers.ModelSerializer): + document_details = FlashGraphicMapSerializer(source="document", read_only=True) class Meta: model = FlashReferences - fields = '__all__' + fields = "__all__" class FlashCountryDistrictSerializer(serializers.ModelSerializer): - country_details = CountrySerializer(source='country', read_only=True) - district_details = MiniDistrictSerializer(source='district', many=True, read_only=True) + country_details = CountrySerializer(source="country", read_only=True) + district_details = MiniDistrictSerializer(source="district", many=True, read_only=True) class Meta: model = FlashCountryDistrict - fields = ('id', 'country', 'district', 'country_details', 'district_details', 'client_id') - read_only_fields = ('flash_update',) + fields = ("id", "country", "district", "country_details", "district_details", "client_id") + read_only_fields = ("flash_update",) def validate(self, data): - districts = data['district'] + districts = data["district"] if districts: for district in districts: - if district.country != data['country']: - raise serializers.ValidationError({ - 'district': gettext('Different districts found for given country') - }) + if district.country != data["country"]: + raise serializers.ValidationError({"district": gettext("Different districts found for given country")}) return data -class FlashUpdateSerializer( - NestedUpdateMixin, - NestedCreateMixin, - serializers.ModelSerializer -): - country_district = FlashCountryDistrictSerializer(source='flash_country_district', many=True, required=False) +class FlashUpdateSerializer(NestedUpdateMixin, NestedCreateMixin, serializers.ModelSerializer): + country_district = FlashCountryDistrictSerializer(source="flash_country_district", many=True, required=False) references = FlashReferencesSerializer(many=True, required=False) - actions_taken = FlashActionsTakenSerializer(source='actions_taken_flash', many=True, required=False) - created_by_details = UserNameSerializer(source='created_by', read_only=True) - hazard_type_details = DisasterTypeSerializer(source='hazard_type', read_only=True) - share_with_display = serializers.CharField(source='get_share_with_display', read_only=True) - map_files = FlashGraphicMapSerializer(source='map', many=True, required=False) - graphics_files = FlashGraphicMapSerializer(source='graphics', many=True, required=False) + actions_taken = FlashActionsTakenSerializer(source="actions_taken_flash", many=True, required=False) + created_by_details = UserNameSerializer(source="created_by", read_only=True) + hazard_type_details = DisasterTypeSerializer(source="hazard_type", read_only=True) + share_with_display = serializers.CharField(source="get_share_with_display", read_only=True) + map_files = FlashGraphicMapSerializer(source="map", many=True, required=False) + graphics_files = FlashGraphicMapSerializer(source="graphics", many=True, required=False) class Meta: model = FlashUpdate - fields = '__all__' + fields = "__all__" def validate_country_district(self, attrs): if len(attrs) > 10: @@ -140,7 +123,7 @@ def validate_country_district(self, attrs): # check for duplicate country country_list = [] for country_district in attrs: - country_list.append(country_district['country']) + country_list.append(country_district["country"]) if len(country_list) > len(set(country_list)): raise serializers.ValidationError("Duplicate country selected") @@ -149,36 +132,30 @@ def validate_extracted_file(self, extracted_file): return extracted_file def create(self, validated_data): - validated_data['created_by'] = self.context['request'].user + validated_data["created_by"] = self.context["request"].user flash_update = super().create(validated_data) - transaction.on_commit( - lambda: send_flash_update_email.delay(flash_update.id) - ) + transaction.on_commit(lambda: send_flash_update_email.delay(flash_update.id)) return flash_update def update(self, instance, validated_data): - validated_data['modified_by'] = self.context['request'].user + validated_data["modified_by"] = self.context["request"].user flash_update = super().update(instance, validated_data) - transaction.on_commit( - lambda: send_flash_update_email.delay(flash_update.id) - ) + transaction.on_commit(lambda: send_flash_update_email.delay(flash_update.id)) return flash_update class ShareFlashUpdateSerializer(serializers.ModelSerializer): - groups_details = DonorGroupSerializer(source='donor_groups', many=True, required=False, read_only=True) - donors_details = DonorsSerializer(source='donors', many=True, required=False, read_only=True) - flash_update_details = FlashUpdateSerializer(source='flash_update', required=False, read_only=True) + groups_details = DonorGroupSerializer(source="donor_groups", many=True, required=False, read_only=True) + donors_details = DonorsSerializer(source="donors", many=True, required=False, read_only=True) + flash_update_details = FlashUpdateSerializer(source="flash_update", required=False, read_only=True) class Meta: model = FlashUpdateShare - fields = '__all__' + fields = "__all__" def create(self, validated_data): flash_update_share = super().create(validated_data) - transaction.on_commit( - lambda: share_flash_update.delay(flash_update_share.id) - ) + transaction.on_commit(lambda: share_flash_update.delay(flash_update_share.id)) return flash_update_share diff --git a/flash_update/tasks.py b/flash_update/tasks.py index 8cc0e4d0a..01494807b 100644 --- a/flash_update/tasks.py +++ b/flash_update/tasks.py @@ -1,13 +1,13 @@ from celery import shared_task - -from django.utils import timezone +from django.contrib.auth.models import User from django.core.files.base import ContentFile from django.template.loader import render_to_string -from django.contrib.auth.models import User +from django.utils import timezone from notifications.notification import send_notification + from .models import Donors, FlashUpdate, FlashUpdateShare -from .utils import render_to_pdf, get_email_context +from .utils import get_email_context, render_to_pdf @shared_task @@ -16,29 +16,24 @@ def share_flash_update(flash_update_share_id): flash_update = instance.flash_update context_for_pdf = get_email_context(flash_update) if flash_update.extracted_at is None or flash_update.modified_at > flash_update.extracted_at: - pdf = render_to_pdf('email/flash_update/flash_pdf.html', context_for_pdf) + pdf = render_to_pdf("email/flash_update/flash_pdf.html", context_for_pdf) # save the generated pdf - flash_update.extracted_file.save(pdf['filename'], ContentFile(pdf['file'])) + flash_update.extracted_file.save(pdf["filename"], ContentFile(pdf["file"])) flash_update.extracted_at = timezone.now() - flash_update.save(update_fields=('extracted_at',)) + flash_update.save(update_fields=("extracted_at",)) # create url for pdf in email - email_context = { - 'document_url': flash_update.extracted_file.url, - 'situational_overview': flash_update.situational_overview - } - donors_emails = instance.donors.all().values_list('email', flat=True) - donor_groups_emails = Donors.objects.filter( - groups__in=instance.donor_groups.all() - ).values_list('email', flat=True) + email_context = {"document_url": flash_update.extracted_file.url, "situational_overview": flash_update.situational_overview} + donors_emails = instance.donors.all().values_list("email", flat=True) + donor_groups_emails = Donors.objects.filter(groups__in=instance.donor_groups.all()).values_list("email", flat=True) users_emails = list(set([*donors_emails, *donor_groups_emails])) send_notification( - f'Flash Update: {flash_update.title}', + f"Flash Update: {flash_update.title}", users_emails, - render_to_string('email/flash_update/donor_email.html', email_context), - 'Flash Update', + render_to_string("email/flash_update/donor_email.html", email_context), + "Flash Update", ) return context_for_pdf @@ -51,15 +46,15 @@ def send_flash_update_email(flash_update_id): return email_context = get_email_context(instance) - users_emails = User.objects.filter( - groups__flash_email_subscription__share_with=share_with_group - ).values_list('email', flat=True) + users_emails = User.objects.filter(groups__flash_email_subscription__share_with=share_with_group).values_list( + "email", flat=True + ) if users_emails: send_notification( - f'Flash Update: {instance.title}', + f"Flash Update: {instance.title}", users_emails, - render_to_string('email/flash_update/flash_update.html', email_context), - 'Flash Update' + render_to_string("email/flash_update/flash_update.html", email_context), + "Flash Update", ) return email_context @@ -69,8 +64,13 @@ def export_to_pdf(id): flash_update = FlashUpdate.objects.get(id=id) context_for_pdf = get_email_context(flash_update) if flash_update.extracted_at is None or flash_update.modified_at > flash_update.extracted_at: - pdf = render_to_pdf('email/flash_update/flash_pdf.html', context_for_pdf) + pdf = render_to_pdf("email/flash_update/flash_pdf.html", context_for_pdf) # save the generated pdf - flash_update.extracted_file.save(pdf['filename'], ContentFile(pdf['file']), save=False) + flash_update.extracted_file.save(pdf["filename"], ContentFile(pdf["file"]), save=False) flash_update.extracted_at = timezone.now() - flash_update.save(update_fields=('extracted_at', 'extracted_file',)) + flash_update.save( + update_fields=( + "extracted_at", + "extracted_file", + ) + ) diff --git a/flash_update/test_views.py b/flash_update/test_views.py index ac9d1a026..15e914fd4 100644 --- a/flash_update/test_views.py +++ b/flash_update/test_views.py @@ -1,36 +1,32 @@ import os +from unittest import mock from django.conf import settings from django.contrib.auth.models import User -from unittest import mock -from main.test_case import APITestCase -from main.factories import GroupFactory import api.models as models -from flash_update.models import ( - FlashUpdate, - FlashEmailSubscriptions, - FlashGraphicMap, -) from flash_update.factories import ( - FlashUpdateFactory, - FlashGraphicMapFactory, - FlashActionFactory, DonorFactory, DonorGroupFactory, + FlashActionFactory, + FlashGraphicMapFactory, + FlashUpdateFactory, ) +from flash_update.models import FlashEmailSubscriptions, FlashGraphicMap, FlashUpdate from flash_update.tasks import send_flash_update_email +from main.factories import GroupFactory +from main.test_case import APITestCase class FlashUpdateTest(APITestCase): def setUp(self): - self.user = User.objects.create(username='jo') - self.country1 = models.Country.objects.create(name='abc') - self.country2 = models.Country.objects.create(name='xyz') - self.district1 = models.District.objects.create(name='test district1', country=self.country1) - self.district2 = models.District.objects.create(name='test district12', country=self.country2) - self.district3 = models.District.objects.create(name='test district3', country=self.country1) + self.user = User.objects.create(username="jo") + self.country1 = models.Country.objects.create(name="abc") + self.country2 = models.Country.objects.create(name="xyz") + self.district1 = models.District.objects.create(name="test district1", country=self.country1) + self.district2 = models.District.objects.create(name="test district12", country=self.country2) + self.district3 = models.District.objects.create(name="test district3", country=self.country1) map1, map2, map3, map5 = FlashGraphicMapFactory.create_batch(4, created_by=self.user) graphic1, graphic2 = FlashGraphicMapFactory.create_batch(2, created_by=self.user) documents1, documents1 = FlashGraphicMapFactory.create_batch(2, created_by=self.user) @@ -40,34 +36,24 @@ def setUp(self): for key, value in FlashUpdate.FlashShareWith.choices: FlashEmailSubscriptions.objects.create(share_with=key) - path = os.path.join(settings.TEST_DIR, 'documents') - self.file = os.path.join(path, 'go.png') + path = os.path.join(settings.TEST_DIR, "documents") + self.file = os.path.join(path, "go.png") self.body = { "country_district": [ - { - 'country': str(self.country1.id), - 'district': [self.district1.id] - }, - { - 'country': str(self.country2.id), - 'district': [self.district2.id] - } + {"country": str(self.country1.id), "district": [self.district1.id]}, + {"country": str(self.country2.id), "district": [self.district2.id]}, ], "references": [ { - 'date': '2021-02-02', - 'source_description': 'A source', + "date": "2021-02-02", + "source_description": "A source", "url": "https://youtube.com/", - 'document': documents1.id, + "document": documents1.id, } ], - 'actions_taken': [ - { - 'organization': 'NTLS', - 'summary': 'actions taken', - 'actions': [actions1.id, actions2.id] - }, + "actions_taken": [ + {"organization": "NTLS", "summary": "actions taken", "actions": [actions1.id, actions2.id]}, ], "title": "test flash update", "situational_overview": "test situational overview", @@ -105,15 +91,15 @@ def setUp(self): } super().setUp() - @mock.patch('flash_update.tasks.send_flash_update_email') + @mock.patch("flash_update.tasks.send_flash_update_email") def test_create_and_update(self, send_flash_update_email): self.client.force_authenticate(user=self.user) with self.capture_on_commit_callbacks(execute=True): - response = self.client.post('/api/v2/flash-update/', self.body, format='json').json() - created = FlashUpdate.objects.get(id=response['id']) + response = self.client.post("/api/v2/flash-update/", self.body, format="json").json() + created = FlashUpdate.objects.get(id=response["id"]) self.assertEqual(created.created_by.id, self.user.id) self.assertEqual(created.hazard_type, self.hazard_type) - self.assertEqual(response['country_district'][0]['country'], self.country1.id) + self.assertEqual(response["country_district"][0]["country"], self.country1.id) self.assertEqual(created.share_with, FlashUpdate.FlashShareWith.IFRC_SECRETARIAT) self.assertEqual(created.actions_taken_flash.count(), 1) action_taken = created.actions_taken_flash.first() @@ -121,93 +107,73 @@ def test_create_and_update(self, send_flash_update_email): # update data = self.body - data['country_district'] = [ - { - 'country': str(self.country1.id), - 'district': [self.district1.id] - } - ] - data['references'] = [ - { - 'date': '2021-01-01', - 'source_description': 'A source', - 'url': "https://youtube.com/" - } - ] - data['actions_taken'] = [ - { - 'organization': 'NTLS', - 'summary': 'actions taken updated', - 'actions': [self.actions3.id, self.actions4.id] - }, - { - 'organization': 'FDRN', - 'summary': 'actions taken updated', - 'actions': [self.actions3.id, self.actions4.id] - } + data["country_district"] = [{"country": str(self.country1.id), "district": [self.district1.id]}] + data["references"] = [{"date": "2021-01-01", "source_description": "A source", "url": "https://youtube.com/"}] + data["actions_taken"] = [ + {"organization": "NTLS", "summary": "actions taken updated", "actions": [self.actions3.id, self.actions4.id]}, + {"organization": "FDRN", "summary": "actions taken updated", "actions": [self.actions3.id, self.actions4.id]}, ] - data['hazard_type'] = str(self.hazard_type_updated.id) - data['share_with'] = FlashUpdate.FlashShareWith.IFRC_SECRETARIAT + data["hazard_type"] = str(self.hazard_type_updated.id) + data["share_with"] = FlashUpdate.FlashShareWith.IFRC_SECRETARIAT - response = self.client.put(f'/api/v2/flash-update/{created.id}/', data, format='json').json() - updated = FlashUpdate.objects.get(id=response['id']) + response = self.client.put(f"/api/v2/flash-update/{created.id}/", data, format="json").json() + updated = FlashUpdate.objects.get(id=response["id"]) self.assertEqual(updated.id, created.id) self.assertEqual(updated.modified_by, self.user) self.assertEqual(updated.share_with, FlashUpdate.FlashShareWith.IFRC_SECRETARIAT) self.assertEqual(updated.hazard_type, self.hazard_type_updated) - self.assertNotEqual(response['hazard_type'], created.hazard_type) + self.assertNotEqual(response["hazard_type"], created.hazard_type) self.assertEqual(updated.actions_taken_flash.count(), 2) def test_patch(self): - user = User.objects.create(username='test_abc') + user = User.objects.create(username="test_abc") self.client.force_authenticate(user=user) with self.capture_on_commit_callbacks(execute=True): - response1 = self.client.post('/api/v2/flash-update/', self.body, format='json').json() - created = FlashUpdate.objects.get(id=response1['id']) - data = {'title': 'test title patched'} - response2 = self.client.patch(f'/api/v2/flash-update/{created.id}/', data=data, format='json').json() - flash_id = FlashUpdate.objects.get(id=response2['id']) + response1 = self.client.post("/api/v2/flash-update/", self.body, format="json").json() + created = FlashUpdate.objects.get(id=response1["id"]) + data = {"title": "test title patched"} + response2 = self.client.patch(f"/api/v2/flash-update/{created.id}/", data=data, format="json").json() + flash_id = FlashUpdate.objects.get(id=response2["id"]) self.assertEqual(flash_id.modified_by, user) - self.assertNotEqual(response1['title'], response2['title']) - self.assertEqual(response1['id'], response2['id']) + self.assertNotEqual(response1["title"], response2["title"]) + self.assertEqual(response1["id"], response2["id"]) self.assertEqual(flash_id.share_with, FlashUpdate.FlashShareWith.IFRC_SECRETARIAT) def test_get_flash_update(self): - user1 = User.objects.create(username='abc') + user1 = User.objects.create(username="abc") flash_update1, flash_update2, flash_update3 = FlashUpdateFactory.create_batch(3, created_by=user1) self.client.force_authenticate(user=user1) - response1 = self.client.get('/api/v2/flash-update/').json() - self.assertEqual(response1['count'], 3) - self.assertEqual(response1['results'][0]['created_by'], user1.id) + response1 = self.client.get("/api/v2/flash-update/").json() + self.assertEqual(response1["count"], 3) + self.assertEqual(response1["results"][0]["created_by"], user1.id) self.assertEqual( - sorted([flash_update1.id, flash_update2.id, flash_update3.id]), - sorted([data['id'] for data in response1['results']]) + sorted([flash_update1.id, flash_update2.id, flash_update3.id]), sorted([data["id"] for data in response1["results"]]) ) # query single flash update - response = self.client.get(f'/api/v2/flash-update/{flash_update1.id}/').json() - self.assertEqual(response['created_by'], user1.id) - self.assertEqual(response['id'], flash_update1.id) + response = self.client.get(f"/api/v2/flash-update/{flash_update1.id}/").json() + self.assertEqual(response["created_by"], user1.id) + self.assertEqual(response["id"], flash_update1.id) # try with another user - user2 = User.objects.create(username='xyz') + user2 = User.objects.create(username="xyz") self.client.force_authenticate(user=user2) flash_update4, flash_update5 = FlashUpdateFactory.create_batch(2, created_by=user2) - response2 = self.client.get('/api/v2/flash-update/').json() - self.assertEqual(response2['count'], 5) - self.assertEqual(response2['results'][0]['created_by'], user2.id) - self.assertIn(flash_update4.id, [data['id'] for data in response2['results']]) - self.assertNotIn([data['id'] for data in response2['results']], [data['id'] for data in response1['results']]) + response2 = self.client.get("/api/v2/flash-update/").json() + self.assertEqual(response2["count"], 5) + self.assertEqual(response2["results"][0]["created_by"], user2.id) + self.assertIn(flash_update4.id, [data["id"] for data in response2["results"]]) + self.assertNotIn([data["id"] for data in response2["results"]], [data["id"] for data in response1["results"]]) # try with users who has no any flash update created - user3 = User.objects.create(username='ram') + user3 = User.objects.create(username="ram") self.client.force_authenticate(user=user3) - response3 = self.client.get('/api/v2/flash-update/').json() - self.assertEqual(response3['count'], 5) + response3 = self.client.get("/api/v2/flash-update/").json() + self.assertEqual(response3["count"], 5) def test_filter(self): - user = User.objects.create(username='xyz') + user = User.objects.create(username="xyz") self.client.force_authenticate(user=user) hazard_type1 = models.DisasterType.objects.create(name="disaster_type1") hazard_type2 = models.DisasterType.objects.create(name="disaster_type2") @@ -219,50 +185,40 @@ def test_filter(self): FlashUpdateFactory.create_batch(2, hazard_type=hazard_type3, created_by=user) FlashUpdateFactory(hazard_type=hazard_type4, created_by=user) - response1 = self.client.get(f'/api/v2/flash-update/?hazard_type={hazard_type1.id}').json() - response2 = self.client.get(f'/api/v2/flash-update/?hazard_type={hazard_type2.id}').json() - response3 = self.client.get(f'/api/v2/flash-update/?hazard_type={hazard_type3.id}').json() - response4 = self.client.get(f'/api/v2/flash-update/?hazard_type={hazard_type4.id}').json() + response1 = self.client.get(f"/api/v2/flash-update/?hazard_type={hazard_type1.id}").json() + response2 = self.client.get(f"/api/v2/flash-update/?hazard_type={hazard_type2.id}").json() + response3 = self.client.get(f"/api/v2/flash-update/?hazard_type={hazard_type3.id}").json() + response4 = self.client.get(f"/api/v2/flash-update/?hazard_type={hazard_type4.id}").json() - self.assertNotIn([data['id'] for data in response2['results']], [data['id'] for data in response1['results']]) - self.assertNotIn([data['id'] for data in response4['results']], [data['id'] for data in response3['results']]) - self.assertNotIn([data['id'] for data in response2['results']], [data['id'] for data in response4['results']]) + self.assertNotIn([data["id"] for data in response2["results"]], [data["id"] for data in response1["results"]]) + self.assertNotIn([data["id"] for data in response4["results"]], [data["id"] for data in response3["results"]]) + self.assertNotIn([data["id"] for data in response2["results"]], [data["id"] for data in response4["results"]]) def test_validate_country_district(self): # validate if district passed belongs to respective country - self.body["country_district"] = [ - { - 'country': str(self.country1.id), - 'district': str(self.district2.id) - } - ] + self.body["country_district"] = [{"country": str(self.country1.id), "district": str(self.district2.id)}] self.client.force_authenticate(user=self.user) with self.capture_on_commit_callbacks(execute=True): - response = self.client.post('/api/v2/flash-update/', self.body, format='json') + response = self.client.post("/api/v2/flash-update/", self.body, format="json") self.assert_400(response) def test_upload_file(self): - user = User.objects.create(username='flash_user') - url = '/api/v2/flash-update-file/' - data = { - 'file': open(self.file, 'rb'), - "caption": "test file" - } + user = User.objects.create(username="flash_user") + url = "/api/v2/flash-update-file/" + data = {"file": open(self.file, "rb"), "caption": "test file"} self.client.force_authenticate(user=user) - response = self.client.post(url, data=data, format='multipart') + response = self.client.post(url, data=data, format="multipart") self.assert_201(response) response = response.json() - self.assertEqual(response['created_by'], user.id) + self.assertEqual(response["created_by"], user.id) def test_upload_multiple_file(self): file_count = FlashGraphicMap.objects.count() - url = '/api/v2/flash-update-file/multiple/' - data = { - 'file': [open(self.file, 'rb'), open(self.file, 'rb'), open(self.file, 'rb')] - } + url = "/api/v2/flash-update-file/multiple/" + data = {"file": [open(self.file, "rb"), open(self.file, "rb"), open(self.file, "rb")]} self.authenticate() - response = self.client.post(url, data, format='multipart') + response = self.client.post(url, data, format="multipart") self.assert_201(response) self.assertEqual(FlashGraphicMap.objects.count(), file_count + 1) @@ -273,91 +229,79 @@ def test_upload_multiple_file(self): # response = self.client.post(url, data2, format='multipart') # self.assert_400(response) - @mock.patch('notifications.notification.send_notification') + @mock.patch("notifications.notification.send_notification") def test_send_email(self, send_notification): group = GroupFactory(name="group1") - email_suscription = FlashEmailSubscriptions.objects.get( - share_with=FlashUpdate.FlashShareWith.IFRC_SECRETARIAT - ) + email_suscription = FlashEmailSubscriptions.objects.get(share_with=FlashUpdate.FlashShareWith.IFRC_SECRETARIAT) email_suscription.group = group email_suscription.save() # check for create self.client.force_authenticate(user=self.user) - response = self.client.post('/api/v2/flash-update/', self.body, format='json').json() - instance = FlashUpdate.objects.get(id=response['id']) + response = self.client.post("/api/v2/flash-update/", self.body, format="json").json() + instance = FlashUpdate.objects.get(id=response["id"]) email_data = send_flash_update_email(instance.id) self.assertTrue(send_notification.assert_called) # check if send_notifications function is called. - self.assertEqual(email_data['title'], instance.title) - self.assertEqual(email_data['situational_overview'], instance.situational_overview) + self.assertEqual(email_data["title"], instance.title) + self.assertEqual(email_data["situational_overview"], instance.situational_overview) self.assertIn( - email_data['actions_taken'][0]['id'], - [data['id'] for data in instance.actions_taken_flash.all().values('id')] + email_data["actions_taken"][0]["id"], [data["id"] for data in instance.actions_taken_flash.all().values("id")] ) # check for update group2 = GroupFactory(name="group2") - email_suscription = FlashEmailSubscriptions.objects.get( - share_with=FlashUpdate.FlashShareWith.IFRC_SECRETARIAT - ) + email_suscription = FlashEmailSubscriptions.objects.get(share_with=FlashUpdate.FlashShareWith.IFRC_SECRETARIAT) email_suscription.group = group2 email_suscription.save() - self.body['share_with'] = FlashUpdate.FlashShareWith.IFRC_SECRETARIAT - response = self.client.put(f'/api/v2/flash-update/{instance.id}/', self.body, format='json').json() - instance = FlashUpdate.objects.get(id=response['id']) + self.body["share_with"] = FlashUpdate.FlashShareWith.IFRC_SECRETARIAT + response = self.client.put(f"/api/v2/flash-update/{instance.id}/", self.body, format="json").json() + instance = FlashUpdate.objects.get(id=response["id"]) email_data = send_flash_update_email(instance.id) self.assertTrue(send_notification.assert_called) # check if send_notifications function is called. - self.assertEqual(email_data['title'], instance.title) - self.assertEqual(email_data['situational_overview'], instance.situational_overview) + self.assertEqual(email_data["title"], instance.title) + self.assertEqual(email_data["situational_overview"], instance.situational_overview) self.assertIn( - email_data['actions_taken'][0]['id'], - [data['id'] for data in instance.actions_taken_flash.all().values('id')] + email_data["actions_taken"][0]["id"], [data["id"] for data in instance.actions_taken_flash.all().values("id")] ) - @mock.patch('flash_update.utils.render_to_pdf') - @mock.patch('notifications.notification.send_notification') + @mock.patch("flash_update.utils.render_to_pdf") + @mock.patch("notifications.notification.send_notification") def test_flash_update_share(self, send_notification, render_to_pdf): - render_to_pdf.return_value = { - 'filename': "test.pdf", - 'file': b'pdf content' - } + render_to_pdf.return_value = {"filename": "test.pdf", "file": b"pdf content"} donor1, donor2, donor3 = DonorFactory.create_batch(3) donor_group1, donor_group2 = DonorGroupFactory.create_batch(2) self.client.force_authenticate(user=self.user) - response = self.client.post('/api/v2/flash-update/', self.body, format='json').json() - flash_update = FlashUpdate.objects.get(id=response['id']) + response = self.client.post("/api/v2/flash-update/", self.body, format="json").json() + flash_update = FlashUpdate.objects.get(id=response["id"]) data = { - 'flash_update': flash_update.id, - 'donors': [donor1.id, donor2.id, donor3.id], - 'donor_groups': [donor_group1.id, donor_group2.id] + "flash_update": flash_update.id, + "donors": [donor1.id, donor2.id, donor3.id], + "donor_groups": [donor_group1.id, donor_group2.id], } - response = self.client.post('/api/v2/share-flash-update/', data, format='json').json() - self.assertEqual(response['flash_update'], flash_update.id) - self.assertIn(donor1.id, response['donors']) - self.assertIn(donor_group1.id, response['donor_groups']) + response = self.client.post("/api/v2/share-flash-update/", data, format="json").json() + self.assertEqual(response["flash_update"], flash_update.id) + self.assertIn(donor1.id, response["donors"]) + self.assertIn(donor_group1.id, response["donor_groups"]) self.assertTrue(render_to_pdf.assert_called) # check if send_notifications function is called. self.assertTrue(send_notification.assert_called) - @mock.patch('flash_update.utils.render_to_pdf') + @mock.patch("flash_update.utils.render_to_pdf") def test_flash_update_pdf_export(self, render_to_pdf): - render_to_pdf.return_value = { - 'filename': "test.pdf", - 'file': b'pdf content' - } + render_to_pdf.return_value = {"filename": "test.pdf", "file": b"pdf content"} self.client.force_authenticate(user=self.user) with self.capture_on_commit_callbacks(execute=True): - response = self.client.post('/api/v2/flash-update/', self.body, format='json').json() - flash_update = FlashUpdate.objects.get(id=response['id']) + response = self.client.post("/api/v2/flash-update/", self.body, format="json").json() + flash_update = FlashUpdate.objects.get(id=response["id"]) with self.capture_on_commit_callbacks(execute=True): - response = self.client.get(f'/api/v2/export-flash-update/{flash_update.id}/', format='json') + response = self.client.get(f"/api/v2/export-flash-update/{flash_update.id}/", format="json") content = response.json() - self.assertEqual(content['status'], "pending") - self.assertEqual(content['url'], None) + self.assertEqual(content["status"], "pending") + self.assertEqual(content["url"], None) with self.capture_on_commit_callbacks(execute=True): - response = self.client.get(f'/api/v2/export-flash-update/{flash_update.id}/', format='json') + response = self.client.get(f"/api/v2/export-flash-update/{flash_update.id}/", format="json") content = response.json() - self.assertEqual(content['status'], "ready") - self.assertIsNotNone(content['url']) + self.assertEqual(content["status"], "ready") + self.assertIsNotNone(content["url"]) diff --git a/flash_update/translation.py b/flash_update/translation.py index 3f966428d..0d7764fe9 100644 --- a/flash_update/translation.py +++ b/flash_update/translation.py @@ -1,8 +1,11 @@ -from modeltranslation.translator import register, TranslationOptions +from modeltranslation.translator import TranslationOptions, register from .models import FlashUpdate @register(FlashUpdate) class FlashUpdateTO(TranslationOptions): - fields = ('title', 'situational_overview',) + fields = ( + "title", + "situational_overview", + ) diff --git a/flash_update/utils.py b/flash_update/utils.py index 4fc5dfee0..381e8ece3 100644 --- a/flash_update/utils.py +++ b/flash_update/utils.py @@ -2,12 +2,10 @@ from io import BytesIO from django.template.loader import render_to_string - from xhtml2pdf import pisa -from main.frontend import get_flash_update_url - from flash_update.models import FlashGraphicMap +from main.frontend import get_flash_update_url logger = logging.getLogger(__name__) @@ -18,21 +16,18 @@ def render_to_pdf(template_src, context_dict={}): try: pdf = pisa.pisaDocument(BytesIO(html.encode("UTF-8")), result) if not pdf.err: - file = { - 'filename': 'flash_update.pdf', - 'file': result.getvalue() - } + file = {"filename": "flash_update.pdf", "file": result.getvalue()} return file except Exception as e: - logger.error('Error in rendering html to pdf', exc_info=True) + logger.error("Error in rendering html to pdf", exc_info=True) return None def generate_file_data(data): return [ { - 'image': item.file.url, - 'caption': item.caption, + "image": item.file.url, + "caption": item.caption, } for item in data ] @@ -46,27 +41,22 @@ def get_email_context(instance): graphics_data = FlashGraphicMap.objects.filter(flash_graphics=instance) map_list = generate_file_data(map_data) graphics_list = generate_file_data(graphics_data) - actions_taken = [dict(action_taken) for action_taken in flash_update_data['actions_taken']] - resources = [dict(reference) for reference in flash_update_data['references']] + actions_taken = [dict(action_taken) for action_taken in flash_update_data["actions_taken"]] + resources = [dict(reference) for reference in flash_update_data["references"]] documents_map = { document.id: document.file.url - for document in FlashGraphicMap.objects.filter( - id__in=[ - resource['document'] - for resource in resources - ] - ).only('id', 'file') + for document in FlashGraphicMap.objects.filter(id__in=[resource["document"] for resource in resources]).only("id", "file") } for resource in resources: - resource['flash_file'] = documents_map.get(resource['document']) + resource["flash_file"] = documents_map.get(resource["document"]) email_context = { - 'resource_url': get_flash_update_url(instance.id), - 'title': flash_update_data['title'], - 'situational_overview': flash_update_data['situational_overview'], - 'map_list': map_list, - 'graphic_list': graphics_list, - 'actions_taken': actions_taken, - 'resources': resources, + "resource_url": get_flash_update_url(instance.id), + "title": flash_update_data["title"], + "situational_overview": flash_update_data["situational_overview"], + "map_list": map_list, + "graphic_list": graphics_list, + "actions_taken": actions_taken, + "resources": resources, } return email_context diff --git a/flash_update/views.py b/flash_update/views.py index a054ccfd7..cfad401fa 100644 --- a/flash_update/views.py +++ b/flash_update/views.py @@ -1,38 +1,38 @@ from django.db import transaction from django.shortcuts import get_object_or_404 - -from rest_framework.response import Response -from rest_framework import serializers +from drf_spectacular.utils import extend_schema from rest_framework import ( - views, - viewsets, - permissions, - status, mixins, + permissions, response, + serializers, + status, + views, + viewsets, ) from rest_framework.decorators import action -from drf_spectacular.utils import extend_schema +from rest_framework.response import Response from api.serializers import ActionSerializer + +from .filter_set import FlashUpdateFilter from .models import ( - FlashUpdate, - FlashGraphicMap, - FlashAction, DonorGroup, Donors, + FlashAction, + FlashGraphicMap, + FlashUpdate, FlashUpdateShare, ) from .serializers import ( - FlashUpdateSerializer, - FlashGraphicMapSerializer, DonorGroupSerializer, DonorsSerializer, - ShareFlashUpdateSerializer, ExportFlashUpdateViewSerializer, - FlashGraphicMapFileInputSerializer + FlashGraphicMapFileInputSerializer, + FlashGraphicMapSerializer, + FlashUpdateSerializer, + ShareFlashUpdateSerializer, ) -from .filter_set import FlashUpdateFilter from .tasks import export_to_pdf @@ -42,55 +42,51 @@ class FlashUpdateViewSet(viewsets.ModelViewSet): filterset_class = FlashUpdateFilter def get_queryset(self): - return FlashUpdate.objects.all().select_related( - 'hazard_type', - 'created_by', - 'modified_by', - ).prefetch_related( - 'references', - 'references__document', - 'map', - 'map__created_by', - 'graphics', - 'graphics__created_by', - 'actions_taken_flash__flash_update', - 'actions_taken_flash__actions', - 'flash_country_district__flash_update', - 'flash_country_district__country', - 'flash_country_district__district' - ).order_by('-created_at').distinct() - - -class FlashUpdateFileViewSet( - mixins.ListModelMixin, - mixins.CreateModelMixin, - viewsets.GenericViewSet -): + return ( + FlashUpdate.objects.all() + .select_related( + "hazard_type", + "created_by", + "modified_by", + ) + .prefetch_related( + "references", + "references__document", + "map", + "map__created_by", + "graphics", + "graphics__created_by", + "actions_taken_flash__flash_update", + "actions_taken_flash__actions", + "flash_country_district__flash_update", + "flash_country_district__country", + "flash_country_district__district", + ) + .order_by("-created_at") + .distinct() + ) + + +class FlashUpdateFileViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet): permission_class = [permissions.IsAuthenticated] serializer_class = FlashGraphicMapSerializer def get_queryset(self): - return FlashGraphicMap.objects.all().select_related('created_by') + return FlashGraphicMap.objects.all().select_related("created_by") - @extend_schema( - request=FlashGraphicMapFileInputSerializer, - responses=FlashGraphicMapSerializer(many=True) - ) + @extend_schema(request=FlashGraphicMapFileInputSerializer, responses=FlashGraphicMapSerializer(many=True)) @action( detail=False, - url_path='multiple', - methods=['POST'], + url_path="multiple", + methods=["POST"], permission_classes=[permissions.IsAuthenticated], ) def multiple_file(self, request, pk=None, version=None): - files = [ - files[0] - for files in dict((request.data).lists()).values() - ] + files = [files[0] for files in dict((request.data).lists()).values()] data = [{"file": file} for file in files] if len(data) > 3: raise serializers.ValidationError("Number of files selected should not be greater than 3") - file_serializer = FlashGraphicMapSerializer(data=data, context={'request': request}, many=True) + file_serializer = FlashGraphicMapSerializer(data=data, context={"request": request}, many=True) if file_serializer.is_valid(): file_serializer.save() return response.Response(file_serializer.data, status=status.HTTP_201_CREATED) @@ -113,11 +109,7 @@ class DonorsViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = DonorsSerializer -class ShareFlashUpdateViewSet( - mixins.CreateModelMixin, - mixins.RetrieveModelMixin, - viewsets.GenericViewSet -): +class ShareFlashUpdateViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): queryset = FlashUpdateShare.objects.all() serializer_class = ShareFlashUpdateSerializer permission_class = [permissions.IsAuthenticated] @@ -126,26 +118,15 @@ class ShareFlashUpdateViewSet( class ExportFlashUpdateView(views.APIView): permission_classes = [permissions.IsAuthenticated] - @extend_schema( - request=None, - responses=ExportFlashUpdateViewSerializer - ) + @extend_schema(request=None, responses=ExportFlashUpdateViewSerializer) def get(self, request, pk, format=None): flash_update = get_object_or_404(FlashUpdate, pk=pk) if flash_update.extracted_file and flash_update.modified_at < flash_update.extracted_at: - return Response(ExportFlashUpdateViewSerializer( - dict( - status='ready', - url=request.build_absolute_uri(flash_update.extracted_file.url) - ) - ).data) - else: - transaction.on_commit( - lambda: export_to_pdf.delay(flash_update.id) + return Response( + ExportFlashUpdateViewSerializer( + dict(status="ready", url=request.build_absolute_uri(flash_update.extracted_file.url)) + ).data ) - return Response(ExportFlashUpdateViewSerializer( - dict( - status='pending', - url=None - ) - ).data) + else: + transaction.on_commit(lambda: export_to_pdf.delay(flash_update.id)) + return Response(ExportFlashUpdateViewSerializer(dict(status="pending", url=None)).data) diff --git a/lang/admin.py b/lang/admin.py index 505758ffc..a7387416e 100644 --- a/lang/admin.py +++ b/lang/admin.py @@ -1,39 +1,36 @@ +from django.contrib import admin +from django.db import models +from django.shortcuts import redirect +from django.urls import path, reverse +from django.utils.translation import get_language, gettext +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import override as translation_override +from modeltranslation.admin import TranslationAdmin as O_TranslationAdmin from modeltranslation.admin import ( - TranslationAdmin as O_TranslationAdmin, TranslationInlineModelAdmin as O_TranslationInlineModelAdmin, ) -from modeltranslation.utils import build_localized_fieldname -from modeltranslation.translator import translator from modeltranslation.manager import ( - MultilingualQuerySet, FallbackValuesIterable, + MultilingualQuerySet, append_fallback, ) +from modeltranslation.translator import translator +from modeltranslation.utils import build_localized_fieldname -from django.contrib import admin -from django.db import models -from django.urls import reverse, path -from django.shortcuts import redirect -from django.utils.translation import ( - get_language, - gettext, - gettext_lazy as _, - override as translation_override, +from main.translation import ( + TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME, + TRANSLATOR_SKIP_FIELD_NAME, ) -# from middlewares.middlewares import get_signal_request - -from main.translation import TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME, TRANSLATOR_SKIP_FIELD_NAME -from .translation import AVAILABLE_LANGUAGES +from .models import String from .serializers import TranslatedModelSerializerMixin +from .translation import AVAILABLE_LANGUAGES -from .models import ( - String, -) +# from middlewares.middlewares import get_signal_request -class TranslationAdminMixin(): - SHOW_ALL_LANGUAGE_TOGGLE_SESSION_NAME = 'GO__TRANS_SHOW_ALL_LANGUAGE_IN_FORM' +class TranslationAdminMixin: + SHOW_ALL_LANGUAGE_TOGGLE_SESSION_NAME = "GO__TRANS_SHOW_ALL_LANGUAGE_IN_FORM" def _go__show_all_language_in_form(self): # return get_signal_request().session.get(self.SHOW_ALL_LANGUAGE_TOGGLE_SESSION_NAME, False) @@ -46,11 +43,14 @@ def _exclude_original_fields(self, exclude=None): return exclude current_lang = get_language() # Exclude other languages - return exclude + tuple([ - build_localized_fieldname(field, lang) - for field in self.trans_opts.fields.keys() - for lang in AVAILABLE_LANGUAGES if lang != current_lang - ]) + return exclude + tuple( + [ + build_localized_fieldname(field, lang) + for field in self.trans_opts.fields.keys() + for lang in AVAILABLE_LANGUAGES + if lang != current_lang + ] + ) class TranslationAdmin(TranslationAdminMixin, O_TranslationAdmin): @@ -58,13 +58,13 @@ class TranslationAdmin(TranslationAdminMixin, O_TranslationAdmin): def get_url_namespace(self, name, absolute=True): meta = self.model._meta - namespace = f'{meta.app_label}_{meta.model_name}_{name}' - return f'admin:{namespace}' if absolute else namespace + namespace = f"{meta.app_label}_{meta.model_name}_{name}" + return f"admin:{namespace}" if absolute else namespace def get_additional_addlinks(self, request): - url = reverse(self.get_url_namespace('toggle_edit_all_language')) + f'?next={request.get_full_path()}' - label = gettext('hide all language') if self._go__show_all_language_in_form() else gettext('show all language') - return [{'url': url, 'label': label}] + url = reverse(self.get_url_namespace("toggle_edit_all_language")) + f"?next={request.get_full_path()}" + label = gettext("hide all language") if self._go__show_all_language_in_form() else gettext("show all language") + return [{"url": url, "label": label}] def get_list_filter(self, request): return [ @@ -73,21 +73,22 @@ def get_list_filter(self, request): TRANSLATOR_SKIP_FIELD_NAME, ] - def change_view(self, request, object_id, form_url='', extra_context=None): + def change_view(self, request, object_id, form_url="", extra_context=None): extra_context = extra_context or {} - extra_context['additional_addlinks'] = extra_context.get('additional_addlinks') or [] + extra_context["additional_addlinks"] = extra_context.get("additional_addlinks") or [] return super().change_view(request, object_id, form_url, extra_context=extra_context) - def add_view(self, request, form_url='', extra_context=None): + def add_view(self, request, form_url="", extra_context=None): extra_context = extra_context or {} - extra_context['additional_addlinks'] = extra_context.get('additional_addlinks') or [] + extra_context["additional_addlinks"] = extra_context.get("additional_addlinks") or [] return super().add_view(request, form_url, extra_context=extra_context) def get_urls(self): return [ path( - 'toggle-edit-all-language/', self.admin_site.admin_view(self.toggle_edit_all_language), - name=self.get_url_namespace('toggle_edit_all_language', False) + "toggle-edit-all-language/", + self.admin_site.admin_view(self.toggle_edit_all_language), + name=self.get_url_namespace("toggle_edit_all_language", False), ), ] + super().get_urls() @@ -95,7 +96,7 @@ def toggle_edit_all_language(self, request): request.session[self.SHOW_ALL_LANGUAGE_TOGGLE_SESSION_NAME] = not request.session.get( self.SHOW_ALL_LANGUAGE_TOGGLE_SESSION_NAME, False ) - return redirect(request.GET.get('next')) + return redirect(request.GET.get("next")) def save_model(self, request, obj, form, change): # To trigger translate @@ -129,16 +130,13 @@ def save_formset(self, request, form, formset, change): def get_search_fields(self, request): # Ex. 'name' is translatable - add 'name_fr', 'name_es', etc - concated_search = ( - list(self.search_fields) + TranslatedModelSerializerMixin._get_translated_searchfields_list( - self.model, self.search_fields - ) + concated_search = list(self.search_fields) + TranslatedModelSerializerMixin._get_translated_searchfields_list( + self.model, self.search_fields ) return concated_search -class TranslationInlineModelAdmin(TranslationAdminMixin, O_TranslationInlineModelAdmin): - ... +class TranslationInlineModelAdmin(TranslationAdminMixin, O_TranslationInlineModelAdmin): ... # NOTE: Fixing modeltranslation Queryset to support experssions in Queryset values() @@ -171,64 +169,64 @@ def multilingual_queryset_values(self, *fields, **expressions): class StringStaleFilter(admin.SimpleListFilter): - title = _('Stale strings') - parameter_name = 'is_stale' + title = _("Stale strings") + parameter_name = "is_stale" def lookups(self, *_): return [ - (True, 'True'), + (True, "True"), ] def queryset(self, _, queryset): value = self.value() if value is None: return queryset - queryset = queryset.exclude(language='en').annotate( + queryset = queryset.exclude(language="en").annotate( en_value_hash=models.Subquery( String.objects.filter( - page_name=models.OuterRef('page_name'), - key=models.OuterRef('key'), - language='en', - ).values('hash')[:1], + page_name=models.OuterRef("page_name"), + key=models.OuterRef("key"), + language="en", + ).values( + "hash" + )[:1], output_field=models.CharField(), ), ) - return queryset.exclude( - hash=models.F('en_value_hash') - ) + return queryset.exclude(hash=models.F("en_value_hash")) @admin.register(String) class StringAdmin(admin.ModelAdmin): search_fields = ( - 'key', - 'page_name', - 'value', - 'hash', + "key", + "page_name", + "value", + "hash", ) list_display = ( - 'page_name', - 'key', - 'language', - 'value', - 'hash', + "page_name", + "key", + "language", + "value", + "hash", ) list_filter = ( - 'language', + "language", StringStaleFilter, ) readonly_fields = ( - 'language', - 'page_name', - 'key', - 'hash', + "language", + "page_name", + "key", + "hash", ) def has_add_permission(self, *_): return False def has_change_permission(self, _, obj=None): - if obj and obj.language == 'en': + if obj and obj.language == "en": return False return True @@ -243,6 +241,6 @@ def save_model(self, request, obj, form, change): obj.hash = String.objects.get( page_name=obj.page_name, key=obj.key, - language='en', + language="en", ).hash super().save_model(request, obj, form, change) diff --git a/lang/apps.py b/lang/apps.py index 0875bc635..fa6504ee0 100644 --- a/lang/apps.py +++ b/lang/apps.py @@ -1,7 +1,7 @@ -from django.utils.translation import gettext_lazy as _ from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class LangConfig(AppConfig): - name = 'lang' - verbose_name = _('lang') + name = "lang" + verbose_name = _("lang") diff --git a/lang/management/commands/client-translation-export.py b/lang/management/commands/client-translation-export.py index 739df595d..3cdd6cff5 100644 --- a/lang/management/commands/client-translation-export.py +++ b/lang/management/commands/client-translation-export.py @@ -1,8 +1,9 @@ import csv import hashlib +from argparse import FileType from collections import defaultdict from sys import stdout -from argparse import FileType + from django.core.management import BaseCommand from django.db import transaction @@ -11,30 +12,30 @@ def get_md5_hash(value): hash_md5 = hashlib.md5() - hash_md5.update(value.encode('UTF-8')) + hash_md5.update(value.encode("UTF-8")) return hash_md5.hexdigest() class Command(BaseCommand): - help = 'Export client translation data to csv' + help = "Export client translation data to csv" def add_arguments(self, parser): - parser.add_argument('output_file', nargs='?', type=FileType('w'), default=stdout) + parser.add_argument("output_file", nargs="?", type=FileType("w"), default=stdout) @transaction.atomic def handle(self, *_, **options): - output_file = options['output_file'] + output_file = options["output_file"] # Collect all data from csv csv_writer = csv.DictWriter( output_file, fieldnames=( - 'page_name', - 'key', - 'value', - 'es', - 'fr', - 'ar', - ) + "page_name", + "key", + "value", + "es", + "fr", + "ar", + ), ) string_qs = String.objects.all() @@ -49,14 +50,14 @@ def handle(self, *_, **options): ar: ar-value """ - self.stdout.write(f'Total String: {string_qs.count()}') + self.stdout.write(f"Total String: {string_qs.count()}") csv_writer.writeheader() for string in string_qs: - code = f'{string.page_name}-{string.key}' - if string.language == 'en': - string_data[code]['key'] = string.key - string_data[code]['page_name'] = string.page_name - string_data[code]['value'] = string.value + code = f"{string.page_name}-{string.key}" + if string.language == "en": + string_data[code]["key"] = string.key + string_data[code]["page_name"] = string.page_name + string_data[code]["value"] = string.value else: string_data[code][string.language] = string.value for string_datum in string_data.values(): diff --git a/lang/management/commands/client-translation-import.py b/lang/management/commands/client-translation-import.py index 869340f84..4fc06bcd5 100644 --- a/lang/management/commands/client-translation-import.py +++ b/lang/management/commands/client-translation-import.py @@ -1,7 +1,8 @@ import csv import hashlib -from sys import stdin from argparse import FileType +from sys import stdin + from django.core.management import BaseCommand from django.db import transaction @@ -10,22 +11,22 @@ def get_md5_hash(value): hash_md5 = hashlib.md5() - hash_md5.update(value.encode('UTF-8')) + hash_md5.update(value.encode("UTF-8")) return hash_md5.hexdigest() class Command(BaseCommand): - help = 'Import from csv and update client translation data. lang.models.py:String' + help = "Import from csv and update client translation data. lang.models.py:String" def add_arguments(self, parser): - parser.add_argument('input_file', nargs='?', type=FileType('r'), default=stdin) + parser.add_argument("input_file", nargs="?", type=FileType("r"), default=stdin) @transaction.atomic def handle(self, *_, **options): - input_file = options['input_file'] + input_file = options["input_file"] if input_file.isatty(): self.stderr.write( - self.style.ERROR('Empty file'), + self.style.ERROR("Empty file"), ) return @@ -33,20 +34,20 @@ def handle(self, *_, **options): reader = csv.DictReader(input_file) updated = 0 for row in reader: - string_key = row['key'] + string_key = row["key"] if string_key is None: continue - page_name = row['page_name'] - string_value_en = row['value'] + page_name = row["page_name"] + string_value_en = row["value"] string_value_hash = get_md5_hash(string_value_en) - self.stdout.write(f'Saving {string_key}') + self.stdout.write(f"Saving {string_key}") for lang, _ in String.language.field.choices: client_string, _ = String.objects.get_or_create( key=string_key, page_name=page_name, language=lang, ) - if lang == 'en': + if lang == "en": client_string.value = string_value_en else: client_string.value = row[lang] @@ -54,5 +55,5 @@ def handle(self, *_, **options): client_string.save() updated += 1 self.stdout.write( - self.style.SUCCESS(f'Saved {updated} strings'), + self.style.SUCCESS(f"Saved {updated} strings"), ) diff --git a/lang/management/commands/static-translation-export.py b/lang/management/commands/static-translation-export.py index 31e1c738d..1bd5b944c 100644 --- a/lang/management/commands/static-translation-export.py +++ b/lang/management/commands/static-translation-export.py @@ -1,40 +1,37 @@ import csv -import polib -from pathlib import Path from collections import defaultdict +from pathlib import Path + +import polib from django.conf import settings from django.core.management import BaseCommand - AVAILABLE_LANGUAGES = [lang for lang, _ in settings.LANGUAGES] class Command(BaseCommand): - help = 'Export django po files to csv' + help = "Export django po files to csv" def add_arguments(self, parser): parser.add_argument("csv_file", type=Path) parser.add_argument( - '--languages', nargs='+', + "--languages", + nargs="+", choices=AVAILABLE_LANGUAGES, - help='Languages to export. Default is all', - ) - parser.add_argument( - '--only-new', - action='store_true', - help='Only include new(empty) strings' + help="Languages to export. Default is all", ) + parser.add_argument("--only-new", action="store_true", help="Only include new(empty) strings") def handle(self, *args, **options): - languages = options['languages'] or AVAILABLE_LANGUAGES - only_new = options['only_new'] - csv_file_path = options['csv_file'] + languages = options["languages"] or AVAILABLE_LANGUAGES + only_new = options["only_new"] + csv_file_path = options["csv_file"] default_language = settings.LANGUAGE_CODE # Collect all data from po translation_data = defaultdict(lambda: defaultdict(lambda: defaultdict(str))) - for file in Path('').glob(f"**/{default_language}/**/*.po"): - path_pattern = str(file).replace(f'/{default_language}/', '/{language}/') + for file in Path("").glob(f"**/{default_language}/**/*.po"): + path_pattern = str(file).replace(f"/{default_language}/", "/{language}/") for lang in languages: po = polib.pofile(path_pattern.format(language=lang)) for s in po: @@ -47,17 +44,16 @@ def handle(self, *args, **options): del translation_data[path_pattern][msgid] # Write to csv - headers = ['file', 'msgid'] + languages - with open(csv_file_path, 'w') as fp: - writer = csv.DictWriter(fp, fieldnames=headers, delimiter=',', lineterminator='\n') + headers = ["file", "msgid"] + languages + with open(csv_file_path, "w") as fp: + writer = csv.DictWriter(fp, fieldnames=headers, delimiter=",", lineterminator="\n") writer.writeheader() for path_pattern, msgid_data in translation_data.items(): for msgid, values in msgid_data.items(): - writer.writerow({ - 'file': path_pattern, - 'msgid': msgid, - **{ - lang: values[lang] - for lang in languages - }, - }) + writer.writerow( + { + "file": path_pattern, + "msgid": msgid, + **{lang: values[lang] for lang in languages}, + } + ) diff --git a/lang/management/commands/static-translation-import.py b/lang/management/commands/static-translation-import.py index d17395182..4a8b7c909 100644 --- a/lang/management/commands/static-translation-import.py +++ b/lang/management/commands/static-translation-import.py @@ -1,25 +1,22 @@ import csv -import polib from collections import defaultdict from pathlib import Path + +import polib from django.conf import settings from django.core.management import BaseCommand class Command(BaseCommand): - help = 'Import from csv and update django po files' + help = "Import from csv and update django po files" def add_arguments(self, parser): parser.add_argument("csv_file", type=Path) - parser.add_argument( - '--partial-update', - action='store_true', - help='Don\'t enforce all languages' - ) + parser.add_argument("--partial-update", action="store_true", help="Don't enforce all languages") def handle(self, *args, **options): - csv_file_path = options['csv_file'] - partial_update = options['partial_update'] + csv_file_path = options["csv_file"] + partial_update = options["partial_update"] # Collect all data from csv translation_data = defaultdict(lambda: defaultdict(dict)) @@ -27,13 +24,9 @@ def handle(self, *args, **options): reader = csv.DictReader(fp) for row in reader: # Default language po file path eg: api/locale/{language}/LC_MESSAGES/django.po - path_pattern = row['file'] - msgid = row['msgid'] - values = { - lang: row[lang] - for lang, _ in settings.LANGUAGES - if row.get(lang) or not partial_update - } + path_pattern = row["file"] + msgid = row["msgid"] + values = {lang: row[lang] for lang, _ in settings.LANGUAGES if row.get(lang) or not partial_update} translation_data[path_pattern][msgid] = values # Write to po diff --git a/lang/management/commands/translate_model.py b/lang/management/commands/translate_model.py index 03fa7841e..899dfcef8 100644 --- a/lang/management/commands/translate_model.py +++ b/lang/management/commands/translate_model.py @@ -1,27 +1,27 @@ import logging + from django.core.management import BaseCommand from lang.tasks import ModelTranslator class Command(BaseCommand): - help = 'Use Amazon Translate to translate all models translated field\'s values' + help = "Use Amazon Translate to translate all models translated field's values" def add_arguments(self, parser): parser.add_argument( - '--batch-size', metavar='N', type=int, default=None, - help='how many instances to translate for each model' + "--batch-size", metavar="N", type=int, default=None, help="how many instances to translate for each model" ) parser.add_argument( - '--show-counts-only', - action='store_true', - help='Show characters counts only', + "--show-counts-only", + action="store_true", + help="Show characters counts only", ) def handle(self, *args, **options): - logging.getLogger('').setLevel(logging.INFO) - if options.get('show_counts_only'): + logging.getLogger("").setLevel(logging.INFO) + if options.get("show_counts_only"): ModelTranslator.show_characters_counts() else: - ModelTranslator().run(batch_size=options.pop('batch_size')) + ModelTranslator().run(batch_size=options.pop("batch_size")) diff --git a/lang/management/commands/translate_po.py b/lang/management/commands/translate_po.py index 84f520160..f236dbeb3 100644 --- a/lang/management/commands/translate_po.py +++ b/lang/management/commands/translate_po.py @@ -3,9 +3,10 @@ from pathlib import Path import polib -from lang.translation import AVAILABLE_LANGUAGES, get_translator_class from django.core.management import BaseCommand +from lang.translation import AVAILABLE_LANGUAGES, get_translator_class + def translate_po_file(po, language): """ @@ -17,38 +18,34 @@ def translate_po_file(po, language): # We replace the formatting specifiers with something # that Amazon Translate will just assume is a title and # not translate. - subbed_message = re.sub( - r'%\((\w+)\)s', r'FORMAT_\1_END', s.msgid - ) + subbed_message = re.sub(r"%\((\w+)\)s", r"FORMAT_\1_END", s.msgid) # Translate the text itself response = translate.translate_text( subbed_message, language, - source_language='en', + source_language="en", ) # Put back the correct gettext formatting - s.msgstr = re.sub( - r'FORMAT_(\w+)_END', r'%(\1)s', - response['TranslatedText'] - ) + s.msgstr = re.sub(r"FORMAT_(\w+)_END", r"%(\1)s", response["TranslatedText"]) return po class Command(BaseCommand): - help = 'Use Amazon Translate to translate all the .po files, Already translated strings are not touched' + help = "Use Amazon Translate to translate all the .po files, Already translated strings are not touched" def add_arguments(self, parser): parser.add_argument( - '--languages', nargs='+', + "--languages", + nargs="+", choices=AVAILABLE_LANGUAGES, - help='Languages to translate. Default is all', + help="Languages to translate. Default is all", ) def handle(self, *args, **options): - languages = options['languages'] or AVAILABLE_LANGUAGES + languages = options["languages"] or AVAILABLE_LANGUAGES for language in languages: - for file in Path('').glob(f'**/{language}/**/*.po'): - print(f'Translating: {file} ({language})') + for file in Path("").glob(f"**/{language}/**/*.po"): + print(f"Translating: {file} ({language})") po = polib.pofile(file) po = translate_po_file(po, language) po.save(file) diff --git a/lang/migrations/0001_initial.py b/lang/migrations/0001_initial.py index 5f6c6f908..a463b4a2a 100644 --- a/lang/migrations/0001_initial.py +++ b/lang/migrations/0001_initial.py @@ -1,35 +1,34 @@ # Generated by Django 2.2.10 on 2020-05-25 07:30 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='Language', + name="Language", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.CharField(max_length=255, unique=True)), - ('description', models.TextField(blank=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("code", models.CharField(max_length=255, unique=True)), + ("description", models.TextField(blank=True)), ], ), migrations.CreateModel( - name='String', + name="String", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('key', models.CharField(max_length=255)), - ('value', models.TextField()), - ('language', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='lang.Language')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("key", models.CharField(max_length=255)), + ("value", models.TextField()), + ("language", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="lang.Language")), ], options={ - 'unique_together': {('language', 'key')}, + "unique_together": {("language", "key")}, }, ), ] diff --git a/lang/migrations/0002_auto_20200603_0613.py b/lang/migrations/0002_auto_20200603_0613.py index 551580860..bad86f25b 100644 --- a/lang/migrations/0002_auto_20200603_0613.py +++ b/lang/migrations/0002_auto_20200603_0613.py @@ -6,16 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('lang', '0001_initial'), + ("lang", "0001_initial"), ] operations = [ migrations.AlterModelOptions( - name='language', - options={'verbose_name': 'Language', 'verbose_name_plural': 'Languages'}, + name="language", + options={"verbose_name": "Language", "verbose_name_plural": "Languages"}, ), migrations.AlterModelOptions( - name='string', - options={'verbose_name': 'String', 'verbose_name_plural': 'Strings'}, + name="string", + options={"verbose_name": "String", "verbose_name_plural": "Strings"}, ), ] diff --git a/lang/migrations/0003_auto_20200610_0911.py b/lang/migrations/0003_auto_20200610_0911.py index a187a68a6..d4fba2936 100644 --- a/lang/migrations/0003_auto_20200610_0911.py +++ b/lang/migrations/0003_auto_20200610_0911.py @@ -6,18 +6,20 @@ class Migration(migrations.Migration): dependencies = [ - ('lang', '0002_auto_20200603_0613'), + ("lang", "0002_auto_20200603_0613"), ] operations = [ migrations.AddField( - model_name='string', - name='hash', + model_name="string", + name="hash", field=models.CharField(blank=True, max_length=32, null=True), ), migrations.AlterField( - model_name='language', - name='code', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], max_length=255, unique=True), + model_name="language", + name="code", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], max_length=255, unique=True + ), ), ] diff --git a/lang/migrations/0004_auto_20200616_0713.py b/lang/migrations/0004_auto_20200616_0713.py index 1a2673a87..1d7955b72 100644 --- a/lang/migrations/0004_auto_20200616_0713.py +++ b/lang/migrations/0004_auto_20200616_0713.py @@ -6,31 +6,35 @@ class Migration(migrations.Migration): dependencies = [ - ('lang', '0003_auto_20200610_0911'), + ("lang", "0003_auto_20200610_0911"), ] operations = [ migrations.AlterField( - model_name='string', - name='hash', - field=models.CharField(blank=True, max_length=32, null=True, verbose_name='hash'), + model_name="string", + name="hash", + field=models.CharField(blank=True, max_length=32, null=True, verbose_name="hash"), ), migrations.AlterField( - model_name='string', - name='key', - field=models.CharField(max_length=255, verbose_name='key'), + model_name="string", + name="key", + field=models.CharField(max_length=255, verbose_name="key"), ), migrations.AlterField( - model_name='string', - name='language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], max_length=8, verbose_name='language'), + model_name="string", + name="language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + max_length=8, + verbose_name="language", + ), ), migrations.AlterField( - model_name='string', - name='value', - field=models.TextField(verbose_name='value'), + model_name="string", + name="value", + field=models.TextField(verbose_name="value"), ), migrations.DeleteModel( - name='Language', + name="Language", ), ] diff --git a/lang/migrations/0005_string_page_name.py b/lang/migrations/0005_string_page_name.py index d0a56d65b..412ad3a70 100644 --- a/lang/migrations/0005_string_page_name.py +++ b/lang/migrations/0005_string_page_name.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('lang', '0004_auto_20200616_0713'), + ("lang", "0004_auto_20200616_0713"), ] operations = [ migrations.AddField( - model_name='string', - name='page_name', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Page name'), + model_name="string", + name="page_name", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Page name"), ), ] diff --git a/lang/migrations/0006_alter_string_unique_together.py b/lang/migrations/0006_alter_string_unique_together.py index 179d47192..859394778 100644 --- a/lang/migrations/0006_alter_string_unique_together.py +++ b/lang/migrations/0006_alter_string_unique_together.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('lang', '0005_string_page_name'), + ("lang", "0005_string_page_name"), ] operations = [ migrations.AlterUniqueTogether( - name='string', - unique_together={('language', 'page_name', 'key')}, + name="string", + unique_together={("language", "page_name", "key")}, ), ] diff --git a/lang/models.py b/lang/models.py index 37bbbae36..dcf18ccb2 100644 --- a/lang/models.py +++ b/lang/models.py @@ -1,6 +1,6 @@ -from django.utils.translation import gettext_lazy as _ from django.conf import settings from django.db import models +from django.utils.translation import gettext_lazy as _ class String(models.Model): @@ -31,6 +31,5 @@ def has_perm(cls, user, lang_code): @classmethod def get_user_permissions_per_language(cls, user): return { - lang_code: user.has_perm(cls._get_permission_per_language_codename(lang_code)) - for lang_code, _ in settings.LANGUAGES + lang_code: user.has_perm(cls._get_permission_per_language_codename(lang_code)) for lang_code, _ in settings.LANGUAGES } diff --git a/lang/permissions.py b/lang/permissions.py index d6d1811ab..a3d051eb4 100644 --- a/lang/permissions.py +++ b/lang/permissions.py @@ -1,4 +1,5 @@ from rest_framework import permissions + from .models import String @@ -12,11 +13,15 @@ def has_permission(self, request, view): # so we'll always allow GET, HEAD or OPTIONS requests. (`view` is allowed for all) if request.method in permissions.SAFE_METHODS: return True - if request.method == 'POST' and \ - hasattr(request, '_request') and request.path[:6] == '/docs/' and \ - hasattr(view, 'basename') and view.basename == 'language': + if ( + request.method == "POST" + and hasattr(request, "_request") + and request.path[:6] == "/docs/" + and hasattr(view, "basename") + and view.basename == "language" + ): return True - return String.has_perm(request.user, view.kwargs.get('pk')) + return String.has_perm(request.user, view.kwargs.get("pk")) def has_object_permission(self, request, view, obj): return self.has_permission(self, request, view) diff --git a/lang/serializers.py b/lang/serializers.py index f17fe6195..904914aaf 100644 --- a/lang/serializers.py +++ b/lang/serializers.py @@ -1,22 +1,22 @@ import logging -from rest_framework import serializers -from django.db import transaction + from django.conf import settings -from django.utils.translation import gettext, get_language as django_get_language -from modeltranslation.utils import build_localized_fieldname +from django.db import transaction +from django.utils.translation import get_language as django_get_language +from django.utils.translation import gettext +from modeltranslation.manager import get_translatable_fields_for_model from modeltranslation.translator import translator -from modeltranslation.manager import ( - get_translatable_fields_for_model, -) +from modeltranslation.utils import build_localized_fieldname +from rest_framework import serializers -from main.translation import skip_auto_translation, TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME from api.utils import get_model_name - -from .tasks import translate_model_fields, translate_model_fields_in_bulk -from .models import ( - String, +from main.translation import ( + TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME, + skip_auto_translation, ) +from .models import String +from .tasks import translate_model_fields, translate_model_fields_in_bulk logger = logging.getLogger(__name__) @@ -109,9 +109,9 @@ def _get_language_clear_validated_data(cls, instance, validated_data, included_f if lang_field == current_lang_field: continue if type(validated_data) == dict: - validated_data[lang_field] = '' + validated_data[lang_field] = "" else: # NOTE: Assuming it's model instance - setattr(validated_data, lang_field, '') + setattr(validated_data, lang_field, "") cleared = True return cleared @@ -120,20 +120,13 @@ def trigger_field_translation(cls, instance): if skip_auto_translation(instance): # Skip translation return - transaction.on_commit( - lambda: translate_model_fields.delay(get_model_name(type(instance)), instance.pk) - ) + transaction.on_commit(lambda: translate_model_fields.delay(get_model_name(type(instance)), instance.pk)) @classmethod def trigger_field_translation_in_bulk(cls, model, instances): - pks = [ - instance.pk for instance in instances - if not skip_auto_translation(instance) - ] + pks = [instance.pk for instance in instances if not skip_auto_translation(instance)] if pks: - transaction.on_commit( - lambda: translate_model_fields_in_bulk.delay(get_model_name(model), pks) - ) + transaction.on_commit(lambda: translate_model_fields_in_bulk.delay(get_model_name(model), pks)) @classmethod def reset_and_trigger_translation_fields(cls, instance, created=False): @@ -183,7 +176,7 @@ def get_fields(self, *args, **kwargs): return { **fields, - 'translation_module_original_language': serializers.ChoiceField(choices=settings.LANGUAGES, read_only=True), + "translation_module_original_language": serializers.ChoiceField(choices=settings.LANGUAGES, read_only=True), } @property @@ -194,12 +187,9 @@ def run_validation(self, data): if self.instance and self.is_translate_model: entity_original_language = getattr(self.instance, TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME) if entity_original_language != django_get_language(): - raise serializers.ValidationError({ - 'non_field_errors': gettext( - "Only original langauge is supported: %s" - % (entity_original_language) - ) - }) + raise serializers.ValidationError( + {"non_field_errors": gettext("Only original langauge is supported: %s" % (entity_original_language))} + ) return super().run_validation(data) def create(self, validated_data): @@ -211,9 +201,8 @@ def create(self, validated_data): return instance def update(self, instance, validated_data): - if ( - self.is_translate_model and - self._get_language_clear_validated_data(instance, validated_data, self.included_fields_lang) + if self.is_translate_model and self._get_language_clear_validated_data( + instance, validated_data, self.included_fields_lang ): self.trigger_field_translation(instance) return super().update(instance, validated_data) diff --git a/lang/tasks.py b/lang/tasks.py index c49054758..fa6e9abb9 100644 --- a/lang/tasks.py +++ b/lang/tasks.py @@ -1,27 +1,30 @@ import logging import typing +from functools import reduce from celery import shared_task -from modeltranslation.translator import translator -from modeltranslation.utils import build_localized_fieldname -from modeltranslation import settings as mt_settings from django.apps import apps as django_apps -from django.db.models.functions import Length -from django.db import models -from django.db.models import Sum -from django.db.models import Q from django.conf import settings -from functools import reduce +from django.db import models +from django.db.models import Q, Sum +from django.db.models.functions import Length +from modeltranslation import settings as mt_settings +from modeltranslation.translator import translator +from modeltranslation.utils import build_localized_fieldname -from main.translation import skip_auto_translation, TRANSLATOR_SKIP_FIELD_NAME, TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME from main.celery import Queues -from .translation import AVAILABLE_LANGUAGES, get_translator_class +from main.translation import ( + TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME, + TRANSLATOR_SKIP_FIELD_NAME, + skip_auto_translation, +) +from .translation import AVAILABLE_LANGUAGES, get_translator_class logger = logging.getLogger(__name__) -class ModelTranslator(): +class ModelTranslator: def __init__(self): self.default_translator = get_translator_class()() @@ -49,7 +52,7 @@ def translate_fields_object(self, obj, field): field_max_length = type(obj)._meta.get_field(field).max_length if field_max_length and len(new_value) > field_max_length: - logger.warning(f'Greater then max_length found for Model ({type(obj)}<{lang_field}>) pk: ({obj.pk})') + logger.warning(f"Greater then max_length found for Model ({type(obj)}<{lang_field}>) pk: ({obj.pk})") new_value = new_value[:field_max_length] setattr(obj, lang_field, new_value) @@ -58,41 +61,36 @@ def translate_fields_object(self, obj, field): @staticmethod def _get_filter(translation_fields): def _get_not_empty_query(field, lang): - return ( - Q(**{f"{build_localized_fieldname(field, lang)}__isnull": True}) | - Q(**{f"{build_localized_fieldname(field, lang)}__exact": ""}) + return Q(**{f"{build_localized_fieldname(field, lang)}__isnull": True}) | Q( + **{f"{build_localized_fieldname(field, lang)}__exact": ""} ) + # Generate filters to fetch only rows with missing translations return reduce( lambda acc, f: acc | f, [ ( # All field shouldn't be empty - ~Q(reduce( - lambda acc, f: acc & f, - [_get_not_empty_query(field, lang) for lang in AVAILABLE_LANGUAGES] - )) & + ~Q(reduce(lambda acc, f: acc & f, [_get_not_empty_query(field, lang) for lang in AVAILABLE_LANGUAGES])) + & # One or more field should be empty - reduce( - lambda acc, f: acc | f, - [_get_not_empty_query(field, lang) for lang in AVAILABLE_LANGUAGES] - ) + reduce(lambda acc, f: acc | f, [_get_not_empty_query(field, lang) for lang in AVAILABLE_LANGUAGES]) ) for field in translation_fields - ] + ], ) @classmethod def get_translatable_models(cls, only_models: typing.Optional[typing.List[models.Model]] = None): # return all models excluding proxy- and not managed models all_translatable_models = [ - m for m in translator.get_registered_models(abstract=False) - if not m._meta.proxy and m._meta.managed + m for m in translator.get_registered_models(abstract=False) if not m._meta.proxy and m._meta.managed ] if only_models: translatable_models = list(set(only_models).intersection(set(all_translatable_models))) - assert len(only_models) == len(translatable_models), \ - f"Translation is not set for this models: {set(only_models).difference(set(translatable_models))}" + assert len(only_models) == len( + translatable_models + ), f"Translation is not set for this models: {set(only_models).difference(set(translatable_models))}" return translatable_models return all_translatable_models @@ -106,9 +104,7 @@ def translate_model_fields(self, obj, translatable_fields=None): translatable_fields = translatable_fields or self.get_translatable_fields(type(obj)) update_fields = [] for field in translatable_fields: - update_fields.extend( - list(self.translate_fields_object(obj, field)) - ) + update_fields.extend(list(self.translate_fields_object(obj, field))) obj.save(update_fields=update_fields) @classmethod @@ -117,29 +113,31 @@ def show_characters_counts(cls, only_models: typing.Optional[typing.List[models. Retrive and search for fields to be translated and show total character count """ translatable_models = cls.get_translatable_models(only_models=only_models) - logger.info(f'Languages: {AVAILABLE_LANGUAGES}') - logger.info(f'Default language: {mt_settings.DEFAULT_LANGUAGE}') - logger.info(f'Number of models: {len(translatable_models)}') + logger.info(f"Languages: {AVAILABLE_LANGUAGES}") + logger.info(f"Default language: {mt_settings.DEFAULT_LANGUAGE}") + logger.info(f"Number of models: {len(translatable_models)}") total_count = 0 for model in translatable_models: - logger.info(f'Processing for Model: {model._meta.verbose_name.title()}') + logger.info(f"Processing for Model: {model._meta.verbose_name.title()}") translatable_fields = cls.get_translatable_fields(model) if not translatable_fields: continue qs = model.objects.filter(cls._get_filter(translatable_fields)) - logger.info(f'\tFields: {translatable_fields}') - logger.info('\tTotal characters:') + logger.info(f"\tFields: {translatable_fields}") + logger.info("\tTotal characters:") for field in translatable_fields: - count = qs.annotate(text_length=Length(field))\ - .aggregate(total_text_length=Sum('text_length'))['total_text_length'] or 0 + count = ( + qs.annotate(text_length=Length(field)).aggregate(total_text_length=Sum("text_length"))["total_text_length"] + or 0 + ) total_count += count - logger.info(f'\t\t {field} - {count}') - logger.info(f'Total Count: {total_count}') - logger.info(f'Estimated Cost (AWS): {(len(AVAILABLE_LANGUAGES) -1) * total_count * 0.000015}') + logger.info(f"\t\t {field} - {count}") + logger.info(f"Total Count: {total_count}") + logger.info(f"Estimated Cost (AWS): {(len(AVAILABLE_LANGUAGES) -1) * total_count * 0.000015}") def run(self, batch_size=None, only_models: typing.Optional[typing.List[models.Model]] = None): """ @@ -147,12 +145,12 @@ def run(self, batch_size=None, only_models: typing.Optional[typing.List[models.M batch_size: how many instances to translate for each model. None will be all """ translatable_models = self.get_translatable_models(only_models=only_models) - logger.info(f'Languages: {AVAILABLE_LANGUAGES}') - logger.info(f'Default language: {mt_settings.DEFAULT_LANGUAGE}') - logger.info(f'Number of models: {len(translatable_models)}') + logger.info(f"Languages: {AVAILABLE_LANGUAGES}") + logger.info(f"Default language: {mt_settings.DEFAULT_LANGUAGE}") + logger.info(f"Number of models: {len(translatable_models)}") for model in translatable_models: - logger.info(f'Processing for Model: {model._meta.verbose_name.title()}') + logger.info(f"Processing for Model: {model._meta.verbose_name.title()}") translatable_fields = self.get_translatable_fields(model) if not translatable_fields: @@ -163,14 +161,14 @@ def run(self, batch_size=None, only_models: typing.Optional[typing.List[models.M self._get_filter(translatable_fields), # Skip which are flagged by user **{TRANSLATOR_SKIP_FIELD_NAME: False}, - ).order_by('-id') + ).order_by("-id") qs_count = qs.count() index = 1 - logger.info(f'\tFields: {translatable_fields}') - logger.info(f'\tTotal instances: {qs_count}') + logger.info(f"\tFields: {translatable_fields}") + logger.info(f"\tTotal instances: {qs_count}") if batch_size is not None: - logger.info(f'\tProcessing instances: {min(qs_count, batch_size)}') + logger.info(f"\tProcessing instances: {min(qs_count, batch_size)}") qs = qs.all()[:batch_size] else: qs = qs.all() @@ -178,7 +176,7 @@ def run(self, batch_size=None, only_models: typing.Optional[typing.List[models.M for obj in qs.iterator(): # Skip if it is flagged as skip by user # TODO: Remove this later assert skip_auto_translation(obj) is False - logger.info(f'\t\t ({index}/{qs_count}) - {obj}') + logger.info(f"\t\t ({index}/{qs_count}) - {obj}") self.translate_model_fields(obj, translatable_fields) index += 1 @@ -187,7 +185,7 @@ def run(self, batch_size=None, only_models: typing.Optional[typing.List[models.M def translate_remaining_models_fields(): # Disabled in DEBUG/Development if settings.DEBUG: - logger.warning('DEGUB is enabled.. Skipping translate_remaining_models_fields') + logger.warning("DEGUB is enabled.. Skipping translate_remaining_models_fields") return ModelTranslator().run(batch_size=100) diff --git a/lang/tests.py b/lang/tests.py index 9994d2049..d62b8dff0 100644 --- a/lang/tests.py +++ b/lang/tests.py @@ -1,16 +1,16 @@ import unittest from unittest import mock -from django.test import override_settings from django.conf import settings +from django.contrib.auth.models import Permission, User from django.core import management -from django.contrib.auth.models import User, Permission -from main.test_case import APITestCase +from django.test import override_settings from lang.translation import IfrcTranslator +from main.test_case import APITestCase -from .serializers import LanguageBulkActionSerializer from .models import String +from .serializers import LanguageBulkActionSerializer class LangTest(APITestCase): @@ -29,9 +29,7 @@ def test_list_languages(self): def test_list_strings(self): language = settings.LANGUAGES[0][0] current_strings_count = String.objects.filter(language=language).count() - String.objects.create( - language=language, key="random-key-for-language-test1", value="Random value", hash="random hash" - ) + String.objects.create(language=language, key="random-key-for-language-test1", value="Random value", hash="random hash") self.authenticate(self.user) resp = self.client.get(f"/api/v2/language/{language}/") j_resp = resp.json() @@ -228,25 +226,24 @@ def test_lang_api_permissions(self): class TranslatorMockTest(unittest.TestCase): - @mock.patch('lang.translation.requests') + @mock.patch("lang.translation.requests") def test_ifrc_translator(self, requests_mock): # Simple mock test where we define what the expected response is from provider - requests_mock.post.return_value.json.return_value = [{ - "detectedLanguage": {"language": "en", "score": 1}, - "translations": [{"text": "Hola", "to": "es"}] - }] + requests_mock.post.return_value.json.return_value = [ + {"detectedLanguage": {"language": "en", "score": 1}, "translations": [{"text": "Hola", "to": "es"}]} + ] # Without valid settings provided for settings_params in [ dict(), dict( - IFRC_TRANSLATION_GET_API_KEY='dummy-api-param-key', - IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key', + IFRC_TRANSLATION_GET_API_KEY="dummy-api-param-key", + IFRC_TRANSLATION_HEADER_API_KEY="dummy-api-header-key", ), - dict(IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key'), + dict(IFRC_TRANSLATION_HEADER_API_KEY="dummy-api-header-key"), ]: with override_settings( - AUTO_TRANSLATION_TRANSLATOR='lang.translation.IfrcTranslator', + AUTO_TRANSLATION_TRANSLATOR="lang.translation.IfrcTranslator", **settings_params, ): with self.assertRaises(Exception): @@ -254,17 +251,17 @@ def test_ifrc_translator(self, requests_mock): # With valid settings provided with override_settings( - AUTO_TRANSLATION_TRANSLATOR='lang.translation.IfrcTranslator', - IFRC_TRANSLATION_DOMAIN='http://example.org', - IFRC_TRANSLATION_GET_API_KEY='dummy-api-param-key', - IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key', + AUTO_TRANSLATION_TRANSLATOR="lang.translation.IfrcTranslator", + IFRC_TRANSLATION_DOMAIN="http://example.org", + IFRC_TRANSLATION_GET_API_KEY="dummy-api-param-key", + IFRC_TRANSLATION_HEADER_API_KEY="dummy-api-header-key", ): # with settings.TESTING True ifrc_translator = IfrcTranslator() - assert ifrc_translator.translate_text('hello', 'es') == 'hello translated to "es" using source language "None"' + assert ifrc_translator.translate_text("hello", "es") == 'hello translated to "es" using source language "None"' # with settings.TESTING False with override_settings(TESTING=False): - assert ifrc_translator.translate_text('hello', 'es') == "Hola" + assert ifrc_translator.translate_text("hello", "es") == "Hola" def test_ifrc_translator_detect_text_content_type(self): valid_htmls = [ @@ -280,9 +277,7 @@ def test_ifrc_translator_detect_text_content_type(self): "Just a simple text", ] for text in valid_htmls: - assert IfrcTranslator.is_text_html(text) is True, \ - f"<{text}> should be detected as html" + assert IfrcTranslator.is_text_html(text) is True, f"<{text}> should be detected as html" for text in valid_texts: - assert IfrcTranslator.is_text_html(text) is False, \ - f"<{text}> should be detected as text" + assert IfrcTranslator.is_text_html(text) is False, f"<{text}> should be detected as text" diff --git a/lang/translation.py b/lang/translation.py index 6548b785c..17fcbdc3f 100644 --- a/lang/translation.py +++ b/lang/translation.py @@ -1,12 +1,11 @@ import logging -import requests -import boto3 +import boto3 +import requests from bs4 import BeautifulSoup from django.conf import settings from django.utils.module_loading import import_string - logger = logging.getLogger(__name__) @@ -14,7 +13,7 @@ AVAILABLE_LANGUAGES = [lang for lang, _ in settings.LANGUAGES] -class BaseTranslator(): +class BaseTranslator: def _fake_translation(self, text, dest_language, source_language): """ This is only used for test @@ -23,7 +22,7 @@ def _fake_translation(self, text, dest_language, source_language): class DummyTranslator(BaseTranslator): - def translate_text(self, text, dest_language, source_language='auto'): + def translate_text(self, text, dest_language, source_language="auto"): return self._fake_translation(text, dest_language, source_language) @@ -31,60 +30,54 @@ class AmazonTranslator(BaseTranslator): """ Amazon Translator helper """ + def __init__(self, client=None): if settings.TESTING: return - if ( - not settings.AWS_TRANSLATE_ACCESS_KEY or - not settings.AWS_TRANSLATE_SECRET_KEY or - not settings.AWS_TRANSLATE_REGION - ): - raise Exception('Translation configuration missing') + if not settings.AWS_TRANSLATE_ACCESS_KEY or not settings.AWS_TRANSLATE_SECRET_KEY or not settings.AWS_TRANSLATE_REGION: + raise Exception("Translation configuration missing") # NOTE: Service not used for testing self._translator = client or boto3.client( - 'translate', + "translate", aws_access_key_id=settings.AWS_TRANSLATE_ACCESS_KEY, aws_secret_access_key=settings.AWS_TRANSLATE_SECRET_KEY, region_name=settings.AWS_TRANSLATE_REGION, ) - def translate_text(self, text, dest_language, source_language='auto'): + def translate_text(self, text, dest_language, source_language="auto"): # NOTE: using 'auto' as source_language will cost extra. Language Detection: https://aws.amazon.com/comprehend/pricing/ if settings.TESTING: # NOTE: Mocking for test purpose return self._fake_translation(text, dest_language, source_language) - return self._translator.translate_text( - Text=text, - SourceLanguageCode=source_language, - TargetLanguageCode=dest_language - )['TranslatedText'] + return self._translator.translate_text(Text=text, SourceLanguageCode=source_language, TargetLanguageCode=dest_language)[ + "TranslatedText" + ] class IfrcTranslator(BaseTranslator): """ IFRC Translator helper """ + domain: str url: str params: dict def __init__(self): if ( - not settings.IFRC_TRANSLATION_DOMAIN or - not settings.IFRC_TRANSLATION_GET_API_KEY or - not settings.IFRC_TRANSLATION_HEADER_API_KEY + not settings.IFRC_TRANSLATION_DOMAIN + or not settings.IFRC_TRANSLATION_GET_API_KEY + or not settings.IFRC_TRANSLATION_HEADER_API_KEY ): - raise Exception('Translation configuration missing') - self.domain = settings.IFRC_TRANSLATION_DOMAIN.strip('/') - self.url = f'{self.domain}/TranslationV2_API/api/Home/Translate' + raise Exception("Translation configuration missing") + self.domain = settings.IFRC_TRANSLATION_DOMAIN.strip("/") + self.url = f"{self.domain}/TranslationV2_API/api/Home/Translate" self.headers = { - 'X-API-KEY': settings.IFRC_TRANSLATION_HEADER_API_KEY, + "X-API-KEY": settings.IFRC_TRANSLATION_HEADER_API_KEY, } - self.params = dict( - apiKey=settings.IFRC_TRANSLATION_GET_API_KEY - ) + self.params = dict(apiKey=settings.IFRC_TRANSLATION_GET_API_KEY) @classmethod def is_text_html(cls, text): @@ -102,7 +95,7 @@ def translate_text(self, text, dest_language, source_language=None): if self.is_text_html(text): # NOTE: Sending 'text' throws 500 from IFRC translation endpoint # So only sending if html - payload['textType'] = 'html' + payload["textType"] = "html" response = requests.post( self.url, headers=self.headers, diff --git a/lang/views.py b/lang/views.py index 3c3dfd4e1..03e26f8fd 100644 --- a/lang/views.py +++ b/lang/views.py @@ -1,27 +1,24 @@ -from django.db import transaction -from django.db.models import Q import functools import operator +from django.conf import settings +from django.db import transaction +from django.db.models import Q from drf_spectacular.utils import extend_schema +from rest_framework import response, viewsets from rest_framework.authentication import TokenAuthentication from rest_framework.decorators import action as djaction -from rest_framework import ( - viewsets, - response, -) -from django.conf import settings +from .models import String from .permissions import LangStringPermission from .serializers import ( - StringSerializer, + LanguageBulkActionResponseSerializer, LanguageBulkActionSerializer, LanguageBulkActionsSerializer, LanguageListSerializer, LanguageRetriveSerializer, - LanguageBulkActionResponseSerializer + StringSerializer, ) -from .models import String class LanguageViewSet(viewsets.ViewSet): @@ -30,10 +27,7 @@ class LanguageViewSet(viewsets.ViewSet): permission_classes = (LangStringPermission,) lookup_url_kwarg = "pk" - @extend_schema( - request=None, - responses=LanguageListSerializer - ) + @extend_schema(request=None, responses=LanguageListSerializer) def list(self, request, version=None): languages = [{"code": code, "title": title} for code, title in settings.LANGUAGES] return response.Response( @@ -43,10 +37,7 @@ def list(self, request, version=None): } ) - @extend_schema( - request=None, - responses=LanguageRetriveSerializer - ) + @extend_schema(request=None, responses=LanguageRetriveSerializer) def retrieve(self, request, pk=None, version=None): page_name = self.request.query_params.getlist("page_name") page_name_list = [] @@ -80,10 +71,7 @@ def retrieve(self, request, pk=None, version=None): return response.Response(obj) @transaction.atomic - @extend_schema( - request=LanguageBulkActionsSerializer, - responses=LanguageBulkActionResponseSerializer - ) + @extend_schema(request=LanguageBulkActionsSerializer, responses=LanguageBulkActionResponseSerializer) @djaction( detail=True, url_path="bulk-action", diff --git a/local_units/admin.py b/local_units/admin.py index 2c229c1cf..a8518d2de 100644 --- a/local_units/admin.py +++ b/local_units/admin.py @@ -1,167 +1,156 @@ -from django.contrib.gis import admin from admin_auto_filters.filters import AutocompleteFilterFactory +from django.contrib.gis import admin from django.core.exceptions import ValidationError from reversion_compare.admin import CompareVersionAdmin from .models import ( - LocalUnit, - LocalUnitType, - LocalUnitLevel, + Affiliation, + BloodService, DelegationOffice, DelegationOfficeType, - Affiliation, - Functionality, FacilityType, - PrimaryHCC, - HospitalType, + Functionality, GeneralMedicalService, - SpecializedMedicalService, - BloodService, - ProfessionalTrainingFacility, HealthData, + HospitalType, + LocalUnit, + LocalUnitLevel, + LocalUnitType, + PrimaryHCC, + ProfessionalTrainingFacility, + SpecializedMedicalService, ) @admin.register(LocalUnitType) class LocalUnitTypeAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(LocalUnitLevel) class LocalUnitLevelAdmin(admin.ModelAdmin): - ordering = ('level',) - search_fields = ('name',) + ordering = ("level",) + search_fields = ("name",) @admin.register(LocalUnit) class LocalUnitAdmin(CompareVersionAdmin, admin.OSMGeoAdmin): search_fields = ( - 'english_branch_name', - 'local_branch_name', - 'city_loc', - 'city_en', - 'country__name', + "english_branch_name", + "local_branch_name", + "city_loc", + "city_en", + "country__name", ) autocomplete_fields = ( - 'country', - 'type', - 'level', - 'health', + "country", + "type", + "level", + "health", ) list_filter = ( - AutocompleteFilterFactory('Country', 'country'), - AutocompleteFilterFactory('Type', 'type'), - AutocompleteFilterFactory('Level', 'level'), + AutocompleteFilterFactory("Country", "country"), + AutocompleteFilterFactory("Type", "type"), + AutocompleteFilterFactory("Level", "level"), ) def save_model(self, request, obj, form, change): if obj.type.code == 1 and obj.health: - raise ValidationError({ - 'Can\'t have health data for type %s' % obj.type.code - }) + raise ValidationError({"Can't have health data for type %s" % obj.type.code}) super().save_model(request, obj, form, change) @admin.register(DelegationOffice) class DelegationOfficeAdmin(admin.OSMGeoAdmin): - search_fields = ( - 'name', - 'city', - 'country', - 'country__name' - ) + search_fields = ("name", "city", "country", "country__name") - autocomplete_fields = ( - 'country', - ) - list_filter = ( - AutocompleteFilterFactory('Country', 'country'), - ) + autocomplete_fields = ("country",) + list_filter = (AutocompleteFilterFactory("Country", "country"),) @admin.register(DelegationOfficeType) class DelegationOfficeTypeAdmin(admin.ModelAdmin): - ordering = ('code',) + ordering = ("code",) @admin.register(Affiliation) class AffiliationAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(Functionality) class FunctionalityAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(FacilityType) class FacilityTypeAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(PrimaryHCC) class PrimaryHCCAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(HospitalType) class HospitalTypeAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(GeneralMedicalService) class GeneralMedicalServiceAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(SpecializedMedicalService) class SpecializedMedicalServiceAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(BloodService) class BloodServiceAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(ProfessionalTrainingFacility) class ProfessionalTrainingFacilityAdmin(admin.ModelAdmin): - ordering = ('code',) - search_fields = ('name',) + ordering = ("code",) + search_fields = ("name",) @admin.register(HealthData) class HealthDataAdmin(CompareVersionAdmin, admin.ModelAdmin): autocomplete_fields = [ - 'affiliation', - 'functionality', - 'health_facility_type', - 'primary_health_care_center', - 'hospital_type', - 'general_medical_services', - 'specialized_medical_beyond_primary_level', - 'blood_services', - 'professional_training_facilities', + "affiliation", + "functionality", + "health_facility_type", + "primary_health_care_center", + "hospital_type", + "general_medical_services", + "specialized_medical_beyond_primary_level", + "blood_services", + "professional_training_facilities", ] - search_fields = ('affiliation__name', 'health_facility_type__name') + search_fields = ("affiliation__name", "health_facility_type__name") list_filter = ( - AutocompleteFilterFactory('Country', 'health_data__country'), - AutocompleteFilterFactory('Affiliation', 'affiliation'), - AutocompleteFilterFactory('Functionality', 'functionality'), - AutocompleteFilterFactory('FacilityType', 'health_facility_type'), - AutocompleteFilterFactory('PrimaryHCC', 'primary_health_care_center'), - AutocompleteFilterFactory('GeneralMedicalService', 'general_medical_services'), - AutocompleteFilterFactory('SpecializedMedicalService', 'specialized_medical_beyond_primary_level'), - AutocompleteFilterFactory('BloodService', 'blood_services'), - AutocompleteFilterFactory('ProfessionalTrainingFacility', 'professional_training_facilities'), + AutocompleteFilterFactory("Country", "health_data__country"), + AutocompleteFilterFactory("Affiliation", "affiliation"), + AutocompleteFilterFactory("Functionality", "functionality"), + AutocompleteFilterFactory("FacilityType", "health_facility_type"), + AutocompleteFilterFactory("PrimaryHCC", "primary_health_care_center"), + AutocompleteFilterFactory("GeneralMedicalService", "general_medical_services"), + AutocompleteFilterFactory("SpecializedMedicalService", "specialized_medical_beyond_primary_level"), + AutocompleteFilterFactory("BloodService", "blood_services"), + AutocompleteFilterFactory("ProfessionalTrainingFacility", "professional_training_facilities"), ) diff --git a/local_units/apps.py b/local_units/apps.py index 3307515af..c343362e5 100644 --- a/local_units/apps.py +++ b/local_units/apps.py @@ -2,5 +2,5 @@ class LocalUnits(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'local_units' + default_auto_field = "django.db.models.BigAutoField" + name = "local_units" diff --git a/local_units/filterset.py b/local_units/filterset.py index ef5e63177..3cf1983f5 100644 --- a/local_units/filterset.py +++ b/local_units/filterset.py @@ -1,18 +1,18 @@ from django_filters import rest_framework as filters -from .models import LocalUnit, DelegationOffice +from .models import DelegationOffice, LocalUnit class LocalUnitFilters(filters.FilterSet): class Meta: model = LocalUnit fields = ( - 'country__name', - 'country__iso3', - 'country__iso', - 'type__code', - 'draft', - 'validated', + "country__name", + "country__iso3", + "country__iso", + "type__code", + "draft", + "validated", ) @@ -20,8 +20,8 @@ class DelegationOfficeFilters(filters.FilterSet): class Meta: model = DelegationOffice fields = ( - 'country__name', - 'country__iso3', - 'country__iso', - 'dotype__code', + "country__name", + "country__iso3", + "country__iso", + "dotype__code", ) diff --git a/local_units/management/commands/import-delegation-offices-csv.py b/local_units/management/commands/import-delegation-offices-csv.py index d2744b49a..a0bf9bacf 100644 --- a/local_units/management/commands/import-delegation-offices-csv.py +++ b/local_units/management/commands/import-delegation-offices-csv.py @@ -1,15 +1,15 @@ import csv + import pytz from dateutil import parser as date_parser - -from django.db import transaction -from django.core.management.base import BaseCommand from django.contrib.gis.geos import Point +from django.core.management.base import BaseCommand +from django.db import transaction from api.models import Country -from ...models import DelegationOffice, DelegationOfficeType from main.managers import BulkCreateManager +from ...models import DelegationOffice, DelegationOfficeType # Don't use the received header's always changing upperlowercase header, use a row like this: # name type city address postcode latitude longitude iso iso3 country ifrc_region_number ifrc_region_name society_name society_url url_ifrc ns_same_location multiple_ifrc_offices office_tier hod_first_name hod_last_name hod_mobile_number hod_email assistant_name assistant_email @@ -20,56 +20,52 @@ class Command(BaseCommand): missing_args_message = "Filename is missing. Filename / path to CSV file required." def add_arguments(self, parser): - parser.add_argument('filename', nargs='+', type=str) + parser.add_argument("filename", nargs="+", type=str) @transaction.atomic def handle(self, *args, **options): - filename = options['filename'][0] + filename = options["filename"][0] with open(filename) as csvfile: - reader = csv.DictReader(csvfile, delimiter='\t') + reader = csv.DictReader(csvfile, delimiter="\t") bulk_mgr = BulkCreateManager(chunk_size=1000) # Prefetch dataset country_iso3_id_map = { - iso3.lower(): _id - for _id, iso3 in Country.objects.filter(iso3__isnull=False).values_list('id', 'iso3') - } - dotype_id_map = { - name: _id - for _id, name in DelegationOfficeType.objects.values_list('id', 'name') + iso3.lower(): _id for _id, iso3 in Country.objects.filter(iso3__isnull=False).values_list("id", "iso3") } + dotype_id_map = {name: _id for _id, name in DelegationOfficeType.objects.values_list("id", "name")} for i, row in enumerate(reader): # Without positions we can't use the row: - if not row['longitude'] or not row['latitude']: + if not row["longitude"] or not row["latitude"]: continue - if len(row['postcode']) > 20: - print('Not using too long ' + row['postcode']) - row['postcode'] = '' # Better then inserting wrong textual data. Please do not use postal_code. + if len(row["postcode"]) > 20: + print("Not using too long " + row["postcode"]) + row["postcode"] = "" # Better then inserting wrong textual data. Please do not use postal_code. - dotype = dotype_id_map[row['type']] - country = country_iso3_id_map[row['iso3'].lower()] + dotype = dotype_id_map[row["type"]] + country = country_iso3_id_map[row["iso3"].lower()] # We do not check COUNTRY or NATIONAL_SOCIETY, but only this ^ visibility = 4 # row['visibility'] # 4: IFRC_NS - is_ns_same_location = row['ns_same_location'].lower() == 'yes' - is_multiple_ifrc_offices = row['multiple_ifrc_offices'].lower() == 'yes' + is_ns_same_location = row["ns_same_location"].lower() == "yes" + is_multiple_ifrc_offices = row["multiple_ifrc_offices"].lower() == "yes" - name = row['name'] - city = row['city'] - address = row['address'] - postcode = row['postcode'] - location = Point(float(row['longitude']), float(row['latitude'])) - society_url = row['society_url'] - url_ifrc = row['url_ifrc'] - hod_first_name = row['hod_first_name'] - hod_last_name = row['hod_last_name'] - hod_mobile_number = row['hod_mobile_number'] - hod_email = row['hod_email'] - assistant_name = row['assistant_name'] - assistant_email = row['assistant_email'] + name = row["name"] + city = row["city"] + address = row["address"] + postcode = row["postcode"] + location = Point(float(row["longitude"]), float(row["latitude"])) + society_url = row["society_url"] + url_ifrc = row["url_ifrc"] + hod_first_name = row["hod_first_name"] + hod_last_name = row["hod_last_name"] + hod_mobile_number = row["hod_mobile_number"] + hod_email = row["hod_email"] + assistant_name = row["assistant_name"] + assistant_email = row["assistant_email"] date_of_data = None - if 'date_of_data' in row and row['date_of_data']: - date_of_data = date_parser.parse(row['date_of_data']).replace(tzinfo=pytz.utc) + if "date_of_data" in row and row["date_of_data"]: + date_of_data = date_parser.parse(row["date_of_data"]).replace(tzinfo=pytz.utc) do = DelegationOffice( dotype_id=dotype, country_id=country, @@ -89,8 +85,8 @@ def handle(self, *args, **options): hod_email=hod_email, assistant_name=assistant_name, assistant_email=assistant_email, - date_of_data=date_of_data + date_of_data=date_of_data, ) bulk_mgr.add(do) bulk_mgr.done() - print('Bulk create summary:', bulk_mgr.summary()) + print("Bulk create summary:", bulk_mgr.summary()) diff --git a/local_units/management/commands/import_health_data.py b/local_units/management/commands/import_health_data.py index 1eade9f21..2bd41d0a7 100644 --- a/local_units/management/commands/import_health_data.py +++ b/local_units/management/commands/import_health_data.py @@ -33,75 +33,45 @@ def numerize(value): bulk_mgr = BulkCreateManager(chunk_size=1000) # Prefetch - affiliation_id_map = { - wash(name): code - for code, name in models.Affiliation.objects.values_list("code", "name") - } - functionality_id_map = { - wash(name): code - for code, name in models.Functionality.objects.values_list("code", "name") - } - facilitytype_id_map = { - wash(name): code - for code, name in models.FacilityType.objects.values_list("code", "name") - } - primaryhcc_id_map = { - wash(name): code - for code, name in models.PrimaryHCC.objects.values_list("code", "name") - } - hospitaltype_id_map = { - wash(name): code - for code, name in models.HospitalType.objects.values_list("code", "name") - } + affiliation_id_map = {wash(name): code for code, name in models.Affiliation.objects.values_list("code", "name")} + functionality_id_map = {wash(name): code for code, name in models.Functionality.objects.values_list("code", "name")} + facilitytype_id_map = {wash(name): code for code, name in models.FacilityType.objects.values_list("code", "name")} + primaryhcc_id_map = {wash(name): code for code, name in models.PrimaryHCC.objects.values_list("code", "name")} + hospitaltype_id_map = {wash(name): code for code, name in models.HospitalType.objects.values_list("code", "name")} generalmedicalservice_id_map = { - wash(name): code - for code, name in models.GeneralMedicalService.objects.values_list("code", "name") + wash(name): code for code, name in models.GeneralMedicalService.objects.values_list("code", "name") } specializedmedicalservice_id_map = { - wash(name): code - for code, name in models.SpecializedMedicalService.objects.values_list("code", "name") - } - bloodservice_id_map = { - wash(name): code - for code, name in models.BloodService.objects.values_list("code", "name") + wash(name): code for code, name in models.SpecializedMedicalService.objects.values_list("code", "name") } + bloodservice_id_map = {wash(name): code for code, name in models.BloodService.objects.values_list("code", "name")} professionaltrainingfacility_id_map = { - wash(name): code - for code, name in models.ProfessionalTrainingFacility.objects.values_list("code", "name") + wash(name): code for code, name in models.ProfessionalTrainingFacility.objects.values_list("code", "name") } - facilitytype_id_map['primaryhealthcarecentre'] = facilitytype_id_map[ - 'primaryhealthcarecenter'] - facilitytype_id_map['residentialfacilities'] = facilitytype_id_map[ - 'residentialfacility'] - facilitytype_id_map['trainingfacilities'] = facilitytype_id_map[ - 'trainingfacility'] - facilitytype_id_map['hospitals'] = facilitytype_id_map[ - 'hospital'] - facilitytype_id_map['pharmacies'] = facilitytype_id_map[ - 'pharmacy'] - facilitytype_id_map['bloodcentres'] = facilitytype_id_map[ - 'bloodcenter'] - specializedmedicalservice_id_map['surgicalspecialties'] = specializedmedicalservice_id_map[ - 'surgicalspecialities'] - - primaryhcc_id_map[''] = None - hospitaltype_id_map[''] = None - generalmedicalservice_id_map[''] = None - generalmedicalservice_id_map['none'] = None - specializedmedicalservice_id_map[''] = None - specializedmedicalservice_id_map['none'] = None - bloodservice_id_map['none'] = None - bloodservice_id_map[''] = None - professionaltrainingfacility_id_map['none'] = None - professionaltrainingfacility_id_map[''] = None + facilitytype_id_map["primaryhealthcarecentre"] = facilitytype_id_map["primaryhealthcarecenter"] + facilitytype_id_map["residentialfacilities"] = facilitytype_id_map["residentialfacility"] + facilitytype_id_map["trainingfacilities"] = facilitytype_id_map["trainingfacility"] + facilitytype_id_map["hospitals"] = facilitytype_id_map["hospital"] + facilitytype_id_map["pharmacies"] = facilitytype_id_map["pharmacy"] + facilitytype_id_map["bloodcentres"] = facilitytype_id_map["bloodcenter"] + specializedmedicalservice_id_map["surgicalspecialties"] = specializedmedicalservice_id_map["surgicalspecialities"] + + primaryhcc_id_map[""] = None + hospitaltype_id_map[""] = None + generalmedicalservice_id_map[""] = None + generalmedicalservice_id_map["none"] = None + specializedmedicalservice_id_map[""] = None + specializedmedicalservice_id_map["none"] = None + bloodservice_id_map["none"] = None + bloodservice_id_map[""] = None + professionaltrainingfacility_id_map["none"] = None + professionaltrainingfacility_id_map[""] = None for i, row in enumerate(reader, start=2): # Without id and affilation we can't use the row: if not row["DATA SOURCE ID"] or not row["Affilation"]: - self.stdout.write( - self.style.WARNING(f"Skipping row {i + 1}: Empty id or Affilation data") - ) + self.stdout.write(self.style.WARNING(f"Skipping row {i + 1}: Empty id or Affilation data")) continue # field order is the same as in the example CSV: @@ -160,13 +130,13 @@ def numerize(value): primary_health_care_center_id=primaryhcc_id_map[f_phc], speciality=f_spc or None, hospital_type_id=hospitaltype_id_map[f_hst], - is_teaching_hospital=wash(f_ths) == 'yes', # boolean - is_in_patient_capacity=wash(f_ipc) == 'yes', # boolean - is_isolation_rooms_wards=wash(f_irw) == 'yes', # boolean + is_teaching_hospital=wash(f_ths) == "yes", # boolean + is_in_patient_capacity=wash(f_ipc) == "yes", # boolean + is_isolation_rooms_wards=wash(f_irw) == "yes", # boolean maximum_capacity=f_mxc or None, number_of_isolation_rooms=f_nir or None, - is_warehousing=wash(f_wrh) == 'yes', # boolean - is_cold_chain=wash(f_cch) == 'yes', # boolean + is_warehousing=wash(f_wrh) == "yes", # boolean + is_cold_chain=wash(f_cch) == "yes", # boolean ambulance_type_a=f_ata or None, ambulance_type_b=f_atb or None, ambulance_type_c=f_atc or None, @@ -179,28 +149,28 @@ def numerize(value): dentist=f_dts or None, nursing_aid=f_nur or None, midwife=f_mid or None, - other_medical_heal=wash(f_omh) == 'yes', # boolean + other_medical_heal=wash(f_omh) == "yes", # boolean other_profiles=f_opr or None, - feedback=f_fbk or None + feedback=f_fbk or None, # Many2Many: general_medical_services: see below in a loop # Many2Many: specialized_medical_beyond_primary_level: also # Many2Many: blood_services: also # Many2Many: professional_training_facilities: also ) if f_gms: - for f in f_gms.split(' '): # Can be None, so: + for f in f_gms.split(" "): # Can be None, so: if generalmedicalservice_id_map[f]: health.general_medical_services.add(generalmedicalservice_id_map[f]) if f_spm: - for f in f_spm.split(' '): + for f in f_spm.split(" "): if specializedmedicalservice_id_map[f]: health.specialized_medical_beyond_primary_level.add(specializedmedicalservice_id_map[f]) if f_bls: - for f in f_bls.split(' '): + for f in f_bls.split(" "): if bloodservice_id_map[f]: health.blood_services.add(bloodservice_id_map[f]) if f_ptf: - for f in f_ptf.split(' '): + for f in f_ptf.split(" "): if professionaltrainingfacility_id_map[f]: health.professional_training_facilities.add(professionaltrainingfacility_id_map[f]) bulk_mgr.add(health) diff --git a/local_units/management/commands/import_local_units_health.py b/local_units/management/commands/import_local_units_health.py index fcbcef6ca..1ca6eddc1 100644 --- a/local_units/management/commands/import_local_units_health.py +++ b/local_units/management/commands/import_local_units_health.py @@ -1,22 +1,23 @@ import csv from datetime import datetime -from django.core.management.base import BaseCommand from django.contrib.gis.geos import Point +from django.core.management.base import BaseCommand from django.db import transaction - from api.models import Country -from local_units.models import LocalUnit, LocalUnitType, HealthData +from local_units.models import HealthData, LocalUnit, LocalUnitType from main.managers import BulkCreateManager class Command(BaseCommand): help = "Import LocalUnits data from CSV" - missing_args_message = "Filename is missing. Filename / path to CSV file required. Required headers in CSV: distr_code, GOadm2code, ADM2" + missing_args_message = ( + "Filename is missing. Filename / path to CSV file required. Required headers in CSV: distr_code, GOadm2code, ADM2" + ) def add_arguments(self, parser): - parser.add_argument('filename', nargs='+', type=str) + parser.add_argument("filename", nargs="+", type=str) @transaction.atomic def handle(self, *args, **options): @@ -27,71 +28,61 @@ def parse_date(date): return today.strftime("%Y-%m-%d") # date_of_data is a non-nullable field, so we need at least this ^ - possible_date_format = ('%d-%b-%y', '%m/%d/%Y', '%Y-%m-%d') + possible_date_format = ("%d-%b-%y", "%m/%d/%Y", "%Y-%m-%d") for date_format in possible_date_format: try: return datetime.strptime(date, date_format).strftime("%Y-%m-%d") except ValueError: return today.strftime("%Y-%m-%d") - filename = options['filename'][0] + filename = options["filename"][0] with open(filename) as csvfile: reader = csv.DictReader(csvfile) bulk_mgr = BulkCreateManager(chunk_size=1000) # Prefetch - country_name_id_map = { - country_name.lower(): _id - for _id, country_name in Country.objects.values_list('id', 'name') - } - local_unit_id_map = { - code: _id - for _id, code in LocalUnitType.objects.values_list('id', 'code') - } + country_name_id_map = {country_name.lower(): _id for _id, country_name in Country.objects.values_list("id", "name")} + local_unit_id_map = {code: _id for _id, code in LocalUnitType.objects.values_list("id", "code")} for i, row in enumerate(reader, start=2): # Without positions we can't use the row: - if not row['LONGITUDE'] or not row['LATITUDE']: - self.stdout.write( - self.style.WARNING(f'Skipping row {i}: Empty locations point') - ) + if not row["LONGITUDE"] or not row["LATITUDE"]: + self.stdout.write(self.style.WARNING(f"Skipping row {i}: Empty locations point")) continue - if not row['NAME_LOC'] and not row['NAME_EN']: - self.stdout.write( - self.style.WARNING(f'Skipping row {i}: Empty brach name combination') - ) + if not row["NAME_LOC"] and not row["NAME_EN"]: + self.stdout.write(self.style.WARNING(f"Skipping row {i}: Empty brach name combination")) continue - country = country_name_id_map[row['COUNTRY'].lower()] - type = local_unit_id_map[int(row['TYPE CODE'])] - subtype = row['SUBTYPE'] # FIXME just a text field - visibility = 3 if row['VISIBILITY'].lower() == 'public' else 1 + country = country_name_id_map[row["COUNTRY"].lower()] + type = local_unit_id_map[int(row["TYPE CODE"])] + subtype = row["SUBTYPE"] # FIXME just a text field + visibility = 3 if row["VISIBILITY"].lower() == "public" else 1 health_id = None - if row['DATA SOURCE ID']: + if row["DATA SOURCE ID"]: try: - health_queryset = HealthData.objects.filter(id=row['DATA SOURCE ID']) + health_queryset = HealthData.objects.filter(id=row["DATA SOURCE ID"]) if existing_health_data := health_queryset.first(): health_id = existing_health_data.pk except ValueError: pass validated = True - level_id = int(row['COVERAGECODE']) + 1 - local_branch_name = row['NAME_LOC'] - english_branch_name = row['NAME_EN'] - postcode = row['POSTCODE'] - address_loc = row['ADDRESS_LOC'] - address_en = row['ADDRESS_EN'] - city_loc = row['CITY_LOC'] - city_en = row['CITY_EN'] - focal_person_loc = row['FOCAL_PERSON_LOC'] - focal_person_en = row['FOCAL_PERSON_EN'] - phone = row['TELEPHONE'].strip()[:30] - email = row['EMAIL'] - link = row['WEBSITE'] - source_en = row['SOURCE_EN'] - source_loc = row['SOURCE_LOC'] - location = Point(float(row['LONGITUDE']), float(row['LATITUDE'])) - visibility = 3 if row['VISIBILITY'].lower() == 'public' else 1 - date_of_data = parse_date(row['DATE OF UPDATE']) + level_id = int(row["COVERAGECODE"]) + 1 + local_branch_name = row["NAME_LOC"] + english_branch_name = row["NAME_EN"] + postcode = row["POSTCODE"] + address_loc = row["ADDRESS_LOC"] + address_en = row["ADDRESS_EN"] + city_loc = row["CITY_LOC"] + city_en = row["CITY_EN"] + focal_person_loc = row["FOCAL_PERSON_LOC"] + focal_person_en = row["FOCAL_PERSON_EN"] + phone = row["TELEPHONE"].strip()[:30] + email = row["EMAIL"] + link = row["WEBSITE"] + source_en = row["SOURCE_EN"] + source_loc = row["SOURCE_LOC"] + location = Point(float(row["LONGITUDE"]), float(row["LATITUDE"])) + visibility = 3 if row["VISIBILITY"].lower() == "public" else 1 + date_of_data = parse_date(row["DATE OF UPDATE"]) local_unit = LocalUnit( level_id=level_id, country_id=country, @@ -120,4 +111,4 @@ def parse_date(date): ) bulk_mgr.add(local_unit) bulk_mgr.done() - print('Bulk create summary:', bulk_mgr.summary()) + print("Bulk create summary:", bulk_mgr.summary()) diff --git a/local_units/migrations/0001_initial.py b/local_units/migrations/0001_initial.py index 544f8cb3d..385e38886 100644 --- a/local_units/migrations/0001_initial.py +++ b/local_units/migrations/0001_initial.py @@ -2,8 +2,8 @@ import django.contrib.gis.db.models.fields import django.core.validators -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): @@ -11,43 +11,76 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('api', '0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940'), + ("api", "0160_merge_0159_auto_20221022_1542_0159_auto_20221028_0940"), ] operations = [ migrations.CreateModel( - name='LocalUnitType', + name="LocalUnitType", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('level', models.IntegerField(validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], verbose_name='Level')), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "level", + models.IntegerField( + validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], + verbose_name="Level", + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='LocalUnit', + name="LocalUnit", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('local_branch_name', models.CharField(max_length=255, verbose_name='Branch name in local language')), - ('english_branch_name', models.CharField(max_length=255, verbose_name='Branch name in English')), - ('created_at', models.DateTimeField(auto_now=True, verbose_name='Created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='Updated at')), - ('draft', models.BooleanField(default=False, verbose_name='Draft')), - ('validated', models.BooleanField(default=True, verbose_name='Validated')), - ('source_en', models.CharField(blank=True, max_length=500, null=True, verbose_name='Source in Local Language')), - ('source_loc', models.CharField(blank=True, max_length=500, null=True, verbose_name='Source in English')), - ('address_loc', models.CharField(blank=True, max_length=500, null=True, verbose_name='Address in local language')), - ('address_en', models.CharField(blank=True, max_length=500, null=True, verbose_name='Address in English')), - ('city_loc', models.CharField(max_length=255, verbose_name='City in local language')), - ('city_en', models.CharField(max_length=255, verbose_name='City in English')), - ('focal_person_loc', models.CharField(blank=True, max_length=255, null=True, verbose_name='Focal person for local language')), - ('focal_person_en', models.CharField(blank=True, max_length=255, null=True, verbose_name='Focal person for English')), - ('postcode', models.CharField(max_length=10, null=True, verbose_name='Postal code')), - ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Telephone')), - ('email', models.EmailField(blank=True, max_length=255, null=True, verbose_name='Email')), - ('link', models.URLField(blank=True, max_length=255, null=True, verbose_name='Social link')), - ('location', django.contrib.gis.db.models.fields.PointField(srid=4326)), - ('country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='local_unit_country', to='api.country', verbose_name='Country')), - ('type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='local_unit_type', to='local_units.localunittype', verbose_name='Type')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("local_branch_name", models.CharField(max_length=255, verbose_name="Branch name in local language")), + ("english_branch_name", models.CharField(max_length=255, verbose_name="Branch name in English")), + ("created_at", models.DateTimeField(auto_now=True, verbose_name="Created at")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="Updated at")), + ("draft", models.BooleanField(default=False, verbose_name="Draft")), + ("validated", models.BooleanField(default=True, verbose_name="Validated")), + ("source_en", models.CharField(blank=True, max_length=500, null=True, verbose_name="Source in Local Language")), + ("source_loc", models.CharField(blank=True, max_length=500, null=True, verbose_name="Source in English")), + ( + "address_loc", + models.CharField(blank=True, max_length=500, null=True, verbose_name="Address in local language"), + ), + ("address_en", models.CharField(blank=True, max_length=500, null=True, verbose_name="Address in English")), + ("city_loc", models.CharField(max_length=255, verbose_name="City in local language")), + ("city_en", models.CharField(max_length=255, verbose_name="City in English")), + ( + "focal_person_loc", + models.CharField(blank=True, max_length=255, null=True, verbose_name="Focal person for local language"), + ), + ( + "focal_person_en", + models.CharField(blank=True, max_length=255, null=True, verbose_name="Focal person for English"), + ), + ("postcode", models.CharField(max_length=10, null=True, verbose_name="Postal code")), + ("phone", models.CharField(blank=True, max_length=20, null=True, verbose_name="Telephone")), + ("email", models.EmailField(blank=True, max_length=255, null=True, verbose_name="Email")), + ("link", models.URLField(blank=True, max_length=255, null=True, verbose_name="Social link")), + ("location", django.contrib.gis.db.models.fields.PointField(srid=4326)), + ( + "country", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="local_unit_country", + to="api.country", + verbose_name="Country", + ), + ), + ( + "type", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="local_unit_type", + to="local_units.localunittype", + verbose_name="Type", + ), + ), ], ), ] diff --git a/local_units/migrations/0002_alter_localunit_phone.py b/local_units/migrations/0002_alter_localunit_phone.py index b0ff71154..b2c6583a8 100644 --- a/local_units/migrations/0002_alter_localunit_phone.py +++ b/local_units/migrations/0002_alter_localunit_phone.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('local_units', '0001_initial'), + ("local_units", "0001_initial"), ] operations = [ migrations.AlterField( - model_name='localunit', - name='phone', - field=models.CharField(blank=True, max_length=30, null=True, verbose_name='Telephone'), + model_name="localunit", + name="phone", + field=models.CharField(blank=True, max_length=30, null=True, verbose_name="Telephone"), ), ] diff --git a/local_units/migrations/0003_alter_localunit_validated.py b/local_units/migrations/0003_alter_localunit_validated.py index 38404c90b..dc493e829 100644 --- a/local_units/migrations/0003_alter_localunit_validated.py +++ b/local_units/migrations/0003_alter_localunit_validated.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('local_units', '0002_alter_localunit_phone'), + ("local_units", "0002_alter_localunit_phone"), ] operations = [ migrations.AlterField( - model_name='localunit', - name='validated', - field=models.BooleanField(default=False, verbose_name='Validated'), + model_name="localunit", + name="validated", + field=models.BooleanField(default=False, verbose_name="Validated"), ), ] diff --git a/local_units/migrations/0004_auto_20231127_1500.py b/local_units/migrations/0004_auto_20231127_1500.py index 86d001006..87ad989e0 100644 --- a/local_units/migrations/0004_auto_20231127_1500.py +++ b/local_units/migrations/0004_auto_20231127_1500.py @@ -1,58 +1,73 @@ # Generated by Django 3.2.20 on 2023-11-27 15:00 import django.core.validators -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('local_units', '0003_alter_localunit_validated'), + ("local_units", "0003_alter_localunit_validated"), ] operations = [ migrations.CreateModel( - name='LocalUnitLevel', + name="LocalUnitLevel", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('level', models.IntegerField(validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], verbose_name='Level')), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "level", + models.IntegerField( + validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], + verbose_name="Level", + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.AddField( - model_name='localunit', - name='subtype', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Subtype'), + model_name="localunit", + name="subtype", + field=models.CharField(blank=True, max_length=200, null=True, verbose_name="Subtype"), ), migrations.AlterField( - model_name='localunittype', - name='level', - field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], verbose_name='Type Code'), + model_name="localunittype", + name="level", + field=models.IntegerField( + validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], + verbose_name="Type Code", + ), ), migrations.AddField( - model_name='localunit', - name='level', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='local_unit_level', to='local_units.localunitlevel', verbose_name='Level'), + model_name="localunit", + name="level", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="local_unit_level", + to="local_units.localunitlevel", + verbose_name="Level", + ), ), migrations.AddField( - model_name='localunit', - name='is_public', - field=models.BooleanField(default=False, verbose_name='Is public?'), + model_name="localunit", + name="is_public", + field=models.BooleanField(default=False, verbose_name="Is public?"), ), migrations.AddField( - model_name='localunit', - name='date_of_data', - field=models.DateField(blank=True, null=True, verbose_name='Date of data collection'), + model_name="localunit", + name="date_of_data", + field=models.DateField(blank=True, null=True, verbose_name="Date of data collection"), ), migrations.AlterField( - model_name='localunit', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='Modified at'), + model_name="localunit", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="Modified at"), ), migrations.RenameField( - model_name='localunittype', - old_name='level', - new_name='code', + model_name="localunittype", + old_name="level", + new_name="code", ), ] diff --git a/local_units/migrations/0005_delegationoffice_delegationofficetype.py b/local_units/migrations/0005_delegationoffice_delegationofficetype.py index 5f7ef374c..c4ab032f9 100644 --- a/local_units/migrations/0005_delegationoffice_delegationofficetype.py +++ b/local_units/migrations/0005_delegationoffice_delegationofficetype.py @@ -2,62 +2,85 @@ import django.contrib.gis.db.models.fields import django.core.validators -from django.db import migrations, models import django.db.models.deletion from django.core.management import call_command +from django.db import migrations, models class Migration(migrations.Migration): def forwards_func(apps, schema_editor): - print('forwards') - call_command('loaddata', 'delegation_office_types.json', verbosity=2) + print("forwards") + call_command("loaddata", "delegation_office_types.json", verbosity=2) def reverse_func(apps, schema_editor): - print('reverse') - model = apps.get_model('local_units', 'delegationofficetype') + print("reverse") + model = apps.get_model("local_units", "delegationofficetype") model.objects.all().delete() - dependencies = [ - ('api', '0187_auto_20231218_0508'), - ('local_units', '0004_auto_20231127_1500'), + ("api", "0187_auto_20231218_0508"), + ("local_units", "0004_auto_20231127_1500"), ] operations = [ migrations.CreateModel( - name='DelegationOfficeType', + name="DelegationOfficeType", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], verbose_name='Type Code')), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], + verbose_name="Type Code", + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='DelegationOffice', + name="DelegationOffice", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('city', models.CharField(blank=True, max_length=500, null=True, verbose_name='City')), - ('address', models.CharField(blank=True, max_length=500, null=True, verbose_name='Address')), - ('postcode', models.CharField(blank=True, max_length=20, null=True, verbose_name='Postal code')), - ('location', django.contrib.gis.db.models.fields.PointField(srid=4326)), - ('society_url', models.URLField(blank=True, max_length=255, null=True, verbose_name='URL of national society')), - ('url_ifrc', models.URLField(blank=True, max_length=255, null=True, verbose_name='URL on IFRC webpage')), - ('hod_first_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='HOD first name')), - ('hod_last_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='HOD last name')), - ('hod_mobile_number', models.CharField(blank=True, max_length=255, null=True, verbose_name='HOD mobile number')), - ('hod_email', models.EmailField(blank=True, max_length=255, null=True, verbose_name='HOD Email')), - ('assistant_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Assistant name')), - ('assistant_email', models.EmailField(blank=True, max_length=255, null=True, verbose_name='Assistant email')), - ('is_ns_same_location', models.BooleanField(default=False, verbose_name='NS on same location?')), - ('is_multiple_ifrc_offices', models.BooleanField(default=False, verbose_name='Multiple IFRC offices?')), - ('is_public', models.BooleanField(default=False, verbose_name='Is public?')), - ('created_at', models.DateTimeField(auto_now=True, verbose_name='Created at')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='Modified at')), - ('date_of_data', models.DateField(blank=True, null=True, verbose_name='Date of data collection')), - ('country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='delegation_office_country', to='api.country', verbose_name='Country')), - ('dotype', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='delegation_office_type', to='local_units.delegationofficetype', verbose_name='Type')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=255, verbose_name="Name")), + ("city", models.CharField(blank=True, max_length=500, null=True, verbose_name="City")), + ("address", models.CharField(blank=True, max_length=500, null=True, verbose_name="Address")), + ("postcode", models.CharField(blank=True, max_length=20, null=True, verbose_name="Postal code")), + ("location", django.contrib.gis.db.models.fields.PointField(srid=4326)), + ("society_url", models.URLField(blank=True, max_length=255, null=True, verbose_name="URL of national society")), + ("url_ifrc", models.URLField(blank=True, max_length=255, null=True, verbose_name="URL on IFRC webpage")), + ("hod_first_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="HOD first name")), + ("hod_last_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="HOD last name")), + ("hod_mobile_number", models.CharField(blank=True, max_length=255, null=True, verbose_name="HOD mobile number")), + ("hod_email", models.EmailField(blank=True, max_length=255, null=True, verbose_name="HOD Email")), + ("assistant_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="Assistant name")), + ("assistant_email", models.EmailField(blank=True, max_length=255, null=True, verbose_name="Assistant email")), + ("is_ns_same_location", models.BooleanField(default=False, verbose_name="NS on same location?")), + ("is_multiple_ifrc_offices", models.BooleanField(default=False, verbose_name="Multiple IFRC offices?")), + ("is_public", models.BooleanField(default=False, verbose_name="Is public?")), + ("created_at", models.DateTimeField(auto_now=True, verbose_name="Created at")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="Modified at")), + ("date_of_data", models.DateField(blank=True, null=True, verbose_name="Date of data collection")), + ( + "country", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="delegation_office_country", + to="api.country", + verbose_name="Country", + ), + ), + ( + "dotype", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="delegation_office_type", + to="local_units.delegationofficetype", + verbose_name="Type", + ), + ), ], ), migrations.RunPython(forwards_func, reverse_func, elidable=True), diff --git a/local_units/migrations/0006_auto_20240329_0849.py b/local_units/migrations/0006_auto_20240329_0849.py index f83256835..fa6aeea04 100644 --- a/local_units/migrations/0006_auto_20240329_0849.py +++ b/local_units/migrations/0006_auto_20240329_0849.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('local_units', '0005_delegationoffice_delegationofficetype'), + ("local_units", "0005_delegationoffice_delegationofficetype"), ] operations = [ migrations.AddField( - model_name='localunit', - name='data_source_id', - field=models.IntegerField(blank=True, null=True, verbose_name='Data Source Id'), + model_name="localunit", + name="data_source_id", + field=models.IntegerField(blank=True, null=True, verbose_name="Data Source Id"), ), migrations.AlterField( - model_name='localunit', - name='city_en', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='City in English'), + model_name="localunit", + name="city_en", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="City in English"), ), migrations.AlterField( - model_name='localunit', - name='city_loc', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='City in local language'), + model_name="localunit", + name="city_loc", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="City in local language"), ), ] diff --git a/local_units/migrations/0007_auto_20240330_1710.py b/local_units/migrations/0007_auto_20240330_1710.py index 30c9fb1dc..875a071b7 100644 --- a/local_units/migrations/0007_auto_20240330_1710.py +++ b/local_units/migrations/0007_auto_20240330_1710.py @@ -1,206 +1,363 @@ # Generated by Django 3.2.25 on 2024-03-28 17:10 import django.core.validators -from django.db import migrations, models import django.db.models.deletion from django.core.management import call_command +from django.db import migrations, models class Migration(migrations.Migration): def forwards_func(apps, schema_editor): - print('forwards') - call_command('loaddata', 'health-affiliation-functionality.json', verbosity=2) + print("forwards") + call_command("loaddata", "health-affiliation-functionality.json", verbosity=2) def reverse_func(apps, schema_editor): - print('reverse') - model = apps.get_model('local_units', 'affiliation') + print("reverse") + model = apps.get_model("local_units", "affiliation") model.objects.all().delete() - model = apps.get_model('local_units', 'functionality') + model = apps.get_model("local_units", "functionality") model.objects.all().delete() - model = apps.get_model('local_units', 'facilitytype') + model = apps.get_model("local_units", "facilitytype") model.objects.all().delete() - model = apps.get_model('local_units', 'primaryhcc') + model = apps.get_model("local_units", "primaryhcc") model.objects.all().delete() - model = apps.get_model('local_units', 'hospitaltype') + model = apps.get_model("local_units", "hospitaltype") model.objects.all().delete() - model = apps.get_model('local_units', 'generalmedicalservice') + model = apps.get_model("local_units", "generalmedicalservice") model.objects.all().delete() - model = apps.get_model('local_units', 'specializedmedicalservice') + model = apps.get_model("local_units", "specializedmedicalservice") model.objects.all().delete() - model = apps.get_model('local_units', 'bloodservice') + model = apps.get_model("local_units", "bloodservice") model.objects.all().delete() - model = apps.get_model('local_units', 'professionaltrainingfacility') + model = apps.get_model("local_units", "professionaltrainingfacility") model.objects.all().delete() dependencies = [ - ('local_units', '0006_auto_20240329_0849'), + ("local_units", "0006_auto_20240329_0849"), ] operations = [ migrations.CreateModel( - name='Affiliation', + name="Affiliation", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)])), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)] + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='BloodService', + name="BloodService", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)])), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)] + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='FacilityType', + name="FacilityType", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)])), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)] + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='Functionality', + name="Functionality", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)])), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)] + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='GeneralMedicalService', + name="GeneralMedicalService", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)])), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)] + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='HospitalType', + name="HospitalType", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)])), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)] + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='PrimaryHCC', + name="PrimaryHCC", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)])), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)] + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='ProfessionalTrainingFacility', + name="ProfessionalTrainingFacility", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)])), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)] + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.CreateModel( - name='SpecializedMedicalService', + name="SpecializedMedicalService", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.IntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)])), - ('name', models.CharField(max_length=100, verbose_name='Name')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "code", + models.IntegerField( + validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(99)] + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), ], ), migrations.AlterField( - model_name='localunit', - name='level', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='local_unit_level', to='local_units.localunitlevel', verbose_name='Coverage'), + model_name="localunit", + name="level", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="local_unit_level", + to="local_units.localunitlevel", + verbose_name="Coverage", + ), ), migrations.AlterField( - model_name='localunitlevel', - name='level', - field=models.IntegerField(validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], verbose_name='Coverage'), + model_name="localunitlevel", + name="level", + field=models.IntegerField( + validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)], + verbose_name="Coverage", + ), ), migrations.CreateModel( - name='HealthData', + name="HealthData", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('other_affiliation', models.CharField(blank=True, max_length=300, null=True, verbose_name='Other Affiliation')), - ('focal_point_email', models.EmailField(blank=True, max_length=90, null=True, verbose_name='Focal point email')), - ('focal_point_phone_number', models.CharField(blank=True, max_length=90, null=True, verbose_name='Focal point phone number')), - ('focal_point_position', models.CharField(blank=True, max_length=90, null=True, verbose_name='Focal point position')), - ('other_facility_type', models.CharField(blank=True, max_length=300, null=True, verbose_name='Other facility type')), - ('speciality', models.CharField(blank=True, max_length=200, null=True, verbose_name='Speciality')), - ('is_teaching_hospital', models.BooleanField(default=False, verbose_name='Is teaching hospital?')), - ('is_in_patient_capacity', models.BooleanField(default=False, verbose_name='Has in-patient capacity?')), - ('is_isolation_rooms_wards', models.BooleanField(default=False, verbose_name='Has isolation rooms wards?')), - ('maximum_capacity', models.IntegerField(blank=True, null=True, verbose_name='Maximum Capacity')), - ('number_of_isolation_rooms', models.IntegerField(blank=True, null=True, verbose_name='Number of isolation rooms')), - ('is_warehousing', models.BooleanField(default=False, verbose_name='Has warehousing?')), - ('is_cold_chain', models.BooleanField(default=False, verbose_name='Has cold chain?')), - ('ambulance_type_a', models.IntegerField(blank=True, null=True, verbose_name='Ambulance Type A')), - ('ambulance_type_b', models.IntegerField(blank=True, null=True, verbose_name='Ambulance Type B')), - ('ambulance_type_c', models.IntegerField(blank=True, null=True, verbose_name='Ambulance Type C')), - ('other_services', models.CharField(blank=True, max_length=300, null=True, verbose_name='Other Services')), - ('total_number_of_human_resource', models.IntegerField(blank=True, null=True, verbose_name='Total number of Human Resource')), - ('general_practitioner', models.IntegerField(blank=True, null=True, verbose_name='General Practitioner')), - ('specialist', models.IntegerField(blank=True, null=True, verbose_name='Specialist')), - ('residents_doctor', models.IntegerField(blank=True, null=True, verbose_name='Residents Doctor')), - ('nurse', models.IntegerField(blank=True, null=True, verbose_name='Nurse')), - ('dentist', models.IntegerField(blank=True, null=True, verbose_name='Dentist')), - ('nursing_aid', models.IntegerField(blank=True, null=True, verbose_name='Nursing Aid')), - ('midwife', models.IntegerField(blank=True, null=True, verbose_name='Midwife')), - ('other_medical_heal', models.BooleanField(default=False, verbose_name='Other medical heal')), - ('other_profiles', models.CharField(blank=True, max_length=200, null=True, verbose_name='Other Profiles')), - ('feedback', models.CharField(blank=True, max_length=500, null=True, verbose_name='Feedback')), - ('affiliation', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='health_affiliation', to='local_units.affiliation', verbose_name='Affiliation')), - ('blood_services', models.ManyToManyField(blank=True, related_name='blood_services', to='local_units.BloodService', verbose_name='Blood Services')), - ('functionality', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='health_functionality', to='local_units.functionality', verbose_name='Functionality')), - ('general_medical_services', models.ManyToManyField(blank=True, related_name='general_medical_services', to='local_units.GeneralMedicalService', verbose_name='General medical services')), - ('health_facility_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='health_facility_type', to='local_units.facilitytype', verbose_name='Health facility type')), - ('hospital_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hospital_type', to='local_units.hospitaltype', verbose_name='Hospital type')), - ('primary_health_care_center', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='primary_health_care_center', to='local_units.primaryhcc', verbose_name='Primary Health Care Center')), - ('professional_training_facilities', models.ManyToManyField(blank=True, related_name='professional_training_facilities', to='local_units.ProfessionalTrainingFacility', verbose_name='Professional Training Facilities')), - ('specialized_medical_beyond_primary_level', models.ManyToManyField(blank=True, related_name='specialized_medical_beyond_primary_level', to='local_units.SpecializedMedicalService', verbose_name='Specialized medical beyond primary level')), + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("other_affiliation", models.CharField(blank=True, max_length=300, null=True, verbose_name="Other Affiliation")), + ("focal_point_email", models.EmailField(blank=True, max_length=90, null=True, verbose_name="Focal point email")), + ( + "focal_point_phone_number", + models.CharField(blank=True, max_length=90, null=True, verbose_name="Focal point phone number"), + ), + ( + "focal_point_position", + models.CharField(blank=True, max_length=90, null=True, verbose_name="Focal point position"), + ), + ( + "other_facility_type", + models.CharField(blank=True, max_length=300, null=True, verbose_name="Other facility type"), + ), + ("speciality", models.CharField(blank=True, max_length=200, null=True, verbose_name="Speciality")), + ("is_teaching_hospital", models.BooleanField(default=False, verbose_name="Is teaching hospital?")), + ("is_in_patient_capacity", models.BooleanField(default=False, verbose_name="Has in-patient capacity?")), + ("is_isolation_rooms_wards", models.BooleanField(default=False, verbose_name="Has isolation rooms wards?")), + ("maximum_capacity", models.IntegerField(blank=True, null=True, verbose_name="Maximum Capacity")), + ( + "number_of_isolation_rooms", + models.IntegerField(blank=True, null=True, verbose_name="Number of isolation rooms"), + ), + ("is_warehousing", models.BooleanField(default=False, verbose_name="Has warehousing?")), + ("is_cold_chain", models.BooleanField(default=False, verbose_name="Has cold chain?")), + ("ambulance_type_a", models.IntegerField(blank=True, null=True, verbose_name="Ambulance Type A")), + ("ambulance_type_b", models.IntegerField(blank=True, null=True, verbose_name="Ambulance Type B")), + ("ambulance_type_c", models.IntegerField(blank=True, null=True, verbose_name="Ambulance Type C")), + ("other_services", models.CharField(blank=True, max_length=300, null=True, verbose_name="Other Services")), + ( + "total_number_of_human_resource", + models.IntegerField(blank=True, null=True, verbose_name="Total number of Human Resource"), + ), + ("general_practitioner", models.IntegerField(blank=True, null=True, verbose_name="General Practitioner")), + ("specialist", models.IntegerField(blank=True, null=True, verbose_name="Specialist")), + ("residents_doctor", models.IntegerField(blank=True, null=True, verbose_name="Residents Doctor")), + ("nurse", models.IntegerField(blank=True, null=True, verbose_name="Nurse")), + ("dentist", models.IntegerField(blank=True, null=True, verbose_name="Dentist")), + ("nursing_aid", models.IntegerField(blank=True, null=True, verbose_name="Nursing Aid")), + ("midwife", models.IntegerField(blank=True, null=True, verbose_name="Midwife")), + ("other_medical_heal", models.BooleanField(default=False, verbose_name="Other medical heal")), + ("other_profiles", models.CharField(blank=True, max_length=200, null=True, verbose_name="Other Profiles")), + ("feedback", models.CharField(blank=True, max_length=500, null=True, verbose_name="Feedback")), + ( + "affiliation", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="health_affiliation", + to="local_units.affiliation", + verbose_name="Affiliation", + ), + ), + ( + "blood_services", + models.ManyToManyField( + blank=True, related_name="blood_services", to="local_units.BloodService", verbose_name="Blood Services" + ), + ), + ( + "functionality", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="health_functionality", + to="local_units.functionality", + verbose_name="Functionality", + ), + ), + ( + "general_medical_services", + models.ManyToManyField( + blank=True, + related_name="general_medical_services", + to="local_units.GeneralMedicalService", + verbose_name="General medical services", + ), + ), + ( + "health_facility_type", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="health_facility_type", + to="local_units.facilitytype", + verbose_name="Health facility type", + ), + ), + ( + "hospital_type", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="hospital_type", + to="local_units.hospitaltype", + verbose_name="Hospital type", + ), + ), + ( + "primary_health_care_center", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="primary_health_care_center", + to="local_units.primaryhcc", + verbose_name="Primary Health Care Center", + ), + ), + ( + "professional_training_facilities", + models.ManyToManyField( + blank=True, + related_name="professional_training_facilities", + to="local_units.ProfessionalTrainingFacility", + verbose_name="Professional Training Facilities", + ), + ), + ( + "specialized_medical_beyond_primary_level", + models.ManyToManyField( + blank=True, + related_name="specialized_medical_beyond_primary_level", + to="local_units.SpecializedMedicalService", + verbose_name="Specialized medical beyond primary level", + ), + ), ], ), migrations.AddField( - model_name='localunit', - name='health', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='health_data', to='local_units.healthdata', verbose_name='Health Data'), + model_name="localunit", + name="health", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="health_data", + to="local_units.healthdata", + verbose_name="Health Data", + ), ), migrations.AlterModelOptions( - name='functionality', - options={'verbose_name': 'Functionality', 'verbose_name_plural': 'Functionalities'}, + name="functionality", + options={"verbose_name": "Functionality", "verbose_name_plural": "Functionalities"}, ), migrations.AlterModelOptions( - name='primaryhcc', - options={'verbose_name': 'Primary Health Care Center', 'verbose_name_plural': 'Primary Health Care Centers'}, + name="primaryhcc", + options={"verbose_name": "Primary Health Care Center", "verbose_name_plural": "Primary Health Care Centers"}, ), migrations.AlterModelOptions( - name='professionaltrainingfacility', - options={'verbose_name': 'Professional Training Facility', 'verbose_name_plural': 'Professional Training Facilities'}, + name="professionaltrainingfacility", + options={"verbose_name": "Professional Training Facility", "verbose_name_plural": "Professional Training Facilities"}, ), migrations.AlterModelOptions( - name='healthdata', - options={'verbose_name': 'Health Data', 'verbose_name_plural': 'Health Data'}, + name="healthdata", + options={"verbose_name": "Health Data", "verbose_name_plural": "Health Data"}, ), migrations.RemoveField( - model_name='delegationoffice', - name='is_public', + model_name="delegationoffice", + name="is_public", ), migrations.RemoveField( - model_name='localunit', - name='is_public', + model_name="localunit", + name="is_public", ), migrations.AddField( - model_name='delegationoffice', - name='visibility', - field=models.IntegerField(choices=[(1, 'RCRC Movement'), (2, 'IFRC Secretariat'), (3, 'Public'), (4, 'IFRC and NS')], default=2, verbose_name='visibility'), + model_name="delegationoffice", + name="visibility", + field=models.IntegerField( + choices=[(1, "RCRC Movement"), (2, "IFRC Secretariat"), (3, "Public"), (4, "IFRC and NS")], + default=2, + verbose_name="visibility", + ), ), migrations.AddField( - model_name='localunit', - name='visibility', - field=models.IntegerField(choices=[(1, 'RCRC Movement'), (2, 'IFRC Secretariat'), (3, 'Public'), (4, 'IFRC and NS')], default=2, verbose_name='visibility'), + model_name="localunit", + name="visibility", + field=models.IntegerField( + choices=[(1, "RCRC Movement"), (2, "IFRC Secretariat"), (3, "Public"), (4, "IFRC and NS")], + default=2, + verbose_name="visibility", + ), ), migrations.RunPython(forwards_func, reverse_func, elidable=True), ] diff --git a/local_units/migrations/0008_remove_localunit_data_source_id.py b/local_units/migrations/0008_remove_localunit_data_source_id.py index 2d08bcb80..901254d89 100644 --- a/local_units/migrations/0008_remove_localunit_data_source_id.py +++ b/local_units/migrations/0008_remove_localunit_data_source_id.py @@ -6,16 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('local_units', '0007_auto_20240330_1710'), + ("local_units", "0007_auto_20240330_1710"), ] operations = [ migrations.RemoveField( - model_name='localunit', - name='data_source_id', + model_name="localunit", + name="data_source_id", ), migrations.AlterModelOptions( - name='localunitlevel', - options={'verbose_name': 'Local unit coverage', 'verbose_name_plural': 'Local unit coverages'}, + name="localunitlevel", + options={"verbose_name": "Local unit coverage", "verbose_name_plural": "Local unit coverages"}, ), ] diff --git a/local_units/migrations/0009_alter_localunit_location.py b/local_units/migrations/0009_alter_localunit_location.py index 04f768358..e488e3988 100644 --- a/local_units/migrations/0009_alter_localunit_location.py +++ b/local_units/migrations/0009_alter_localunit_location.py @@ -7,13 +7,13 @@ class Migration(migrations.Migration): dependencies = [ - ('local_units', '0008_remove_localunit_data_source_id'), + ("local_units", "0008_remove_localunit_data_source_id"), ] operations = [ migrations.AlterField( - model_name='localunit', - name='location', - field=django.contrib.gis.db.models.fields.PointField(help_text='Local Unit Location', srid=4326), + model_name="localunit", + name="location", + field=django.contrib.gis.db.models.fields.PointField(help_text="Local Unit Location", srid=4326), ), ] diff --git a/local_units/migrations/0010_alter_localunit_country.py b/local_units/migrations/0010_alter_localunit_country.py index 2917203a2..5ccd3a852 100644 --- a/local_units/migrations/0010_alter_localunit_country.py +++ b/local_units/migrations/0010_alter_localunit_country.py @@ -1,21 +1,27 @@ # Generated by Django 3.2.25 on 2024-05-06 06:05 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0210_profile_accepted_montandon_license_terms'), - ('local_units', '0009_alter_localunit_location'), + ("api", "0210_profile_accepted_montandon_license_terms"), + ("local_units", "0009_alter_localunit_location"), ] operations = [ migrations.AlterField( - model_name='localunit', - name='country', - field=models.ForeignKey(default=14, on_delete=django.db.models.deletion.CASCADE, related_name='local_unit_country', to='api.country', verbose_name='Country'), + model_name="localunit", + name="country", + field=models.ForeignKey( + default=14, + on_delete=django.db.models.deletion.CASCADE, + related_name="local_unit_country", + to="api.country", + verbose_name="Country", + ), preserve_default=False, ), ] diff --git a/local_units/migrations/0011_auto_20240506_0624.py b/local_units/migrations/0011_auto_20240506_0624.py index 2670a79ba..300944f70 100644 --- a/local_units/migrations/0011_auto_20240506_0624.py +++ b/local_units/migrations/0011_auto_20240506_0624.py @@ -1,47 +1,60 @@ # Generated by Django 3.2.25 on 2024-05-06 06:24 -from django.db import migrations, models import django.db.models.deletion import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('local_units', '0010_alter_localunit_country'), + ("local_units", "0010_alter_localunit_country"), ] operations = [ migrations.AlterField( - model_name='localunit', - name='date_of_data', - field=models.DateField(default=django.utils.timezone.now, verbose_name='Date of data collection'), + model_name="localunit", + name="date_of_data", + field=models.DateField(default=django.utils.timezone.now, verbose_name="Date of data collection"), preserve_default=False, ), migrations.AlterField( - model_name='localunit', - name='english_branch_name', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Branch name in English'), + model_name="localunit", + name="english_branch_name", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Branch name in English"), ), migrations.AlterField( - model_name='localunit', - name='health', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='health_data', to='local_units.healthdata', verbose_name='Health Data'), + model_name="localunit", + name="health", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="health_data", + to="local_units.healthdata", + verbose_name="Health Data", + ), ), migrations.AlterField( - model_name='localunit', - name='local_branch_name', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Branch name in local language'), + model_name="localunit", + name="local_branch_name", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Branch name in local language"), ), migrations.AlterField( - model_name='localunit', - name='postcode', - field=models.CharField(blank=True, max_length=10, null=True, verbose_name='Postal code'), + model_name="localunit", + name="postcode", + field=models.CharField(blank=True, max_length=10, null=True, verbose_name="Postal code"), ), migrations.AlterField( - model_name='localunit', - name='type', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='local_unit_type', to='local_units.localunittype', verbose_name='Type'), + model_name="localunit", + name="type", + field=models.ForeignKey( + default=1, + on_delete=django.db.models.deletion.CASCADE, + related_name="local_unit_type", + to="local_units.localunittype", + verbose_name="Type", + ), preserve_default=False, ), ] diff --git a/local_units/migrations/0012_auto_20240506_0636.py b/local_units/migrations/0012_auto_20240506_0636.py index a14cb4538..18ce59a4e 100644 --- a/local_units/migrations/0012_auto_20240506_0636.py +++ b/local_units/migrations/0012_auto_20240506_0636.py @@ -1,32 +1,50 @@ # Generated by Django 3.2.25 on 2024-05-06 06:36 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('local_units', '0011_auto_20240506_0624'), + ("local_units", "0011_auto_20240506_0624"), ] operations = [ migrations.AlterField( - model_name='healthdata', - name='affiliation', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='health_affiliation', to='local_units.affiliation', verbose_name='Affiliation'), + model_name="healthdata", + name="affiliation", + field=models.ForeignKey( + default=1, + on_delete=django.db.models.deletion.CASCADE, + related_name="health_affiliation", + to="local_units.affiliation", + verbose_name="Affiliation", + ), preserve_default=False, ), migrations.AlterField( - model_name='healthdata', - name='functionality', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='health_functionality', to='local_units.functionality', verbose_name='Functionality'), + model_name="healthdata", + name="functionality", + field=models.ForeignKey( + default=1, + on_delete=django.db.models.deletion.CASCADE, + related_name="health_functionality", + to="local_units.functionality", + verbose_name="Functionality", + ), preserve_default=False, ), migrations.AlterField( - model_name='healthdata', - name='health_facility_type', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='health_facility_type', to='local_units.facilitytype', verbose_name='Health facility type'), + model_name="healthdata", + name="health_facility_type", + field=models.ForeignKey( + default=1, + on_delete=django.db.models.deletion.CASCADE, + related_name="health_facility_type", + to="local_units.facilitytype", + verbose_name="Health facility type", + ), preserve_default=False, ), ] diff --git a/local_units/migrations/0013_localunittype_colour.py b/local_units/migrations/0013_localunittype_colour.py index 10200b8a2..b02e52cfa 100644 --- a/local_units/migrations/0013_localunittype_colour.py +++ b/local_units/migrations/0013_localunittype_colour.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('local_units', '0012_auto_20240506_0636'), + ("local_units", "0012_auto_20240506_0636"), ] operations = [ migrations.AddField( - model_name='localunittype', - name='colour', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Local Unit Colour'), + model_name="localunittype", + name="colour", + field=models.CharField(blank=True, max_length=50, null=True, verbose_name="Local Unit Colour"), ), ] diff --git a/local_units/migrations/0014_auto_20240509_0529.py b/local_units/migrations/0014_auto_20240509_0529.py index 3e704451c..51b1a693e 100644 --- a/local_units/migrations/0014_auto_20240509_0529.py +++ b/local_units/migrations/0014_auto_20240509_0529.py @@ -6,48 +6,48 @@ class Migration(migrations.Migration): dependencies = [ - ('local_units', '0013_localunittype_colour'), + ("local_units", "0013_localunittype_colour"), ] operations = [ migrations.AlterField( - model_name='healthdata', - name='feedback', - field=models.TextField(blank=True, null=True, verbose_name='Feedback'), + model_name="healthdata", + name="feedback", + field=models.TextField(blank=True, null=True, verbose_name="Feedback"), ), migrations.AlterField( - model_name='healthdata', - name='focal_point_email', - field=models.EmailField(blank=True, max_length=255, null=True, verbose_name='Focal point email'), + model_name="healthdata", + name="focal_point_email", + field=models.EmailField(blank=True, max_length=255, null=True, verbose_name="Focal point email"), ), migrations.AlterField( - model_name='healthdata', - name='focal_point_phone_number', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Focal point phone number'), + model_name="healthdata", + name="focal_point_phone_number", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Focal point phone number"), ), migrations.AlterField( - model_name='healthdata', - name='focal_point_position', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Focal point position'), + model_name="healthdata", + name="focal_point_position", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Focal point position"), ), migrations.AlterField( - model_name='healthdata', - name='other_affiliation', - field=models.TextField(blank=True, null=True, verbose_name='Other Affiliation'), + model_name="healthdata", + name="other_affiliation", + field=models.TextField(blank=True, null=True, verbose_name="Other Affiliation"), ), migrations.AlterField( - model_name='healthdata', - name='other_facility_type', - field=models.TextField(blank=True, null=True, verbose_name='Other facility type'), + model_name="healthdata", + name="other_facility_type", + field=models.TextField(blank=True, null=True, verbose_name="Other facility type"), ), migrations.AlterField( - model_name='healthdata', - name='other_services', - field=models.TextField(blank=True, null=True, verbose_name='Other Services'), + model_name="healthdata", + name="other_services", + field=models.TextField(blank=True, null=True, verbose_name="Other Services"), ), migrations.AlterField( - model_name='healthdata', - name='speciality', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Speciality'), + model_name="healthdata", + name="speciality", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Speciality"), ), ] diff --git a/local_units/migrations/0015_auto_20240521_0434.py b/local_units/migrations/0015_auto_20240521_0434.py index 2887278ea..9f533e880 100644 --- a/local_units/migrations/0015_auto_20240521_0434.py +++ b/local_units/migrations/0015_auto_20240521_0434.py @@ -1,46 +1,70 @@ # Generated by Django 3.2.25 on 2024-05-21 04:34 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('local_units', '0014_auto_20240509_0529'), + ("local_units", "0014_auto_20240509_0529"), ] operations = [ migrations.AddField( - model_name='healthdata', - name='created_at', - field=models.DateTimeField(auto_now=True, verbose_name='Created at'), + model_name="healthdata", + name="created_at", + field=models.DateTimeField(auto_now=True, verbose_name="Created at"), ), migrations.AddField( - model_name='healthdata', - name='created_by', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_by_health_data', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + model_name="healthdata", + name="created_by", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="created_by_health_data", + to=settings.AUTH_USER_MODEL, + verbose_name="created by", + ), ), migrations.AddField( - model_name='healthdata', - name='modified_at', - field=models.DateTimeField(auto_now=True, verbose_name='Modified at'), + model_name="healthdata", + name="modified_at", + field=models.DateTimeField(auto_now=True, verbose_name="Modified at"), ), migrations.AddField( - model_name='healthdata', - name='modified_by', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_by_health_data', to=settings.AUTH_USER_MODEL, verbose_name='modified by'), + model_name="healthdata", + name="modified_by", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="modified_by_health_data", + to=settings.AUTH_USER_MODEL, + verbose_name="modified by", + ), ), migrations.AddField( - model_name='localunit', - name='created_by', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_by_local_unit', to=settings.AUTH_USER_MODEL, verbose_name='created by'), + model_name="localunit", + name="created_by", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="created_by_local_unit", + to=settings.AUTH_USER_MODEL, + verbose_name="created by", + ), ), migrations.AddField( - model_name='localunit', - name='modified_by', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_by_local_unit', to=settings.AUTH_USER_MODEL, verbose_name='modified by'), + model_name="localunit", + name="modified_by", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="modified_by_local_unit", + to=settings.AUTH_USER_MODEL, + verbose_name="modified by", + ), ), ] diff --git a/local_units/migrations/0016_auto_20240521_0511.py b/local_units/migrations/0016_auto_20240521_0511.py index 7ae4e9739..4bfa93602 100644 --- a/local_units/migrations/0016_auto_20240521_0511.py +++ b/local_units/migrations/0016_auto_20240521_0511.py @@ -6,33 +6,33 @@ class Migration(migrations.Migration): dependencies = [ - ('local_units', '0015_auto_20240521_0434'), + ("local_units", "0015_auto_20240521_0434"), ] operations = [ migrations.AlterField( - model_name='healthdata', - name='is_cold_chain', - field=models.BooleanField(blank=True, null=True, verbose_name='Has cold chain?'), + model_name="healthdata", + name="is_cold_chain", + field=models.BooleanField(blank=True, null=True, verbose_name="Has cold chain?"), ), migrations.AlterField( - model_name='healthdata', - name='is_in_patient_capacity', - field=models.BooleanField(blank=True, null=True, verbose_name='Has in-patient capacity?'), + model_name="healthdata", + name="is_in_patient_capacity", + field=models.BooleanField(blank=True, null=True, verbose_name="Has in-patient capacity?"), ), migrations.AlterField( - model_name='healthdata', - name='is_isolation_rooms_wards', - field=models.BooleanField(blank=True, null=True, verbose_name='Has isolation rooms wards?'), + model_name="healthdata", + name="is_isolation_rooms_wards", + field=models.BooleanField(blank=True, null=True, verbose_name="Has isolation rooms wards?"), ), migrations.AlterField( - model_name='healthdata', - name='is_teaching_hospital', - field=models.BooleanField(blank=True, null=True, verbose_name='Is teaching hospital?'), + model_name="healthdata", + name="is_teaching_hospital", + field=models.BooleanField(blank=True, null=True, verbose_name="Is teaching hospital?"), ), migrations.AlterField( - model_name='healthdata', - name='is_warehousing', - field=models.BooleanField(blank=True, null=True, verbose_name='Has warehousing?'), + model_name="healthdata", + name="is_warehousing", + field=models.BooleanField(blank=True, null=True, verbose_name="Has warehousing?"), ), ] diff --git a/local_units/migrations/0017_alter_healthdata_other_medical_heal.py b/local_units/migrations/0017_alter_healthdata_other_medical_heal.py index 6462b7fde..a90f1bc50 100644 --- a/local_units/migrations/0017_alter_healthdata_other_medical_heal.py +++ b/local_units/migrations/0017_alter_healthdata_other_medical_heal.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('local_units', '0016_auto_20240521_0511'), + ("local_units", "0016_auto_20240521_0511"), ] operations = [ migrations.AlterField( - model_name='healthdata', - name='other_medical_heal', - field=models.BooleanField(blank=True, null=True, verbose_name='Other medical heal'), + model_name="healthdata", + name="other_medical_heal", + field=models.BooleanField(blank=True, null=True, verbose_name="Other medical heal"), ), ] diff --git a/local_units/models.py b/local_units/models.py index 0231c6bc9..9033d5090 100644 --- a/local_units/models.py +++ b/local_units/models.py @@ -1,50 +1,41 @@ import os -import reversion +import reversion +from django.conf import settings from django.contrib.gis.db import models from django.core.validators import MaxValueValidator, MinValueValidator -from django.utils.translation import gettext_lazy as _ from django.templatetags.static import static -from django.conf import settings +from django.utils.translation import gettext_lazy as _ from api.models import Country, VisibilityChoices class Affiliation(models.Model): - code = models.IntegerField( - validators=[MinValueValidator(0), MaxValueValidator(99)]) - name = models.CharField( - max_length=100, verbose_name=_('Name')) + code = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" class Functionality(models.Model): - code = models.IntegerField( - validators=[MinValueValidator(0), MaxValueValidator(99)]) - name = models.CharField( - max_length=100, verbose_name=_('Name')) + code = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" class Meta: - verbose_name = 'Functionality' - verbose_name_plural = 'Functionalities' + verbose_name = "Functionality" + verbose_name_plural = "Functionalities" class FacilityType(models.Model): - code = models.IntegerField( - validators=[MinValueValidator(0), MaxValueValidator(99)] - ) - name = models.CharField( - max_length=100, - verbose_name=_('Name') - ) + code = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" @staticmethod def get_image_map(code, request): @@ -59,87 +50,71 @@ def get_image_map(code, request): 8: "specialized-services.png", 9: "other.png", } - return request.build_absolute_uri(static(os.path.join("images/local_units/health_facility_type", code_static_map.get(code, "favicon.png")))) + return request.build_absolute_uri( + static(os.path.join("images/local_units/health_facility_type", code_static_map.get(code, "favicon.png"))) + ) class PrimaryHCC(models.Model): - code = models.IntegerField( - validators=[MinValueValidator(0), MaxValueValidator(99)]) - name = models.CharField( - max_length=100, verbose_name=_('Name')) + code = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" class Meta: - verbose_name = 'Primary Health Care Center' - verbose_name_plural = 'Primary Health Care Centers' + verbose_name = "Primary Health Care Center" + verbose_name_plural = "Primary Health Care Centers" class HospitalType(models.Model): - code = models.IntegerField( - validators=[MinValueValidator(0), MaxValueValidator(99)]) - name = models.CharField( - max_length=100, verbose_name=_('Name')) + code = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" class GeneralMedicalService(models.Model): - code = models.IntegerField( - validators=[MinValueValidator(0), MaxValueValidator(99)]) - name = models.CharField( - max_length=100, verbose_name=_('Name')) + code = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" class SpecializedMedicalService(models.Model): - code = models.IntegerField( - validators=[MinValueValidator(0), MaxValueValidator(99)]) - name = models.CharField( - max_length=100, verbose_name=_('Name')) + code = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" class BloodService(models.Model): - code = models.IntegerField( - validators=[MinValueValidator(0), MaxValueValidator(99)]) - name = models.CharField( - max_length=100, verbose_name=_('Name')) + code = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" class ProfessionalTrainingFacility(models.Model): - code = models.IntegerField( - validators=[MinValueValidator(0), MaxValueValidator(99)]) - name = models.CharField( - max_length=100, verbose_name=_('Name')) + code = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" class Meta: - verbose_name = 'Professional Training Facility' - verbose_name_plural = 'Professional Training Facilities' + verbose_name = "Professional Training Facility" + verbose_name_plural = "Professional Training Facilities" @reversion.register() class HealthData(models.Model): - created_at = models.DateTimeField( - verbose_name=_('Created at'), - auto_now=True - ) - modified_at = models.DateTimeField( - verbose_name=_('Modified at'), - auto_now=True - ) + created_at = models.DateTimeField(verbose_name=_("Created at"), auto_now=True) + modified_at = models.DateTimeField(verbose_name=_("Modified at"), auto_now=True) created_by = models.ForeignKey( settings.AUTH_USER_MODEL, verbose_name=_("created by"), @@ -155,175 +130,123 @@ class HealthData(models.Model): related_name="modified_by_health_data", ) affiliation = models.ForeignKey( - Affiliation, - on_delete=models.CASCADE, - verbose_name=_('Affiliation'), - related_name='health_affiliation' - ) - other_affiliation = models.TextField( - verbose_name=_('Other Affiliation'), - null=True, blank=True + Affiliation, on_delete=models.CASCADE, verbose_name=_("Affiliation"), related_name="health_affiliation" ) + other_affiliation = models.TextField(verbose_name=_("Other Affiliation"), null=True, blank=True) functionality = models.ForeignKey( Functionality, on_delete=models.CASCADE, - verbose_name=_('Functionality'), - related_name='health_functionality', - ) - focal_point_email = models.EmailField( - max_length=255, verbose_name=_('Focal point email'), blank=True, null=True - ) - focal_point_phone_number = models.CharField( - max_length=255, verbose_name=_('Focal point phone number'), blank=True, null=True - ) - focal_point_position = models.CharField( - max_length=255, verbose_name=_('Focal point position'), blank=True, null=True + verbose_name=_("Functionality"), + related_name="health_functionality", ) + focal_point_email = models.EmailField(max_length=255, verbose_name=_("Focal point email"), blank=True, null=True) + focal_point_phone_number = models.CharField(max_length=255, verbose_name=_("Focal point phone number"), blank=True, null=True) + focal_point_position = models.CharField(max_length=255, verbose_name=_("Focal point position"), blank=True, null=True) health_facility_type = models.ForeignKey( - FacilityType, - on_delete=models.CASCADE, - verbose_name=_('Health facility type'), - related_name='health_facility_type' - ) - other_facility_type = models.TextField( - verbose_name=_('Other facility type'), blank=True, null=True + FacilityType, on_delete=models.CASCADE, verbose_name=_("Health facility type"), related_name="health_facility_type" ) + other_facility_type = models.TextField(verbose_name=_("Other facility type"), blank=True, null=True) primary_health_care_center = models.ForeignKey( PrimaryHCC, on_delete=models.SET_NULL, - verbose_name=_('Primary Health Care Center'), - related_name='primary_health_care_center', + verbose_name=_("Primary Health Care Center"), + related_name="primary_health_care_center", null=True, ) - speciality = models.CharField( - max_length=255, verbose_name=_('Speciality'), blank=True, null=True - ) + speciality = models.CharField(max_length=255, verbose_name=_("Speciality"), blank=True, null=True) hospital_type = models.ForeignKey( HospitalType, on_delete=models.SET_NULL, - verbose_name=_('Hospital type'), - related_name='hospital_type', + verbose_name=_("Hospital type"), + related_name="hospital_type", null=True, ) is_teaching_hospital = models.BooleanField( - verbose_name=_('Is teaching hospital?'), - null=True, blank=True, + verbose_name=_("Is teaching hospital?"), + null=True, + blank=True, ) is_in_patient_capacity = models.BooleanField( - verbose_name=_('Has in-patient capacity?'), - null=True, blank=True, + verbose_name=_("Has in-patient capacity?"), + null=True, + blank=True, ) is_isolation_rooms_wards = models.BooleanField( - verbose_name=_('Has isolation rooms wards?'), - null=True, blank=True, - ) - maximum_capacity = models.IntegerField( - verbose_name=_('Maximum Capacity'), blank=True, null=True - ) - number_of_isolation_rooms = models.IntegerField( - verbose_name=_('Number of isolation rooms'), blank=True, null=True + verbose_name=_("Has isolation rooms wards?"), + null=True, + blank=True, ) + maximum_capacity = models.IntegerField(verbose_name=_("Maximum Capacity"), blank=True, null=True) + number_of_isolation_rooms = models.IntegerField(verbose_name=_("Number of isolation rooms"), blank=True, null=True) is_warehousing = models.BooleanField( - verbose_name=_('Has warehousing?'), - null=True, blank=True, + verbose_name=_("Has warehousing?"), + null=True, + blank=True, ) is_cold_chain = models.BooleanField( - verbose_name=_('Has cold chain?'), - null=True, blank=True, - ) - ambulance_type_a = models.IntegerField( - verbose_name=_('Ambulance Type A'), blank=True, null=True - ) - ambulance_type_b = models.IntegerField( - verbose_name=_('Ambulance Type B'), blank=True, null=True - ) - ambulance_type_c = models.IntegerField( - verbose_name=_('Ambulance Type C'), blank=True, null=True + verbose_name=_("Has cold chain?"), + null=True, + blank=True, ) + ambulance_type_a = models.IntegerField(verbose_name=_("Ambulance Type A"), blank=True, null=True) + ambulance_type_b = models.IntegerField(verbose_name=_("Ambulance Type B"), blank=True, null=True) + ambulance_type_c = models.IntegerField(verbose_name=_("Ambulance Type C"), blank=True, null=True) general_medical_services = models.ManyToManyField( GeneralMedicalService, - related_name='general_medical_services', - verbose_name=_('General medical services'), + related_name="general_medical_services", + verbose_name=_("General medical services"), blank=True, ) specialized_medical_beyond_primary_level = models.ManyToManyField( SpecializedMedicalService, - related_name='specialized_medical_beyond_primary_level', - verbose_name=_('Specialized medical beyond primary level'), + related_name="specialized_medical_beyond_primary_level", + verbose_name=_("Specialized medical beyond primary level"), blank=True, ) - other_services = models.TextField( - verbose_name=_('Other Services'), blank=True, null=True - ) + other_services = models.TextField(verbose_name=_("Other Services"), blank=True, null=True) blood_services = models.ManyToManyField( BloodService, - related_name='blood_services', - verbose_name=_('Blood Services'), + related_name="blood_services", + verbose_name=_("Blood Services"), blank=True, ) professional_training_facilities = models.ManyToManyField( ProfessionalTrainingFacility, - related_name='professional_training_facilities', - verbose_name=_('Professional Training Facilities'), + related_name="professional_training_facilities", + verbose_name=_("Professional Training Facilities"), blank=True, ) - total_number_of_human_resource = models.IntegerField( - verbose_name=_('Total number of Human Resource'), blank=True, null=True - ) - general_practitioner = models.IntegerField( - verbose_name=_('General Practitioner'), blank=True, null=True - ) - specialist = models.IntegerField( - verbose_name=_('Specialist'), blank=True, null=True - ) - residents_doctor = models.IntegerField( - verbose_name=_('Residents Doctor'), blank=True, null=True - ) - nurse = models.IntegerField(verbose_name=_('Nurse'), blank=True, null=True) - dentist = models.IntegerField(verbose_name=_('Dentist'), blank=True, null=True) - nursing_aid = models.IntegerField( - verbose_name=_('Nursing Aid'), blank=True, null=True - ) - midwife = models.IntegerField(verbose_name=_('Midwife'), blank=True, null=True) + total_number_of_human_resource = models.IntegerField(verbose_name=_("Total number of Human Resource"), blank=True, null=True) + general_practitioner = models.IntegerField(verbose_name=_("General Practitioner"), blank=True, null=True) + specialist = models.IntegerField(verbose_name=_("Specialist"), blank=True, null=True) + residents_doctor = models.IntegerField(verbose_name=_("Residents Doctor"), blank=True, null=True) + nurse = models.IntegerField(verbose_name=_("Nurse"), blank=True, null=True) + dentist = models.IntegerField(verbose_name=_("Dentist"), blank=True, null=True) + nursing_aid = models.IntegerField(verbose_name=_("Nursing Aid"), blank=True, null=True) + midwife = models.IntegerField(verbose_name=_("Midwife"), blank=True, null=True) other_medical_heal = models.BooleanField( - verbose_name=_('Other medical heal'), - null=True, blank=True, - ) - other_profiles = models.CharField( - max_length=200, verbose_name=_('Other Profiles'), blank=True, null=True - ) - feedback = models.TextField( - verbose_name=_('Feedback'), blank=True, null=True + verbose_name=_("Other medical heal"), + null=True, + blank=True, ) + other_profiles = models.CharField(max_length=200, verbose_name=_("Other Profiles"), blank=True, null=True) + feedback = models.TextField(verbose_name=_("Feedback"), blank=True, null=True) def __str__(self): - return f'{self.affiliation} – {self.id}' + return f"{self.affiliation} – {self.id}" class Meta: - verbose_name = 'Health Data' - verbose_name_plural = 'Health Data' + verbose_name = "Health Data" + verbose_name_plural = "Health Data" class LocalUnitType(models.Model): - code = models.IntegerField( - verbose_name=_('Type Code'), - validators=[ - MaxValueValidator(10), - MinValueValidator(0) - ] - ) - name = models.CharField( - max_length=100, - verbose_name=_('Name') - ) - colour = models.CharField( - verbose_name=_('Local Unit Colour'), - null=True, blank=True, - max_length=50 - ) + code = models.IntegerField(verbose_name=_("Type Code"), validators=[MaxValueValidator(10), MinValueValidator(0)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) + colour = models.CharField(verbose_name=_("Local Unit Colour"), null=True, blank=True, max_length=50) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" @staticmethod def get_image_map(code, request): @@ -335,75 +258,44 @@ def get_image_map(code, request): 5: "Training & Education.png", 6: "Other.png", } - return request.build_absolute_uri(static(os.path.join("images/local_units/local_unit_type", code_static_map.get(code, "favicon.png")))) + return request.build_absolute_uri( + static(os.path.join("images/local_units/local_unit_type", code_static_map.get(code, "favicon.png"))) + ) class LocalUnitLevel(models.Model): - level = models.IntegerField( - verbose_name=_('Coverage'), - validators=[ - MaxValueValidator(10), - MinValueValidator(0) - ] - ) - name = models.CharField( - max_length=100, - verbose_name=_('Name') - ) + level = models.IntegerField(verbose_name=_("Coverage"), validators=[MaxValueValidator(10), MinValueValidator(0)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) class Meta: verbose_name = _("Local unit coverage") verbose_name_plural = _("Local unit coverages") def __str__(self): - return f'{self.name} ({self.level})' + return f"{self.name} ({self.level})" -@reversion.register(follow=('health',)) +@reversion.register(follow=("health",)) class LocalUnit(models.Model): # added to track health local unit data (Table B) health = models.ForeignKey( - HealthData, on_delete=models.SET_NULL, verbose_name=_('Health Data'), - related_name='health_data', null=True, blank=True + HealthData, on_delete=models.SET_NULL, verbose_name=_("Health Data"), related_name="health_data", null=True, blank=True ) country = models.ForeignKey( - Country, on_delete=models.CASCADE, verbose_name=_('Country'), - related_name='local_unit_country', - ) - type = models.ForeignKey( - LocalUnitType, on_delete=models.CASCADE, verbose_name=_('Type'), - related_name='local_unit_type' - ) - subtype = models.CharField( - max_length=200, - blank=True, - null=True, - verbose_name=_('Subtype') + Country, + on_delete=models.CASCADE, + verbose_name=_("Country"), + related_name="local_unit_country", ) + type = models.ForeignKey(LocalUnitType, on_delete=models.CASCADE, verbose_name=_("Type"), related_name="local_unit_type") + subtype = models.CharField(max_length=200, blank=True, null=True, verbose_name=_("Subtype")) level = models.ForeignKey( - LocalUnitLevel, on_delete=models.SET_NULL, verbose_name=_('Coverage'), - related_name='local_unit_level', null=True - ) - local_branch_name = models.CharField( - max_length=255, - null=True, - blank=True, - verbose_name=_('Branch name in local language') - ) - english_branch_name = models.CharField( - max_length=255, - null=True, - blank=True, - verbose_name=_('Branch name in English') - ) - created_at = models.DateTimeField( - verbose_name=_('Created at'), - auto_now=True - ) - modified_at = models.DateTimeField( - verbose_name=_('Modified at'), - auto_now=True + LocalUnitLevel, on_delete=models.SET_NULL, verbose_name=_("Coverage"), related_name="local_unit_level", null=True ) + local_branch_name = models.CharField(max_length=255, null=True, blank=True, verbose_name=_("Branch name in local language")) + english_branch_name = models.CharField(max_length=255, null=True, blank=True, verbose_name=_("Branch name in English")) + created_at = models.DateTimeField(verbose_name=_("Created at"), auto_now=True) + modified_at = models.DateTimeField(verbose_name=_("Modified at"), auto_now=True) created_by = models.ForeignKey( settings.AUTH_USER_MODEL, verbose_name=_("created by"), @@ -419,209 +311,80 @@ class LocalUnit(models.Model): related_name="modified_by_local_unit", ) date_of_data = models.DateField( - verbose_name=_('Date of data collection'), + verbose_name=_("Date of data collection"), auto_now=False, ) - draft = models.BooleanField(default=False, verbose_name=_('Draft')) - validated = models.BooleanField(default=False, verbose_name=_('Validated')) - visibility = models.IntegerField( - choices=VisibilityChoices.choices, verbose_name=_('visibility'), - default=2) # 2:IFRC - source_en = models.CharField( - max_length=500, - blank=True, - null=True, - verbose_name=_('Source in Local Language') - ) - source_loc = models.CharField( - max_length=500, - blank=True, - null=True, - verbose_name=_('Source in English') - ) - address_loc = models.CharField( - max_length=500, - blank=True, - null=True, - verbose_name=_('Address in local language') - ) - address_en = models.CharField( - max_length=500, - blank=True, - null=True, - verbose_name=_('Address in English') - ) + draft = models.BooleanField(default=False, verbose_name=_("Draft")) + validated = models.BooleanField(default=False, verbose_name=_("Validated")) + visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=2) # 2:IFRC + source_en = models.CharField(max_length=500, blank=True, null=True, verbose_name=_("Source in Local Language")) + source_loc = models.CharField(max_length=500, blank=True, null=True, verbose_name=_("Source in English")) + address_loc = models.CharField(max_length=500, blank=True, null=True, verbose_name=_("Address in local language")) + address_en = models.CharField(max_length=500, blank=True, null=True, verbose_name=_("Address in English")) city_loc = models.CharField( max_length=255, - verbose_name=_('City in local language'), + verbose_name=_("City in local language"), null=True, blank=True, ) city_en = models.CharField( max_length=255, - verbose_name=_('City in English'), - null=True, - blank=True, - ) - focal_person_loc = models.CharField( - max_length=255, - blank=True, - null=True, - verbose_name=_('Focal person for local language') - ) - focal_person_en = models.CharField( - max_length=255, - blank=True, - null=True, - verbose_name=_('Focal person for English') - ) - postcode = models.CharField( - max_length=10, - null=True, - verbose_name=_('Postal code'), - blank=True - ) - phone = models.CharField( - max_length=30, - blank=True, - null=True, - verbose_name=_('Telephone') - ) - email = models.EmailField( - max_length=255, - blank=True, + verbose_name=_("City in English"), null=True, - verbose_name=_('Email') - ) - link = models.URLField( - max_length=255, blank=True, - null=True, - verbose_name=_('Social link') ) + focal_person_loc = models.CharField(max_length=255, blank=True, null=True, verbose_name=_("Focal person for local language")) + focal_person_en = models.CharField(max_length=255, blank=True, null=True, verbose_name=_("Focal person for English")) + postcode = models.CharField(max_length=10, null=True, verbose_name=_("Postal code"), blank=True) + phone = models.CharField(max_length=30, blank=True, null=True, verbose_name=_("Telephone")) + email = models.EmailField(max_length=255, blank=True, null=True, verbose_name=_("Email")) + link = models.URLField(max_length=255, blank=True, null=True, verbose_name=_("Social link")) location = models.PointField(srid=4326, help_text="Local Unit Location") def __str__(self): branch_name = self.local_branch_name or self.english_branch_name - return f'{branch_name} ({self.country.name})' + return f"{branch_name} ({self.country.name})" class DelegationOfficeType(models.Model): - code = models.IntegerField( - verbose_name=_('Type Code'), - validators=[ - MaxValueValidator(10), - MinValueValidator(0) - ] - ) - name = models.CharField( - max_length=100, - verbose_name=_('Name') - ) + code = models.IntegerField(verbose_name=_("Type Code"), validators=[MaxValueValidator(10), MinValueValidator(0)]) + name = models.CharField(max_length=100, verbose_name=_("Name")) def __str__(self): - return f'{self.name} ({self.code})' + return f"{self.name} ({self.code})" class DelegationOffice(models.Model): - name = models.CharField( - max_length=255, - verbose_name=_('Name') - ) + name = models.CharField(max_length=255, verbose_name=_("Name")) dotype = models.ForeignKey( - DelegationOfficeType, on_delete=models.SET_NULL, verbose_name=_('Type'), - related_name='delegation_office_type', null=True - ) - city = models.CharField( - max_length=500, - blank=True, - null=True, - verbose_name=_('City') - ) - address = models.CharField( - max_length=500, - blank=True, - null=True, - verbose_name=_('Address') - ) - postcode = models.CharField( - max_length=20, - blank=True, - null=True, - verbose_name=_('Postal code') + DelegationOfficeType, on_delete=models.SET_NULL, verbose_name=_("Type"), related_name="delegation_office_type", null=True ) + city = models.CharField(max_length=500, blank=True, null=True, verbose_name=_("City")) + address = models.CharField(max_length=500, blank=True, null=True, verbose_name=_("Address")) + postcode = models.CharField(max_length=20, blank=True, null=True, verbose_name=_("Postal code")) location = models.PointField() country = models.ForeignKey( - Country, on_delete=models.SET_NULL, verbose_name=_('Country'), - related_name='delegation_office_country', null=True - ) - society_url = models.URLField( - max_length=255, - blank=True, - null=True, - verbose_name=_('URL of national society') - ) - url_ifrc = models.URLField( - max_length=255, - blank=True, - null=True, - verbose_name=_('URL on IFRC webpage') - ) - hod_first_name = models.CharField( - max_length=255, - blank=True, - null=True, - verbose_name=_('HOD first name') - ) - hod_last_name = models.CharField( - max_length=255, - blank=True, - null=True, - verbose_name=_('HOD last name') - ) - hod_mobile_number = models.CharField( - max_length=255, - blank=True, - null=True, - verbose_name=_('HOD mobile number') - ) - hod_email = models.EmailField( - max_length=255, - blank=True, - null=True, - verbose_name=_('HOD Email') - ) - assistant_name = models.CharField( - max_length=255, - blank=True, - null=True, - verbose_name=_('Assistant name') - ) - assistant_email = models.EmailField( - max_length=255, - blank=True, - null=True, - verbose_name=_('Assistant email') - ) - is_ns_same_location = models.BooleanField(default=False, verbose_name=_('NS on same location?')) - is_multiple_ifrc_offices = models.BooleanField(default=False, verbose_name=_('Multiple IFRC offices?')) - visibility = models.IntegerField( - choices=VisibilityChoices.choices, verbose_name=_('visibility'), - default=2) # 2:IFRC - created_at = models.DateTimeField( - verbose_name=_('Created at'), - auto_now=True - ) - modified_at = models.DateTimeField( - verbose_name=_('Modified at'), - auto_now=True - ) + Country, on_delete=models.SET_NULL, verbose_name=_("Country"), related_name="delegation_office_country", null=True + ) + society_url = models.URLField(max_length=255, blank=True, null=True, verbose_name=_("URL of national society")) + url_ifrc = models.URLField(max_length=255, blank=True, null=True, verbose_name=_("URL on IFRC webpage")) + hod_first_name = models.CharField(max_length=255, blank=True, null=True, verbose_name=_("HOD first name")) + hod_last_name = models.CharField(max_length=255, blank=True, null=True, verbose_name=_("HOD last name")) + hod_mobile_number = models.CharField(max_length=255, blank=True, null=True, verbose_name=_("HOD mobile number")) + hod_email = models.EmailField(max_length=255, blank=True, null=True, verbose_name=_("HOD Email")) + assistant_name = models.CharField(max_length=255, blank=True, null=True, verbose_name=_("Assistant name")) + assistant_email = models.EmailField(max_length=255, blank=True, null=True, verbose_name=_("Assistant email")) + is_ns_same_location = models.BooleanField(default=False, verbose_name=_("NS on same location?")) + is_multiple_ifrc_offices = models.BooleanField(default=False, verbose_name=_("Multiple IFRC offices?")) + visibility = models.IntegerField(choices=VisibilityChoices.choices, verbose_name=_("visibility"), default=2) # 2:IFRC + created_at = models.DateTimeField(verbose_name=_("Created at"), auto_now=True) + modified_at = models.DateTimeField(verbose_name=_("Modified at"), auto_now=True) date_of_data = models.DateField( - verbose_name=_('Date of data collection'), + verbose_name=_("Date of data collection"), auto_now=False, blank=True, null=True, ) def __str__(self): - return f'{self.name} ({self.country.name})' + return f"{self.name} ({self.country.name})" diff --git a/local_units/permissions.py b/local_units/permissions.py index d100e3a89..75363c110 100644 --- a/local_units/permissions.py +++ b/local_units/permissions.py @@ -1,6 +1,5 @@ -from rest_framework import permissions - from django.contrib.auth.models import Permission +from rest_framework import permissions class ValidateLocalUnitPermission(permissions.BasePermission): @@ -11,11 +10,11 @@ def has_object_permission(self, request, view, object): if user.is_superuser: return True country_admin_ids = [ - int(codename.replace('country_admin_', '')) + int(codename.replace("country_admin_", "")) for codename in Permission.objects.filter( group__user=user, - codename__startswith='country_admin_', - ).values_list('codename', flat=True) + codename__startswith="country_admin_", + ).values_list("codename", flat=True) ] if object.country_id in country_admin_ids: return True diff --git a/local_units/serializers.py b/local_units/serializers.py index 101e7b877..40701c6ff 100644 --- a/local_units/serializers.py +++ b/local_units/serializers.py @@ -1,32 +1,33 @@ import json -from shapely.geometry import Polygon, MultiPolygon, Point -from reversion.models import Version -import reversion -from rest_framework import serializers -from django.utils.translation import gettext -from django.contrib.gis.geos import GEOSGeometry +import reversion from django.contrib.auth.models import User +from django.contrib.gis.geos import GEOSGeometry +from django.utils.translation import gettext +from rest_framework import serializers +from reversion.models import Version +from shapely.geometry import MultiPolygon, Point, Polygon + +from api.models import Country +from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin from .models import ( - HealthData, - LocalUnit, - LocalUnitType, - LocalUnitLevel, + Affiliation, + BloodService, DelegationOffice, DelegationOfficeType, - Affiliation, - Functionality, FacilityType, - PrimaryHCC, + Functionality, + GeneralMedicalService, + HealthData, HospitalType, - BloodService, + LocalUnit, + LocalUnitLevel, + LocalUnitType, + PrimaryHCC, ProfessionalTrainingFacility, - GeneralMedicalService, SpecializedMedicalService, ) -from api.models import Country -from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin class GeneralMedicalServiceSerializer(serializers.ModelSerializer): @@ -89,79 +90,59 @@ class Meta: class ProfessionalTrainingFacilitySerializer(serializers.ModelSerializer): class Meta: model = ProfessionalTrainingFacility - fields = ('__all__') + fields = "__all__" -class MiniHealthDataSerializer( - serializers.ModelSerializer -): - health_facility_type_details = FacilityTypeSerializer(source='health_facility_type', read_only=True) +class MiniHealthDataSerializer(serializers.ModelSerializer): + health_facility_type_details = FacilityTypeSerializer(source="health_facility_type", read_only=True) class Meta: model = HealthData fields = ( - 'id', - 'health_facility_type', - 'health_facility_type_details', + "id", + "health_facility_type", + "health_facility_type_details", ) class LocalUnitMiniUserSerializer(serializers.ModelSerializer): class Meta: model = User - fields = ( - "id", - "username", - "email", - "first_name", - "last_name" - ) + fields = ("id", "username", "email", "first_name", "last_name") class HealthDataSerializer( NestedCreateMixin, NestedUpdateMixin, ): - health_facility_type_details = FacilityTypeSerializer(source='health_facility_type', read_only=True) - affiliation_details = AffiliationSerializer(source='affiliation', read_only=True) - functionality_details = FunctionalitySerializer(source='functionality', read_only=True) - primary_health_care_center_details = PrimaryHCCSerializer( - source='primary_health_care_center', - read_only=True - ) - hospital_type_details = HospitalTypeSerializer( - source='hospital_type', - read_only=True - ) + health_facility_type_details = FacilityTypeSerializer(source="health_facility_type", read_only=True) + affiliation_details = AffiliationSerializer(source="affiliation", read_only=True) + functionality_details = FunctionalitySerializer(source="functionality", read_only=True) + primary_health_care_center_details = PrimaryHCCSerializer(source="primary_health_care_center", read_only=True) + hospital_type_details = HospitalTypeSerializer(source="hospital_type", read_only=True) general_medical_services_details = GeneralMedicalServiceSerializer( - source='general_medical_services', - read_only=True, - many=True + source="general_medical_services", read_only=True, many=True ) specialized_medical_beyond_primary_level_details = SpecializedMedicalServiceSerializer( - source='specialized_medical_beyond_primary_level', - read_only=True, - many=True + source="specialized_medical_beyond_primary_level", read_only=True, many=True ) blood_services_details = BloodServiceSerializer( - source='blood_services', + source="blood_services", read_only=True, many=True, ) professional_training_facilities_details = ProfessionalTrainingFacilitySerializer( - source='professional_training_facilities', - many=True, - read_only=True + source="professional_training_facilities", many=True, read_only=True ) modified_by_details = LocalUnitMiniUserSerializer(source="modified_by", read_only=True) created_by_details = LocalUnitMiniUserSerializer(source="created_by", read_only=True) class Meta: model = HealthData - fields = ('__all__') + fields = "__all__" def create(self, validated_data): - validated_data['created_by'] = self.context["request"].user + validated_data["created_by"] = self.context["request"].user return super().create(validated_data) def update(self, instance, validated_data): @@ -173,9 +154,7 @@ class LocalUnitCountrySerializer(serializers.ModelSerializer): class Meta: model = Country - fields = ( - 'name', 'iso3', 'id' - ) + fields = ("name", "iso3", "id") class LocalUnitTypeSerializer(serializers.ModelSerializer): @@ -184,11 +163,11 @@ class LocalUnitTypeSerializer(serializers.ModelSerializer): class Meta: model = LocalUnitType fields = ( - 'name', - 'code', - 'id', - 'colour', - 'image_url', + "name", + "code", + "id", + "colour", + "image_url", ) def get_image_url(self, facility_type): @@ -203,52 +182,62 @@ class LocalUnitLevelSerializer(serializers.ModelSerializer): class Meta: model = LocalUnitLevel - fields = ( - 'name', 'level', 'id' - ) + fields = ("name", "level", "id") -class LocalUnitDetailSerializer( - serializers.ModelSerializer -): - country_details = LocalUnitCountrySerializer(source='country', read_only=True) - type_details = LocalUnitTypeSerializer(source='type', read_only=True) - level_details = LocalUnitLevelSerializer(source='level', read_only=True) +class LocalUnitDetailSerializer(serializers.ModelSerializer): + country_details = LocalUnitCountrySerializer(source="country", read_only=True) + type_details = LocalUnitTypeSerializer(source="type", read_only=True) + level_details = LocalUnitLevelSerializer(source="level", read_only=True) health = HealthDataSerializer(required=False, allow_null=True) location_details = serializers.SerializerMethodField() - visibility_display = serializers.CharField(source='get_visibility_display', read_only=True) + visibility_display = serializers.CharField(source="get_visibility_display", read_only=True) validated = serializers.BooleanField(read_only=True) class Meta: model = LocalUnit fields = ( - 'local_branch_name', 'english_branch_name', 'type', 'country', - 'created_at', 'modified_at', 'draft', 'validated', 'postcode', - 'address_loc', 'address_en', 'city_loc', 'city_en', 'link', - 'location', 'source_loc', 'source_en', 'subtype', 'date_of_data', - 'level', 'health', 'visibility_display', 'location_details', 'type_details', - 'level_details', 'country_details' + "local_branch_name", + "english_branch_name", + "type", + "country", + "created_at", + "modified_at", + "draft", + "validated", + "postcode", + "address_loc", + "address_en", + "city_loc", + "city_en", + "link", + "location", + "source_loc", + "source_en", + "subtype", + "date_of_data", + "level", + "health", + "visibility_display", + "location_details", + "type_details", + "level_details", + "country_details", ) def get_location_details(self, unit) -> dict: return json.loads(unit.location.geojson) -class PrivateLocalUnitDetailSerializer( - NestedCreateMixin, - NestedUpdateMixin -): - country_details = LocalUnitCountrySerializer(source='country', read_only=True) - type_details = LocalUnitTypeSerializer(source='type', read_only=True) - level_details = LocalUnitLevelSerializer(source='level', read_only=True) +class PrivateLocalUnitDetailSerializer(NestedCreateMixin, NestedUpdateMixin): + country_details = LocalUnitCountrySerializer(source="country", read_only=True) + type_details = LocalUnitTypeSerializer(source="type", read_only=True) + level_details = LocalUnitLevelSerializer(source="level", read_only=True) health = HealthDataSerializer(required=False, allow_null=True) location_details = serializers.SerializerMethodField(read_only=True) - visibility_display = serializers.CharField(source='get_visibility_display', read_only=True) + visibility_display = serializers.CharField(source="get_visibility_display", read_only=True) validated = serializers.BooleanField(read_only=True) - location_json = serializers.JSONField( - required=True, - write_only=True - ) + location_json = serializers.JSONField(required=True, write_only=True) location = serializers.CharField(required=False) modified_by_details = LocalUnitMiniUserSerializer(source="modified_by", read_only=True) created_by_details = LocalUnitMiniUserSerializer(source="created_by", read_only=True) @@ -257,14 +246,41 @@ class PrivateLocalUnitDetailSerializer( class Meta: model = LocalUnit fields = ( - 'local_branch_name', 'english_branch_name', 'type', 'country', - 'created_at', 'modified_at', 'draft', 'validated', 'postcode', - 'address_loc', 'address_en', 'city_loc', 'city_en', 'link', - 'location', 'source_loc', 'source_en', 'subtype', 'date_of_data', - 'level', 'health', 'visibility_display', 'location_details', 'type_details', - 'level_details', 'country_details', 'focal_person_loc', 'focal_person_en', - 'email', 'phone', 'location_json', 'visibility', 'modified_by_details', - 'created_by_details', 'version_id' + "local_branch_name", + "english_branch_name", + "type", + "country", + "created_at", + "modified_at", + "draft", + "validated", + "postcode", + "address_loc", + "address_en", + "city_loc", + "city_en", + "link", + "location", + "source_loc", + "source_en", + "subtype", + "date_of_data", + "level", + "health", + "visibility_display", + "location_details", + "type_details", + "level_details", + "country_details", + "focal_person_loc", + "focal_person_en", + "email", + "phone", + "location_json", + "visibility", + "modified_by_details", + "created_by_details", + "version_id", ) def get_location_details(self, unit) -> dict: @@ -276,36 +292,30 @@ def get_version_id(self, resource): return None version_id = Version.objects.get_for_object(resource).count() - request = self.context['request'] - if request.method in ['POST', 'PUT', 'PATCH']: - if not (request.method == 'POST' and self.context.get('post_is_used_for_filter', False)): + request = self.context["request"] + if request.method in ["POST", "PUT", "PATCH"]: + if not (request.method == "POST" and self.context.get("post_is_used_for_filter", False)): version_id += 1 return version_id def validate(self, data): - local_branch_name = data.get('local_branch_name') - english_branch_name = data.get('english_branch_name') + local_branch_name = data.get("local_branch_name") + english_branch_name = data.get("english_branch_name") if (not local_branch_name) and (not english_branch_name): - raise serializers.ValidationError( - gettext('Branch Name Combination is required !') - ) - type = data.get('type') - health = data.get('health') + raise serializers.ValidationError(gettext("Branch Name Combination is required !")) + type = data.get("type") + health = data.get("health") if type.code == 1 and health: - raise serializers.ValidationError({ - 'Can\'t have health data for type %s' % type.code - }) + raise serializers.ValidationError({"Can't have health data for type %s" % type.code}) return data def create(self, validated_data): - country = validated_data.get('country') - location_json = validated_data.pop('location_json') - lat = location_json.get('lat') - lng = location_json.get('lng') + country = validated_data.get("country") + location_json = validated_data.pop("location_json") + lat = location_json.get("lat") + lng = location_json.get("lng") if not lat and not lng: - raise serializers.ValidationError( - gettext('Combination of lat/lon is required') - ) + raise serializers.ValidationError(gettext("Combination of lat/lon is required")) input_point = Point(lng, lat) if country.bbox: country_json = json.loads(country.countrygeoms.geom.geojson) @@ -322,23 +332,19 @@ def create(self, validated_data): shapely_multipolygon = MultiPolygon(polygons) if not input_point.within(shapely_multipolygon): raise serializers.ValidationError( - { - 'location_json': gettext('Input coordinates is outside country %s boundary' % country.name) - } + {"location_json": gettext("Input coordinates is outside country %s boundary" % country.name)} ) - validated_data['location'] = GEOSGeometry('POINT(%f %f)' % (lng, lat)) - validated_data['created_by'] = self.context["request"].user + validated_data["location"] = GEOSGeometry("POINT(%f %f)" % (lng, lat)) + validated_data["created_by"] = self.context["request"].user return super().create(validated_data) def update(self, instance, validated_data): country = instance.country - location_json = validated_data.pop('location_json') - lat = location_json.get('lat') - lng = location_json.get('lng') + location_json = validated_data.pop("location_json") + lat = location_json.get("lat") + lng = location_json.get("lng") if not lat and not lng: - raise serializers.ValidationError( - gettext('Combination of lat/lon is required') - ) + raise serializers.ValidationError(gettext("Combination of lat/lon is required")) input_point = Point(lng, lat) if country.bbox: country_json = json.loads(country.countrygeoms.geom.geojson) @@ -355,77 +361,71 @@ def update(self, instance, validated_data): shapely_multipolygon = MultiPolygon(polygons) if not input_point.within(shapely_multipolygon): raise serializers.ValidationError( - { - 'location_json': gettext('Input coordinates is outside country %s boundary' % country.name) - } + {"location_json": gettext("Input coordinates is outside country %s boundary" % country.name)} ) - validated_data['location'] = GEOSGeometry('POINT(%f %f)' % (lng, lat)) + validated_data["location"] = GEOSGeometry("POINT(%f %f)" % (lng, lat)) validated_data["modified_by"] = self.context["request"].user # NOTE: Each time form is updated change validated status to `False` validated_data["validated"] = False return super().update(instance, validated_data) -class LocalUnitSerializer( - serializers.ModelSerializer -): +class LocalUnitSerializer(serializers.ModelSerializer): location_details = serializers.SerializerMethodField() - country_details = LocalUnitCountrySerializer(source='country', read_only=True) - type_details = LocalUnitTypeSerializer(source='type', read_only=True) - health_details = MiniHealthDataSerializer(read_only=True, source='health') + country_details = LocalUnitCountrySerializer(source="country", read_only=True) + type_details = LocalUnitTypeSerializer(source="type", read_only=True) + health_details = MiniHealthDataSerializer(read_only=True, source="health") validated = serializers.BooleanField(read_only=True) class Meta: model = LocalUnit fields = ( - 'id', - 'country', - 'local_branch_name', - 'english_branch_name', - 'location_details', - 'type', - 'validated', - 'address_loc', - 'address_en', - 'country_details', - 'type_details', - 'health', - 'health_details', + "id", + "country", + "local_branch_name", + "english_branch_name", + "location_details", + "type", + "validated", + "address_loc", + "address_en", + "country_details", + "type_details", + "health", + "health_details", ) def get_location_details(self, unit) -> dict: return json.loads(unit.location.geojson) -class PrivateLocalUnitSerializer( - serializers.ModelSerializer -): +class PrivateLocalUnitSerializer(serializers.ModelSerializer): location_details = serializers.SerializerMethodField() - country_details = LocalUnitCountrySerializer(source='country', read_only=True) - type_details = LocalUnitTypeSerializer(source='type', read_only=True) - health_details = MiniHealthDataSerializer(read_only=True, source='health') + country_details = LocalUnitCountrySerializer(source="country", read_only=True) + type_details = LocalUnitTypeSerializer(source="type", read_only=True) + health_details = MiniHealthDataSerializer(read_only=True, source="health") validated = serializers.BooleanField(read_only=True) class Meta: model = LocalUnit fields = ( - 'id', - 'country', - 'local_branch_name', - 'english_branch_name', - 'location_details', - 'type', - 'validated', - 'address_loc', - 'address_en', - 'country_details', - 'type_details', - 'health', - 'health_details', - 'focal_person_loc', - 'focal_person_en', - 'email', - 'phone', + "id", + "country", + "local_branch_name", + "english_branch_name", + "location_details", + "type", + "validated", + "address_loc", + "address_en", + "country_details", + "type_details", + "health", + "health_details", + "focal_person_loc", + "focal_person_en", + "email", + "phone", ) def get_location_details(self, unit) -> dict: @@ -436,18 +436,14 @@ class DelegationOfficeCountrySerializer(serializers.ModelSerializer): class Meta: model = Country - fields = ( - 'name', 'iso3', 'region', 'region' - ) + fields = ("name", "iso3", "region", "region") class DelegationOfficeTypeSerializer(serializers.ModelSerializer): class Meta: model = DelegationOfficeType - fields = ( - 'name', 'code' - ) + fields = ("name", "code") class DelegationOfficeSerializer(serializers.ModelSerializer): @@ -458,36 +454,37 @@ class DelegationOfficeSerializer(serializers.ModelSerializer): class Meta: model = DelegationOffice fields = [ - 'name', - 'city', - 'address', - 'postcode', - 'location', - 'society_url', - 'url_ifrc', - 'hod_first_name', - 'hod_last_name', - 'hod_mobile_number', - 'hod_email', - 'assistant_name', - 'assistant_email', - 'is_ns_same_location', - 'is_multiple_ifrc_offices', - 'visibility', - 'created_at', - 'modified_at', - 'date_of_data', - 'country', - 'dotype'] + "name", + "city", + "address", + "postcode", + "location", + "society_url", + "url_ifrc", + "hod_first_name", + "hod_last_name", + "hod_mobile_number", + "hod_email", + "assistant_name", + "assistant_email", + "is_ns_same_location", + "is_multiple_ifrc_offices", + "visibility", + "created_at", + "modified_at", + "date_of_data", + "country", + "dotype", + ] def get_location(self, office): return json.loads(office.location.geojson) def get_country(self, office): - return {'country'} + return {"country"} def get_type(self, office): - return {'type'} + return {"type"} class LocalUnitOptionsSerializer(serializers.Serializer): @@ -505,16 +502,16 @@ class LocalUnitOptionsSerializer(serializers.Serializer): class MiniDelegationOfficeSerializer(serializers.ModelSerializer): - dotype_name = serializers.CharField(source='dotype.name', read_only=True) + dotype_name = serializers.CharField(source="dotype.name", read_only=True) class Meta: model = DelegationOffice fields = ( - 'hod_first_name', - 'hod_last_name', - 'hod_mobile_number', - 'hod_email', - 'dotype_name', - 'city', - 'address', + "hod_first_name", + "hod_last_name", + "hod_mobile_number", + "hod_email", + "dotype_name", + "city", + "address", ) diff --git a/local_units/test_views.py b/local_units/test_views.py index 5b0113512..cc31d1a2f 100644 --- a/local_units/test_views.py +++ b/local_units/test_views.py @@ -1,21 +1,22 @@ -import factory import datetime +import factory from django.contrib.gis.geos import Point +from api.models import Country, Region +from main.test_case import APITestCase + from .models import ( - LocalUnit, - LocalUnitType, - LocalUnitLevel, + Affiliation, DelegationOffice, DelegationOfficeType, - Affiliation, - Functionality, FacilityType, + Functionality, + LocalUnit, + LocalUnitLevel, + LocalUnitType, PrimaryHCC, ) -from api.models import Country, Region -from main.test_case import APITestCase class LocalUnitFactory(factory.django.DjangoModelFactory): @@ -30,42 +31,23 @@ class TestLocalUnitsListView(APITestCase): def setUp(self): super().setUp() region = Region.objects.create(name=2) - country = Country.objects.create( - name='Nepal', - iso3='NLP', - iso='NP', - region=region - ) + country = Country.objects.create(name="Nepal", iso3="NLP", iso="NP", region=region) country_1 = Country.objects.create( - name='Philippines', - iso3='PHL', - iso='PH', + name="Philippines", + iso3="PHL", + iso="PH", region=region, ) - type = LocalUnitType.objects.create(code=0, name='Code 0') - type_1 = LocalUnitType.objects.create(code=1, name='Code 1') - LocalUnitFactory.create_batch( - 5, - country=country, - type=type, - draft=True, - validated=False, - date_of_data='2023-09-09' - ) - LocalUnitFactory.create_batch( - 5, - country=country_1, - type=type_1, - draft=False, - validated=True, - date_of_data='2023-08-08' - ) + type = LocalUnitType.objects.create(code=0, name="Code 0") + type_1 = LocalUnitType.objects.create(code=1, name="Code 1") + LocalUnitFactory.create_batch(5, country=country, type=type, draft=True, validated=False, date_of_data="2023-09-09") + LocalUnitFactory.create_batch(5, country=country_1, type=type_1, draft=False, validated=True, date_of_data="2023-08-08") def test_list(self): self.authenticate() - response = self.client.get('/api/v2/local-units/') + response = self.client.get("/api/v2/local-units/") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 10) + self.assertEqual(response.data["count"], 10) # TODO: fix these asaywltdi # self.assertEqual(response.data['results'][0]['location_details']['coordinates'], [12, 38]) # self.assertEqual(response.data['results'][0]['country_details']['name'], 'Nepal') @@ -75,86 +57,86 @@ def test_list(self): def test_filter(self): self.authenticate() - response = self.client.get('/api/v2/local-units/?country__name=Nepal') + response = self.client.get("/api/v2/local-units/?country__name=Nepal") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/local-units/?country__name=Philippines') + response = self.client.get("/api/v2/local-units/?country__name=Philippines") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/local-units/?country__name=Belgium') + response = self.client.get("/api/v2/local-units/?country__name=Belgium") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) - response = self.client.get('/api/v2/local-units/?country__iso=BE') + response = self.client.get("/api/v2/local-units/?country__iso=BE") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) - response = self.client.get('/api/v2/local-units/?country__iso3=BEL') + response = self.client.get("/api/v2/local-units/?country__iso3=BEL") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) - response = self.client.get('/api/v2/local-units/?country__iso=BE') + response = self.client.get("/api/v2/local-units/?country__iso=BE") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) - response = self.client.get('/api/v2/local-units/?country__iso3=PHL') + response = self.client.get("/api/v2/local-units/?country__iso3=PHL") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/local-units/?country__iso=NP') + response = self.client.get("/api/v2/local-units/?country__iso=NP") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/local-units/?type__code=0') + response = self.client.get("/api/v2/local-units/?type__code=0") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/local-units/?type__code=4') + response = self.client.get("/api/v2/local-units/?type__code=4") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) - response = self.client.get('/api/v2/local-units/?draft=true') + response = self.client.get("/api/v2/local-units/?draft=true") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/local-units/?draft=false') + response = self.client.get("/api/v2/local-units/?draft=false") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/local-units/?validated=true') + response = self.client.get("/api/v2/local-units/?validated=true") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/local-units/?validated=false') + response = self.client.get("/api/v2/local-units/?validated=false") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) class TestLocalUnitsDetailView(APITestCase): def setUp(self): super().setUp() region = Region.objects.create(name=2) - country = Country.objects.create(name='Nepal', iso3='NLP', region=region) - type = LocalUnitType.objects.create(code=0, name='Code 0') + country = Country.objects.create(name="Nepal", iso3="NLP", region=region) + type = LocalUnitType.objects.create(code=0, name="Code 0") LocalUnitFactory.create_batch(2, country=country, type=type) def test_detail(self): local_unit = LocalUnit.objects.all().first() self.authenticate() - response = self.client.get(f'/api/v2/local-units/{local_unit.id}/') + response = self.client.get(f"/api/v2/local-units/{local_unit.id}/") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['location_details']['coordinates'], [12, 38]) - self.assertEqual(response.data['country_details']['name'], 'Nepal') - self.assertEqual(response.data['country_details']['iso3'], 'NLP') - self.assertEqual(response.data['type_details']['name'], 'Code 0') - self.assertEqual(response.data['type_details']['code'], 0) + self.assertEqual(response.data["location_details"]["coordinates"], [12, 38]) + self.assertEqual(response.data["country_details"]["name"], "Nepal") + self.assertEqual(response.data["country_details"]["iso3"], "NLP") + self.assertEqual(response.data["type_details"]["name"], "Code 0") + self.assertEqual(response.data["type_details"]["code"], 0) def test_validate_local_units(self): local_unit = LocalUnit.objects.all().first() self.authenticate() - url = f'/api/v2/local-units/{local_unit.id}/validate/' + url = f"/api/v2/local-units/{local_unit.id}/validate/" data = {} response = self.client.post(url, data=data) self.assert_403(response) @@ -175,82 +157,82 @@ class Meta: class TestDelegationOfficesListView(APITestCase): def setUp(self): region = Region.objects.create(name=2) - country = Country.objects.create(name='Nepal', iso3='NLP', iso='NP', region=region) - country_1 = Country.objects.create(name='Philippines', iso3='PHL', iso='PH', region=region) - type = DelegationOfficeType.objects.create(code=0, name='Code 0') - type_1 = DelegationOfficeType.objects.create(code=1, name='Code 1') + country = Country.objects.create(name="Nepal", iso3="NLP", iso="NP", region=region) + country_1 = Country.objects.create(name="Philippines", iso3="PHL", iso="PH", region=region) + type = DelegationOfficeType.objects.create(code=0, name="Code 0") + type_1 = DelegationOfficeType.objects.create(code=1, name="Code 1") DelegationOfficeFactory.create_batch(5, country=country, dotype=type) DelegationOfficeFactory.create_batch(5, country=country_1, dotype=type_1) def test_list(self): - response = self.client.get('/api/v2/delegation-office/') + response = self.client.get("/api/v2/delegation-office/") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 10) - self.assertEqual(response.data['results'][0]['location']['coordinates'], [2.2, 3.3]) - self.assertEqual(response.data['results'][0]['country']['name'], 'Nepal') - self.assertEqual(response.data['results'][0]['country']['iso3'], 'NLP') - self.assertEqual(response.data['results'][0]['dotype']['name'], 'Code 0') - self.assertEqual(response.data['results'][0]['dotype']['code'], 0) + self.assertEqual(response.data["count"], 10) + self.assertEqual(response.data["results"][0]["location"]["coordinates"], [2.2, 3.3]) + self.assertEqual(response.data["results"][0]["country"]["name"], "Nepal") + self.assertEqual(response.data["results"][0]["country"]["iso3"], "NLP") + self.assertEqual(response.data["results"][0]["dotype"]["name"], "Code 0") + self.assertEqual(response.data["results"][0]["dotype"]["code"], 0) def test_filter(self): - response = self.client.get('/api/v2/delegation-office/?country__name=Nepal') + response = self.client.get("/api/v2/delegation-office/?country__name=Nepal") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/delegation-office/?country__name=Philippines') + response = self.client.get("/api/v2/delegation-office/?country__name=Philippines") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/delegation-office/?country__name=Belgium') + response = self.client.get("/api/v2/delegation-office/?country__name=Belgium") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) - response = self.client.get('/api/v2/delegation-office/?country__iso=BE') + response = self.client.get("/api/v2/delegation-office/?country__iso=BE") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) - response = self.client.get('/api/v2/delegation-office/?country__iso3=BEL') + response = self.client.get("/api/v2/delegation-office/?country__iso3=BEL") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) - response = self.client.get('/api/v2/delegation-office/?country__iso=BE') + response = self.client.get("/api/v2/delegation-office/?country__iso=BE") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) - response = self.client.get('/api/v2/delegation-office/?country__iso3=PHL') + response = self.client.get("/api/v2/delegation-office/?country__iso3=PHL") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/delegation-office/?country__iso=NP') + response = self.client.get("/api/v2/delegation-office/?country__iso=NP") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/delegation-office/?dotype__code=0') + response = self.client.get("/api/v2/delegation-office/?dotype__code=0") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 5) + self.assertEqual(response.data["count"], 5) - response = self.client.get('/api/v2/delegation-office/?dotype__code=4') + response = self.client.get("/api/v2/delegation-office/?dotype__code=4") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['count'], 0) + self.assertEqual(response.data["count"], 0) class TestDelegationOfficesDetailView(APITestCase): def setUp(self): region = Region.objects.create(name=2) - country = Country.objects.create(name='Nepal', iso3='NLP', region=region) - type = DelegationOfficeType.objects.create(code=0, name='Code 0') + country = Country.objects.create(name="Nepal", iso3="NLP", region=region) + type = DelegationOfficeType.objects.create(code=0, name="Code 0") DelegationOfficeFactory.create_batch(2, country=country, dotype=type) def test_detail(self): local_unit = DelegationOffice.objects.all().first() self.authenticate() - response = self.client.get(f'/api/v2/delegation-office/{local_unit.id}/') + response = self.client.get(f"/api/v2/delegation-office/{local_unit.id}/") self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['location']['coordinates'], [2.2, 3.3]) - self.assertEqual(response.data['country']['name'], 'Nepal') - self.assertEqual(response.data['country']['iso3'], 'NLP') - self.assertEqual(response.data['dotype']['name'], 'Code 0') - self.assertEqual(response.data['dotype']['code'], 0) + self.assertEqual(response.data["location"]["coordinates"], [2.2, 3.3]) + self.assertEqual(response.data["country"]["name"], "Nepal") + self.assertEqual(response.data["country"]["iso3"], "NLP") + self.assertEqual(response.data["dotype"]["name"], "Code 0") + self.assertEqual(response.data["dotype"]["code"], 0) class TestLocalUnitCreate(APITestCase): @@ -258,13 +240,13 @@ class TestLocalUnitCreate(APITestCase): def test_create_local_unit_administrative(self): region = Region.objects.create(name=2) country = Country.objects.create( - name='Philippines', - iso3='PHL', - iso='PH', + name="Philippines", + iso3="PHL", + iso="PH", region=region, ) - type = LocalUnitType.objects.create(code=1, name='Code 0') - level = LocalUnitLevel.objects.create(level=1, name='Code 1') + type = LocalUnitType.objects.create(code=1, name="Code 0") + level = LocalUnitLevel.objects.create(level=1, name="Code 1") data = { "local_branch_name": None, @@ -280,8 +262,8 @@ def test_create_local_unit_administrative(self): "city_en": "Pukë", "link": "", "location_json": { - 'lat': 42.066667, - 'lng': 19.983333, + "lat": 42.066667, + "lng": 19.983333, }, "source_loc": "", "source_en": "", @@ -295,28 +277,23 @@ def test_create_local_unit_administrative(self): # "health": {} } self.authenticate() - response = self.client.post('/api/v2/local-units/', data=data, format='json') + response = self.client.post("/api/v2/local-units/", data=data, format="json") self.assertEqual(response.status_code, 400) # add `english branch_name` - data['english_branch_name'] = 'Test branch name' - response = self.client.post('/api/v2/local-units/', data=data, format='json') + data["english_branch_name"] = "Test branch name" + response = self.client.post("/api/v2/local-units/", data=data, format="json") self.assertEqual(response.status_code, 201) def test_create_local_unit_health(self): region = Region.objects.create(name=2) - country = Country.objects.create( - name='Philippines', - iso3='PHL', - iso='PH', - region=region - ) - type = LocalUnitType.objects.create(code=2, name='Code 0') - level = LocalUnitLevel.objects.create(level=1, name='Code 1') - affiliation = Affiliation.objects.create(code=1, name='Code 1') - functionality = Functionality.objects.create(code=1, name='Code 1') - health_facility_type = FacilityType.objects.create(code=1, name='Code 1') - primary_health_care_center = PrimaryHCC.objects.create(code=1, name='Code 1') + country = Country.objects.create(name="Philippines", iso3="PHL", iso="PH", region=region) + type = LocalUnitType.objects.create(code=2, name="Code 0") + level = LocalUnitLevel.objects.create(level=1, name="Code 1") + affiliation = Affiliation.objects.create(code=1, name="Code 1") + functionality = Functionality.objects.create(code=1, name="Code 1") + health_facility_type = FacilityType.objects.create(code=1, name="Code 1") + primary_health_care_center = PrimaryHCC.objects.create(code=1, name="Code 1") data = { "local_branch_name": "Silele Red Cross Clinic, Sigombeni Red Cross Clinic & Mahwalala Red Cross Clinic", @@ -340,8 +317,8 @@ def test_create_local_unit_health(self): "date_of_data": "2024-05-13", "level": level.id, "location_json": { - 'lat': 42.066667, - 'lng': 19.983333, + "lat": 42.066667, + "lng": 19.983333, }, "health": { "other_affiliation": None, @@ -377,29 +354,17 @@ def test_create_local_unit_health(self): "health_facility_type": health_facility_type.id, "primary_health_care_center": primary_health_care_center.id, "hospital_type": None, - "general_medical_services": [ - 1, - 2, - 3, - 4, - 5 - ], - "specialized_medical_beyond_primary_level": [ - 4, - 10, - 22 - ], - "blood_services": [ - 2 - ], - "professional_training_facilities": [] + "general_medical_services": [1, 2, 3, 4, 5], + "specialized_medical_beyond_primary_level": [4, 10, 22], + "blood_services": [2], + "professional_training_facilities": [], }, "visibility_display": "RCRC Movement", "focal_person_loc": "Elliot Jele", "focal_person_en": "", "email": "", - "phone": "" + "phone": "", } self.client.force_authenticate(self.root_user) - response = self.client.post('/api/v2/local-units/', data=data, format='json') + response = self.client.post("/api/v2/local-units/", data=data, format="json") self.assertEqual(response.status_code, 201) diff --git a/local_units/views.py b/local_units/views.py index c724787a0..7affa78a4 100644 --- a/local_units/views.py +++ b/local_units/views.py @@ -1,57 +1,52 @@ -from rest_framework import ( - viewsets, - permissions, - response, - views -) -from rest_framework.generics import ( - ListAPIView, - RetrieveAPIView -) -from rest_framework.decorators import action from drf_spectacular.utils import extend_schema +from rest_framework import permissions, response, views, viewsets +from rest_framework.decorators import action +from rest_framework.generics import ListAPIView, RetrieveAPIView -from local_units.filterset import LocalUnitFilters, DelegationOfficeFilters +from api.utils import bad_request +from local_units.filterset import DelegationOfficeFilters, LocalUnitFilters from local_units.models import ( + Affiliation, + BloodService, + DelegationOffice, + FacilityType, + Functionality, + GeneralMedicalService, + HospitalType, LocalUnit, LocalUnitLevel, LocalUnitType, - Affiliation, - Functionality, - FacilityType, PrimaryHCC, - HospitalType, - BloodService, ProfessionalTrainingFacility, - VisibilityChoices, - GeneralMedicalService, SpecializedMedicalService, - DelegationOffice, + VisibilityChoices, +) +from local_units.permissions import ( + IsAuthenticatedForLocalUnit, + ValidateLocalUnitPermission, ) from local_units.serializers import ( - LocalUnitSerializer, - LocalUnitOptionsSerializer, - LocalUnitDetailSerializer, DelegationOfficeSerializer, + LocalUnitDetailSerializer, + LocalUnitOptionsSerializer, + LocalUnitSerializer, + PrivateLocalUnitDetailSerializer, PrivateLocalUnitSerializer, - PrivateLocalUnitDetailSerializer -) -from local_units.permissions import ( - ValidateLocalUnitPermission, - IsAuthenticatedForLocalUnit ) -from api.utils import bad_request class PrivateLocalUnitViewSet(viewsets.ModelViewSet): queryset = LocalUnit.objects.select_related( - 'health', - 'country', - 'type', - 'level', + "health", + "country", + "type", + "level", ) filterset_class = LocalUnitFilters - search_fields = ('local_branch_name', 'english_branch_name',) + search_fields = ( + "local_branch_name", + "english_branch_name", + ) permission_classes = [permissions.IsAuthenticated, IsAuthenticatedForLocalUnit] def get_serializer_class(self): @@ -60,17 +55,15 @@ def get_serializer_class(self): return PrivateLocalUnitDetailSerializer def destroy(self, request, *args, **kwargs): - return bad_request('Delete method not allowed') + return bad_request("Delete method not allowed") - @extend_schema( - responses=PrivateLocalUnitSerializer - ) + @extend_schema(responses=PrivateLocalUnitSerializer) @action( detail=True, url_path="validate", methods=["post"], serializer_class=PrivateLocalUnitSerializer, - permission_classes=[permissions.IsAuthenticated, ValidateLocalUnitPermission] + permission_classes=[permissions.IsAuthenticated, ValidateLocalUnitPermission], ) def get_validate(self, request, pk=None, version=None): local_unit = self.get_object() @@ -82,13 +75,16 @@ def get_validate(self, request, pk=None, version=None): class LocalUnitViewSet(viewsets.ModelViewSet): queryset = LocalUnit.objects.select_related( - 'health', - 'country', - 'type', - 'level', + "health", + "country", + "type", + "level", ).filter(visibility=VisibilityChoices.PUBLIC) filterset_class = LocalUnitFilters - search_fields = ('local_branch_name', 'english_branch_name',) + search_fields = ( + "local_branch_name", + "english_branch_name", + ) def get_serializer_class(self): if self.action == "list": @@ -96,13 +92,13 @@ def get_serializer_class(self): return LocalUnitDetailSerializer def create(self, request, *args, **kwargs): - return bad_request('Create method not allowed') + return bad_request("Create method not allowed") def update(self, request, *args, **kwargs): - return bad_request('Update method not allowed') + return bad_request("Update method not allowed") def destroy(self, request, *args, **kwargs): - return bad_request('Delete method not allowed') + return bad_request("Delete method not allowed") class LocalUnitOptionsView(views.APIView): @@ -123,7 +119,8 @@ def get(self, request, version=None): professional_training_facilities=ProfessionalTrainingFacility.objects.all(), general_medical_services=GeneralMedicalService.objects.all(), specialized_medical_services=SpecializedMedicalService.objects.all(), - ), context={'request': request} + ), + context={"request": request}, ).data ) @@ -132,7 +129,7 @@ class DelegationOfficeListAPIView(ListAPIView): queryset = DelegationOffice.objects.all() serializer_class = DelegationOfficeSerializer filterset_class = DelegationOfficeFilters - search_fields = ('name', 'country__name') + search_fields = ("name", "country__name") class DelegationOfficeDetailAPIView(RetrieveAPIView): diff --git a/main/__init__.py b/main/__init__.py index 30f985b0c..f1e3eeff0 100644 --- a/main/__init__.py +++ b/main/__init__.py @@ -2,5 +2,5 @@ # Django starts so that shared_task will use this app. from .celery import app as celery_app -__all__ = ['celery_app'] -__version__ = '1.1.500' +__all__ = ["celery_app"] +__version__ = "1.1.500" diff --git a/main/celery.py b/main/celery.py index fa710210a..a6ac4f13b 100644 --- a/main/celery.py +++ b/main/celery.py @@ -1,7 +1,8 @@ import os -import celery +import celery from django.conf import settings + from main import sentry @@ -9,7 +10,7 @@ class CustomCeleryApp(celery.Celery): def on_configure(self): if settings.SENTRY_DSN: sentry.init_sentry( - app_type='WORKER', + app_type="WORKER", **settings.SENTRY_CONFIG, ) @@ -17,22 +18,22 @@ def on_configure(self): # set the default Django settings module for the 'celery' program. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings") -app = CustomCeleryApp('main') +app = CustomCeleryApp("main") # Using a string here means the worker doesn't have to serialize # the configuration object to child processes. # - namespace='CELERY' means all celery-related configuration keys # should have a `CELERY_` prefix. -app.config_from_object('django.conf:settings', namespace='CELERY') +app.config_from_object("django.conf:settings", namespace="CELERY") # Load task modules from all registered Django app configs. app.autodiscover_tasks() -class Queues(): - DEFAULT = 'default' - HEAVY = 'heavy' - CRONJOB = 'cronjob' +class Queues: + DEFAULT = "default" + HEAVY = "heavy" + CRONJOB = "cronjob" DEV_QUEUES = ( DEFAULT, @@ -46,4 +47,4 @@ class Queues(): @app.task(bind=True) def debug_task(self): - print('Request: {0!r}'.format(self.request)) + print("Request: {0!r}".format(self.request)) diff --git a/main/context_processors.py b/main/context_processors.py index e1aa95053..edc51a6ff 100644 --- a/main/context_processors.py +++ b/main/context_processors.py @@ -1,15 +1,16 @@ from django.conf import settings + from api.models import CronJob, CronJobStatus def ifrc_go(request): - cron_error = CronJob.objects.filter(status=CronJobStatus.ERRONEOUS).order_by('-id').first() + cron_error = CronJob.objects.filter(status=CronJobStatus.ERRONEOUS).order_by("-id").first() return { # Provide a variable to define current environment - 'GO_ENVIRONMENT': settings.GO_ENVIRONMENT, + "GO_ENVIRONMENT": settings.GO_ENVIRONMENT, # For maintenance mode: - 'DJANGO_READ_ONLY': settings.DJANGO_READ_ONLY, + "DJANGO_READ_ONLY": settings.DJANGO_READ_ONLY, # For header /_!_\ error symbol in base_site.html - 'HAVING_INGEST_ISSUE': True if cron_error else False, - 'INGEST_ISSUE_ID': cron_error.id if cron_error else None, + "HAVING_INGEST_ISSUE": True if cron_error else False, + "INGEST_ISSUE_ID": cron_error.id if cron_error else None, } diff --git a/main/enums.py b/main/enums.py index 06b9dd6a1..2365266e1 100644 --- a/main/enums.py +++ b/main/enums.py @@ -1,28 +1,27 @@ from django.conf import settings from rest_framework import serializers -from dref import enums as dref_enums from api import enums as api_enums -from flash_update import enums as flash_update_enums +from databank import enums as databank_enums from deployments import enums as deployments_enums -from per import enums as per_enums +from dref import enums as dref_enums +from flash_update import enums as flash_update_enums from notifications import enums as notifications_enums -from databank import enums as databank_enums - +from per import enums as per_enums apps_enum_register = [ - ('dref', dref_enums.enum_register), - ('api', api_enums.enum_register), - ('flash_update', flash_update_enums.enum_register), - ('deployments', deployments_enums.enum_register), - ('per', per_enums.enum_register), - ('notifications', notifications_enums.enum_register), - ('databank', databank_enums.enum_register), + ("dref", dref_enums.enum_register), + ("api", api_enums.enum_register), + ("flash_update", flash_update_enums.enum_register), + ("deployments", deployments_enums.enum_register), + ("per", per_enums.enum_register), + ("notifications", notifications_enums.enum_register), + ("databank", databank_enums.enum_register), ] def underscore_to_camel(text): - return text.replace('_', ' ').title().replace(' ', '') + return text.replace("_", " ").title().replace(" ", "") def generate_global_enum_register(): @@ -31,10 +30,10 @@ def generate_global_enum_register(): for app_prefix, app_enum_register in apps_enum_register: for enum_field, enum in app_enum_register.items(): # Change field dref_national_society_action_title -> DrefNationalSocietyActionTitle - _enum_field = f'{app_prefix}_{enum_field}' - enum_name = f'{underscore_to_camel(_enum_field)}EnumSerializer' + _enum_field = f"{app_prefix}_{enum_field}" + enum_name = f"{underscore_to_camel(_enum_field)}EnumSerializer" if enum_name in enum_names: - raise Exception(f'Duplicate enum_names found for {enum_name} in {enum_names}') + raise Exception(f"Duplicate enum_names found for {enum_name} in {enum_names}") enum_names.add(enum_name) enum_map[_enum_field] = (enum_name, enum) return enum_map @@ -45,14 +44,14 @@ def generate_global_enum_register(): def generate_enum_global_serializer(name): def _get_enum_key_value_serializer(enum, enum_name): - _enum_name = enum_name.replace('EnumSerializer', 'EnumKey') - settings.SPECTACULAR_SETTINGS['ENUM_NAME_OVERRIDES'][_enum_name] = enum + _enum_name = enum_name.replace("EnumSerializer", "EnumKey") + settings.SPECTACULAR_SETTINGS["ENUM_NAME_OVERRIDES"][_enum_name] = enum return type( enum_name, (serializers.Serializer,), { - 'key': serializers.ChoiceField(enum.choices), - 'value': serializers.CharField(), + "key": serializers.ChoiceField(enum.choices), + "value": serializers.CharField(), }, ) @@ -62,15 +61,15 @@ def _get_enum_key_value_serializer(enum, enum_name): return type(name, (serializers.Serializer,), fields) -GlobalEnumSerializer = generate_enum_global_serializer('GlobalEnumSerializer') +GlobalEnumSerializer = generate_enum_global_serializer("GlobalEnumSerializer") def get_enum_values(): enum_data = { enum_field: [ { - 'key': key, - 'value': value, + "key": key, + "value": value, } for key, value in enum.choices ] diff --git a/main/errors.py b/main/errors.py index 10c2fa95d..3896732a1 100644 --- a/main/errors.py +++ b/main/errors.py @@ -1,9 +1,8 @@ from main import error_codes - error_code_map = { - 'not_authenticated': error_codes.NOT_AUTHENTICATED, - 'authentication_failed': error_codes.AUTHENTICATION_FAILED, + "not_authenticated": error_codes.NOT_AUTHENTICATED, + "authentication_failed": error_codes.AUTHENTICATION_FAILED, } @@ -15,7 +14,7 @@ def map_error_codes(codes, default=None): if isinstance(codes, str): return error_code_map.get(codes, default) - if codes == {'non_field_errors': ['invalid']}: + if codes == {"non_field_errors": ["invalid"]}: return error_codes.TOKEN_INVALID return default diff --git a/main/exception_handler.py b/main/exception_handler.py index fc8cfb9cf..2ff51a7d8 100644 --- a/main/exception_handler.py +++ b/main/exception_handler.py @@ -1,22 +1,19 @@ import logging -import sentry_sdk -from rest_framework.views import exception_handler -from rest_framework.response import Response -from rest_framework import status, exceptions -from django_read_only import DjangoReadOnlyError +import sentry_sdk from django.utils import timezone +from django_read_only import DjangoReadOnlyError +from rest_framework import exceptions, status +from rest_framework.response import Response +from rest_framework.views import exception_handler from main.errors import map_error_codes logger = logging.getLogger(__name__) -logger = logging.getLogger('api') +logger = logging.getLogger("api") -standard_error_string = ( - 'Something unexpected has occured. ' - 'Please contact an admin to fix this issue.' -) +standard_error_string = "Something unexpected has occured. " "Please contact an admin to fix this issue." logger = logging.getLogger(__name__) @@ -30,31 +27,27 @@ def custom_exception_handler(exc, context): # Expected ReadOnlyError if type(exc) == DjangoReadOnlyError: response_data = { - 'errors': { - 'non_field_errors': ['We are in maintenance mode, come back a bit later – site is in read only mode'] - }, + "errors": {"non_field_errors": ["We are in maintenance mode, come back a bit later – site is in read only mode"]}, } else: # Other 500 errors - request = context.get('request') + request = context.get("request") if request and request.user and request.user.id: with sentry_sdk.configure_scope() as scope: scope.user = { - 'id': request.user.id, - 'email': request.user.email, + "id": request.user.id, + "email": request.user.email, } - scope.set_extra('is_superuser', request.user.is_superuser) + scope.set_extra("is_superuser", request.user.is_superuser) sentry_sdk.capture_exception() - logger.error('500 error', exc_info=True) + logger.error("500 error", exc_info=True) response_data = { - 'errors': { - 'non_field_errors': [standard_error_string] - }, + "errors": {"non_field_errors": [standard_error_string]}, } logger.error( - '{}.{}'.format(type(exc).__module__, type(exc).__name__), + "{}.{}".format(type(exc).__module__, type(exc).__name__), exc_info=True, - extra={'request': context.get('request')}, + extra={"request": context.get("request")}, ) response = Response(response_data, status=status.HTTP_500_INTERNAL_SERVER_ERROR) @@ -62,26 +55,25 @@ def custom_exception_handler(exc, context): response.data = {} # Timestamp of exception - response.data['timestamp'] = timezone.now() + response.data["timestamp"] = timezone.now() if isinstance(exc, (exceptions.NotAuthenticated,)): response.status_code = status.HTTP_401_UNAUTHORIZED - elif hasattr(exc, 'status_code'): + elif hasattr(exc, "status_code"): response.status_code = exc.status_code - if hasattr(exc, 'code'): + if hasattr(exc, "code"): # If the raised exception defines a code, send it as # internal error code - response.data['error_code'] = exc.code - elif hasattr(exc, 'get_codes'): + response.data["error_code"] = exc.code + elif hasattr(exc, "get_codes"): # Otherwise, try to map the exception.get_codes() value to an # internal error code. # If no internal code available, return http status code as # internal error code by default. - response.data['error_code'] = map_error_codes( - exc.get_codes(), response.status_code) + response.data["error_code"] = map_error_codes(exc.get_codes(), response.status_code) else: - response.data['error_code'] = response.status_code + response.data["error_code"] = response.status_code # Error message can be defined by the exception as message # or detail attributres @@ -90,37 +82,37 @@ def custom_exception_handler(exc, context): errors = None user_error = None - if hasattr(exc, 'message'): + if hasattr(exc, "message"): errors = exc.message - elif hasattr(exc, 'detail'): + elif hasattr(exc, "detail"): if isinstance(exc.detail, list): errors = [str(error) for error in exc.detail] else: errors = exc.detail - elif hasattr(exc, 'default_detail'): + elif hasattr(exc, "default_detail"): errors = exc.default_detail elif response.status_code == 404: - errors = 'Resource not found' + errors = "Resource not found" else: errors = str(exc) user_error = standard_error_string - if hasattr(exc, 'user_message'): + if hasattr(exc, "user_message"): user_error = exc.user_message # Wrap up string error inside non-field-errors if isinstance(errors, str): errors = { - 'non_field_errors': [errors], + "non_field_errors": [errors], } elif isinstance(errors, list) and all([isinstance(error, str) for error in errors]): errors = { - 'non_field_errors': errors, + "non_field_errors": errors, } if user_error: - errors['internal_non_field_errors'] = errors.get('non_field_errors') - errors['non_field_errors'] = [user_error] + errors["internal_non_field_errors"] = errors.get("non_field_errors") + errors["non_field_errors"] = [user_error] - response.data['errors'] = errors + response.data["errors"] = errors return response diff --git a/main/factories.py b/main/factories.py index 5ac35a8a0..736cfe0fc 100644 --- a/main/factories.py +++ b/main/factories.py @@ -1,5 +1,4 @@ import factory - from django.contrib.auth.models import Group diff --git a/main/filters.py b/main/filters.py index 1d6a80a6f..53827ad6b 100644 --- a/main/filters.py +++ b/main/filters.py @@ -1,4 +1,4 @@ -from django.db.models import OrderBy, F +from django.db.models import F, OrderBy from django_filters import rest_framework as filters from rest_framework.filters import OrderingFilter @@ -14,7 +14,7 @@ def get_ordering(self, request, queryset, view): if ordering: nulls_last_ordering = [] for field in ordering: - if field.startswith('-'): + if field.startswith("-"): nulls_last_ordering.append(F(field[1:]).desc(nulls_last=True)) else: nulls_last_ordering.append(F(field).asc(nulls_last=True)) @@ -22,4 +22,3 @@ def get_ordering(self, request, queryset, view): return nulls_last_ordering return ordering - diff --git a/main/frontend.py b/main/frontend.py index 3e1ced6a2..70592cf77 100644 --- a/main/frontend.py +++ b/main/frontend.py @@ -2,8 +2,8 @@ def get_project_url(id): - return f'{settings.FRONTEND_URL}/three-w/projects/{id}/' + return f"{settings.FRONTEND_URL}/three-w/projects/{id}/" def get_flash_update_url(id): - return f'https://{settings.FRONTEND_URL}/flash-updates/{id}/' + return f"https://{settings.FRONTEND_URL}/flash-updates/{id}/" diff --git a/main/managers.py b/main/managers.py index 8db255cab..1b275783b 100644 --- a/main/managers.py +++ b/main/managers.py @@ -1,8 +1,9 @@ import abc import typing from collections import defaultdict -from django.db import models + from django.apps import apps +from django.db import models class BaseBulkManager(object): @@ -62,7 +63,7 @@ def _commit(self, model_class: typing.Type[models.Model]): @abc.abstractmethod def summary(self): - return {'added': dict(self._summary)} + return {"added": dict(self._summary)} class BulkUpdateManager(BaseBulkManager): @@ -72,7 +73,7 @@ def __init__(self, update_fields: typing.List[str], *args, **kwargs): def _process_obj(self, obj: models.Model): if obj.pk is None: - raise Exception(f'Only object with pk is allowed: {obj}') + raise Exception(f"Only object with pk is allowed: {obj}") return obj def _commit(self, model_class: typing.Type[models.Model]): @@ -83,4 +84,4 @@ def _commit(self, model_class: typing.Type[models.Model]): @abc.abstractmethod def summary(self): - return {'updated': dict(self._summary)} + return {"updated": dict(self._summary)} diff --git a/main/mock.py b/main/mock.py index 312d8261c..a8866b57a 100644 --- a/main/mock.py +++ b/main/mock.py @@ -4,11 +4,11 @@ def erp_request_side_effect_mock(url, json, headers): def _generate_mock(status_code, json, headers): response_mock = Mock() - response_mock.text = 'FindThisGUID' + response_mock.text = "FindThisGUID" response_mock.status_code = status_code response_mock.json.return_value = json return response_mock - if json['Emergency']['FieldReport']['AffectedCountries']: + if json["Emergency"]["FieldReport"]["AffectedCountries"]: return _generate_mock(200, None, None) return _generate_mock(400, None, None) diff --git a/main/sentry.py b/main/sentry.py index 270b11472..5c588c63a 100644 --- a/main/sentry.py +++ b/main/sentry.py @@ -1,21 +1,21 @@ +import logging import os import typing -import yaml -import logging -import sentry_sdk from difflib import context_diff -from sentry_sdk.integrations.logging import ignore_logger -from sentry_sdk.integrations.celery import CeleryIntegration -from sentry_sdk.integrations.django import DjangoIntegration -from sentry_sdk.integrations.redis import RedisIntegration -from celery.exceptions import Retry as CeleryRetry -from django.db import models -from django.conf import settings -from django.core.exceptions import PermissionDenied +import sentry_sdk +import yaml # Celery Terminated Exception: The worker processing a job has been terminated by user request. from billiard.exceptions import Terminated +from celery.exceptions import Retry as CeleryRetry +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.db import models +from sentry_sdk.integrations.celery import CeleryIntegration +from sentry_sdk.integrations.django import DjangoIntegration +from sentry_sdk.integrations.logging import ignore_logger +from sentry_sdk.integrations.redis import RedisIntegration IGNORED_ERRORS = [ Terminated, @@ -23,7 +23,7 @@ CeleryRetry, ] IGNORED_LOGGERS = [ - 'django.core.exceptions.ObjectDoesNotExist', + "django.core.exceptions.ObjectDoesNotExist", ] logger = logging.getLogger(__name__) @@ -42,46 +42,41 @@ def fetch_git_sha(path, head=None): >>> fetch_git_sha(os.path.dirname(__file__)) """ if not head: - head_path = os.path.join(path, '.git', 'HEAD') + head_path = os.path.join(path, ".git", "HEAD") if not os.path.exists(head_path): - raise InvalidGitRepository( - 'Cannot identify HEAD for git repository at %s' % (path,)) + raise InvalidGitRepository("Cannot identify HEAD for git repository at %s" % (path,)) - with open(head_path, 'r') as fp: + with open(head_path, "r") as fp: head = str(fp.read()).strip() - if head.startswith('ref: '): + if head.startswith("ref: "): head = head[5:] - revision_file = os.path.join( - path, '.git', *head.split('/') - ) + revision_file = os.path.join(path, ".git", *head.split("/")) else: return head else: - revision_file = os.path.join(path, '.git', 'refs', 'heads', head) + revision_file = os.path.join(path, ".git", "refs", "heads", head) if not os.path.exists(revision_file): - if not os.path.exists(os.path.join(path, '.git')): - raise InvalidGitRepository( - '%s does not seem to be the root of a git repository' % (path,)) + if not os.path.exists(os.path.join(path, ".git")): + raise InvalidGitRepository("%s does not seem to be the root of a git repository" % (path,)) # Check for our .git/packed-refs' file since a `git gc` may have run # https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery - packed_file = os.path.join(path, '.git', 'packed-refs') + packed_file = os.path.join(path, ".git", "packed-refs") if os.path.exists(packed_file): with open(packed_file) as fh: for line in fh: line = line.rstrip() - if line and line[:1] not in ('#', '^'): + if line and line[:1] not in ("#", "^"): try: - revision, ref = line.split(' ', 1) + revision, ref = line.split(" ", 1) except ValueError: continue if ref == head: return str(revision) - raise InvalidGitRepository( - 'Unable to find ref to head "%s" in repository' % (head,)) + raise InvalidGitRepository('Unable to find ref to head "%s" in repository' % (head,)) with open(revision_file) as fh: return str(fh.read()).strip() @@ -99,36 +94,34 @@ def init_sentry(app_type, tags={}, **config): integrations=integrations, ) with sentry_sdk.configure_scope() as scope: - scope.set_tag('app_type', app_type) + scope.set_tag("app_type", app_type) for tag, value in tags.items(): scope.set_tag(tag, value) class SentryMonitor(models.TextChoices): - ''' + """ This class is used to create Sentry monitor of cron jobs @Note: Before adding the jobs to this class, make sure to add the job to the `Values.yaml` file - ''' - INDEX_AND_NOTIFY = 'index_and_notify', '*/5 * * * *' - SYNC_MOLNIX = 'sync_molnix', '*/10 * * * *' - INGEST_APPEALS = 'ingest_appeals', '45 */2 * * *' - SYNC_APPEALDOCS = 'sync_appealdocs', '15 * * * *' - REVOKE_STAFF_STATUS = 'revoke_staff_status', '51 * * * *' - UPDATE_PROJECT_STATUS = 'update_project_status', '1 3 * * *' - USER_REGISTRATION_REMINDER = 'user_registration_reminder', '0 9 * * *' - INGEST_COUNTRY_PLAN_FILE = 'ingest_country_plan_file', '1 0 * * *' - UPDATE_SURGE_ALERT_STATUS = 'update_surge_alert_status', '1 */12 * * *' + """ + + INDEX_AND_NOTIFY = "index_and_notify", "*/5 * * * *" + SYNC_MOLNIX = "sync_molnix", "*/10 * * * *" + INGEST_APPEALS = "ingest_appeals", "45 */2 * * *" + SYNC_APPEALDOCS = "sync_appealdocs", "15 * * * *" + REVOKE_STAFF_STATUS = "revoke_staff_status", "51 * * * *" + UPDATE_PROJECT_STATUS = "update_project_status", "1 3 * * *" + USER_REGISTRATION_REMINDER = "user_registration_reminder", "0 9 * * *" + INGEST_COUNTRY_PLAN_FILE = "ingest_country_plan_file", "1 0 * * *" + UPDATE_SURGE_ALERT_STATUS = "update_surge_alert_status", "1 */12 * * *" @staticmethod def load_cron_data() -> typing.List[typing.Tuple[str, str]]: - with open(os.path.join(settings.BASE_DIR, 'deploy/helm/ifrcgo-helm/values.yaml')) as fp: + with open(os.path.join(settings.BASE_DIR, "deploy/helm/ifrcgo-helm/values.yaml")) as fp: try: - return [ - (metadata['command'], metadata['schedule']) - for metadata in yaml.safe_load(fp)["cronjobs"] - ] + return [(metadata["command"], metadata["schedule"]) for metadata in yaml.safe_load(fp)["cronjobs"]] except yaml.YAMLError as e: - logger.error('Failed to load cronjob data from helm', exc_info=True) + logger.error("Failed to load cronjob data from helm", exc_info=True) raise e @classmethod @@ -139,14 +132,15 @@ def validate_config(cls): current_helm_crons = cls.load_cron_data() assert set(cls.choices) == set(current_helm_crons), ( # Show a simple diff for correction - 'SentryMonitor needs update\n\n' + ( - '\n'.join( + "SentryMonitor needs update\n\n" + + ( + "\n".join( list( context_diff( [f"{c} {s}" for c, s in set(cls.choices)], [f"{c} {s}" for c, s in set(current_helm_crons)], - fromfile='SentryMonitor', - tofile='Values.yml' + fromfile="SentryMonitor", + tofile="Values.yml", ) ) ) diff --git a/main/serializers.py b/main/serializers.py index a51a8bd3a..f879faa9d 100644 --- a/main/serializers.py +++ b/main/serializers.py @@ -1,6 +1,5 @@ - # Attention! deployments/PersonnelViewset CSV output does not use this: -class CsvListMixin(): +class CsvListMixin: def get_csv_serializer_class(self): return self.csv_serializer_class @@ -10,8 +9,8 @@ def get_serializer_class(self): This means that views will not be instantiated with a request instance. i.e. Inside the view self.request will be None. """ - if self.action == 'list' and self.request is not None: - format = self.request.GET.get('format', 'json') - if format == 'csv': + if self.action == "list" and self.request is not None: + format = self.request.GET.get("format", "json") + if format == "csv": return self.get_csv_serializer_class() return super().get_serializer_class() diff --git a/main/settings.py b/main/settings.py index b68d22ee1..817da7931 100644 --- a/main/settings.py +++ b/main/settings.py @@ -1,33 +1,33 @@ +import base64 +import logging import os import sys -import pytz -import logging -import base64 -import environ from datetime import datetime +import environ +import pytz +from corsheaders.defaults import default_headers from django.utils.translation import gettext_lazy as _ from urllib3.util.retry import Retry -from corsheaders.defaults import default_headers from main import sentry logger = logging.getLogger(__name__) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' +DEFAULT_AUTO_FIELD = "django.db.models.AutoField" env = environ.Env( # Django DJANGO_DEBUG=(bool, False), DOCKER_HOST_IP=(str, None), DJANGO_SECRET_KEY=str, - DJANGO_MEDIA_URL=(str, '/media/'), - DJANGO_MEDIA_ROOT=(str, os.path.join(BASE_DIR, 'media')), - DJANGO_STATIC_URL=(str, '/static/'), - DJANGO_STATIC_ROOT=(str, os.path.join(BASE_DIR, 'static')), + DJANGO_MEDIA_URL=(str, "/media/"), + DJANGO_MEDIA_ROOT=(str, os.path.join(BASE_DIR, "media")), + DJANGO_STATIC_URL=(str, "/static/"), + DJANGO_STATIC_ROOT=(str, os.path.join(BASE_DIR, "static")), DJANGO_ADDITIONAL_ALLOWED_HOSTS=(list, []), # Eg: api.go.ifrc.org, goadmin.ifrc.org, dsgocdnapi.azureedge.net - GO_ENVIRONMENT=(str, 'development'), # staging, production + GO_ENVIRONMENT=(str, "development"), # staging, production # API_FQDN=str, # sub-domain.domain.domain-extension FRONTEND_URL=str, @@ -53,7 +53,7 @@ # - lang.translation.DummyTranslator # - lang.translation.IfrcTranslator # - lang.translation.AmazonTranslator - AUTO_TRANSLATION_TRANSLATOR=(str, 'lang.translation.DummyTranslator'), + AUTO_TRANSLATION_TRANSLATOR=(str, "lang.translation.DummyTranslator"), # AWS Translate NOTE: not used right now AWS_TRANSLATE_ACCESS_KEY=(str, None), AWS_TRANSLATE_SECRET_KEY=(str, None), @@ -68,12 +68,12 @@ CACHE_TEST_REDIS_URL=(str, None), CACHE_MIDDLEWARE_SECONDS=(int, None), # MOLNIX - MOLNIX_API_BASE=(str, 'https://api.ifrc-staging.rpm.molnix.com/api/'), + MOLNIX_API_BASE=(str, "https://api.ifrc-staging.rpm.molnix.com/api/"), MOLNIX_USERNAME=(str, None), MOLNIX_PASSWORD=(str, None), # ERP - ERP_API_ENDPOINT=(str, 'https://ifrctintapim001.azure-api.net/GoAPI/ExtractGoEmergency'), - ERP_API_SUBSCRIPTION_KEY=(str, 'abcdef'), + ERP_API_ENDPOINT=(str, "https://ifrctintapim001.azure-api.net/GoAPI/ExtractGoEmergency"), + ERP_API_SUBSCRIPTION_KEY=(str, "abcdef"), # Misc FDRS_APIKEY=(str, None), FDRS_CREDENTIAL=(str, None), @@ -83,8 +83,8 @@ PYTEST_XDIST_WORKER=(str, None), # Elastic-Cache ELASTIC_SEARCH_HOST=(str, None), - ELASTIC_SEARCH_INDEX=(str, 'new_index'), - ELASTIC_SEARCH_TEST_INDEX=(str, 'new_test_index'), # This will be used and cleared by test + ELASTIC_SEARCH_INDEX=(str, "new_index"), + ELASTIC_SEARCH_TEST_INDEX=(str, "new_test_index"), # This will be used and cleared by test # FTP GO_FTPHOST=(str, None), GO_FTPUSER=(str, None), @@ -106,246 +106,256 @@ JWT_PRIVATE_KEY=(str, None), JWT_PUBLIC_KEY=(str, None), JWT_EXPIRE_TIMESTAMP_DAYS=(int, 365), - # Country page NS_CONTACT_USERNAME=(str, None), NS_CONTACT_PASSWORD=(str, None), ACAPS_API_TOKEN=(str, None), NS_DOCUMENT_API_KEY=(str, None), NS_INITIATIVES_API_KEY=(str, None), - NS_INITIATIVES_API_TOKEN=(str, None) + NS_INITIATIVES_API_TOKEN=(str, None), ) # Requires uppercase variable https://docs.djangoproject.com/en/2.1/topics/settings/#creating-your-own-settings -BASE_URL = GO_API_FQDN = env('API_FQDN') +BASE_URL = GO_API_FQDN = env("API_FQDN") -INTERNAL_IPS = ['127.0.0.1'] -if env('DOCKER_HOST_IP'): - INTERNAL_IPS.append(env('DOCKER_HOST_IP')) +INTERNAL_IPS = ["127.0.0.1"] +if env("DOCKER_HOST_IP"): + INTERNAL_IPS.append(env("DOCKER_HOST_IP")) DEBUG_TOOLBAR_CONFIG = { - 'DISABLE_PANELS': [ - 'debug_toolbar.panels.sql.SQLPanel', - 'debug_toolbar.panels.staticfiles.StaticFilesPanel', - 'debug_toolbar.panels.redirects.RedirectsPanel', - 'debug_toolbar.panels.templates.TemplatesPanel', + "DISABLE_PANELS": [ + "debug_toolbar.panels.sql.SQLPanel", + "debug_toolbar.panels.staticfiles.StaticFilesPanel", + "debug_toolbar.panels.redirects.RedirectsPanel", + "debug_toolbar.panels.templates.TemplatesPanel", ], } ALLOWED_HOSTS = [ - 'localhost', - '0.0.0.0', + "localhost", + "0.0.0.0", GO_API_FQDN, - *env('DJANGO_ADDITIONAL_ALLOWED_HOSTS'), + *env("DJANGO_ADDITIONAL_ALLOWED_HOSTS"), ] -SECRET_KEY = env('DJANGO_SECRET_KEY') -DEBUG = env('DJANGO_DEBUG') -GO_ENVIRONMENT = env('GO_ENVIRONMENT') +SECRET_KEY = env("DJANGO_SECRET_KEY") +DEBUG = env("DJANGO_DEBUG") +GO_ENVIRONMENT = env("GO_ENVIRONMENT") # See if we are inside a test environment -TESTING = any([ - arg in sys.argv for arg in [ - 'test', - 'pytest', - 'py.test', - '/usr/local/bin/pytest', - '/usr/local/bin/py.test', - '/usr/local/lib/python3.6/dist-packages/py/test.py', - ] - # Provided by pytest-xdist (If pytest is used) -]) or env('PYTEST_XDIST_WORKER') is not None +TESTING = ( + any( + [ + arg in sys.argv + for arg in [ + "test", + "pytest", + "py.test", + "/usr/local/bin/pytest", + "/usr/local/bin/py.test", + "/usr/local/lib/python3.6/dist-packages/py/test.py", + ] + # Provided by pytest-xdist (If pytest is used) + ] + ) + or env("PYTEST_XDIST_WORKER") is not None +) INSTALLED_APPS = [ # External App (This app has to defined before django.contrib.admin) - 'modeltranslation', # https://django-modeltranslation.readthedocs.io/en/latest/installation.html#installed-apps - 'drf_spectacular', - + "modeltranslation", # https://django-modeltranslation.readthedocs.io/en/latest/installation.html#installed-apps + "drf_spectacular", # Django Apps - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.humanize', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'django_admin_listfilter_dropdown', - 'corsheaders', - 'rest_framework', - 'rest_framework.authtoken', - 'guardian', - 'django_filters', - 'graphene_django', - 'django_read_only', - + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.humanize", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "django_admin_listfilter_dropdown", + "corsheaders", + "rest_framework", + "rest_framework.authtoken", + "guardian", + "django_filters", + "graphene_django", + "django_read_only", # GO Apps - 'api', - 'per', - 'notifications', - 'registrations', - 'deployments', - 'databank', - 'lang', - 'dref', - 'flash_update', - 'eap', - 'country_plan', - 'local_units', - + "api", + "per", + "notifications", + "registrations", + "deployments", + "databank", + "lang", + "dref", + "flash_update", + "eap", + "country_plan", + "local_units", # Utils Apps - 'tinymce', - 'admin_auto_filters', - 'haystack', - + "tinymce", + "admin_auto_filters", + "haystack", # Logging - 'reversion', - 'reversion_compare', - + "reversion", + "reversion_compare", # Debug - 'debug_toolbar', - + "debug_toolbar", # GIS - 'django.contrib.gis' + "django.contrib.gis", ] REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework.authentication.TokenAuthentication', - 'rest_framework.authentication.BasicAuthentication', - 'rest_framework.authentication.SessionAuthentication', + "DEFAULT_AUTHENTICATION_CLASSES": ( + "rest_framework.authentication.TokenAuthentication", + "rest_framework.authentication.BasicAuthentication", + "rest_framework.authentication.SessionAuthentication", ), - 'EXCEPTION_HANDLER': 'main.exception_handler.custom_exception_handler', - 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', - 'PAGE_SIZE': 50, - 'DEFAULT_FILTER_BACKENDS': ( - 'django_filters.rest_framework.DjangoFilterBackend', - 'rest_framework.filters.SearchFilter', - 'rest_framework.filters.OrderingFilter', + "EXCEPTION_HANDLER": "main.exception_handler.custom_exception_handler", + "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination", + "PAGE_SIZE": 50, + "DEFAULT_FILTER_BACKENDS": ( + "django_filters.rest_framework.DjangoFilterBackend", + "rest_framework.filters.SearchFilter", + "rest_framework.filters.OrderingFilter", ), - 'DEFAULT_RENDERER_CLASSES': ( - 'rest_framework.renderers.JSONRenderer', - 'rest_framework.renderers.BrowsableAPIRenderer', - 'rest_framework_csv.renderers.PaginatedCSVRenderer', + "DEFAULT_RENDERER_CLASSES": ( + "rest_framework.renderers.JSONRenderer", + "rest_framework.renderers.BrowsableAPIRenderer", + "rest_framework_csv.renderers.PaginatedCSVRenderer", ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', + "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema", } -GRAPHENE = { - 'SCHEMA': 'api.schema.schema' -} +GRAPHENE = {"SCHEMA": "api.schema.schema"} MIDDLEWARE = [ - 'debug_toolbar.middleware.DebugToolbarMiddleware', - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'corsheaders.middleware.CorsMiddleware', - 'django.middleware.locale.LocaleMiddleware', + "debug_toolbar.middleware.DebugToolbarMiddleware", + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "corsheaders.middleware.CorsMiddleware", + "django.middleware.locale.LocaleMiddleware", # 'middlewares.middlewares.LocaleMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', + "django.contrib.auth.middleware.AuthenticationMiddleware", # 'middlewares.cache.UpdateCacheForUserMiddleware', - 'django.middleware.common.CommonMiddleware', + "django.middleware.common.CommonMiddleware", # 'middlewares.cache.FetchFromCacheForUserMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'middlewares.middlewares.RequestMiddleware', - 'reversion.middleware.RevisionMiddleware', + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + "middlewares.middlewares.RequestMiddleware", + "reversion.middleware.RevisionMiddleware", ] AUTHENTICATION_BACKENDS = ( # 'django.contrib.auth.backends.ModelBackend', - 'api.authentication_backend.EmailBackend', - 'guardian.backends.ObjectPermissionBackend', + "api.authentication_backend.EmailBackend", + "guardian.backends.ObjectPermissionBackend", ) CORS_ORIGIN_ALLOW_ALL = True CORS_ALLOW_HEADERS = list(default_headers) + [ - 'sentry-trace', - 'baggage', + "sentry-trace", + "baggage", ] -ROOT_URLCONF = 'main.urls' +ROOT_URLCONF = "main.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [ - os.path.join(BASE_DIR, 'notifications/templates/'), - os.path.join(BASE_DIR, 'api/templates/'), + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [ + os.path.join(BASE_DIR, "notifications/templates/"), + os.path.join(BASE_DIR, "api/templates/"), ], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - 'main.context_processors.ifrc_go', + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + "main.context_processors.ifrc_go", ], }, }, ] -WSGI_APPLICATION = 'main.wsgi.application' +WSGI_APPLICATION = "main.wsgi.application" # Use local postgres for dev, env-determined for production DATABASES = { - 'default': { - 'ENGINE': 'django.contrib.gis.db.backends.postgis', - 'NAME': env('DJANGO_DB_NAME'), - 'USER': env('DJANGO_DB_USER'), - 'PASSWORD': env('DJANGO_DB_PASS'), - 'HOST': env('DJANGO_DB_HOST'), - 'PORT': env('DJANGO_DB_PORT'), + "default": { + "ENGINE": "django.contrib.gis.db.backends.postgis", + "NAME": env("DJANGO_DB_NAME"), + "USER": env("DJANGO_DB_USER"), + "PASSWORD": env("DJANGO_DB_PASS"), + "HOST": env("DJANGO_DB_HOST"), + "PORT": env("DJANGO_DB_PORT"), } } AUTH_PASSWORD_VALIDATORS = [ - {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, - {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, - {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, - {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, - {'NAME': 'main.validators.NumberValidator', }, - {'NAME': 'main.validators.UppercaseValidator', }, - {'NAME': 'main.validators.LowercaseValidator', }, - {'NAME': 'main.validators.SymbolValidator', }, + { + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + }, + { + "NAME": "main.validators.NumberValidator", + }, + { + "NAME": "main.validators.UppercaseValidator", + }, + { + "NAME": "main.validators.LowercaseValidator", + }, + { + "NAME": "main.validators.SymbolValidator", + }, ] TINYMCE_DEFAULT_CONFIG = { - 'entity_encoding': 'raw', - 'height': 360, - 'width': 1120, - 'cleanup_on_startup': True, - 'custom_undo_redo_levels': 20, - 'selector': 'textarea:not(.vWKTField)', - 'plugins': ''' + "entity_encoding": "raw", + "height": 360, + "width": 1120, + "cleanup_on_startup": True, + "custom_undo_redo_levels": 20, + "selector": "textarea:not(.vWKTField)", + "plugins": ''' anchor autolink charmap code codesample directionality fullscreen image insertdatetime link lists media nonbreaking pagebreak preview save searchreplace table visualblocks visualchars - ''', - 'toolbar1': ''' + """, + "toolbar1": """ bold italic underline superscript subscript fontsizeselect | alignleft alignright | aligncenter alignjustify | indent outdent | bullist numlist | | link visualchars charmap hr nonbreaking | code preview fullscreen - ''', - 'force_p_newlines': True, # TODO: could be False? - 'force_br_newlines': True, # TODO: could be False? - 'forced_root_block': '', - 'contextmenu': 'formats | link', - 'menubar': False, - 'statusbar': False, + """, + "force_p_newlines": True, # TODO: could be False? + "force_br_newlines": True, # TODO: could be False? + "forced_root_block": "", + "contextmenu": "formats | link", + "menubar": False, + "statusbar": False, # https://www.tiny.cloud/docs/configure/content-filtering/#invalid_styles - 'invalid_styles': { - '*': 'opacity' # Global invalid style - } + "invalid_styles": {"*": "opacity"}, # Global invalid style # 'extended_valid_elements': 'iframe[src|frameborder|style|scrolling|class|width|height|name|align]', - # If more formatting possibilities needed (or more rows), choose from these: - # 'toolbar1': ''' + # 'toolbar1': ''', # fullscreen preview bold italic underline | fontselect, # fontsizeselect | forecolor backcolor | alignleft alignright | # aligncenter alignjustify | indent outdent | bullist numlist table | @@ -360,32 +370,32 @@ # Languages using BiDi (right-to-left) layout LANGUAGES_BIDI = ["he", "ar", "ar-dz", "ckb", "fa", "ug", "ur"] -LANGUAGE_CODE = 'en' -TIME_ZONE = 'UTC' +LANGUAGE_CODE = "en" +TIME_ZONE = "UTC" USE_I18N = True USE_L10N = True USE_TZ = True # Make sure to update main.translation if this is updated LANGUAGES = ( - ('en', _('English')), - ('es', _('Spanish')), - ('fr', _('French')), - ('ar', _('Arabic')), + ("en", _("English")), + ("es", _("Spanish")), + ("fr", _("French")), + ("ar", _("Arabic")), ) -MODELTRANSLATION_DEFAULT_LANGUAGE = 'en' -MODELTRANSLATION_FALLBACK_LANGUAGES = ('en', 'fr', 'es', 'ar') -AUTO_TRANSLATION_TRANSLATOR = env('AUTO_TRANSLATION_TRANSLATOR') +MODELTRANSLATION_DEFAULT_LANGUAGE = "en" +MODELTRANSLATION_FALLBACK_LANGUAGES = ("en", "fr", "es", "ar") +AUTO_TRANSLATION_TRANSLATOR = env("AUTO_TRANSLATION_TRANSLATOR") -IFRC_TRANSLATION_DOMAIN = env('IFRC_TRANSLATION_DOMAIN') -IFRC_TRANSLATION_GET_API_KEY = env('IFRC_TRANSLATION_GET_API_KEY') -IFRC_TRANSLATION_HEADER_API_KEY = env('IFRC_TRANSLATION_HEADER_API_KEY') +IFRC_TRANSLATION_DOMAIN = env("IFRC_TRANSLATION_DOMAIN") +IFRC_TRANSLATION_GET_API_KEY = env("IFRC_TRANSLATION_GET_API_KEY") +IFRC_TRANSLATION_HEADER_API_KEY = env("IFRC_TRANSLATION_HEADER_API_KEY") -MEDIA_URL = env('DJANGO_MEDIA_URL') -MEDIA_ROOT = env('DJANGO_MEDIA_ROOT') +MEDIA_URL = env("DJANGO_MEDIA_URL") +MEDIA_ROOT = env("DJANGO_MEDIA_ROOT") -STATIC_URL = env('DJANGO_STATIC_URL') -STATIC_ROOT = env('DJANGO_STATIC_ROOT') +STATIC_URL = env("DJANGO_STATIC_URL") +STATIC_ROOT = env("DJANGO_STATIC_ROOT") STATICFILES_DIRS = [ os.path.join(BASE_DIR, "go-static"), @@ -394,20 +404,20 @@ # Needed to generate correct https links when running behind a reverse proxy # when SSL is terminated at the proxy USE_X_FORWARDED_HOST = True -SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https') +SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_SCHEME", "https") -AZURE_STORAGE_ACCOUNT = env('AZURE_STORAGE_ACCOUNT') -AZURE_STORAGE_KEY = env('AZURE_STORAGE_KEY') +AZURE_STORAGE_ACCOUNT = env("AZURE_STORAGE_ACCOUNT") +AZURE_STORAGE_KEY = env("AZURE_STORAGE_KEY") AZURE_STORAGE = { - 'CONTAINER': 'api', - 'ACCOUNT_NAME': AZURE_STORAGE_ACCOUNT, - 'ACCOUNT_KEY': AZURE_STORAGE_KEY, - 'CDN_HOST': None, - 'USE_SSL': False, + "CONTAINER": "api", + "ACCOUNT_NAME": AZURE_STORAGE_ACCOUNT, + "ACCOUNT_KEY": AZURE_STORAGE_KEY, + "CDN_HOST": None, + "USE_SSL": False, } if AZURE_STORAGE_ACCOUNT: - DEFAULT_FILE_STORAGE = 'api.storage.AzureStorage' + DEFAULT_FILE_STORAGE = "api.storage.AzureStorage" """ # FIXME: TODO: Use this instead. https://django-storages.readthedocs.io/en/latest/backends/azure.html @@ -419,12 +429,12 @@ """ # Email config -EMAIL_API_ENDPOINT = env('EMAIL_API_ENDPOINT') -EMAIL_HOST = env('EMAIL_HOST') -EMAIL_PORT = env('EMAIL_PORT') -EMAIL_USER = env('EMAIL_USER') -EMAIL_PASS = env('EMAIL_PASS') -DEBUG_EMAIL = env('DEBUG_EMAIL') +EMAIL_API_ENDPOINT = env("EMAIL_API_ENDPOINT") +EMAIL_HOST = env("EMAIL_HOST") +EMAIL_PORT = env("EMAIL_PORT") +EMAIL_USER = env("EMAIL_USER") +EMAIL_PASS = env("EMAIL_PASS") +DEBUG_EMAIL = env("DEBUG_EMAIL") # TEST_EMAILS = env('TEST_EMAILS') # maybe later DATA_UPLOAD_MAX_MEMORY_SIZE = 104857600 # default 2621440, 2.5MB -> 100MB @@ -438,143 +448,141 @@ PER_LAST_DUEDATE = timezone.localize(datetime(2018, 11, 15, 9, 59, 25, 0)) PER_NEXT_DUEDATE = timezone.localize(datetime(2023, 11, 15, 9, 59, 25, 0)) -FDRS_APIKEY = env('FDRS_APIKEY') -FDRS_CREDENTIAL = env('FDRS_CREDENTIAL') -HPC_CREDENTIAL = env('HPC_CREDENTIAL') +FDRS_APIKEY = env("FDRS_APIKEY") +FDRS_CREDENTIAL = env("FDRS_CREDENTIAL") +HPC_CREDENTIAL = env("HPC_CREDENTIAL") -APPLICATION_INSIGHTS_INSTRUMENTATION_KEY = env('APPLICATION_INSIGHTS_INSTRUMENTATION_KEY') +APPLICATION_INSIGHTS_INSTRUMENTATION_KEY = env("APPLICATION_INSIGHTS_INSTRUMENTATION_KEY") if not TESTING and APPLICATION_INSIGHTS_INSTRUMENTATION_KEY: - MIDDLEWARE.append('opencensus.ext.django.middleware.OpencensusMiddleware') + MIDDLEWARE.append("opencensus.ext.django.middleware.OpencensusMiddleware") OPENCENSUS = { - 'TRACE': { - 'SAMPLER': 'opencensus.trace.samplers.ProbabilitySampler(rate=1)', - 'EXPORTER': '''opencensus.ext.azure.trace_exporter.AzureExporter( + "TRACE": { + "SAMPLER": "opencensus.trace.samplers.ProbabilitySampler(rate=1)", + "EXPORTER": """opencensus.ext.azure.trace_exporter.AzureExporter( connection_string="InstrumentationKey={}", enable_local_storage=False, - )'''.format(APPLICATION_INSIGHTS_INSTRUMENTATION_KEY) + )""".format( + APPLICATION_INSIGHTS_INSTRUMENTATION_KEY + ), } } LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'formatters': { - 'timestamp': { - 'format': '{asctime} {levelname} {message}', - 'style': '{', + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "timestamp": { + "format": "{asctime} {levelname} {message}", + "style": "{", }, }, - 'handlers': { - 'file': { - 'level': 'INFO', - 'class': 'api.filehandler.MakeFileHandler', - 'filename': '../logs/logger.log', - 'formatter': 'timestamp', - 'encoding': 'utf-8', + "handlers": { + "file": { + "level": "INFO", + "class": "api.filehandler.MakeFileHandler", + "filename": "../logs/logger.log", + "formatter": "timestamp", + "encoding": "utf-8", }, }, - 'loggers': { - 'django': { - 'handlers': ['file'], - 'level': 'INFO', - 'propagate': True, + "loggers": { + "django": { + "handlers": ["file"], + "level": "INFO", + "propagate": True, }, - 'celery': { - 'handlers': ['file'], - 'level': 'INFO', - 'propagate': True, + "celery": { + "handlers": ["file"], + "level": "INFO", + "propagate": True, }, }, } # AWS Translate Credentials -AWS_TRANSLATE_ACCESS_KEY = env('AWS_TRANSLATE_ACCESS_KEY') -AWS_TRANSLATE_SECRET_KEY = env('AWS_TRANSLATE_SECRET_KEY') -AWS_TRANSLATE_REGION = env('AWS_TRANSLATE_REGION') +AWS_TRANSLATE_ACCESS_KEY = env("AWS_TRANSLATE_ACCESS_KEY") +AWS_TRANSLATE_SECRET_KEY = env("AWS_TRANSLATE_SECRET_KEY") +AWS_TRANSLATE_REGION = env("AWS_TRANSLATE_REGION") -TEST_RUNNER = 'snapshottest.django.TestRunner' +TEST_RUNNER = "snapshottest.django.TestRunner" # CELERY CONFIG -CELERY_REDIS_URL = env('CELERY_REDIS_URL') # "redis://:{password}@{host}:{port}/{db}" +CELERY_REDIS_URL = env("CELERY_REDIS_URL") # "redis://:{password}@{host}:{port}/{db}" CELERY_BROKER_URL = CELERY_REDIS_URL CELERY_RESULT_BACKEND = CELERY_REDIS_URL CELERY_TIMEZONE = TIME_ZONE CELERY_ACKS_LATE = True -RETRY_STRATEGY = Retry( - total=3, - status_forcelist=[429, 500, 502, 503, 504], - allowed_methods=["HEAD", "GET", "OPTIONS"] -) +RETRY_STRATEGY = Retry(total=3, status_forcelist=[429, 500, 502, 503, 504], allowed_methods=["HEAD", "GET", "OPTIONS"]) -MOLNIX_API_BASE = env('MOLNIX_API_BASE') -MOLNIX_USERNAME = env('MOLNIX_USERNAME') -MOLNIX_PASSWORD = env('MOLNIX_PASSWORD') +MOLNIX_API_BASE = env("MOLNIX_API_BASE") +MOLNIX_USERNAME = env("MOLNIX_USERNAME") +MOLNIX_PASSWORD = env("MOLNIX_PASSWORD") -ERP_API_ENDPOINT = env('ERP_API_ENDPOINT') -ERP_API_SUBSCRIPTION_KEY = env('ERP_API_SUBSCRIPTION_KEY') +ERP_API_ENDPOINT = env("ERP_API_ENDPOINT") +ERP_API_SUBSCRIPTION_KEY = env("ERP_API_SUBSCRIPTION_KEY") -TEST_DIR = os.path.join(BASE_DIR, 'main/test_files') +TEST_DIR = os.path.join(BASE_DIR, "main/test_files") # Elastic search host -ELASTIC_SEARCH_HOST = env('ELASTIC_SEARCH_HOST') -ELASTIC_SEARCH_INDEX = env('ELASTIC_SEARCH_INDEX') -ELASTIC_SEARCH_TEST_INDEX = env('ELASTIC_SEARCH_TEST_INDEX') +ELASTIC_SEARCH_HOST = env("ELASTIC_SEARCH_HOST") +ELASTIC_SEARCH_INDEX = env("ELASTIC_SEARCH_INDEX") +ELASTIC_SEARCH_TEST_INDEX = env("ELASTIC_SEARCH_TEST_INDEX") # FTP -GO_FTPHOST = env('GO_FTPHOST') -GO_FTPUSER = env('GO_FTPUSER') -GO_FTPPASS = env('GO_FTPPASS') -GO_DBPASS = env('GO_DBPASS') +GO_FTPHOST = env("GO_FTPHOST") +GO_FTPUSER = env("GO_FTPUSER") +GO_FTPPASS = env("GO_FTPPASS") +GO_DBPASS = env("GO_DBPASS") # MISC -FRONTEND_URL = env('FRONTEND_URL') +FRONTEND_URL = env("FRONTEND_URL") # COUNTRY PAGE -NS_CONTACT_USERNAME = env('NS_CONTACT_USERNAME') -NS_CONTACT_PASSWORD = env('NS_CONTACT_PASSWORD') -ACAPS_API_TOKEN = env('ACAPS_API_TOKEN') -NS_DOCUMENT_API_KEY = env('NS_DOCUMENT_API_KEY') -NS_INITIATIVES_API_KEY = env('NS_INITIATIVES_API_KEY') -NS_INITIATIVES_API_TOKEN = env('NS_INITIATIVES_API_TOKEN') +NS_CONTACT_USERNAME = env("NS_CONTACT_USERNAME") +NS_CONTACT_PASSWORD = env("NS_CONTACT_PASSWORD") +ACAPS_API_TOKEN = env("ACAPS_API_TOKEN") +NS_DOCUMENT_API_KEY = env("NS_DOCUMENT_API_KEY") +NS_INITIATIVES_API_KEY = env("NS_INITIATIVES_API_KEY") +NS_INITIATIVES_API_TOKEN = env("NS_INITIATIVES_API_TOKEN") DREF_OP_UPDATE_FINAL_REPORT_UPDATE_ERROR_MESSAGE = "OBSOLETE_PAYLOAD" # Appeal Server Credentials -APPEALS_USER = env('APPEALS_USER') -APPEALS_PASS = env('APPEALS_PASS') +APPEALS_USER = env("APPEALS_USER") +APPEALS_PASS = env("APPEALS_PASS") # Handmade Git Command -LAST_GIT_TAG = max(os.listdir(os.path.join(BASE_DIR, '.git', 'refs', 'tags')), default=0) +LAST_GIT_TAG = max(os.listdir(os.path.join(BASE_DIR, ".git", "refs", "tags")), default=0) # Sentry Config -SENTRY_DSN = env('SENTRY_DSN') -SENTRY_SAMPLE_RATE = env('SENTRY_SAMPLE_RATE') +SENTRY_DSN = env("SENTRY_DSN") +SENTRY_SAMPLE_RATE = env("SENTRY_SAMPLE_RATE") SENTRY_CONFIG = { - 'dsn': SENTRY_DSN, - 'send_default_pii': True, - 'traces_sample_rate': SENTRY_SAMPLE_RATE, - 'enable_tracing': True, - 'release': sentry.fetch_git_sha(BASE_DIR), - 'environment': GO_ENVIRONMENT, - 'debug': DEBUG, - 'tags': { - 'site': GO_API_FQDN, + "dsn": SENTRY_DSN, + "send_default_pii": True, + "traces_sample_rate": SENTRY_SAMPLE_RATE, + "enable_tracing": True, + "release": sentry.fetch_git_sha(BASE_DIR), + "environment": GO_ENVIRONMENT, + "debug": DEBUG, + "tags": { + "site": GO_API_FQDN, }, } if SENTRY_DSN: sentry.init_sentry( - app_type='API', + app_type="API", **SENTRY_CONFIG, ) # Required for Django HayStack HAYSTACK_CONNECTIONS = { - 'default': { - 'ENGINE': 'haystack.backends.elasticsearch7_backend.Elasticsearch7SearchEngine', - 'URL': ELASTIC_SEARCH_HOST, - 'INDEX_NAME': ELASTIC_SEARCH_INDEX, + "default": { + "ENGINE": "haystack.backends.elasticsearch7_backend.Elasticsearch7SearchEngine", + "URL": ELASTIC_SEARCH_HOST, + "INDEX_NAME": ELASTIC_SEARCH_INDEX, }, } @@ -583,34 +591,34 @@ SUSPEND_SIGNALS = True # Maintenance mode -DJANGO_READ_ONLY = env('DJANGO_READ_ONLY') +DJANGO_READ_ONLY = env("DJANGO_READ_ONLY") -CACHE_REDIS_URL = env('CACHE_REDIS_URL') +CACHE_REDIS_URL = env("CACHE_REDIS_URL") CACHES = { - 'default': { - 'BACKEND': 'django_redis.cache.RedisCache', - 'LOCATION': env('CACHE_REDIS_URL'), - 'OPTIONS': { - 'CLIENT_CLASS': 'django_redis.client.DefaultClient', - } + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": env("CACHE_REDIS_URL"), + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + }, } } -if env('CACHE_MIDDLEWARE_SECONDS'): - CACHE_MIDDLEWARE_SECONDS = env('CACHE_MIDDLEWARE_SECONDS') # Planned: 600 for staging, 60 from prod -DISABLE_API_CACHE = env('DISABLE_API_CACHE') +if env("CACHE_MIDDLEWARE_SECONDS"): + CACHE_MIDDLEWARE_SECONDS = env("CACHE_MIDDLEWARE_SECONDS") # Planned: 600 for staging, 60 from prod +DISABLE_API_CACHE = env("DISABLE_API_CACHE") SPECTACULAR_SETTINGS = { - 'TITLE': 'IFRC-GO API', - 'DESCRIPTION': 'Please see the GO Wiki for an overview of API usage, or the interactive Swagger page.', - 'VERSION': '1.0.0', - 'SERVE_INCLUDE_SCHEMA': False, - 'ENUM_ADD_EXPLICIT_BLANK_NULL_CHOICE': False, - 'ENUM_NAME_OVERRIDES': {}, + "TITLE": "IFRC-GO API", + "DESCRIPTION": 'Please see the GO Wiki for an overview of API usage, or the interactive Swagger page.', + "VERSION": "1.0.0", + "SERVE_INCLUDE_SCHEMA": False, + "ENUM_ADD_EXPLICIT_BLANK_NULL_CHOICE": False, + "ENUM_NAME_OVERRIDES": {}, } # A character which is rarely used in strings – for separator: -SEP = '¤' +SEP = "¤" def decode_base64(env_key, fallback_env_key): @@ -619,13 +627,13 @@ def decode_base64(env_key, fallback_env_key): try: return base64.b64decode(encoded_value) except Exception: - logger.error(f'Failed to decode {env_key}', exc_info=True) + logger.error(f"Failed to decode {env_key}", exc_info=True) return env(fallback_env_key) -JWT_PRIVATE_KEY = decode_base64('JWT_PRIVATE_KEY_BASE64_ENCODED', 'JWT_PRIVATE_KEY') -JWT_PUBLIC_KEY = decode_base64('JWT_PUBLIC_KEY_BASE64_ENCODED', 'JWT_PUBLIC_KEY') -JWT_EXPIRE_TIMESTAMP_DAYS = env('JWT_EXPIRE_TIMESTAMP_DAYS') +JWT_PRIVATE_KEY = decode_base64("JWT_PRIVATE_KEY_BASE64_ENCODED", "JWT_PRIVATE_KEY") +JWT_PUBLIC_KEY = decode_base64("JWT_PUBLIC_KEY_BASE64_ENCODED", "JWT_PUBLIC_KEY") +JWT_EXPIRE_TIMESTAMP_DAYS = env("JWT_EXPIRE_TIMESTAMP_DAYS") # Need to load this to overwrite modeltranslation module import main.translation # noqa: F401 E402 diff --git a/main/test_case.py b/main/test_case.py index 21cc48045..b2a33f687 100644 --- a/main/test_case.py +++ b/main/test_case.py @@ -1,107 +1,105 @@ import datetime -import pytz -import haystack from unittest import mock -import snapshottest.django as django_snapshottest import factory.random - -from rest_framework.authtoken.models import Token -from rest_framework import test, status - -from django.core import management +import haystack +import pytz +import snapshottest.django as django_snapshottest from django.conf import settings from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType +from django.core import management from django.db import DEFAULT_DB_ALIAS, connections from django.test import override_settings +from rest_framework import status, test +from rest_framework.authtoken.models import Token from api.models import Country, Region from deployments.factories.user import UserFactory - from lang.translation import BaseTranslator # XXX: Will not support if test are run in parallel TEST_HAYSTACK_CONNECTIONS = { - 'default': { - 'ENGINE': 'haystack.backends.elasticsearch7_backend.Elasticsearch7SearchEngine', - 'URL': settings.ELASTIC_SEARCH_HOST, - 'INDEX_NAME': settings.ELASTIC_SEARCH_TEST_INDEX, + "default": { + "ENGINE": "haystack.backends.elasticsearch7_backend.Elasticsearch7SearchEngine", + "URL": settings.ELASTIC_SEARCH_HOST, + "INDEX_NAME": settings.ELASTIC_SEARCH_TEST_INDEX, }, } TEST_CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', + "default": { + "BACKEND": "django.core.cache.backends.dummy.DummyCache", } } -class GoAPITestMixin(): +class GoAPITestMixin: """ Base TestCase """ + client_class = test.APIClient def set_up_haystack(self): - haystack.connections.reload('default') + haystack.connections.reload("default") def tear_down_haystack(self): - haystack.connections.reload('default') - backend = haystack.connections['default'].get_backend() + haystack.connections.reload("default") + backend = haystack.connections["default"].get_backend() assert backend.index_name == settings.ELASTIC_SEARCH_TEST_INDEX backend.clear() def set_up_seed(self): self.root_user = UserFactory.create( - username='root@test.com', - first_name='Root', - last_name='Toot', - password='admin123', - email='root@test.com', + username="root@test.com", + first_name="Root", + last_name="Toot", + password="admin123", + email="root@test.com", is_superuser=True, is_staff=True, ) self.user = UserFactory.create( - username='jon@dave.com', - first_name='Jon', - last_name='Mon', - password='test123', - email='jon@dave.com', + username="jon@dave.com", + first_name="Jon", + last_name="Mon", + password="test123", + email="jon@dave.com", ) self.ifrc_user = UserFactory.create( - username='jon@@ifrc.org', - first_name='IFRC', - last_name='GO', - password='test123', - email='jon@@ifrc.org', + username="jon@@ifrc.org", + first_name="IFRC", + last_name="GO", + password="test123", + email="jon@@ifrc.org", is_superuser=True, is_staff=True, ) self.aws_translator = BaseTranslator() self.ifrc_permission = Permission.objects.create( - codename='ifrc_admin', + codename="ifrc_admin", content_type=ContentType.objects.get_for_model(Country), - name='IFRC Admin', + name="IFRC Admin", ) self.per_country_permission = Permission.objects.create( - codename='per_country_admin', + codename="per_country_admin", content_type=ContentType.objects.get_for_model(Country), - name='PER Admin for', + name="PER Admin for", ) self.per_region_permission = Permission.objects.create( - codename='per_region_admin', + codename="per_region_admin", content_type=ContentType.objects.get_for_model(Region), - name='PER Admin for', + name="PER Admin for", ) self.per_core_permission = Permission.objects.create( - codename='per_core_admin', + codename="per_core_admin", content_type=ContentType.objects.get_for_model(Country), - name='PER Core Admin', + name="PER Core Admin", ) self.ifrc_user.user_permissions.add(self.ifrc_permission) self.ifrc_user.user_permissions.add(self.per_country_permission) @@ -110,19 +108,17 @@ def set_up_seed(self): def authenticate(self, user=None): if user is None: - if not hasattr(self, 'user'): + if not hasattr(self, "user"): self.user = UserFactory.create( - username='jon@dave.com', - first_name='Jon', - last_name='Mon', - password='test123', - email='jon@dave.com', + username="jon@dave.com", + first_name="Jon", + last_name="Mon", + password="test123", + email="jon@dave.com", ) user = self.user api_key, created = Token.objects.get_or_create(user=user) - self.client.credentials( - HTTP_AUTHORIZATION='Token {}'.format(api_key) - ) + self.client.credentials(HTTP_AUTHORIZATION="Token {}".format(api_key)) return api_key def assert_http_code(self, response, code): @@ -177,7 +173,7 @@ def capture_on_commit_callbacks(cls, *, using=DEFAULT_DB_ALIAS, execute=False): SUSPEND_SIGNALS=True, HAYSTACK_CONNECTIONS=TEST_HAYSTACK_CONNECTIONS, CACHES=TEST_CACHES, - AUTO_TRANSLATION_TRANSLATOR='lang.translation.DummyTranslator', + AUTO_TRANSLATION_TRANSLATOR="lang.translation.DummyTranslator", ) class APITestCase(GoAPITestMixin, test.APITestCase): def setUp(self): @@ -194,7 +190,7 @@ def tearDown(self): SUSPEND_SIGNALS=True, HAYSTACK_CONNECTIONS=TEST_HAYSTACK_CONNECTIONS, CACHES=TEST_CACHES, - AUTO_TRANSLATION_TRANSLATOR='lang.translation.DummyTranslator', + AUTO_TRANSLATION_TRANSLATOR="lang.translation.DummyTranslator", ) class SnapshotTestCase(GoAPITestMixin, django_snapshottest.TestCase): maxDiff = None @@ -205,7 +201,7 @@ def setUp(self): management.call_command("flush", "--no-input") factory.random.reseed_random(42) self.set_up_seed() - self.patcher = mock.patch('django.utils.timezone.now') + self.patcher = mock.patch("django.utils.timezone.now") self.patcher.start().return_value = datetime.datetime(2008, 1, 1, 0, 0, 0, 123456, tzinfo=pytz.UTC) def tearDown(self): @@ -228,7 +224,7 @@ def __enter__(self): return self.callbacks def __exit__(self, exc_type, exc_valuei, exc_traceback): - run_on_commit = connections[self.using].run_on_commit[self.start_count:] + run_on_commit = connections[self.using].run_on_commit[self.start_count :] self.callbacks[:] = [func for sids, func, forgetme in run_on_commit] if exc_type is None and self.execute: for callback in self.callbacks: @@ -238,5 +234,5 @@ def __exit__(self, exc_type, exc_valuei, exc_traceback): class GoApiGlobalTest(APITestCase): def test_docs_api(self, **kwargs): - resp = self.client.get('/docs/') + resp = self.client.get("/docs/") self.assert_200(resp) diff --git a/main/test_fake.py b/main/test_fake.py index 167976b7f..9ab7d67cb 100644 --- a/main/test_fake.py +++ b/main/test_fake.py @@ -6,5 +6,6 @@ class FakeTest(TestCase): This test is for running migrations only docker-compose run --rm serve ./manage.py test -v 2 --pattern="test_fake.py"" """ + def test_fake(self): pass diff --git a/main/translation.py b/main/translation.py index 0ed35324c..73ddb99ca 100644 --- a/main/translation.py +++ b/main/translation.py @@ -1,16 +1,14 @@ -from django.utils.translation import gettext_lazy as _ -from django.db.models.base import ModelBase -from django.db import models from django.conf import settings - +from django.db import models +from django.db.models.base import ModelBase +from django.utils.translation import gettext_lazy as _ from modeltranslation.translator import Translator - original_translator_register = Translator.register -TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME = 'translation_module_original_language' -TRANSLATOR_SKIP_FIELD_NAME = 'translation_module_skip_auto_translation' +TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME = "translation_module_original_language" +TRANSLATOR_SKIP_FIELD_NAME = "translation_module_skip_auto_translation" def custom_translation_register(self, model_or_iterable, opts_class=None, **options): @@ -20,27 +18,23 @@ def custom_translation_register(self, model_or_iterable, opts_class=None, **opti else: _models = [model_or_iterable] for model in _models: - if any([ - ( - hasattr(_class, '_meta') and - _class.__dict__.get(TRANSLATOR_SKIP_FIELD_NAME, None) - ) - for _class in model.__mro__ - ]): + if any( + [(hasattr(_class, "_meta") and _class.__dict__.get(TRANSLATOR_SKIP_FIELD_NAME, None)) for _class in model.__mro__] + ): # Skip if the field is already attached to that model continue original_language_field = models.CharField( max_length=2, - default='en', + default="en", choices=settings.LANGUAGES, - verbose_name=_('Entity Original language'), - help_text=_('Language used to create this entity'), + verbose_name=_("Entity Original language"), + help_text=_("Language used to create this entity"), ) skip_auto_translation_field = models.BooleanField( - verbose_name=_('Skip auto translation'), + verbose_name=_("Skip auto translation"), default=False, - help_text=_('Skip auto translation operation for this entity?'), + help_text=_("Skip auto translation operation for this entity?"), ) model.add_to_class(TRANSLATOR_ORIGINAL_LANGUAGE_FIELD_NAME, original_language_field) model.add_to_class(TRANSLATOR_SKIP_FIELD_NAME, skip_auto_translation_field) diff --git a/main/urls.py b/main/urls.py index 433cbe0d9..878f79ce5 100644 --- a/main/urls.py +++ b/main/urls.py @@ -1,149 +1,147 @@ """ main URL Configuration """ -from django.views.decorators.clickjacking import xframe_options_exempt -from django.urls import include, path, re_path as url # FIXME later as best practice is "path" + from django.conf import settings -from django.contrib import admin from django.conf.urls import static -from django.views.static import serve +from django.conf.urls.i18n import i18n_patterns +from django.contrib import admin +from django.urls import include, path +from django.urls import re_path as url # FIXME later as best practice is "path" +from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import RedirectView +from django.views.static import serve +from drf_spectacular.views import ( + SpectacularAPIView, + SpectacularRedocView, + SpectacularSwaggerView, +) from graphene_django.views import GraphQLView -from django.conf.urls.i18n import i18n_patterns +# DRF routes +from rest_framework import routers + +from api import drf_views as api_views from api.views import ( - GetAuthToken, - RecoverPassword, - ShowUsername, - EsPageHealth, + AddCronJobLog, + AddSubscription, + AggregateByDtype, + AggregateByTime, + AggregateHeaderFigures, + AreaAggregate, Brief, + DelSubscription, + DummyExceptionError, + DummyHttpStatusError, ERUTypes, - RecentAffecteds, + EsPageHealth, FieldReportStatuses, + GetAuthToken, + HayStackSearch, ProjectPrimarySectors, ProjectSecondarySectors, ProjectStatuses, - AggregateHeaderFigures, - AggregateByDtype, - AggregateByTime, - AddSubscription, - DelSubscription, - UpdateSubscriptionPreferences, - AreaAggregate, - AddCronJobLog, - DummyHttpStatusError, - DummyExceptionError, + RecentAffecteds, + RecoverPassword, ResendValidation, - HayStackSearch, -) -from registrations.views import ( - VerifyEmail, - ValidateUser, - UserExternalTokenViewset, + ShowUsername, + UpdateSubscriptionPreferences, ) -from registrations.drf_views import RegistrationView +from country_plan import drf_views as country_plan_views +from databank import views as data_bank_views from databank.views import CountryOverviewViewSet -from local_units.views import ( - DelegationOfficeListAPIView, - DelegationOfficeDetailAPIView -) - -# DRF routes -from rest_framework import routers -from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView -from api import drf_views as api_views +from deployments import drf_views as deployment_views +from dref import views as dref_views from flash_update import views as flash_views +from lang import views as lang_views +from local_units import views as local_units_views +from local_units.views import DelegationOfficeDetailAPIView, DelegationOfficeListAPIView +from notifications import drf_views as notification_views from per import drf_views as per_views from per.views import LearningTypes -from deployments import drf_views as deployment_views -from notifications import drf_views as notification_views from registrations import drf_views as registration_views -from country_plan import drf_views as country_plan_views -from lang import views as lang_views -from dref import views as dref_views -from local_units import views as local_units_views -from databank import views as data_bank_views - +from registrations.drf_views import RegistrationView +from registrations.views import UserExternalTokenViewset, ValidateUser, VerifyEmail router = routers.DefaultRouter() -router.register(r'action', api_views.ActionViewset, basename='action') -router.register(r'flash-update-action', flash_views.FlashActionViewset, basename='flash_update_action') -router.register(r'appeal', api_views.AppealViewset, basename='appeal') -router.register(r'appeal_document', api_views.AppealDocumentViewset, basename='appeal_document') -router.register(r'country', api_views.CountryViewset, basename='country') -router.register(r'country-document', api_views.CountryKeyDocumentViewSet, basename='country_document') -router.register(r'review-country', api_views.CountryOfFieldReportToReviewViewset, basename='review_country') -router.register(r'country_rmd', api_views.CountryRMDViewset, basename='country_rmd') -router.register(r'country_key_figure', api_views.CountryKeyFigureViewset, basename='country_key_figure') -router.register(r'country_snippet', api_views.CountrySnippetViewset, basename='country_snippet') -router.register(r'country-supporting-partner', api_views.CountrySupportingPartnerViewSet, basename="country_supporting_partner") -router.register(r'data-bank/country-overview', CountryOverviewViewSet) -router.register(r'disaster_type', api_views.DisasterTypeViewset, basename='disaster_type') -router.register(r'admin2', api_views.Admin2Viewset, basename='admin2') -router.register(r'district', api_views.DistrictViewset, basename='district') -router.register(r'district_rmd', api_views.DistrictRMDViewset, basename='district_rmd') -router.register(r'domainwhitelist', registration_views.DomainWhitelistViewset) -router.register(r'eru', deployment_views.ERUViewset, basename='eru') -router.register(r'eru_owner', deployment_views.ERUOwnerViewset, basename='eru_owner') -router.register(r'event', api_views.EventViewset, basename='event') -router.register(r'go-historical', api_views.GoHistoricalViewSet, basename='go_historical') -router.register(r'featured_event_deployments', api_views.EventDeploymentsViewset, basename='featured_event_deployments') -router.register(r'field-report', api_views.FieldReportViewset, basename='field_report') -router.register(r'event_snippet', api_views.EventSnippetViewset, basename='event_snippet') -router.register(r'external_partner', api_views.ExternalPartnerViewset, basename='external_partner') -router.register(r'language', lang_views.LanguageViewSet, basename='language') -router.register(r'main_contact', api_views.MainContactViewset, basename='main_contact') -router.register(r'nslinks', api_views.NSLinksViewset, basename='ns_links') -router.register(r'partner_deployment', deployment_views.PartnerDeploymentViewset, basename='partner_deployment') +router.register(r"action", api_views.ActionViewset, basename="action") +router.register(r"flash-update-action", flash_views.FlashActionViewset, basename="flash_update_action") +router.register(r"appeal", api_views.AppealViewset, basename="appeal") +router.register(r"appeal_document", api_views.AppealDocumentViewset, basename="appeal_document") +router.register(r"country", api_views.CountryViewset, basename="country") +router.register(r"country-document", api_views.CountryKeyDocumentViewSet, basename="country_document") +router.register(r"review-country", api_views.CountryOfFieldReportToReviewViewset, basename="review_country") +router.register(r"country_rmd", api_views.CountryRMDViewset, basename="country_rmd") +router.register(r"country_key_figure", api_views.CountryKeyFigureViewset, basename="country_key_figure") +router.register(r"country_snippet", api_views.CountrySnippetViewset, basename="country_snippet") +router.register(r"country-supporting-partner", api_views.CountrySupportingPartnerViewSet, basename="country_supporting_partner") +router.register(r"data-bank/country-overview", CountryOverviewViewSet) +router.register(r"disaster_type", api_views.DisasterTypeViewset, basename="disaster_type") +router.register(r"admin2", api_views.Admin2Viewset, basename="admin2") +router.register(r"district", api_views.DistrictViewset, basename="district") +router.register(r"district_rmd", api_views.DistrictRMDViewset, basename="district_rmd") +router.register(r"domainwhitelist", registration_views.DomainWhitelistViewset) +router.register(r"eru", deployment_views.ERUViewset, basename="eru") +router.register(r"eru_owner", deployment_views.ERUOwnerViewset, basename="eru_owner") +router.register(r"event", api_views.EventViewset, basename="event") +router.register(r"go-historical", api_views.GoHistoricalViewSet, basename="go_historical") +router.register(r"featured_event_deployments", api_views.EventDeploymentsViewset, basename="featured_event_deployments") +router.register(r"field-report", api_views.FieldReportViewset, basename="field_report") +router.register(r"event_snippet", api_views.EventSnippetViewset, basename="event_snippet") +router.register(r"external_partner", api_views.ExternalPartnerViewset, basename="external_partner") +router.register(r"language", lang_views.LanguageViewSet, basename="language") +router.register(r"main_contact", api_views.MainContactViewset, basename="main_contact") +router.register(r"nslinks", api_views.NSLinksViewset, basename="ns_links") +router.register(r"partner_deployment", deployment_views.PartnerDeploymentViewset, basename="partner_deployment") # PER apis -router.register(r'per-overview', per_views.PerOverviewViewSet, basename='new_per') -router.register(r'per-assessment', per_views.FormAssessmentViewSet, basename='per-assessent') -router.register(r'public-per-assessment', per_views.PublicFormAssessmentViewSet, basename='public-per-assessent') -router.register(r'per-prioritization', per_views.FormPrioritizationViewSet, basename='per-priorirization') -router.register(r'public-per-prioritization', per_views.PublicFormPrioritizationViewSet, basename='public-per-priorirization') -router.register(r'per-work-plan', per_views.NewPerWorkPlanViewSet) -router.register(r'per-formanswer', per_views.FormAnswerViewset, basename='per-formanswer') -router.register(r'per-formarea', per_views.FormAreaViewset, basename='per-formarea') -router.register(r'per-formcomponent', per_views.FormComponentViewset, basename='per-formcomponent') -router.register(r'per-formquestion', per_views.FormQuestionViewset, basename='per-formquestion') -router.register(r'per-formquestion-group', per_views.FormQuestionGroupViewset, basename='per-formquestion-group') -router.register(r'aggregated-per-process-status', per_views.PerAggregatedViewSet, basename='aggregated-per-process-status'), -router.register(r'per-file', per_views.PerFileViewSet, basename='per-file') -router.register(r'per-process-status', per_views.PerProcessStatusViewSet, basename='per-process-status') -router.register(r'public-per-process-status', per_views.PublicPerProcessStatusViewSet, basename='public-per-process-status') -router.register(r'perdocs', per_views.PERDocsViewset) -router.register(r'per-country', per_views.PerCountryViewSet, basename='per-country') -router.register(r'public-per-stats', per_views.CountryPublicPerStatsViewset, basename='public_country_per_stats') -router.register(r'per-stats', per_views.CountryPerStatsViewset, basename='country_per_stats') -router.register(r'ops-learning', per_views.OpsLearningViewset, basename='ops_learning') -router.register(r'per-document-upload', per_views.PerDocumentUploadViewSet, basename='per_document_upload') +router.register(r"per-overview", per_views.PerOverviewViewSet, basename="new_per") +router.register(r"per-assessment", per_views.FormAssessmentViewSet, basename="per-assessent") +router.register(r"public-per-assessment", per_views.PublicFormAssessmentViewSet, basename="public-per-assessent") +router.register(r"per-prioritization", per_views.FormPrioritizationViewSet, basename="per-priorirization") +router.register(r"public-per-prioritization", per_views.PublicFormPrioritizationViewSet, basename="public-per-priorirization") +router.register(r"per-work-plan", per_views.NewPerWorkPlanViewSet) +router.register(r"per-formanswer", per_views.FormAnswerViewset, basename="per-formanswer") +router.register(r"per-formarea", per_views.FormAreaViewset, basename="per-formarea") +router.register(r"per-formcomponent", per_views.FormComponentViewset, basename="per-formcomponent") +router.register(r"per-formquestion", per_views.FormQuestionViewset, basename="per-formquestion") +router.register(r"per-formquestion-group", per_views.FormQuestionGroupViewset, basename="per-formquestion-group") +router.register(r"aggregated-per-process-status", per_views.PerAggregatedViewSet, basename="aggregated-per-process-status"), +router.register(r"per-file", per_views.PerFileViewSet, basename="per-file") +router.register(r"per-process-status", per_views.PerProcessStatusViewSet, basename="per-process-status") +router.register(r"public-per-process-status", per_views.PublicPerProcessStatusViewSet, basename="public-per-process-status") +router.register(r"perdocs", per_views.PERDocsViewset) +router.register(r"per-country", per_views.PerCountryViewSet, basename="per-country") +router.register(r"public-per-stats", per_views.CountryPublicPerStatsViewset, basename="public_country_per_stats") +router.register(r"per-stats", per_views.CountryPerStatsViewset, basename="country_per_stats") +router.register(r"ops-learning", per_views.OpsLearningViewset, basename="ops_learning") +router.register(r"per-document-upload", per_views.PerDocumentUploadViewSet, basename="per_document_upload") -router.register(r'personnel_deployment', deployment_views.PersonnelDeploymentViewset, basename='personnel_deployment') -router.register(r'personnel', deployment_views.PersonnelViewset, basename='personnel') -router.register(r'personnel_by_event', api_views.DeploymentsByEventViewset, basename='personnel_by_event') -router.register(r'profile', api_views.ProfileViewset, basename='profile') -router.register(r'project', deployment_views.ProjectViewset, basename='project') -router.register(r'emergency-project', deployment_views.EmergencyProjectViewSet) -router.register(r'region', api_views.RegionViewset, basename='region') -router.register(r'region_key_figure', api_views.RegionKeyFigureViewset, basename='region_key_figure') -router.register(r'region_snippet', api_views.RegionSnippetViewset, basename='region_snippet') -router.register(r'region-project', deployment_views.RegionProjectViewset, basename='region-project') -router.register(r'global-project', deployment_views.GlobalProjectViewset, basename='global-project') -router.register(r'regional-project', deployment_views.RegionalProjectViewset) -router.register(r'supported_activity', api_views.SupportedActivityViewset, basename='supported_activity') -router.register(r'situation_report', api_views.SituationReportViewset, basename='situation_report') -router.register(r'situation_report_type', api_views.SituationReportTypeViewset, basename='situation_report_type') -router.register(r'subscription', notification_views.SubscriptionViewset, basename='subscription') -router.register(r'surge_alert', notification_views.SurgeAlertViewset, basename='surge_alert') -router.register(r'user', api_views.UserViewset, basename='user') -router.register(r'flash-update', flash_views.FlashUpdateViewSet, basename='flash_update') -router.register(r'flash-update-file', flash_views.FlashUpdateFileViewSet, basename='flash_update_file') -router.register(r'donor-group', flash_views.DonorGroupViewSet, basename='donor_group') -router.register(r'donor', flash_views.DonorsViewSet, basename='donor') -router.register(r'share-flash-update', flash_views.ShareFlashUpdateViewSet, basename='share_flash_update') -router.register(r'users', api_views.UsersViewset, basename='users') +router.register(r"personnel_deployment", deployment_views.PersonnelDeploymentViewset, basename="personnel_deployment") +router.register(r"personnel", deployment_views.PersonnelViewset, basename="personnel") +router.register(r"personnel_by_event", api_views.DeploymentsByEventViewset, basename="personnel_by_event") +router.register(r"profile", api_views.ProfileViewset, basename="profile") +router.register(r"project", deployment_views.ProjectViewset, basename="project") +router.register(r"emergency-project", deployment_views.EmergencyProjectViewSet) +router.register(r"region", api_views.RegionViewset, basename="region") +router.register(r"region_key_figure", api_views.RegionKeyFigureViewset, basename="region_key_figure") +router.register(r"region_snippet", api_views.RegionSnippetViewset, basename="region_snippet") +router.register(r"region-project", deployment_views.RegionProjectViewset, basename="region-project") +router.register(r"global-project", deployment_views.GlobalProjectViewset, basename="global-project") +router.register(r"regional-project", deployment_views.RegionalProjectViewset) +router.register(r"supported_activity", api_views.SupportedActivityViewset, basename="supported_activity") +router.register(r"situation_report", api_views.SituationReportViewset, basename="situation_report") +router.register(r"situation_report_type", api_views.SituationReportTypeViewset, basename="situation_report_type") +router.register(r"subscription", notification_views.SubscriptionViewset, basename="subscription") +router.register(r"surge_alert", notification_views.SurgeAlertViewset, basename="surge_alert") +router.register(r"user", api_views.UserViewset, basename="user") +router.register(r"flash-update", flash_views.FlashUpdateViewSet, basename="flash_update") +router.register(r"flash-update-file", flash_views.FlashUpdateFileViewSet, basename="flash_update_file") +router.register(r"donor-group", flash_views.DonorGroupViewSet, basename="donor_group") +router.register(r"donor", flash_views.DonorsViewSet, basename="donor") +router.register(r"share-flash-update", flash_views.ShareFlashUpdateViewSet, basename="share_flash_update") +router.register(r"users", api_views.UsersViewset, basename="users") router.register(r"external-token", UserExternalTokenViewset, basename="user_external_token") # Dref apis router.register(r"dref", dref_views.DrefViewSet, basename="dref") @@ -213,9 +211,7 @@ # PER options url(r"^api/v2/per-options/", per_views.PerOptionsView.as_view()), url(r"^api/v2/export-per/(?P\d+)/", per_views.ExportPerView.as_view()), - url(r"^api/v2/local-units-options/", local_units_views.LocalUnitOptionsView.as_view()), - url(r"^api/v2/event/(?P\d+)", api_views.EventViewset.as_view({"get": "retrieve"})), url(r"^api/v2/event/(?P[-\w]+)", api_views.EventViewset.as_view({"get": "retrieve"}, lookup_field="slug")), url(r"^api/v2/delegation-office/(?P\d+)", DelegationOfficeDetailAPIView.as_view()), @@ -226,21 +222,17 @@ url(r"^favicon\.ico$", RedirectView.as_view(url="/static/favicon.ico")), url(r"^server-error-for-devs", DummyHttpStatusError.as_view()), url(r"^exception-error-for-devs", DummyExceptionError.as_view()), - path(".well-known/ai-plugin.json", serve, { - "document_root": settings.STATICFILES_DIRS[0], - 'path': 'well-known/ai-plugin.json' - }), - path(".well-known/openapi.yml", serve, { - "document_root": settings.STATICFILES_DIRS[0], - 'path': 'well-known/openapi.yml' - }), + path( + ".well-known/ai-plugin.json", serve, {"document_root": settings.STATICFILES_DIRS[0], "path": "well-known/ai-plugin.json"} + ), + path(".well-known/openapi.yml", serve, {"document_root": settings.STATICFILES_DIRS[0], "path": "well-known/openapi.yml"}), path("i18n/", include("django.conf.urls.i18n")), # Enums url(r"^api/v2/global-enums/", api_views.GlobalEnumView.as_view(), name="global_enums"), # Docs - path("docs/", SpectacularRedocView.as_view(url_name='schema'), name='redoc'), - path("api-docs/", SpectacularAPIView.as_view(), name='schema'), - path("api-docs/swagger-ui/", SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), + path("docs/", SpectacularRedocView.as_view(url_name="schema"), name="redoc"), + path("api-docs/", SpectacularAPIView.as_view(), name="schema"), + path("api-docs/swagger-ui/", SpectacularSwaggerView.as_view(url_name="schema"), name="swagger-ui"), ] if settings.DEBUG: @@ -251,7 +243,9 @@ url("__debug__/", include(debug_toolbar.urls)), # For django versions before 2.0: # url(r'^__debug__/', include(debug_toolbar.urls)), - ] + urlpatterns + static.static( + ] + + urlpatterns + + static.static( settings.MEDIA_URL, view=xframe_options_exempt(serve), document_root=settings.MEDIA_ROOT, diff --git a/main/utils.py b/main/utils.py index dcccff76a..155f86819 100644 --- a/main/utils.py +++ b/main/utils.py @@ -1,28 +1,27 @@ -import requests -import typing -import json import datetime - -from tempfile import NamedTemporaryFile, _TemporaryFileWrapper +import json +import typing from collections import defaultdict +from tempfile import NamedTemporaryFile, _TemporaryFileWrapper -from reversion.models import Version -from reversion.revisions import _get_options -from django.utils.dateparse import parse_datetime, parse_date -from django.db import models, router +import requests from django.contrib.contenttypes.models import ContentType -from rest_framework.negotiation import DefaultContentNegotiation +from django.db import models, router +from django.utils.dateparse import parse_date, parse_datetime from rest_framework import exceptions +from rest_framework.negotiation import DefaultContentNegotiation +from reversion.models import Version +from reversion.revisions import _get_options def is_tableau(request): - """ Checking the request for the 'tableau' parameter - (used mostly for switching to the *TableauSerializers) + """Checking the request for the 'tableau' parameter + (used mostly for switching to the *TableauSerializers) """ - return request.GET.get('tableau', 'false').lower() == 'true' + return request.GET.get("tableau", "false").lower() == "true" -def get_merged_items_by_fields(items, fields, seperator=', '): +def get_merged_items_by_fields(items, fields, seperator=", "): """ For given array and fields: input: [{'name': 'name 1', 'age': 2}, {'name': 'name 2', 'height': 32}], ['name', 'age'] @@ -34,13 +33,10 @@ def get_merged_items_by_fields(items, fields, seperator=', '): value = getattr(item, field, None) if value is not None: data[field].append(str(value)) - return { - field: seperator.join(data[field]) - for field in fields - } + return {field: seperator.join(data[field]) for field in fields} -class DownloadFileManager(): +class DownloadFileManager: """ Convert Appeal API datetime into django datetime Parameters @@ -49,12 +45,13 @@ class DownloadFileManager(): Return: TemporaryFile On close: Close and Delete the file """ - def __init__(self, url, dir='/tmp/', **kwargs): + + def __init__(self, url, dir="/tmp/", **kwargs): self.url = url self.downloaded_file = None # NamedTemporaryFile attributes self.named_temporary_file_args = { - 'dir': dir, + "dir": dir, **kwargs, } @@ -75,11 +72,7 @@ def __exit__(self, *_): class DjangoReversionDataFixHelper: @staticmethod - def _get_content_type( - content_type_model: typing.Type[ContentType], - model: typing.Type[models.Model], - using - ): + def _get_content_type(content_type_model: typing.Type[ContentType], model: typing.Type[models.Model], using): version_options = _get_options(model) return content_type_model.objects.db_manager(using).get_for_model( model, @@ -115,20 +108,20 @@ def _date_field_adjust( updated_serialized_data = json.loads(version.serialized_data) has_changed = False for field in fields: - _value = updated_serialized_data[0]['fields'].get(field) + _value = updated_serialized_data[0]["fields"].get(field) if _value is None: continue updated_value = parser(_value) if updated_value is None: # For other format, parser should return None continue - updated_serialized_data[0]['fields'][field] = renderer(updated_value) + updated_serialized_data[0]["fields"][field] = renderer(updated_value) has_changed = True if has_changed: version.serialized_data = json.dumps(updated_serialized_data) updated_versions.append(version) - version_model.objects.bulk_update(updated_versions, fields=('serialized_data',)) + version_model.objects.bulk_update(updated_versions, fields=("serialized_data",)) @classmethod def date_fields_to_datetime( @@ -167,8 +160,8 @@ def datetime_fields_to_date( class SpreadSheetContentNegotiation(DefaultContentNegotiation): MEDIA_TYPES = [ - 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'text/html', # To allow download from browser + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "text/html", # To allow download from browser ] def select_renderer(self, request, renderers, format_suffix): diff --git a/main/validators.py b/main/validators.py index 799fa8aba..3f8b05403 100644 --- a/main/validators.py +++ b/main/validators.py @@ -1,61 +1,52 @@ import re + from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ class NumberValidator(object): def validate(self, password, user=None): - if not re.findall('\d', password): + if not re.findall("\d", password): raise ValidationError( _("The password must contain at least 1 digit, 0-9."), - code='password_no_number', + code="password_no_number", ) def get_help_text(self): - return _( - "Your password must contain at least 1 digit, 0-9." - ) + return _("Your password must contain at least 1 digit, 0-9.") class UppercaseValidator(object): def validate(self, password, user=None): - if not re.findall('[A-Z]', password): + if not re.findall("[A-Z]", password): raise ValidationError( _("The password must contain at least 1 uppercase letter, A-Z."), - code='password_no_upper', + code="password_no_upper", ) def get_help_text(self): - return _( - "Your password must contain at least 1 uppercase letter, A-Z." - ) + return _("Your password must contain at least 1 uppercase letter, A-Z.") class LowercaseValidator(object): def validate(self, password, user=None): - if not re.findall('[a-z]', password): + if not re.findall("[a-z]", password): raise ValidationError( _("The password must contain at least 1 lowercase letter, a-z."), - code='password_no_lower', + code="password_no_lower", ) def get_help_text(self): - return _( - "Your password must contain at least 1 lowercase letter, a-z." - ) + return _("Your password must contain at least 1 lowercase letter, a-z.") class SymbolValidator(object): def validate(self, password, user=None): - if not re.findall('[()[\]{}|\\`~!@#$%^&*_\-+=;:\'",<>./?]', password): + if not re.findall("[()[\]{}|\\`~!@#$%^&*_\-+=;:'\",<>./?]", password): raise ValidationError( - _("The password must contain at least 1 symbol: " + - "()[]{}|\`~!@#$%^&*_-+=;:'\",<>./?"), - code='password_no_symbol', + _("The password must contain at least 1 symbol: " + "()[]{}|\`~!@#$%^&*_-+=;:'\",<>./?"), + code="password_no_symbol", ) def get_help_text(self): - return _( - "Your password must contain at least 1 symbol: " + - "()[]{}|\`~!@#$%^&*_-+=;:'\",<>./?" - ) + return _("Your password must contain at least 1 symbol: " + "()[]{}|\`~!@#$%^&*_-+=;:'\",<>./?") diff --git a/main/writable_nested_serializers.py b/main/writable_nested_serializers.py index 85d39f270..60ef16fb2 100644 --- a/main/writable_nested_serializers.py +++ b/main/writable_nested_serializers.py @@ -4,8 +4,8 @@ from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.models import ContentType -from django.db.models import ProtectedError from django.core.exceptions import FieldDoesNotExist +from django.db.models import ProtectedError from django.db.models.fields.related import ForeignObjectRel from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -17,14 +17,15 @@ class ListToDictField(serializers.Field): """ Represent a list of entities as a dictionary """ + def __init__(self, *args, **kwargs): - self.child = kwargs.pop('child') - self.key = kwargs.pop('key') + self.child = kwargs.pop("child") + self.key = kwargs.pop("key") assert self.child.source is None, ( - 'The `source` argument is not meaningful when ' - 'applied to a `child=` field. ' - 'Remove `source=` from the field declaration.' + "The `source` argument is not meaningful when " + "applied to a `child=` field. " + "Remove `source=` from the field declaration." ) super().__init__(*args, **kwargs) @@ -45,10 +46,12 @@ def to_internal_value(self, data): def to_list_data(self, data): list_data = [] for key, value in data.items(): - list_data.append({ - self.key: key, - **value, - }) + list_data.append( + { + self.key: key, + **value, + } + ) return list_data @@ -79,6 +82,7 @@ class Meta: (`UniqueFieldsMixin` and `NestedCreateMixin` or `NestedUpdateMixin`) you should put `UniqueFieldsMixin` ahead. """ + _unique_fields = [] def get_fields(self): @@ -86,13 +90,10 @@ def get_fields(self): fields = super(UniqueFieldsMixin, self).get_fields() for field_name, field in fields.items(): - is_unique = any([isinstance(validator, UniqueValidator) - for validator in field.validators]) + is_unique = any([isinstance(validator, UniqueValidator) for validator in field.validators]) if is_unique: self._unique_fields.append(field_name) - field.validators = [ - validator for validator in field.validators - if not isinstance(validator, UniqueValidator)] + field.validators = [validator for validator in field.validators if not isinstance(validator, UniqueValidator)] return fields @@ -101,7 +102,7 @@ def _validate_unique_fields(self, validated_data): unique_validator = UniqueValidator(self.Meta.model.objects.all()) try: # `set_context` removed on DRF >= 3.11, pass in via __call__ instead - if hasattr(unique_validator, 'set_context'): + if hasattr(unique_validator, "set_context"): unique_validator.set_context(self.fields[field_name]) unique_validator(validated_data[field_name]) else: @@ -138,20 +139,15 @@ def _extract_relations(self, validated_data): continue validated_data.pop(field.source) - reverse_relations[field_name] = ( - related_field, field, field.source - ) + reverse_relations[field_name] = (related_field, field, field.source) - if isinstance(field, serializers.ListSerializer) and \ - isinstance(field.child, serializers.ModelSerializer): + if isinstance(field, serializers.ListSerializer) and isinstance(field.child, serializers.ModelSerializer): if field.source not in validated_data: # Skip field if field is not required continue validated_data.pop(field.source) - reverse_relations[field_name] = ( - related_field, field.child, field.source - ) + reverse_relations[field_name] = (related_field, field.child, field.source) if isinstance(field, serializers.ModelSerializer): if field.source not in validated_data: @@ -170,14 +166,13 @@ def _extract_relations(self, validated_data): if direct: relations[field_name] = (field, field.source) else: - reverse_relations[field_name] = ( - related_field, field, field.source) + reverse_relations[field_name] = (related_field, field, field.source) return relations, reverse_relations def _get_related_field(self, field): model_class = self.Meta.model - if field.source.endswith('_set'): + if field.source.endswith("_set"): related_field = model_class._meta.get_field(field.source[:-4]) else: related_field = model_class._meta.get_field(field.source) @@ -187,16 +182,17 @@ def _get_related_field(self, field): return related_field, True def _get_serializer_for_field(self, field, **kwargs): - kwargs.update({ - 'context': self.context, - 'partial': self.partial, - }) + kwargs.update( + { + "context": self.context, + "partial": self.partial, + } + ) return field.__class__(**kwargs) def _get_generic_lookup(self, instance, related_field): return { - related_field.content_type_field_name: - ContentType.objects.get_for_model(instance), + related_field.content_type_field_name: ContentType.objects.get_for_model(instance), related_field.object_id_field_name: instance.pk, } @@ -209,16 +205,13 @@ def prefetch_related_instances(self, field, related_data): pk_list.append(pk) instances = { - str(related_instance.pk): related_instance - for related_instance in model_class.objects.filter( - pk__in=pk_list - ) + str(related_instance.pk): related_instance for related_instance in model_class.objects.filter(pk__in=pk_list) } return instances def _get_related_pk(self, data, model_class): - pk = data.get('pk') or data.get(model_class._meta.pk.attname) + pk = data.get("pk") or data.get(model_class._meta.pk.attname) if pk: return str(pk) @@ -227,8 +220,7 @@ def _get_related_pk(self, data, model_class): def update_or_create_reverse_relations(self, instance, reverse_relations): # Update or create reverse relations: # many-to-one, many-to-many, reversed one-to-one - for field_name, (related_field, field, field_source) in \ - reverse_relations.items(): + for field_name, (related_field, field, field_source) in reverse_relations.items(): related_data = self.initial_data[field_name] # Expand to array of one item for one-to-one for uniformity if related_field.one_to_one: @@ -253,9 +245,7 @@ def update_or_create_reverse_relations(self, instance, reverse_relations): new_related_instances = [] for data in related_data: - obj = instances.get( - self._get_related_pk(data, field.Meta.model) - ) + obj = instances.get(self._get_related_pk(data, field.Meta.model)) serializer = self._get_serializer_for_field( field, instance=obj, @@ -263,7 +253,7 @@ def update_or_create_reverse_relations(self, instance, reverse_relations): ) serializer.is_valid(raise_exception=True) related_instance = serializer.save(**save_kwargs) - data['pk'] = related_instance.pk + data["pk"] = related_instance.pk new_related_instances.append(related_instance) if related_field.many_to_many: @@ -287,9 +277,7 @@ def update_or_create_direct_relations(self, attrs, relations): data=data, ) serializer.is_valid(raise_exception=True) - attrs[field_source] = serializer.save( - **self.get_save_kwargs(field_name) - ) + attrs[field_source] = serializer.save(**self.get_save_kwargs(field_name)) def save(self, **kwargs): self.save_kwargs = defaultdict(dict, kwargs) @@ -299,9 +287,7 @@ def save(self, **kwargs): def get_save_kwargs(self, field_name): save_kwargs = self.save_kwargs[field_name] if not isinstance(save_kwargs, dict): - raise TypeError( - _("Arguments to nested serializer's `save` must be dict's") - ) + raise TypeError(_("Arguments to nested serializer's `save` must be dict's")) return save_kwargs @@ -320,6 +306,7 @@ class NestedCreateMixin(BaseNestedModelSerializer): """ Mixin adds nested create feature """ + def create(self, validated_data): relations, reverse_relations = self._extract_relations(validated_data) @@ -341,11 +328,8 @@ class NestedUpdateMixin(BaseNestedModelSerializer): """ Mixin adds update nested feature """ - default_error_messages = { - 'cannot_delete_protected': _( - "Cannot delete {instances} because " - "protected relation exists") - } + + default_error_messages = {"cannot_delete_protected": _("Cannot delete {instances} because " "protected relation exists")} def update(self, instance, validated_data): relations, reverse_relations = self._extract_relations(validated_data) @@ -367,12 +351,10 @@ def update(self, instance, validated_data): def delete_reverse_relations_if_need(self, instance, reverse_relations): # Reverse `reverse_relations` for correct delete priority - reverse_relations = OrderedDict( - reversed(list(reverse_relations.items()))) + reverse_relations = OrderedDict(reversed(list(reverse_relations.items()))) # Delete instances which is missed in data - for field_name, (related_field, field, field_source) in \ - reverse_relations.items(): + for field_name, (related_field, field, field_source) in reverse_relations.items(): # related_data = self.initial_data[field_name] related_data = self.get_initial()[field_name] @@ -387,14 +369,12 @@ def delete_reverse_relations_if_need(self, instance, reverse_relations): # M2M relation can be as direct or as reverse. For direct relation # we should use reverse relation name - if related_field.many_to_many and \ - not isinstance(related_field, ForeignObjectRel): + if related_field.many_to_many and not isinstance(related_field, ForeignObjectRel): related_field_lookup = { related_field.remote_field.name: instance, } elif isinstance(related_field, GenericRelation): - related_field_lookup = \ - self._get_generic_lookup(instance, related_field) + related_field_lookup = self._get_generic_lookup(instance, related_field) else: related_field_lookup = { related_field.name: instance, @@ -405,11 +385,7 @@ def delete_reverse_relations_if_need(self, instance, reverse_relations): try: pks_to_delete = list( - model_class.objects.filter( - **related_field_lookup - ).exclude( - pk__in=current_ids - ).values_list('pk', flat=True) + model_class.objects.filter(**related_field_lookup).exclude(pk__in=current_ids).values_list("pk", flat=True) ) if related_field.many_to_many: @@ -421,5 +397,4 @@ def delete_reverse_relations_if_need(self, instance, reverse_relations): except ProtectedError as e: instances = e.args[1] - self.fail('cannot_delete_protected', instances=", ".join([ - str(instance) for instance in instances])) + self.fail("cannot_delete_protected", instances=", ".join([str(instance) for instance in instances])) diff --git a/middlewares/cache.py b/middlewares/cache.py index ce0c1d613..4391fe3ed 100644 --- a/middlewares/cache.py +++ b/middlewares/cache.py @@ -1,6 +1,5 @@ from django.conf import settings from django.middleware.cache import FetchFromCacheMiddleware, UpdateCacheMiddleware - from rest_framework.exceptions import AuthenticationFailed from rest_framework.views import APIView @@ -21,7 +20,7 @@ def get_cache_key_prefix(request): drf_request = APIView().initialize_request(request) if check_if_user_is_anonymous(drf_request): - return f'{cache_prefix}_anonymous' + return f"{cache_prefix}_anonymous" class UpdateCacheForUserMiddleware(UpdateCacheMiddleware): diff --git a/middlewares/middlewares.py b/middlewares/middlewares.py index a9e428344..92acdadcd 100644 --- a/middlewares/middlewares.py +++ b/middlewares/middlewares.py @@ -42,7 +42,7 @@ def __call__(self, request): # # the view is called. # workaround for safelink check: - if request.method == 'HEAD': + if request.method == "HEAD": return # return response setattr(_threadlocal, "request", request) diff --git a/notifications/admin.py b/notifications/admin.py index 3af910eff..d1c7e3878 100644 --- a/notifications/admin.py +++ b/notifications/admin.py @@ -1,9 +1,9 @@ from django.contrib import admin -import notifications.models as models -from api.admin_classes import RegionRestrictedAdmin from django_admin_listfilter_dropdown.filters import ChoiceDropdownFilter from reversion_compare.admin import CompareVersionAdmin +import notifications.models as models +from api.admin_classes import RegionRestrictedAdmin from lang.admin import TranslationAdmin @@ -14,33 +14,46 @@ def std(self, obj): return obj.is_stood_down std.boolean = True - country_in = 'event__countries__in' - region_in = 'event__regions__in' - autocomplete_fields = ('event',) - search_fields = ('operation', 'message', 'event__name',) - readonly_fields = ('molnix_id', 'is_stood_down') - list_display = ('__str__', 'message', 'start', 'molnix_id', 'molnix_status', 'status', 'std') - list_filter = ('molnix_status', 'status', 'is_stood_down') + country_in = "event__countries__in" + region_in = "event__regions__in" + autocomplete_fields = ("event",) + search_fields = ( + "operation", + "message", + "event__name", + ) + readonly_fields = ("molnix_id", "is_stood_down") + list_display = ("__str__", "message", "start", "molnix_id", "molnix_status", "status", "std") + list_filter = ("molnix_status", "status", "is_stood_down") class SubscriptionAdmin(CompareVersionAdmin): - search_fields = ('user__username', 'rtype') - list_filter = (('rtype', ChoiceDropdownFilter),) + search_fields = ("user__username", "rtype") + list_filter = (("rtype", ChoiceDropdownFilter),) def get_queryset(self, request): - return super().get_queryset(request).select_related('user') + return super().get_queryset(request).select_related("user") class NotificationGUIDAdmin(admin.ModelAdmin): - list_display = ('api_guid', 'email_type', 'created_at',) - list_filter = ('email_type',) - search_fields = ('email_type',) - readonly_fields = ('api_guid', 'email_type', 'to_list', 'created_at',) + list_display = ( + "api_guid", + "email_type", + "created_at", + ) + list_filter = ("email_type",) + search_fields = ("email_type",) + readonly_fields = ( + "api_guid", + "email_type", + "to_list", + "created_at", + ) def get_actions(self, request): actions = super().get_actions(request) - if 'delete_selected' in actions: - del actions['delete_selected'] + if "delete_selected" in actions: + del actions["delete_selected"] return actions def has_add_permission(self, request, obj=None): diff --git a/notifications/apps.py b/notifications/apps.py index 0105ccebf..56f45e732 100644 --- a/notifications/apps.py +++ b/notifications/apps.py @@ -1,7 +1,7 @@ -from django.utils.translation import gettext_lazy as _ from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class NotificationsConfig(AppConfig): - name = 'notifications' - verbose_name = _('notifications') + name = "notifications" + verbose_name = _("notifications") diff --git a/notifications/drf_views.py b/notifications/drf_views.py index 90178cf94..2447338cb 100644 --- a/notifications/drf_views.py +++ b/notifications/drf_views.py @@ -2,54 +2,55 @@ # from django.db.models import Q from django_filters import rest_framework as filters from django_filters.widgets import CSVWidget -from main.filters import CharInFilter +from rest_framework import viewsets from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated -from rest_framework import viewsets -from .models import SurgeAlert, Subscription + from deployments.models import MolnixTag -from .serializers import ( - SurgeAlertSerializer, - # UnauthenticatedSurgeAlertSerializer, +from main.filters import CharInFilter + +from .models import Subscription, SurgeAlert +from .serializers import ( # UnauthenticatedSurgeAlertSerializer, SubscriptionSerializer, + SurgeAlertSerializer, ) class SurgeAlertFilter(filters.FilterSet): - atype = filters.NumberFilter(field_name='atype', lookup_expr='exact') - category = filters.NumberFilter(field_name='category', lookup_expr='exact') - event = filters.NumberFilter(field_name='event', lookup_expr='exact') + atype = filters.NumberFilter(field_name="atype", lookup_expr="exact") + category = filters.NumberFilter(field_name="category", lookup_expr="exact") + event = filters.NumberFilter(field_name="event", lookup_expr="exact") molnix_tags = filters.ModelMultipleChoiceFilter( - label='tag-ids', - field_name='molnix_tags', - help_text='Molnix_tag GO identifiers, comma separated', + label="tag-ids", + field_name="molnix_tags", + help_text="Molnix_tag GO identifiers, comma separated", widget=CSVWidget, queryset=MolnixTag.objects.all(), ) molnix_tag_names = CharInFilter( - label='tag-names', - field_name='molnix_tags__name', - lookup_expr='in', - help_text='Molnix_tag names, comma separated', + label="tag-names", + field_name="molnix_tags__name", + lookup_expr="in", + help_text="Molnix_tag names, comma separated", widget=CSVWidget, ) - status = filters.NumberFilter(field_name='status', lookup_expr='exact') + status = filters.NumberFilter(field_name="status", lookup_expr="exact") class Meta: model = SurgeAlert fields = { - 'created_at': ('exact', 'gt', 'gte', 'lt', 'lte'), - 'start': ('exact', 'gt', 'gte', 'lt', 'lte'), - 'end': ('exact', 'gt', 'gte', 'lt', 'lte'), - 'is_stood_down': ('exact',), - 'is_active': ('exact',), - 'molnix_id': ('exact', 'in'), - 'molnix_status': ('exact', 'in'), - 'message': ('exact', 'in'), - 'country': ('exact', 'in'), - 'country__name': ('exact', 'in'), - 'country__iso': ('exact', 'in'), - 'country__iso3': ('exact', 'in'), + "created_at": ("exact", "gt", "gte", "lt", "lte"), + "start": ("exact", "gt", "gte", "lt", "lte"), + "end": ("exact", "gt", "gte", "lt", "lte"), + "is_stood_down": ("exact",), + "is_active": ("exact",), + "molnix_id": ("exact", "in"), + "molnix_status": ("exact", "in"), + "message": ("exact", "in"), + "country": ("exact", "in"), + "country__name": ("exact", "in"), + "country__iso": ("exact", "in"), + "country__iso3": ("exact", "in"), } @property @@ -59,12 +60,14 @@ def qs(self): class SurgeAlertViewset(viewsets.ReadOnlyModelViewSet): authentication_classes = (TokenAuthentication,) - queryset = SurgeAlert.objects.\ - prefetch_related('molnix_tags', 'molnix_tags__groups').\ - select_related('event', 'country').all() + queryset = SurgeAlert.objects.prefetch_related("molnix_tags", "molnix_tags__groups").select_related("event", "country").all() filterset_class = SurgeAlertFilter - ordering_fields = ('created_at', 'atype', 'category', 'event', 'is_stood_down', 'status', 'opens') - search_fields = ('operation', 'message', 'event__name',) # for /docs + ordering_fields = ("created_at", "atype", "category", "event", "is_stood_down", "status", "opens") + search_fields = ( + "operation", + "message", + "event__name", + ) # for /docs def get_serializer_class(self): # if self.request.user.is_authenticated: @@ -72,6 +75,7 @@ def get_serializer_class(self): # return UnauthenticatedSurgeAlertSerializer return SurgeAlertSerializer + # def get_queryset(self): # # limit = 14 # days # # cond1 = Q(is_stood_down=True) @@ -84,7 +88,7 @@ class SubscriptionViewset(viewsets.ModelViewSet): serializer_class = SubscriptionSerializer authentication_classes = (TokenAuthentication,) permission_classes = (IsAuthenticated,) - search_fields = ('user__username', 'rtype') # for /docs + search_fields = ("user__username", "rtype") # for /docs def get_queryset(self): return Subscription.objects.filter(user=self.request.user) diff --git a/notifications/enums.py b/notifications/enums.py index be894ed41..1f9749f62 100644 --- a/notifications/enums.py +++ b/notifications/enums.py @@ -1,5 +1,5 @@ from . import models enum_register = { - 'surge_alert_status': models.SurgeAlertStatus, -} \ No newline at end of file + "surge_alert_status": models.SurgeAlertStatus, +} diff --git a/notifications/factories.py b/notifications/factories.py index 986a1f066..a91e2ea7e 100644 --- a/notifications/factories.py +++ b/notifications/factories.py @@ -1,9 +1,7 @@ import factory from factory import fuzzy -from .models import ( - SurgeAlert, -) +from .models import SurgeAlert class SurgeAlertFactory(factory.django.DjangoModelFactory): @@ -13,7 +11,7 @@ class Meta: message = fuzzy.FuzzyText(length=100) atype = fuzzy.FuzzyInteger(low=1) category = fuzzy.FuzzyInteger(low=1) - molnix_status = fuzzy.FuzzyChoice(choices=['active', 'inactive']) + molnix_status = fuzzy.FuzzyChoice(choices=["active", "inactive"]) @factory.post_generation def molnix_tags(self, create, extracted, **_): diff --git a/notifications/hello.py b/notifications/hello.py index bd4a0e634..037529a1e 100644 --- a/notifications/hello.py +++ b/notifications/hello.py @@ -1,7 +1,9 @@ import random + hellos = [ - 'Hello,', + "Hello,", ] + def get_hello(): return random.choice(hellos) diff --git a/notifications/management/commands/ingest_alerts.py b/notifications/management/commands/ingest_alerts.py index 6e6cc1ad6..ea87176cd 100644 --- a/notifications/management/commands/ingest_alerts.py +++ b/notifications/management/commands/ingest_alerts.py @@ -1,62 +1,64 @@ -import requests from datetime import datetime, timezone + +import requests from django.core.management.base import BaseCommand -from notifications.models import SurgeAlertType, SurgeAlertCategory, SurgeAlert -from lang.serializers import TranslatedModelSerializerMixin +from lang.serializers import TranslatedModelSerializerMixin +from notifications.models import SurgeAlert, SurgeAlertCategory, SurgeAlertType categories = { - 'information': SurgeAlertCategory.INFO, - 'deployment': SurgeAlertCategory.DEPLOYMENT, - 'alert': SurgeAlertCategory.ALERT, - 'shelter deployment': SurgeAlertCategory.SHELTER, - 'stand down': SurgeAlertCategory.STAND_DOWN, + "information": SurgeAlertCategory.INFO, + "deployment": SurgeAlertCategory.DEPLOYMENT, + "alert": SurgeAlertCategory.ALERT, + "shelter deployment": SurgeAlertCategory.SHELTER, + "stand down": SurgeAlertCategory.STAND_DOWN, } -timeformat = '%Y-%m-%d:%H:%M' +timeformat = "%Y-%m-%d:%H:%M" class Command(BaseCommand): - help = 'Ingest alerts data' + help = "Ingest alerts data" def id_from_model(self, model): timestring = datetime.strftime(model.created_at, timeformat) - return '%s:%s' % (timestring, model.atype) + return "%s:%s" % (timestring, model.atype) def id_from_alert(self, alert): atype = SurgeAlertType[alert[0].strip().upper()] - return '%s:%s:%s' % (alert[4], alert[5], atype) + return "%s:%s:%s" % (alert[4], alert[5], atype) def handle(self, *args, **options): url = ( - 'https://proxy.hxlstandard.org/data.json?' - 'url=https%3A//docs.google.com/spreadsheets/d/1eVpS1Bob4G2KzSwco6ELTzIsYHKvqKsNQI7ZdAzmPuQ&strip-headers=on' + "https://proxy.hxlstandard.org/data.json?" + "url=https%3A//docs.google.com/spreadsheets/d/1eVpS1Bob4G2KzSwco6ELTzIsYHKvqKsNQI7ZdAzmPuQ&strip-headers=on" ) response = requests.get(url) if response.status_code != 200: - raise Exception('Error querying Appeals API') + raise Exception("Error querying Appeals API") alerts = response.json() aids = [self.id_from_model(m) for m in SurgeAlert.objects.all()] - print('%s current surge alerts' % len(aids)) + print("%s current surge alerts" % len(aids)) # The first alert is headers new_alerts = [a for a in alerts[1:] if self.id_from_alert(a) not in aids] - print('%s alerts ingesting' % len(new_alerts)) + print("%s alerts ingesting" % len(new_alerts)) surge_alerts = [] for alert in new_alerts: fields = { - 'atype': SurgeAlertType[alert[0].strip().upper()], - 'category': categories[alert[1].strip().lower()], - 'operation': alert[2].strip(), - 'message': alert[3].strip(), - 'deployment_needed': False, - 'is_private': True, - 'created_at': datetime.strptime( - '%s:%s' % (alert[4].strip(), alert[5].strip()), timeformat, + "atype": SurgeAlertType[alert[0].strip().upper()], + "category": categories[alert[1].strip().lower()], + "operation": alert[2].strip(), + "message": alert[3].strip(), + "deployment_needed": False, + "is_private": True, + "created_at": datetime.strptime( + "%s:%s" % (alert[4].strip(), alert[5].strip()), + timeformat, ).replace(tzinfo=timezone.utc), } surge_alert = SurgeAlert(**fields) @@ -65,4 +67,4 @@ def handle(self, *args, **options): # Trigger translation TranslatedModelSerializerMixin.trigger_field_translation_in_bulk(SurgeAlert, surge_alerts) - print('%s current surge alerts' % SurgeAlert.objects.all().count()) + print("%s current surge alerts" % SurgeAlert.objects.all().count()) diff --git a/notifications/management/commands/update_surge_alert_status.py b/notifications/management/commands/update_surge_alert_status.py index 9eb50ea68..d42397b80 100644 --- a/notifications/management/commands/update_surge_alert_status.py +++ b/notifications/management/commands/update_surge_alert_status.py @@ -1,51 +1,55 @@ import logging -from sentry_sdk.crons import monitor from django.core.management.base import BaseCommand -from django.utils import timezone from django.db import models +from django.utils import timezone +from sentry_sdk.crons import monitor -from notifications.models import SurgeAlert, SurgeAlertStatus from api.models import CronJob, CronJobStatus from main.sentry import SentryMonitor - +from notifications.models import SurgeAlert, SurgeAlertStatus logger = logging.getLogger(__name__) @monitor(monitor_slug=SentryMonitor.UPDATE_SURGE_ALERT_STATUS) class Command(BaseCommand): - ''' - Updating the Surge Alert Status according: - If the alert status is marked as stood_down, then the status is Stood Down. - If the closing timestamp (closes) is earlier than the current date, the status is displayed as Closed. - Otherwise, it is displayed as Open. - ''' - help = 'Update surge alert status' + """ + Updating the Surge Alert Status according: + If the alert status is marked as stood_down, then the status is Stood Down. + If the closing timestamp (closes) is earlier than the current date, the status is displayed as Closed. + Otherwise, it is displayed as Open. + """ + + help = "Update surge alert status" def handle(self, *args, **options): now = timezone.now() try: - logger.info('Updating Surge alerts status') + logger.info("Updating Surge alerts status") SurgeAlert.objects.update( status=models.Case( models.When(is_stood_down=True, then=models.Value(SurgeAlertStatus.STOOD_DOWN)), models.When(closes__lt=now, then=models.Value(SurgeAlertStatus.CLOSED)), models.When(closes__gte=now, then=models.Value(SurgeAlertStatus.OPEN)), - default=models.F('status'), - output_field=models.IntegerField() + default=models.F("status"), + output_field=models.IntegerField(), ) ) - CronJob.sync_cron({ - 'name': 'update_surge_alert_status', - 'message': 'Updated Surge alerts status', - 'status': CronJobStatus.SUCCESSFUL, - }) - logger.info('Updated Surge alerts status') + CronJob.sync_cron( + { + "name": "update_surge_alert_status", + "message": "Updated Surge alerts status", + "status": CronJobStatus.SUCCESSFUL, + } + ) + logger.info("Updated Surge alerts status") except Exception as e: - CronJob.sync_cron({ - 'name': 'update_surge_alert_status', - 'message': f'Error while updating Surge alerts status\n\nException:\n{str(e)}', - 'status': CronJobStatus.ERRONEOUS, - }) - logger.error('Error while updating surge alerts status', exc_info=True) + CronJob.sync_cron( + { + "name": "update_surge_alert_status", + "message": f"Error while updating Surge alerts status\n\nException:\n{str(e)}", + "status": CronJobStatus.ERRONEOUS, + } + ) + logger.error("Error while updating surge alerts status", exc_info=True) diff --git a/notifications/migrations/0001_initial.py b/notifications/migrations/0001_initial.py index dfab957ba..a83bd7116 100644 --- a/notifications/migrations/0001_initial.py +++ b/notifications/migrations/0001_initial.py @@ -2,9 +2,10 @@ # Generated by Django 1.11.8 on 2018-02-07 21:09 from __future__ import unicode_literals +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion + import notifications.models @@ -14,38 +15,52 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('api', '0001_initial'), + ("api", "0001_initial"), ] operations = [ migrations.CreateModel( - name='Subscription', + name="Subscription", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('stype', models.IntegerField(default=0, choices=notifications.models.SubscriptionType.choices)), - ('rtype', models.IntegerField(default=0, choices=notifications.models.RecordType.choices)), - ('lookup_id', models.CharField(blank=True, editable=False, max_length=20, null=True)), - ('country', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country')), - ('dtype', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType')), - ('region', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Region')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subscription', to=settings.AUTH_USER_MODEL)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("stype", models.IntegerField(default=0, choices=notifications.models.SubscriptionType.choices)), + ("rtype", models.IntegerField(default=0, choices=notifications.models.RecordType.choices)), + ("lookup_id", models.CharField(blank=True, editable=False, max_length=20, null=True)), + ( + "country", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), + ), + ( + "dtype", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.DisasterType"), + ), + ( + "region", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Region"), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="subscription", to=settings.AUTH_USER_MODEL + ), + ), ], ), migrations.CreateModel( - name='SurgeAlert', + name="SurgeAlert", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('atype', models.IntegerField(default=0, choices=notifications.models.SurgeAlertType.choices)), - ('category', models.IntegerField(default=0, choices=notifications.models.SurgeAlertCategory.choices)), - ('operation', models.CharField(max_length=100)), - ('message', models.TextField()), - ('deployment_needed', models.BooleanField(default=False)), - ('is_private', models.BooleanField(default=False)), - ('created_at', models.DateTimeField()), - ('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("atype", models.IntegerField(default=0, choices=notifications.models.SurgeAlertType.choices)), + ("category", models.IntegerField(default=0, choices=notifications.models.SurgeAlertCategory.choices)), + ("operation", models.CharField(max_length=100)), + ("message", models.TextField()), + ("deployment_needed", models.BooleanField(default=False)), + ("is_private", models.BooleanField(default=False)), + ("created_at", models.DateTimeField()), + ("event", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event")), ], options={ - 'ordering': ['-created_at'], + "ordering": ["-created_at"], }, ), ] diff --git a/notifications/migrations/0002_subscription_event.py b/notifications/migrations/0002_subscription_event.py index 2235b31ca..9289a1814 100644 --- a/notifications/migrations/0002_subscription_event.py +++ b/notifications/migrations/0002_subscription_event.py @@ -1,20 +1,20 @@ # Generated by Django 2.0.12 on 2019-05-16 14:38 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0017_auto_20190424_1508'), - ('notifications', '0001_initial'), + ("api", "0017_auto_20190424_1508"), + ("notifications", "0001_initial"), ] operations = [ migrations.AddField( - model_name='subscription', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event'), + model_name="subscription", + name="event", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event"), ), ] diff --git a/notifications/migrations/0003_notificationguid.py b/notifications/migrations/0003_notificationguid.py index 323465f63..ece6ea1a2 100644 --- a/notifications/migrations/0003_notificationguid.py +++ b/notifications/migrations/0003_notificationguid.py @@ -6,18 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('notifications', '0002_subscription_event'), + ("notifications", "0002_subscription_event"), ] operations = [ migrations.CreateModel( - name='NotificationGUID', + name="NotificationGUID", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('api_guid', models.CharField(editable=False, help_text='Can be used to do a GET request to check on the email sender API side.', max_length=200)), - ('email_type', models.CharField(blank=True, editable=False, max_length=50, null=True)), - ('to_list', models.TextField(blank=True, editable=False, null=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ( + "api_guid", + models.CharField( + editable=False, + help_text="Can be used to do a GET request to check on the email sender API side.", + max_length=200, + ), + ), + ("email_type", models.CharField(blank=True, editable=False, max_length=50, null=True)), + ("to_list", models.TextField(blank=True, editable=False, null=True)), ], ), ] diff --git a/notifications/migrations/0004_auto_20200618_0904.py b/notifications/migrations/0004_auto_20200618_0904.py index e655695b5..8510d9104 100644 --- a/notifications/migrations/0004_auto_20200618_0904.py +++ b/notifications/migrations/0004_auto_20200618_0904.py @@ -1,119 +1,145 @@ # Generated by Django 2.2.13 on 2020-06-18 09:04 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion + import notifications.models class Migration(migrations.Migration): dependencies = [ - ('notifications', '0003_notificationguid'), + ("notifications", "0003_notificationguid"), ] operations = [ migrations.AlterModelOptions( - name='subscription', - options={'verbose_name': 'Subscription', 'verbose_name_plural': 'Subscriptions'}, + name="subscription", + options={"verbose_name": "Subscription", "verbose_name_plural": "Subscriptions"}, ), migrations.AlterModelOptions( - name='surgealert', - options={'ordering': ['-created_at'], 'verbose_name': 'Surge Alert', 'verbose_name_plural': 'Surge Alerts'}, + name="surgealert", + options={"ordering": ["-created_at"], "verbose_name": "Surge Alert", "verbose_name_plural": "Surge Alerts"}, ), migrations.AlterField( - model_name='notificationguid', - name='api_guid', - field=models.CharField(help_text='Can be used to do a GET request to check on the email sender API side.', max_length=200), + model_name="notificationguid", + name="api_guid", + field=models.CharField( + help_text="Can be used to do a GET request to check on the email sender API side.", max_length=200 + ), ), migrations.AlterField( - model_name='notificationguid', - name='email_type', + model_name="notificationguid", + name="email_type", field=models.CharField(blank=True, max_length=50, null=True), ), migrations.AlterField( - model_name='notificationguid', - name='to_list', + model_name="notificationguid", + name="to_list", field=models.TextField(blank=True, null=True), ), migrations.AlterField( - model_name='subscription', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country'), + model_name="subscription", + name="country", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='subscription', - name='dtype', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.DisasterType', verbose_name='disaster type'), + model_name="subscription", + name="dtype", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.DisasterType", + verbose_name="disaster type", + ), ), migrations.AlterField( - model_name='subscription', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event', verbose_name='event'), + model_name="subscription", + name="event", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event", verbose_name="event" + ), ), migrations.AlterField( - model_name='subscription', - name='lookup_id', - field=models.CharField(blank=True, editable=False, max_length=20, null=True, verbose_name='lookup id'), + model_name="subscription", + name="lookup_id", + field=models.CharField(blank=True, editable=False, max_length=20, null=True, verbose_name="lookup id"), ), migrations.AlterField( - model_name='subscription', - name='region', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Region', verbose_name='region'), + model_name="subscription", + name="region", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Region", verbose_name="region" + ), ), migrations.AlterField( - model_name='subscription', - name='rtype', - field=models.IntegerField(default=0, choices=notifications.models.RecordType.choices, verbose_name='record type'), + model_name="subscription", + name="rtype", + field=models.IntegerField(default=0, choices=notifications.models.RecordType.choices, verbose_name="record type"), ), migrations.AlterField( - model_name='subscription', - name='stype', - field=models.IntegerField(default=0, choices=notifications.models.SubscriptionType.choices, verbose_name='subscription type'), + model_name="subscription", + name="stype", + field=models.IntegerField( + default=0, choices=notifications.models.SubscriptionType.choices, verbose_name="subscription type" + ), ), migrations.AlterField( - model_name='subscription', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subscription', to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="subscription", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="subscription", + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), migrations.AlterField( - model_name='surgealert', - name='atype', - field=models.IntegerField(default=0, choices=notifications.models.SurgeAlertType.choices, verbose_name='alert type'), + model_name="surgealert", + name="atype", + field=models.IntegerField(default=0, choices=notifications.models.SurgeAlertType.choices, verbose_name="alert type"), ), migrations.AlterField( - model_name='surgealert', - name='category', - field=models.IntegerField(default=0, choices=notifications.models.SurgeAlertCategory.choices, verbose_name='category'), + model_name="surgealert", + name="category", + field=models.IntegerField( + default=0, choices=notifications.models.SurgeAlertCategory.choices, verbose_name="category" + ), ), migrations.AlterField( - model_name='surgealert', - name='created_at', - field=models.DateTimeField(verbose_name='created at'), + model_name="surgealert", + name="created_at", + field=models.DateTimeField(verbose_name="created at"), ), migrations.AlterField( - model_name='surgealert', - name='deployment_needed', - field=models.BooleanField(default=False, verbose_name='deployment needed'), + model_name="surgealert", + name="deployment_needed", + field=models.BooleanField(default=False, verbose_name="deployment needed"), ), migrations.AlterField( - model_name='surgealert', - name='event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Event', verbose_name='event'), + model_name="surgealert", + name="event", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Event", verbose_name="event" + ), ), migrations.AlterField( - model_name='surgealert', - name='is_private', - field=models.BooleanField(default=False, verbose_name='is private?'), + model_name="surgealert", + name="is_private", + field=models.BooleanField(default=False, verbose_name="is private?"), ), migrations.AlterField( - model_name='surgealert', - name='message', - field=models.TextField(verbose_name='message'), + model_name="surgealert", + name="message", + field=models.TextField(verbose_name="message"), ), migrations.AlterField( - model_name='surgealert', - name='operation', - field=models.CharField(max_length=100, verbose_name='operation'), + model_name="surgealert", + name="operation", + field=models.CharField(max_length=100, verbose_name="operation"), ), ] diff --git a/notifications/migrations/0004_auto_20200618_1017.py b/notifications/migrations/0004_auto_20200618_1017.py index d27c6b525..995dc7593 100644 --- a/notifications/migrations/0004_auto_20200618_1017.py +++ b/notifications/migrations/0004_auto_20200618_1017.py @@ -6,23 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('notifications', '0003_notificationguid'), + ("notifications", "0003_notificationguid"), ] operations = [ migrations.AlterField( - model_name='notificationguid', - name='api_guid', - field=models.CharField(help_text='Can be used to do a GET request to check on the email sender API side.', max_length=200), + model_name="notificationguid", + name="api_guid", + field=models.CharField( + help_text="Can be used to do a GET request to check on the email sender API side.", max_length=200 + ), ), migrations.AlterField( - model_name='notificationguid', - name='email_type', + model_name="notificationguid", + name="email_type", field=models.CharField(blank=True, max_length=600, null=True), ), migrations.AlterField( - model_name='notificationguid', - name='to_list', + model_name="notificationguid", + name="to_list", field=models.TextField(blank=True, null=True), ), ] diff --git a/notifications/migrations/0005_merge_20200619_0724.py b/notifications/migrations/0005_merge_20200619_0724.py index 459cac448..d2e8b8211 100644 --- a/notifications/migrations/0005_merge_20200619_0724.py +++ b/notifications/migrations/0005_merge_20200619_0724.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('notifications', '0004_auto_20200618_0904'), - ('notifications', '0004_auto_20200618_1017'), + ("notifications", "0004_auto_20200618_0904"), + ("notifications", "0004_auto_20200618_1017"), ] - operations = [ - ] + operations = [] diff --git a/notifications/migrations/0006_auto_20200623_0704.py b/notifications/migrations/0006_auto_20200623_0704.py index f8c8d83fb..2bc232e42 100644 --- a/notifications/migrations/0006_auto_20200623_0704.py +++ b/notifications/migrations/0006_auto_20200623_0704.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('notifications', '0005_merge_20200619_0724'), + ("notifications", "0005_merge_20200619_0724"), ] operations = [ migrations.AlterField( - model_name='notificationguid', - name='email_type', + model_name="notificationguid", + name="email_type", field=models.CharField(blank=True, max_length=600, null=True), ), ] diff --git a/notifications/migrations/0007_auto_20200810_1116.py b/notifications/migrations/0007_auto_20200810_1116.py index 16ec74d2b..f3dc5a539 100644 --- a/notifications/migrations/0007_auto_20200810_1116.py +++ b/notifications/migrations/0007_auto_20200810_1116.py @@ -6,48 +6,48 @@ class Migration(migrations.Migration): dependencies = [ - ('notifications', '0006_auto_20200623_0704'), + ("notifications", "0006_auto_20200623_0704"), ] operations = [ migrations.AddField( - model_name='surgealert', - name='message_ar', - field=models.TextField(null=True, verbose_name='message'), + model_name="surgealert", + name="message_ar", + field=models.TextField(null=True, verbose_name="message"), ), migrations.AddField( - model_name='surgealert', - name='message_en', - field=models.TextField(null=True, verbose_name='message'), + model_name="surgealert", + name="message_en", + field=models.TextField(null=True, verbose_name="message"), ), migrations.AddField( - model_name='surgealert', - name='message_es', - field=models.TextField(null=True, verbose_name='message'), + model_name="surgealert", + name="message_es", + field=models.TextField(null=True, verbose_name="message"), ), migrations.AddField( - model_name='surgealert', - name='message_fr', - field=models.TextField(null=True, verbose_name='message'), + model_name="surgealert", + name="message_fr", + field=models.TextField(null=True, verbose_name="message"), ), migrations.AddField( - model_name='surgealert', - name='operation_ar', - field=models.CharField(max_length=100, null=True, verbose_name='operation'), + model_name="surgealert", + name="operation_ar", + field=models.CharField(max_length=100, null=True, verbose_name="operation"), ), migrations.AddField( - model_name='surgealert', - name='operation_en', - field=models.CharField(max_length=100, null=True, verbose_name='operation'), + model_name="surgealert", + name="operation_en", + field=models.CharField(max_length=100, null=True, verbose_name="operation"), ), migrations.AddField( - model_name='surgealert', - name='operation_es', - field=models.CharField(max_length=100, null=True, verbose_name='operation'), + model_name="surgealert", + name="operation_es", + field=models.CharField(max_length=100, null=True, verbose_name="operation"), ), migrations.AddField( - model_name='surgealert', - name='operation_fr', - field=models.CharField(max_length=100, null=True, verbose_name='operation'), + model_name="surgealert", + name="operation_fr", + field=models.CharField(max_length=100, null=True, verbose_name="operation"), ), ] diff --git a/notifications/migrations/0008_auto_20201104_0352.py b/notifications/migrations/0008_auto_20201104_0352.py index 10c7824e0..8a610ad6b 100644 --- a/notifications/migrations/0008_auto_20201104_0352.py +++ b/notifications/migrations/0008_auto_20201104_0352.py @@ -6,39 +6,39 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0033_molnixtag'), - ('notifications', '0007_auto_20200810_1116'), + ("deployments", "0033_molnixtag"), + ("notifications", "0007_auto_20200810_1116"), ] operations = [ migrations.AddField( - model_name='surgealert', - name='closes', + model_name="surgealert", + name="closes", field=models.DateTimeField(blank=True, null=True), ), migrations.AddField( - model_name='surgealert', - name='end', + model_name="surgealert", + name="end", field=models.DateTimeField(blank=True, null=True), ), migrations.AddField( - model_name='surgealert', - name='molnix_id', + model_name="surgealert", + name="molnix_id", field=models.IntegerField(blank=True, null=True), ), migrations.AddField( - model_name='surgealert', - name='molnix_tags', - field=models.ManyToManyField(blank=True, to='deployments.MolnixTag'), + model_name="surgealert", + name="molnix_tags", + field=models.ManyToManyField(blank=True, to="deployments.MolnixTag"), ), migrations.AddField( - model_name='surgealert', - name='opens', + model_name="surgealert", + name="opens", field=models.DateTimeField(blank=True, null=True), ), migrations.AddField( - model_name='surgealert', - name='start', + model_name="surgealert", + name="start", field=models.DateTimeField(blank=True, null=True), ), ] diff --git a/notifications/migrations/0009_surgealert_is_active.py b/notifications/migrations/0009_surgealert_is_active.py index 3ee0bd93f..90ad66a6a 100644 --- a/notifications/migrations/0009_surgealert_is_active.py +++ b/notifications/migrations/0009_surgealert_is_active.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('notifications', '0008_auto_20201104_0352'), + ("notifications", "0008_auto_20201104_0352"), ] operations = [ migrations.AddField( - model_name='surgealert', - name='is_active', + model_name="surgealert", + name="is_active", field=models.BooleanField(default=True), ), ] diff --git a/notifications/migrations/0010_surgealert_molnix_status.py b/notifications/migrations/0010_surgealert_molnix_status.py index 56674bcc7..abd789dca 100644 --- a/notifications/migrations/0010_surgealert_molnix_status.py +++ b/notifications/migrations/0010_surgealert_molnix_status.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('notifications', '0009_surgealert_is_active'), + ("notifications", "0009_surgealert_is_active"), ] operations = [ migrations.AddField( - model_name='surgealert', - name='molnix_status', + model_name="surgealert", + name="molnix_status", field=models.CharField(blank=True, max_length=32, null=True), ), ] diff --git a/notifications/migrations/0011_surgealert_country.py b/notifications/migrations/0011_surgealert_country.py index 6b7da4282..df0c4a7dd 100644 --- a/notifications/migrations/0011_surgealert_country.py +++ b/notifications/migrations/0011_surgealert_country.py @@ -1,19 +1,21 @@ # Generated by Django 2.2.20 on 2021-08-18 06:58 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('notifications', '0010_surgealert_molnix_status'), + ("notifications", "0010_surgealert_molnix_status"), ] operations = [ migrations.AddField( - model_name='surgealert', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country'), + model_name="surgealert", + name="country", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="country" + ), ), ] diff --git a/notifications/migrations/0012_surgealert_is_stood_down.py b/notifications/migrations/0012_surgealert_is_stood_down.py index 847fabd2c..59d992ae5 100644 --- a/notifications/migrations/0012_surgealert_is_stood_down.py +++ b/notifications/migrations/0012_surgealert_is_stood_down.py @@ -2,24 +2,26 @@ from django.db import migrations, models + def update_stood_down(self, schema_editor): "Set is_stood_down value depending on molnix_status for existing records" - SurgeAlert = self.get_model('notifications', 'surgealert') + SurgeAlert = self.get_model("notifications", "surgealert") for record in SurgeAlert.objects.all(): - record.is_stood_down = True if record.molnix_status == 'unfilled' else False - record.save(update_fields=['is_stood_down']) + record.is_stood_down = True if record.molnix_status == "unfilled" else False + record.save(update_fields=["is_stood_down"]) + class Migration(migrations.Migration): dependencies = [ - ('notifications', '0011_surgealert_country'), + ("notifications", "0011_surgealert_country"), ] operations = [ migrations.AddField( - model_name='surgealert', - name='is_stood_down', - field=models.BooleanField(default=False, verbose_name='is stood down?'), + model_name="surgealert", + name="is_stood_down", + field=models.BooleanField(default=False, verbose_name="is stood down?"), ), migrations.RunPython(update_stood_down, reverse_code=migrations.RunPython.noop), ] diff --git a/notifications/migrations/0013_auto_20230410_0720.py b/notifications/migrations/0013_auto_20230410_0720.py index 31e33c507..3fb21de12 100644 --- a/notifications/migrations/0013_auto_20230410_0720.py +++ b/notifications/migrations/0013_auto_20230410_0720.py @@ -6,18 +6,26 @@ class Migration(migrations.Migration): dependencies = [ - ('notifications', '0012_surgealert_is_stood_down'), + ("notifications", "0012_surgealert_is_stood_down"), ] operations = [ migrations.AddField( - model_name='surgealert', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="surgealert", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='surgealert', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="surgealert", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/notifications/migrations/0014_surgealert_status.py b/notifications/migrations/0014_surgealert_status.py index 8d5374b86..484bebeaf 100644 --- a/notifications/migrations/0014_surgealert_status.py +++ b/notifications/migrations/0014_surgealert_status.py @@ -6,13 +6,15 @@ class Migration(migrations.Migration): dependencies = [ - ('notifications', '0013_auto_20230410_0720'), + ("notifications", "0013_auto_20230410_0720"), ] operations = [ migrations.AddField( - model_name='surgealert', - name='status', - field=models.IntegerField(choices=[(0, 'Open'), (1, 'Stood Down'), (2, 'Closed')], default=0, verbose_name='alert status'), + model_name="surgealert", + name="status", + field=models.IntegerField( + choices=[(0, "Open"), (1, "Stood Down"), (2, "Closed")], default=0, verbose_name="alert status" + ), ), ] diff --git a/notifications/models.py b/notifications/models.py index 636734ebf..dcd82950e 100644 --- a/notifications/models.py +++ b/notifications/models.py @@ -1,48 +1,50 @@ -from django.utils.translation import gettext_lazy as _ from django.conf import settings from django.db import models from django.utils import timezone -from api.models import Country, Region, Event, DisasterType +from django.utils.translation import gettext_lazy as _ + +from api.models import Country, DisasterType, Event, Region from deployments.models import MolnixTag class SurgeAlertType(models.IntegerChoices): - FACT = 0, _('fact') - SIMS = 1, _('SIMS') - ERU = 2, _('ERU') - DHEOPS = 3, _('DHEOPS') - HEOPS = 4, _('HEOPS') - SURGE = 5, _('surge') - RAPID_RESPONSE = 6, _('rapid response') + FACT = 0, _("fact") + SIMS = 1, _("SIMS") + ERU = 2, _("ERU") + DHEOPS = 3, _("DHEOPS") + HEOPS = 4, _("HEOPS") + SURGE = 5, _("surge") + RAPID_RESPONSE = 6, _("rapid response") class SurgeAlertCategory(models.IntegerChoices): - INFO = 0, _('information') - DEPLOYMENT = 1, _('deployment') - ALERT = 2, _('alert') - SHELTER = 3, _('shelter') - STAND_DOWN = 4, _('stand down') + INFO = 0, _("information") + DEPLOYMENT = 1, _("deployment") + ALERT = 2, _("alert") + SHELTER = 3, _("shelter") + STAND_DOWN = 4, _("stand down") class SurgeAlertStatus(models.IntegerChoices): - ''' + """ Note: Ordering value should be in order of Open, Stood Down, Closed to supported custom defined ordering logic - ''' - OPEN = 0, _('Open') - STOOD_DOWN = 1, _('Stood Down') - CLOSED = 2, _('Closed') + """ + + OPEN = 0, _("Open") + STOOD_DOWN = 1, _("Stood Down") + CLOSED = 2, _("Closed") class SurgeAlert(models.Model): - atype = models.IntegerField(choices=SurgeAlertType.choices, verbose_name=_('alert type'), default=0) - category = models.IntegerField(choices=SurgeAlertCategory.choices, verbose_name=_('category'), default=0) - operation = models.CharField(verbose_name=_('operation'), max_length=100) - message = models.TextField(verbose_name=_('message')) - deployment_needed = models.BooleanField(verbose_name=_('deployment needed'), default=False) - is_private = models.BooleanField(verbose_name=_('is private?'), default=False) - event = models.ForeignKey(Event, verbose_name=_('event'), null=True, blank=True, on_delete=models.SET_NULL) - country = models.ForeignKey(Country, verbose_name=_('country'), null=True, blank=True, on_delete=models.SET_NULL) + atype = models.IntegerField(choices=SurgeAlertType.choices, verbose_name=_("alert type"), default=0) + category = models.IntegerField(choices=SurgeAlertCategory.choices, verbose_name=_("category"), default=0) + operation = models.CharField(verbose_name=_("operation"), max_length=100) + message = models.TextField(verbose_name=_("message")) + deployment_needed = models.BooleanField(verbose_name=_("deployment needed"), default=False) + is_private = models.BooleanField(verbose_name=_("is private?"), default=False) + event = models.ForeignKey(Event, verbose_name=_("event"), null=True, blank=True, on_delete=models.SET_NULL) + country = models.ForeignKey(Country, verbose_name=_("country"), null=True, blank=True, on_delete=models.SET_NULL) # Fields specific to Molnix integration: # ID in Molnix system, if parsed from Molnix. molnix_id = models.IntegerField(blank=True, null=True) @@ -51,7 +53,7 @@ class SurgeAlert(models.Model): molnix_status = models.CharField(blank=True, null=True, max_length=32) # It depends on molnix_status. Check "save" method below. - is_stood_down = models.BooleanField(verbose_name=_('is stood down?'), default=False) + is_stood_down = models.BooleanField(verbose_name=_("is stood down?"), default=False) opens = models.DateTimeField(blank=True, null=True) closes = models.DateTimeField(blank=True, null=True) start = models.DateTimeField(blank=True, null=True) @@ -62,13 +64,13 @@ class SurgeAlert(models.Model): is_active = models.BooleanField(default=True) # Don't set `auto_now_add` so we can modify it on save - created_at = models.DateTimeField(verbose_name=_('created at')) - status = models.IntegerField(choices=SurgeAlertStatus.choices, verbose_name=_('alert status'), default=SurgeAlertStatus.OPEN) + created_at = models.DateTimeField(verbose_name=_("created at")) + status = models.IntegerField(choices=SurgeAlertStatus.choices, verbose_name=_("alert status"), default=SurgeAlertStatus.OPEN) class Meta: - ordering = ['-created_at'] - verbose_name = _('Surge Alert') - verbose_name_plural = _('Surge Alerts') + ordering = ["-created_at"] + verbose_name = _("Surge Alert") + verbose_name_plural = _("Surge Alerts") def save(self, *args, **kwargs): """ @@ -79,7 +81,7 @@ def save(self, *args, **kwargs): # On save, if `created` is not set, make it the current time if (not self.id and not self.created_at) or (self.created_at > timezone.now()): self.created_at = timezone.now() - self.is_stood_down = self.molnix_status == 'unfilled' + self.is_stood_down = self.molnix_status == "unfilled" if self.is_stood_down: self.status = SurgeAlertStatus.STOOD_DOWN elif self.closes and self.closes < timezone.now(): @@ -89,39 +91,42 @@ def save(self, *args, **kwargs): return super(SurgeAlert, self).save(*args, **kwargs) def __str__(self): - if self.operation and self.operation != '': + if self.operation and self.operation != "": return self.operation elif self.event: return self.event.name elif self.message: return self.message else: - return '–' + return "–" class SubscriptionType(models.IntegerChoices): - """ New or edit to existing record """ - NEW = 0, _('new') - EDIT = 1, _('edit') + """New or edit to existing record""" + + NEW = 0, _("new") + EDIT = 1, _("edit") class RecordType(models.IntegerChoices): - """ Types of notifications a user can subscribe to """ - EVENT = 0, _('event') # not to use in rtype_of_subscr, migrated to NEW_EMERGENCIES - APPEAL = 1, _('appeal') # not to use in rtype_of_subscr, migrated to NEW_OPERATIONS - FIELD_REPORT = 2, _('field report') # not to use in rtype_of_subscr, migrated to NEW_EMERGENCIES - SURGE_ALERT = 3, _('surge alert') - COUNTRY = 4, _('country') - REGION = 5, _('region') - DTYPE = 6, _('disaster type') - PER_DUE_DATE = 7, _('per due date') - FOLLOWED_EVENT = 8, _('followed event') - SURGE_DEPLOYMENT_MESSAGES = 9, _('surge deployment messages') - SURGE_APPROACHING_END_OF_MISSION = 10, _('surge approaching end of mission') - WEEKLY_DIGEST = 11, _('weekly digest') - NEW_EMERGENCIES = 12, _('new emergencies') - NEW_OPERATIONS = 13, _('new operations') - GENERAL_ANNOUNCEMENTS = 14, _('general announcements') + """Types of notifications a user can subscribe to""" + + EVENT = 0, _("event") # not to use in rtype_of_subscr, migrated to NEW_EMERGENCIES + APPEAL = 1, _("appeal") # not to use in rtype_of_subscr, migrated to NEW_OPERATIONS + FIELD_REPORT = 2, _("field report") # not to use in rtype_of_subscr, migrated to NEW_EMERGENCIES + SURGE_ALERT = 3, _("surge alert") + COUNTRY = 4, _("country") + REGION = 5, _("region") + DTYPE = 6, _("disaster type") + PER_DUE_DATE = 7, _("per due date") + FOLLOWED_EVENT = 8, _("followed event") + SURGE_DEPLOYMENT_MESSAGES = 9, _("surge deployment messages") + SURGE_APPROACHING_END_OF_MISSION = 10, _("surge approaching end of mission") + WEEKLY_DIGEST = 11, _("weekly digest") + NEW_EMERGENCIES = 12, _("new emergencies") + NEW_OPERATIONS = 13, _("new operations") + GENERAL_ANNOUNCEMENTS = 14, _("general announcements") + # Migration # update notification_subscription set rtype=12, stype=0 where rtype=0; -- EVENT > EMERGENCY @@ -133,88 +138,88 @@ class RecordType(models.IntegerChoices): class Subscription(models.Model): - """ User subscriptions """ + """User subscriptions""" user = models.ForeignKey( settings.AUTH_USER_MODEL, - verbose_name=_('user'), + verbose_name=_("user"), on_delete=models.CASCADE, - related_name='subscription', + related_name="subscription", ) - stype = models.IntegerField(choices=SubscriptionType.choices, verbose_name=_('subscription type'), default=0) - rtype = models.IntegerField(choices=RecordType.choices, verbose_name=_('record type'), default=0) + stype = models.IntegerField(choices=SubscriptionType.choices, verbose_name=_("subscription type"), default=0) + rtype = models.IntegerField(choices=RecordType.choices, verbose_name=_("record type"), default=0) - country = models.ForeignKey(Country, verbose_name=_('country'), null=True, blank=True, on_delete=models.SET_NULL) - region = models.ForeignKey(Region, verbose_name=_('region'), null=True, blank=True, on_delete=models.SET_NULL) - dtype = models.ForeignKey(DisasterType, verbose_name=_('disaster type'), null=True, blank=True, on_delete=models.SET_NULL) - event = models.ForeignKey(Event, verbose_name=_('event'), null=True, blank=True, on_delete=models.SET_NULL) + country = models.ForeignKey(Country, verbose_name=_("country"), null=True, blank=True, on_delete=models.SET_NULL) + region = models.ForeignKey(Region, verbose_name=_("region"), null=True, blank=True, on_delete=models.SET_NULL) + dtype = models.ForeignKey(DisasterType, verbose_name=_("disaster type"), null=True, blank=True, on_delete=models.SET_NULL) + event = models.ForeignKey(Event, verbose_name=_("event"), null=True, blank=True, on_delete=models.SET_NULL) - lookup_id = models.CharField(verbose_name=_('lookup id'), max_length=20, null=True, blank=True, editable=False) + lookup_id = models.CharField(verbose_name=_("lookup id"), max_length=20, null=True, blank=True, editable=False) class Meta: - verbose_name = _('Subscription') - verbose_name_plural = _('Subscriptions') + verbose_name = _("Subscription") + verbose_name_plural = _("Subscriptions") # Given a request containing new subscriptions, validate and # sync the subscriptions. def sync_user_subscriptions(user, body, deletePrevious): rtype_map = { - 'event': RecordType.EVENT, - 'appeal': RecordType.APPEAL, - 'fieldReport': RecordType.FIELD_REPORT, - 'surge': RecordType.SURGE_ALERT, - 'country': RecordType.COUNTRY, - 'region': RecordType.REGION, - 'disasterType': RecordType.DTYPE, - 'perDueDate': RecordType.PER_DUE_DATE, - 'followedEvent': RecordType.FOLLOWED_EVENT, - 'surgeDM': RecordType.SURGE_DEPLOYMENT_MESSAGES, - 'surgeAEM': RecordType.SURGE_APPROACHING_END_OF_MISSION, - 'weeklyDigest': RecordType.WEEKLY_DIGEST, - 'newEmergencies': RecordType.NEW_EMERGENCIES, - 'newOperations': RecordType.NEW_OPERATIONS, - 'general': RecordType.GENERAL_ANNOUNCEMENTS, + "event": RecordType.EVENT, + "appeal": RecordType.APPEAL, + "fieldReport": RecordType.FIELD_REPORT, + "surge": RecordType.SURGE_ALERT, + "country": RecordType.COUNTRY, + "region": RecordType.REGION, + "disasterType": RecordType.DTYPE, + "perDueDate": RecordType.PER_DUE_DATE, + "followedEvent": RecordType.FOLLOWED_EVENT, + "surgeDM": RecordType.SURGE_DEPLOYMENT_MESSAGES, + "surgeAEM": RecordType.SURGE_APPROACHING_END_OF_MISSION, + "weeklyDigest": RecordType.WEEKLY_DIGEST, + "newEmergencies": RecordType.NEW_EMERGENCIES, + "newOperations": RecordType.NEW_OPERATIONS, + "general": RecordType.GENERAL_ANNOUNCEMENTS, } stype_map = { - 'new': SubscriptionType.NEW, - 'modified': SubscriptionType.EDIT, + "new": SubscriptionType.NEW, + "modified": SubscriptionType.EDIT, } new = [] errors = [] for req in body: - rtype = rtype_map.get(req['type'], None) - fields = {'rtype': rtype, 'user': user} + rtype = rtype_map.get(req["type"], None) + fields = {"rtype": rtype, "user": user} error = None if rtype in [RecordType.EVENT, RecordType.APPEAL, RecordType.FIELD_REPORT]: - fields['stype'] = stype_map.get(req['value'], 0) + fields["stype"] = stype_map.get(req["value"], 0) elif rtype == RecordType.COUNTRY: try: - fields['country'] = Country.objects.get(pk=req['value']) + fields["country"] = Country.objects.get(pk=req["value"]) except Country.DoesNotExist: - error = 'Could not find country with primary key %s' % req['value'] - fields['lookup_id'] = 'c%s' % req['value'] + error = "Could not find country with primary key %s" % req["value"] + fields["lookup_id"] = "c%s" % req["value"] elif rtype == RecordType.REGION: try: - fields['region'] = Region.objects.get(pk=req['value']) + fields["region"] = Region.objects.get(pk=req["value"]) except Region.DoesNotExist: - error = 'Could not find region with primary key %s' % req['value'] - fields['lookup_id'] = 'r%s' % req['value'] + error = "Could not find region with primary key %s" % req["value"] + fields["lookup_id"] = "r%s" % req["value"] elif rtype == RecordType.DTYPE: try: - fields['dtype'] = DisasterType.objects.get(pk=req['value']) + fields["dtype"] = DisasterType.objects.get(pk=req["value"]) except DisasterType.DoesNotExist: - error = 'Could not find disaster type with primary key %s' % req['value'] - fields['lookup_id'] = 'd%s' % req['value'] + error = "Could not find disaster type with primary key %s" % req["value"] + fields["lookup_id"] = "d%s" % req["value"] elif rtype == RecordType.FOLLOWED_EVENT: - lookup_id = 'e%s' % req['value'] + lookup_id = "e%s" % req["value"] if Subscription.objects.filter(user=user, lookup_id=lookup_id) and not deletePrevious: # We check existence only when the previous subscriptions are not to be deleted (add only 1!) # In this case there is no need to continue the for loop. See ¤ below. @@ -222,43 +227,45 @@ def sync_user_subscriptions(user, body, deletePrevious): break else: try: - fields['event'] = Event.objects.get(pk=req['value']) + fields["event"] = Event.objects.get(pk=req["value"]) except Event.DoesNotExist: - error = 'Could not find followed emergency with primary key %s' % req['value'] - fields['lookup_id'] = 'e%s' % req['value'] + error = "Could not find followed emergency with primary key %s" % req["value"] + fields["lookup_id"] = "e%s" % req["value"] elif rtype == RecordType.PER_DUE_DATE: - fields['stype'] = SubscriptionType.NEW + fields["stype"] = SubscriptionType.NEW elif rtype == RecordType.SURGE_ALERT: - fields['stype'] = SubscriptionType.NEW + fields["stype"] = SubscriptionType.NEW elif rtype == RecordType.SURGE_DEPLOYMENT_MESSAGES: - fields['stype'] = SubscriptionType.NEW + fields["stype"] = SubscriptionType.NEW elif rtype == RecordType.SURGE_APPROACHING_END_OF_MISSION: - fields['stype'] = SubscriptionType.NEW + fields["stype"] = SubscriptionType.NEW elif rtype == RecordType.WEEKLY_DIGEST: - fields['stype'] = SubscriptionType.NEW + fields["stype"] = SubscriptionType.NEW elif rtype == RecordType.NEW_EMERGENCIES: - fields['stype'] = SubscriptionType.NEW + fields["stype"] = SubscriptionType.NEW elif rtype == RecordType.NEW_OPERATIONS: - fields['stype'] = SubscriptionType.NEW + fields["stype"] = SubscriptionType.NEW elif rtype == RecordType.GENERAL_ANNOUNCEMENTS: - fields['stype'] = SubscriptionType.NEW + fields["stype"] = SubscriptionType.NEW else: - error = 'Record type is not valid, must be one of %s' % ', '.join(list(rtype_map.keys())), + error = ("Record type is not valid, must be one of %s" % ", ".join(list(rtype_map.keys())),) if error is not None: - errors.append({ - 'error': error, - 'record': req, - }) + errors.append( + { + "error": error, + "record": req, + } + ) else: new.append(Subscription(**fields)) @@ -277,38 +284,42 @@ def del_user_subscriptions(user, body): req = body[0] errors = [] error = None - if 'value' in req: - lookup_id = 'e%s' % req['value'] + if "value" in req: + lookup_id = "e%s" % req["value"] if Subscription.objects.filter(user=user, lookup_id=lookup_id): try: Subscription.objects.filter(user=user, lookup_id=lookup_id).delete() except Subscription.DoesNotExist: - error = 'Could not remove followed subscription with lookup_id %s' % lookup_id - elif 'perDueDate' in req: + error = "Could not remove followed subscription with lookup_id %s" % lookup_id + elif "perDueDate" in req: if Subscription.objects.filter(user=user, rtype=RecordType.PER_DUE_DATE): try: Subscription.objects.filter(user=user, rtype=RecordType.PER_DUE_DATE).delete() except Subscription.DoesNotExist: - error = 'Could not remove PER_DUE_DATE subscription' + error = "Could not remove PER_DUE_DATE subscription" else: - error = 'Wrong deletion format, value or perDueDate should be given.' + error = "Wrong deletion format, value or perDueDate should be given." if error is not None: - errors.append({ - 'error': error, - 'record': req, - }) + errors.append( + { + "error": error, + "record": req, + } + ) return errors def __str__(self): - return '%s %s (%s)' % (self.user.username, self.rtype, self.user.email) + return "%s %s (%s)" % (self.user.username, self.rtype, self.user.email) class NotificationGUID(models.Model): - """ Email GUIDs from the sender API """ + """Email GUIDs from the sender API""" + created_at = models.DateTimeField(auto_now_add=True) - api_guid = models.CharField(max_length=200, - help_text='Can be used to do a GET request to check on the email sender API side.') + api_guid = models.CharField( + max_length=200, help_text="Can be used to do a GET request to check on the email sender API side." + ) email_type = models.CharField(max_length=600, null=True, blank=True) to_list = models.TextField(null=True, blank=True) diff --git a/notifications/notification.py b/notifications/notification.py index 1394b46f8..7a8bf99d1 100644 --- a/notifications/notification.py +++ b/notifications/notification.py @@ -1,9 +1,10 @@ -import requests import base64 -import threading import smtplib +import threading from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText + +import requests from django.conf import settings from django.utils.html import strip_tags @@ -11,9 +12,8 @@ from api.models import CronJob, CronJobStatus from notifications.models import NotificationGUID - -EMAIL_TO = 'no-reply@ifrc.org' -IS_PROD = settings.GO_ENVIRONMENT == 'production' +EMAIL_TO = "no-reply@ifrc.org" +IS_PROD = settings.GO_ENVIRONMENT == "production" class SendMail(threading.Thread): @@ -29,38 +29,41 @@ def run(self): server.starttls() server.ehlo() succ = server.login(settings.EMAIL_USER, settings.EMAIL_PASS) - if 'successful' not in str(succ[1]): - cron_rec = {"name": "notification", - "message": 'Error contacting ' + settings.EMAIL_HOST + ' smtp server for notifications', - "status": CronJobStatus.ERRONEOUS} + if "successful" not in str(succ[1]): + cron_rec = { + "name": "notification", + "message": "Error contacting " + settings.EMAIL_HOST + " smtp server for notifications", + "status": CronJobStatus.ERRONEOUS, + } CronJob.sync_cron(cron_rec) if len(self.recipients) > 0: server.sendmail(settings.EMAIL_USER, self.recipients, self.msg.as_string()) server.quit() - logger.info('E-mails were sent successfully.') + logger.info("E-mails were sent successfully.") except Exception as exc: - logger.error('Could not send emails with Python smtlib, exception: {} -- {}'.format(type(exc).__name__, - exc.args)) - ex = '' + logger.error("Could not send emails with Python smtlib, exception: {} -- {}".format(type(exc).__name__, exc.args)) + ex = "" try: ex = str(exc.args) except Exception as exctwo: logger.error(exctwo.args) - cron_rec = {"name": "notification", - "message": 'Error sending out email with Python smtplib: {}'.format(ex), - "status": CronJobStatus.ERRONEOUS} + cron_rec = { + "name": "notification", + "message": "Error sending out email with Python smtplib: {}".format(ex), + "status": CronJobStatus.ERRONEOUS, + } CronJob.sync_cron(cron_rec) def construct_msg(subject, html): - msg = MIMEMultipart('alternative') + msg = MIMEMultipart("alternative") - msg['Subject'] = subject - msg['From'] = settings.EMAIL_USER.upper() - msg['To'] = 'no-reply@ifrc.org' + msg["Subject"] = subject + msg["From"] = settings.EMAIL_USER.upper() + msg["To"] = "no-reply@ifrc.org" - text_body = MIMEText(strip_tags(html), 'plain') - html_body = MIMEText(html, 'html') + text_body = MIMEText(strip_tags(html), "plain") + html_body = MIMEText(html, "html") msg.attach(text_body) msg.attach(html_body) @@ -68,93 +71,88 @@ def construct_msg(subject, html): return msg -def send_notification(subject, recipients, html, mailtype='', files=None): - """ Generic email sending method, handly only HTML emails currently """ +def send_notification(subject, recipients, html, mailtype="", files=None): + """Generic email sending method, handly only HTML emails currently""" if not settings.EMAIL_USER or not settings.EMAIL_API_ENDPOINT: - logger.warning( - 'Cannot send notifications.\n' - 'No username and/or API endpoint set as environment variables.' - ) + logger.warning("Cannot send notifications.\n" "No username and/or API endpoint set as environment variables.") if settings.DEBUG: - print('-' * 22, 'EMAIL START', '-' * 22) - print(f'subject={subject}\nrecipients={recipients}\nhtml={html}\nmailtype={mailtype}') - print('-' * 22, 'EMAIL END -', '-' * 22) + print("-" * 22, "EMAIL START", "-" * 22) + print(f"subject={subject}\nrecipients={recipients}\nhtml={html}\nmailtype={mailtype}") + print("-" * 22, "EMAIL END -", "-" * 22) return if settings.DEBUG_EMAIL: - print('-' * 22, 'EMAIL START', '-' * 22) - print(f'\n{html}\n') - print('-' * 22, 'EMAIL END -', '-' * 22) + print("-" * 22, "EMAIL START", "-" * 22) + print(f"\n{html}\n") + print("-" * 22, "EMAIL END -", "-" * 22) to_addresses = recipients if isinstance(recipients, list) else [recipients] -# if not IS_PROD: -# logger.info('Using test email addresses...') -# to_addresses = [] -# logger.info(to_addresses) -# for eml in settings.TEST_EMAILS: -# -# # It is possible to filter test addressees to domain name only – not used. -# is_dom = True if '@' not in eml else False -# if is_dom: -# for rec in recipients: -# try: -# if eml == rec.split('@')[1]: -# to_addresses.append(rec) -# except Exception: -# logger.info('Could not extract domain from: {}'.format(rec)) -# elif eml and (eml in recipients): -# to_addresses.append(eml) - - recipients_as_string = ','.join(to_addresses) + # if not IS_PROD: + # logger.info('Using test email addresses...') + # to_addresses = [] + # logger.info(to_addresses) + # for eml in settings.TEST_EMAILS: + # + # # It is possible to filter test addressees to domain name only – not used. + # is_dom = True if '@' not in eml else False + # if is_dom: + # for rec in recipients: + # try: + # if eml == rec.split('@')[1]: + # to_addresses.append(rec) + # except Exception: + # logger.info('Could not extract domain from: {}'.format(rec)) + # elif eml and (eml in recipients): + # to_addresses.append(eml) + + recipients_as_string = ",".join(to_addresses) if not recipients_as_string: if len(to_addresses) > 0: - warn_msg = 'Recipients failed to be converted to string, 1st rec.: {}'.format(to_addresses[0]) + warn_msg = "Recipients failed to be converted to string, 1st rec.: {}".format(to_addresses[0]) logger.info(warn_msg) # Save the warning into the CronJob logs too cron_error = {"name": "index_and_notify", "message": warn_msg, "status": CronJobStatus.WARNED} CronJob.sync_cron(cron_error) else: - logger.info('Recipients string is empty') + logger.info("Recipients string is empty") return # If there are no recipients it's unnecessary to send out the email # Encode with base64 into bytes, then converting it back to strings for the JSON payload = { - "FromAsBase64": str(base64.b64encode(settings.EMAIL_USER.encode('utf-8')), 'utf-8'), - "ToAsBase64": str(base64.b64encode(EMAIL_TO.encode('utf-8')), 'utf-8'), + "FromAsBase64": str(base64.b64encode(settings.EMAIL_USER.encode("utf-8")), "utf-8"), + "ToAsBase64": str(base64.b64encode(EMAIL_TO.encode("utf-8")), "utf-8"), "CcAsBase64": "", - "BccAsBase64": str(base64.b64encode(recipients_as_string.encode('utf-8')), 'utf-8'), - "SubjectAsBase64": str(base64.b64encode(subject.encode('utf-8')), 'utf-8'), - "BodyAsBase64": str(base64.b64encode(html.encode('utf-8')), 'utf-8'), + "BccAsBase64": str(base64.b64encode(recipients_as_string.encode("utf-8")), "utf-8"), + "SubjectAsBase64": str(base64.b64encode(subject.encode("utf-8")), "utf-8"), + "BodyAsBase64": str(base64.b64encode(html.encode("utf-8")), "utf-8"), "IsBodyHtml": True, "TemplateName": "", - "TemplateLanguage": "" + "TemplateLanguage": "", } # The response contains the GUID (res.text) res = requests.post(settings.EMAIL_API_ENDPOINT, json=payload) - res_text = res.text.replace('"', '') + res_text = res.text.replace('"', "") if res.status_code == 200: - logger.info(u'Subject: {subject}, Recipients: {recs}'.format(subject=subject, recs=recipients_as_string)) + logger.info("Subject: {subject}, Recipients: {recs}".format(subject=subject, recs=recipients_as_string)) - logger.info('GUID: {}'.format(res_text)) + logger.info("GUID: {}".format(res_text)) # Saving GUID into a table so that the API can be queried with it to get info about # if the actual sending has failed or not. NotificationGUID.objects.create( - api_guid=res_text, - email_type=mailtype, - to_list=f'To: {EMAIL_TO}; Bcc: {recipients_as_string}' + api_guid=res_text, email_type=mailtype, to_list=f"To: {EMAIL_TO}; Bcc: {recipients_as_string}" ) - logger.info('E-mails were sent successfully.') + logger.info("E-mails were sent successfully.") elif res.status_code == 401 or res.status_code == 403: # Try sending with Python smtplib, if reaching the API fails - logger.error(f'Authorization/authentication failed ({res.status_code}) to the e-mail sender API.') + logger.error(f"Authorization/authentication failed ({res.status_code}) to the e-mail sender API.") msg = construct_msg(subject, html) SendMail(to_addresses, msg).start() else: # Try sending with Python smtplib, if reaching the API fails - logger.error('Could not reach the e-mail sender API. Trying with Python smtplib...') + logger.error("Could not reach the e-mail sender API. Trying with Python smtplib...") msg = construct_msg(subject, html) SendMail(to_addresses, msg).start() diff --git a/notifications/search_indexes.py b/notifications/search_indexes.py index 9dafb73e0..329390287 100644 --- a/notifications/search_indexes.py +++ b/notifications/search_indexes.py @@ -5,19 +5,19 @@ class SurgeIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField(document=True, use_template=True) - name = indexes.EdgeNgramField(model_attr='message') + name = indexes.EdgeNgramField(model_attr="message") molnix_tag = indexes.MultiValueField(null=True) - event_name = indexes.CharField(model_attr='event__name') - country_name = indexes.CharField(model_attr='country__name') - start_date = indexes.DateTimeField(model_attr='start', null=True) - alert_date = indexes.DateTimeField(model_attr='opens', null=True) - event_id = indexes.IntegerField(model_attr='event__id', null=True) - deadline = indexes.DateTimeField(model_attr='closes', null=True) - surge_type = indexes.CharField(model_attr='get_atype_display') - status = indexes.CharField(model_attr='molnix_status', null=True) - country_id = indexes.IntegerField(model_attr='country__id') - iso3 = indexes.CharField(model_attr='country__iso3', null=True) - visibility = indexes.CharField(model_attr='event__get_visibility_display', null=True) + event_name = indexes.CharField(model_attr="event__name") + country_name = indexes.CharField(model_attr="country__name") + start_date = indexes.DateTimeField(model_attr="start", null=True) + alert_date = indexes.DateTimeField(model_attr="opens", null=True) + event_id = indexes.IntegerField(model_attr="event__id", null=True) + deadline = indexes.DateTimeField(model_attr="closes", null=True) + surge_type = indexes.CharField(model_attr="get_atype_display") + status = indexes.CharField(model_attr="molnix_status", null=True) + country_id = indexes.IntegerField(model_attr="country__id") + iso3 = indexes.CharField(model_attr="country__iso3", null=True) + visibility = indexes.CharField(model_attr="event__get_visibility_display", null=True) def get_model(self): return SurgeAlert diff --git a/notifications/serializers.py b/notifications/serializers.py index 3bb1e5d9a..d65e83aae 100644 --- a/notifications/serializers.py +++ b/notifications/serializers.py @@ -1,26 +1,50 @@ from rest_framework import serializers -from api.serializers import MiniEventSerializer, SurgeEventSerializer, MiniCountrySerializer +from api.serializers import ( + MiniCountrySerializer, + MiniEventSerializer, + SurgeEventSerializer, +) +from deployments.serializers import MolnixTagSerializer from lang.serializers import ModelSerializer -from .models import SurgeAlert, Subscription -from deployments.serializers import MolnixTagSerializer +from .models import Subscription, SurgeAlert class SurgeAlertSerializer(ModelSerializer): event = SurgeEventSerializer() country = MiniCountrySerializer() - atype_display = serializers.CharField(source='get_atype_display', read_only=True) - status_display = serializers.CharField(source='get_status_display', read_only=True) - category_display = serializers.CharField(source='get_category_display', read_only=True) + atype_display = serializers.CharField(source="get_atype_display", read_only=True) + status_display = serializers.CharField(source="get_status_display", read_only=True) + category_display = serializers.CharField(source="get_category_display", read_only=True) molnix_tags = MolnixTagSerializer(many=True, read_only=True) class Meta: model = SurgeAlert fields = ( - 'operation','country', 'message', 'deployment_needed', 'is_private', 'event', 'created_at', 'id', - 'atype', 'atype_display', 'category', 'category_display', 'molnix_id', 'molnix_tags', - 'molnix_status', 'opens', 'closes', 'start', 'end', 'is_active', 'is_stood_down','status', 'status_display' + "operation", + "country", + "message", + "deployment_needed", + "is_private", + "event", + "created_at", + "id", + "atype", + "atype_display", + "category", + "category_display", + "molnix_id", + "molnix_tags", + "molnix_status", + "opens", + "closes", + "start", + "end", + "is_active", + "is_stood_down", + "status", + "status_display", ) @@ -40,12 +64,20 @@ class Meta: class SubscriptionSerializer(ModelSerializer): country = MiniCountrySerializer() event = MiniEventSerializer() - stype_display = serializers.CharField(source='get_stype_display', read_only=True) - rtype_display = serializers.CharField(source='get_rtype_display', read_only=True) + stype_display = serializers.CharField(source="get_stype_display", read_only=True) + rtype_display = serializers.CharField(source="get_rtype_display", read_only=True) class Meta: model = Subscription fields = ( - 'user', 'country', 'region', 'event', 'dtype', 'lookup_id', - 'stype', 'stype_display', 'rtype', 'rtype_display', + "user", + "country", + "region", + "event", + "dtype", + "lookup_id", + "stype", + "stype_display", + "rtype", + "rtype_display", ) diff --git a/notifications/templatetags/custom_filters.py b/notifications/templatetags/custom_filters.py index 7d0f70429..4b90be648 100644 --- a/notifications/templatetags/custom_filters.py +++ b/notifications/templatetags/custom_filters.py @@ -5,7 +5,7 @@ @register.tag def lineless(parser, token): - nodelist = parser.parse(('endlineless',)) + nodelist = parser.parse(("endlineless",)) parser.delete_first_token() return LinelessNode(nodelist) @@ -16,10 +16,10 @@ def __init__(self, nodelist): def render(self, context): input_str = self.nodelist.render(context) - output_str = '' + output_str = "" for line in input_str.splitlines(): if line.strip(): - output_str = '\n'.join((output_str, line)) + output_str = "\n".join((output_str, line)) return output_str diff --git a/notifications/tests.py b/notifications/tests.py index a2417fe79..167a7fb48 100644 --- a/notifications/tests.py +++ b/notifications/tests.py @@ -1,20 +1,19 @@ from datetime import datetime, timedelta -from django.utils import timezone from unittest.mock import patch + from django.conf import settings +from django.core.management import call_command +from django.utils import timezone from modeltranslation.utils import build_localized_fieldname -from notifications.management.commands.ingest_alerts import categories, timeformat -from lang.serializers import TranslatedModelSerializerMixin -from main.test_case import APITestCase - -from api.factories.region import RegionFactory from api.factories.country import CountryFactory +from api.factories.region import RegionFactory from deployments.factories.molnix_tag import MolnixTagFactory - -from notifications.models import SurgeAlert, SurgeAlertStatus, SurgeAlertType +from lang.serializers import TranslatedModelSerializerMixin +from main.test_case import APITestCase from notifications.factories import SurgeAlertFactory -from django.core.management import call_command +from notifications.management.commands.ingest_alerts import categories, timeformat +from notifications.models import SurgeAlert, SurgeAlertStatus, SurgeAlertType class NotificationTestCase(APITestCase): @@ -28,7 +27,7 @@ def test_surge_translation(self): # message "Due to the very limited number of Portuguese and Spanish speakers in our roster, we would appreciate if you could please let us know your tentative availability, only in case you speak Portuguese and/or Spanish.", # noqa: E501 "2017-02-15", # created_at: date - "14:23" # created_at: time + "14:23", # created_at: time ], ] @@ -36,14 +35,15 @@ def test_surge_translation(self): surge_alerts_field_values = {} for alert in alerts: fields = { - 'atype': SurgeAlertType[alert[0].strip().upper()], - 'category': categories[alert[1].strip().lower()], - 'operation': alert[2].strip(), - 'message': alert[3].strip(), - 'deployment_needed': False, - 'is_private': True, - 'created_at': datetime.strptime( - '%s:%s' % (alert[4].strip(), alert[5].strip()), timeformat, + "atype": SurgeAlertType[alert[0].strip().upper()], + "category": categories[alert[1].strip().lower()], + "operation": alert[2].strip(), + "message": alert[3].strip(), + "deployment_needed": False, + "is_private": True, + "created_at": datetime.strptime( + "%s:%s" % (alert[4].strip(), alert[5].strip()), + timeformat, ).replace(tzinfo=timezone.utc), } surge_alert = SurgeAlert(**fields) @@ -57,32 +57,32 @@ def test_surge_translation(self): for surge_alert in surge_alerts: surge_alert.refresh_from_db() - for field in ['operation', 'message']: + for field in ["operation", "message"]: for lang, _ in settings.LANGUAGES: original_value = surge_alerts_field_values[surge_alert.pk][field] self.assertEqual( getattr(surge_alert, build_localized_fieldname(field, lang)), - self.aws_translator._fake_translation(original_value, lang, 'en') if lang != 'en' else original_value, + self.aws_translator._fake_translation(original_value, lang, "en") if lang != "en" else original_value, ) class SurgeAlertFilteringTest(APITestCase): def test_filtering(self): region_1, region_2 = RegionFactory.create_batch(2) - country_1 = CountryFactory.create(iso3='ATL', region=region_1) - country_2 = CountryFactory.create(iso3='NPT', region=region_2) + country_1 = CountryFactory.create(iso3="ATL", region=region_1) + country_2 = CountryFactory.create(iso3="NPT", region=region_2) - molnix_tag_1 = MolnixTagFactory.create(name='OP-6700') - molnix_tag_2 = MolnixTagFactory.create(name='L-FRA') - molnix_tag_3 = MolnixTagFactory.create(name='AMER') + molnix_tag_1 = MolnixTagFactory.create(name="OP-6700") + molnix_tag_2 = MolnixTagFactory.create(name="L-FRA") + molnix_tag_3 = MolnixTagFactory.create(name="AMER") SurgeAlertFactory.create( - message='CEA Coordinator, Floods, Atlantis', + message="CEA Coordinator, Floods, Atlantis", country=country_1, molnix_tags=[molnix_tag_1, molnix_tag_2], ) SurgeAlertFactory.create( - message='WASH Coordinator, Earthquake, Neptunus', + message="WASH Coordinator, Earthquake, Neptunus", country=country_2, molnix_tags=[molnix_tag_1, molnix_tag_3], ) @@ -91,83 +91,92 @@ def test_filtering(self): # Filtering for X, B gives 1; filtering for A, B gives both results. def _fetch(filters): - return self.client.get('/api/v2/surge_alert/', filters).json() + return self.client.get("/api/v2/surge_alert/", filters).json() def _to_csv(*items): - return ','.join([str(i) for i in items]) + return ",".join([str(i) for i in items]) - response = _fetch(dict(country__iso3__in='AAA,NPT')) - self.assertEqual(response['count'], 1) - self.assertEqual(response['results'][0]['molnix_tags'][0]['name'], 'OP-6700') + response = _fetch(dict(country__iso3__in="AAA,NPT")) + self.assertEqual(response["count"], 1) + self.assertEqual(response["results"][0]["molnix_tags"][0]["name"], "OP-6700") - response = _fetch(dict(country__iso3__in='ATL,NPT')) - self.assertEqual(response['count'], 2) + response = _fetch(dict(country__iso3__in="ATL,NPT")) + self.assertEqual(response["count"], 2) self.assertEqual( { - response['results'][0]['molnix_tags'][0]['name'], - response['results'][0]['molnix_tags'][1]['name'], - response['results'][1]['molnix_tags'][0]['name'], - response['results'][1]['molnix_tags'][1]['name'] + response["results"][0]["molnix_tags"][0]["name"], + response["results"][0]["molnix_tags"][1]["name"], + response["results"][1]["molnix_tags"][0]["name"], + response["results"][1]["molnix_tags"][1]["name"], }, - {'OP-6700', 'L-FRA', 'AMER'}) + {"OP-6700", "L-FRA", "AMER"}, + ) # we have 2 SurgeAlerts with MolnixTags A, B and A, C. # Filtering for A, B, C gives both. Filtering for only B or C gives 1. # filtering by molnix_tags - response = _fetch(dict( - country__iso3__in='ATL,NPT', - molnix_tags=_to_csv(molnix_tag_2.id), - )) - self.assertEqual(response['count'], 1) - - response = _fetch(dict( - country__iso3__in='ATL,NPT', - molnix_tags=_to_csv(molnix_tag_1.id, molnix_tag_2.id, molnix_tag_3.id), - )) - self.assertEqual(response['count'], 2) - - response = _fetch(dict( - country__iso3__in='ATL,NPT', - molnix_tag_names=_to_csv('AMER'), - )) - self.assertEqual(response['count'], 1) - - response = _fetch(dict( - country__iso3__in='ATL,NPT', - molnix_tag_names=_to_csv('OP-6700', 'L-FRA', 'AMER'), - )) - self.assertEqual(response['count'], 2) + response = _fetch( + dict( + country__iso3__in="ATL,NPT", + molnix_tags=_to_csv(molnix_tag_2.id), + ) + ) + self.assertEqual(response["count"], 1) + + response = _fetch( + dict( + country__iso3__in="ATL,NPT", + molnix_tags=_to_csv(molnix_tag_1.id, molnix_tag_2.id, molnix_tag_3.id), + ) + ) + self.assertEqual(response["count"], 2) + + response = _fetch( + dict( + country__iso3__in="ATL,NPT", + molnix_tag_names=_to_csv("AMER"), + ) + ) + self.assertEqual(response["count"], 1) + + response = _fetch( + dict( + country__iso3__in="ATL,NPT", + molnix_tag_names=_to_csv("OP-6700", "L-FRA", "AMER"), + ) + ) + self.assertEqual(response["count"], 2) def test_surge_alert_status(self): region_1, region_2 = RegionFactory.create_batch(2) - country_1 = CountryFactory.create(iso3='ATL', region=region_1) - country_2 = CountryFactory.create(iso3='NPT', region=region_2) + country_1 = CountryFactory.create(iso3="ATL", region=region_1) + country_2 = CountryFactory.create(iso3="NPT", region=region_2) - molnix_tag_1 = MolnixTagFactory.create(name='OP-6700') - molnix_tag_2 = MolnixTagFactory.create(name='L-FRA') - molnix_tag_3 = MolnixTagFactory.create(name='AMER') + molnix_tag_1 = MolnixTagFactory.create(name="OP-6700") + molnix_tag_2 = MolnixTagFactory.create(name="L-FRA") + molnix_tag_3 = MolnixTagFactory.create(name="AMER") alert1 = SurgeAlertFactory.create( - message='CEA Coordinator, Floods, Atlantis', + message="CEA Coordinator, Floods, Atlantis", country=country_1, molnix_tags=[molnix_tag_1, molnix_tag_2], opens=timezone.now() - timedelta(days=2), - closes=timezone.now() + timedelta(days=5) + closes=timezone.now() + timedelta(days=5), ) alert2 = SurgeAlertFactory.create( - message='WASH Coordinator, Earthquake, Neptunus', + message="WASH Coordinator, Earthquake, Neptunus", country=country_2, molnix_tags=[molnix_tag_1, molnix_tag_3], opens=timezone.now() - timedelta(days=2), - closes=timezone.now() - timedelta(days=1) + closes=timezone.now() - timedelta(days=1), ) alert3 = SurgeAlertFactory.create( - message='New One', + message="New One", country=country_2, molnix_tags=[molnix_tag_1, molnix_tag_3], - molnix_status='unfilled', + molnix_status="unfilled", ) self.assertEqual(alert1.status, SurgeAlertStatus.OPEN) @@ -175,58 +184,52 @@ def test_surge_alert_status(self): self.assertEqual(alert3.status, SurgeAlertStatus.STOOD_DOWN) def _fetch(filters): - return self.client.get('/api/v2/surge_alert/', filters).json() + return self.client.get("/api/v2/surge_alert/", filters).json() - response = _fetch(dict({ - 'status': SurgeAlertStatus.OPEN - })) + response = _fetch(dict({"status": SurgeAlertStatus.OPEN})) - self.assertEqual(response['count'], 1) - self.assertEqual(response['results'][0]['status'], SurgeAlertStatus.OPEN) + self.assertEqual(response["count"], 1) + self.assertEqual(response["results"][0]["status"], SurgeAlertStatus.OPEN) - response = _fetch(dict({ - 'status': SurgeAlertStatus.CLOSED - })) - self.assertEqual(response['count'], 1) - self.assertEqual(response['results'][0]['status'], SurgeAlertStatus.CLOSED) + response = _fetch(dict({"status": SurgeAlertStatus.CLOSED})) + self.assertEqual(response["count"], 1) + self.assertEqual(response["results"][0]["status"], SurgeAlertStatus.CLOSED) - response = _fetch(dict({ - 'status': SurgeAlertStatus.STOOD_DOWN - })) - self.assertEqual(response['count'], 1) - self.assertEqual(response['results'][0]['status'], SurgeAlertStatus.STOOD_DOWN) + response = _fetch(dict({"status": SurgeAlertStatus.STOOD_DOWN})) + self.assertEqual(response["count"], 1) + self.assertEqual(response["results"][0]["status"], SurgeAlertStatus.STOOD_DOWN) class SurgeAlertTestCase(APITestCase): def test_update_alert_status_command(self): region_1, region_2 = RegionFactory.create_batch(2) - country_1 = CountryFactory.create(iso3='NPP', region=region_1) - country_2 = CountryFactory.create(iso3='CTT', region=region_2) + country_1 = CountryFactory.create(iso3="NPP", region=region_1) + country_2 = CountryFactory.create(iso3="CTT", region=region_2) - molnix_tag_1 = MolnixTagFactory.create(name='OP-6700') - molnix_tag_2 = MolnixTagFactory.create(name='L-FRA') - molnix_tag_3 = MolnixTagFactory.create(name='AMER') + molnix_tag_1 = MolnixTagFactory.create(name="OP-6700") + molnix_tag_2 = MolnixTagFactory.create(name="L-FRA") + molnix_tag_3 = MolnixTagFactory.create(name="AMER") alert1 = SurgeAlertFactory.create( - message='CEA Coordinator, Floods, Atlantis', + message="CEA Coordinator, Floods, Atlantis", country=country_1, molnix_tags=[molnix_tag_1, molnix_tag_2], opens=timezone.now() - timedelta(days=2), - closes=timezone.now() + timedelta(seconds=5) + closes=timezone.now() + timedelta(seconds=5), ) alert2 = SurgeAlertFactory.create( - message='WASH Coordinator, Earthquake, Neptunus', + message="WASH Coordinator, Earthquake, Neptunus", country=country_2, molnix_tags=[molnix_tag_1, molnix_tag_3], opens=timezone.now() - timedelta(days=2), - closes=timezone.now() - timedelta(days=1) + closes=timezone.now() - timedelta(days=1), ) self.assertEqual(alert1.status, SurgeAlertStatus.OPEN) self.assertEqual(alert2.status, SurgeAlertStatus.CLOSED) - with patch('django.utils.timezone.now') as mock_now: + with patch("django.utils.timezone.now") as mock_now: mock_now.return_value = datetime.now() + timedelta(days=1) - call_command('update_surge_alert_status') + call_command("update_surge_alert_status") alert1.refresh_from_db() alert2.refresh_from_db() diff --git a/notifications/translation.py b/notifications/translation.py index 48153b8b2..b62ecb277 100644 --- a/notifications/translation.py +++ b/notifications/translation.py @@ -1,9 +1,8 @@ -from modeltranslation.translator import register, TranslationOptions -from .models import ( - SurgeAlert, -) +from modeltranslation.translator import TranslationOptions, register + +from .models import SurgeAlert @register(SurgeAlert) class SurgeAlertTO(TranslationOptions): - fields = ('operation', 'message') + fields = ("operation", "message") diff --git a/per/admin.py b/per/admin.py index e9ae06b39..a7e25ee2f 100644 --- a/per/admin.py +++ b/per/admin.py @@ -1,13 +1,15 @@ import csv import time from functools import lru_cache + from django.contrib import admin -from lang.admin import TranslationAdmin, TranslationInlineModelAdmin +from django.http import HttpResponse +from reversion_compare.admin import CompareVersionAdmin + import per.models as models from api.models import Appeal -from per.admin_classes import RegionRestrictedAdmin, GotoNextModelAdmin -from reversion_compare.admin import CompareVersionAdmin -from django.http import HttpResponse +from lang.admin import TranslationAdmin, TranslationInlineModelAdmin +from per.admin_classes import GotoNextModelAdmin, RegionRestrictedAdmin class FormDataInline(admin.TabularInline, TranslationInlineModelAdmin): @@ -63,10 +65,7 @@ def area_number(self, obj): def get_queryset(self, request): return ( - super() - .get_queryset(request) - .order_by("area__area_num", "component_num", "component_letter") - .select_related("area") + super().get_queryset(request).order_by("area__area_num", "component_num", "component_letter").select_related("area") ) @@ -181,23 +180,23 @@ class FormQuestionGroupAdmin(TranslationAdmin): class OpsLearningAdmin(GotoNextModelAdmin): ordering = ("-created_at",) - ls = ("organization", "organization_validated", - "sector", "sector_validated", - "per_component", "per_component_validated") + ls = ("organization", "organization_validated", "sector", "sector_validated", "per_component", "per_component_validated") list_filter = ("is_validated", "appeal_code__atype") + ls autocomplete_fields = ("appeal_code",) + ls search_fields = ("learning", "learning_validated") list_display = ("learning", "appeal_code", "is_validated", "modified_at") change_form_template = "admin/opslearning_change_form.html" - actions = ['export_selected_records'] + actions = ["export_selected_records"] def get_fields(self, request, obj=None): if obj and obj.is_validated: - if obj.learning_validated is None \ - and obj.type_validated == models.LearningType.LESSON_LEARNED.value \ - and obj.organization_validated.count() == 0 \ - and obj.sector_validated.count() == 0 \ - and obj.per_component_validated.count() == 0: + if ( + obj.learning_validated is None + and obj.type_validated == models.LearningType.LESSON_LEARNED.value + and obj.organization_validated.count() == 0 + and obj.sector_validated.count() == 0 + and obj.per_component_validated.count() == 0 + ): obj.learning_validated = obj.learning obj.type_validated = obj.type @@ -205,31 +204,26 @@ def get_fields(self, request, obj=None): obj.sector_validated.add(*[x[0] for x in obj.sector.values_list()]) obj.per_component_validated.add(*[x[0] for x in obj.per_component.values_list()]) return ( - 'learning_validated', - 'appeal_code', - 'appeal_document_id', - 'type_validated', - 'organization_validated', - 'sector_validated', - 'per_component_validated') + "learning_validated", + "appeal_code", + "appeal_document_id", + "type_validated", + "organization_validated", + "sector_validated", + "per_component_validated", + ) elif obj: return ( - 'learning', - 'appeal_code', - 'appeal_document_id', - 'type', - 'organization', - 'sector', - 'per_component', - 'is_validated') - return ( - 'learning', - 'appeal_code', - 'appeal_document_id', - 'type', - 'organization', - 'sector', - 'per_component') + "learning", + "appeal_code", + "appeal_document_id", + "type", + "organization", + "sector", + "per_component", + "is_validated", + ) + return ("learning", "appeal_code", "appeal_document_id", "type", "organization", "sector", "per_component") def export_selected_records(self, request, queryset): """ @@ -260,21 +254,30 @@ def break_to_rows(many2many, many2many_validated, is_validated, idx): return [str(x[idx]) for x in many2many_validated.values_list()] elif many2many.values_list(): return [str(x[idx]) for x in many2many.values_list()] - return [''] + return [""] timestr = time.strftime("%Y%m%d-%H%M%S") - finding = [''] + [t.label for t in models.LearningType] + finding = [""] + [t.label for t in models.LearningType] - response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = 'attachment; filename=OpsLearning_export_{}.csv'.format( - timestr) + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = "attachment; filename=OpsLearning_export_{}.csv".format(timestr) writer = csv.writer(response, quoting=csv.QUOTE_NONNUMERIC) writer.writerow( [ - 'id', 'appeal_code', 'learning', 'finding', 'sector', 'component', - 'organization', 'country_name', 'region_name', 'dtype_name', 'appeal_year', - 'appeal_num_beneficiaries', 'modified_at' + "id", + "appeal_code", + "learning", + "finding", + "sector", + "component", + "organization", + "country_name", + "region_name", + "dtype_name", + "appeal_year", + "appeal_num_beneficiaries", + "modified_at", ] ) @@ -290,14 +293,12 @@ def break_to_rows(many2many, many2many_validated, is_validated, idx): for sect in break_to_rows(opsl.sector, opsl.sector_validated, v, 1): for pcom in break_to_rows(opsl.per_component, opsl.per_component_validated, v, 2): - writer.writerow([ - opsl.id, code, lrng, find, sect, pcom, - orgn, ctry, regn, dtyp, year, benf, modf]) + writer.writerow([opsl.id, code, lrng, find, sect, pcom, orgn, ctry, regn, dtyp, year, benf, modf]) print("Cache information of Appeal queries:\n", get_appeal_details.cache_info()) return response - export_selected_records.short_description = 'Export selected Ops Learning records to CSV' + export_selected_records.short_description = "Export selected Ops Learning records to CSV" admin.site.register(models.Form, FormAdmin) diff --git a/per/admin_classes.py b/per/admin_classes.py index eaec3f286..599aea900 100644 --- a/per/admin_classes.py +++ b/per/admin_classes.py @@ -89,7 +89,7 @@ def get_next_instance_pk(self, request, current): Returns the primary key of the next object in the query (considering filters and ordering). Returns None if the object is not in the queryset. """ - querystring = request.GET.get('_changelist_filters') + querystring = request.GET.get("_changelist_filters") if querystring: # Alters the HttpRequest object to make it function as a list request original_get = request.GET @@ -99,7 +99,9 @@ def get_next_instance_pk(self, request, current): ChangeList = self.get_changelist(request) list_display = self.get_list_display(request) changelist = ChangeList( - request, self.model, list_display, + request, + self.model, + list_display, self.get_list_display_links(request, list_display), self.get_list_filter(request), self.date_hierarchy, @@ -109,7 +111,8 @@ def get_next_instance_pk(self, request, current): self.list_max_show_all, self.list_editable, self, - self.sortable_by) # New in Django 2.0 + self.sortable_by, + ) # New in Django 2.0 queryset = changelist.get_queryset(request) finally: request.GET = original_get @@ -117,7 +120,7 @@ def get_next_instance_pk(self, request, current): queryset = self.get_queryset(request) # Try to find pk in this list: - iterator = queryset.values_list('pk', flat=True).iterator() + iterator = queryset.values_list("pk", flat=True).iterator() try: while next(iterator) != current.pk: continue @@ -129,21 +132,21 @@ def response_change(self, request, obj): """Determines the HttpResponse for the change_view stage.""" app_label = obj._meta.app_label model_name = obj._meta.model_name - if '_save_next' in request.POST: + if "_save_next" in request.POST: next_pk = self.get_next_instance_pk(request, obj) if next_pk: - response = redirect(f'admin:{app_label}_{model_name}_change', next_pk) + response = redirect(f"admin:{app_label}_{model_name}_change", next_pk) qs = request.GET.urlencode() # keeps _changelist_filters else: # Last item (or no longer in list) - go back to list in the same position - response = redirect(f'admin:{app_label}_{model_name}_changelist') - qs = request.GET.get('_changelist_filters') + response = redirect(f"admin:{app_label}_{model_name}_changelist") + qs = request.GET.get("_changelist_filters") if qs: - response['Location'] += '?' + qs + response["Location"] += "?" + qs return response return super().response_change(request, obj) # stackoverflow.com/questions/49560378/cannot-hide-save-and-add-another-button-in-django-admin - def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None): - context.update({'show_save_and_next': True}) + def render_change_form(self, request, context, add=False, change=False, form_url="", obj=None): + context.update({"show_save_and_next": True}) return super().render_change_form(request, context, add, change, form_url, obj) diff --git a/per/apps.py b/per/apps.py index 428f19bf5..02728a6a2 100644 --- a/per/apps.py +++ b/per/apps.py @@ -1,5 +1,5 @@ -from django.utils.translation import gettext_lazy as _ from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class PerConfig(AppConfig): diff --git a/per/custom_renderers.py b/per/custom_renderers.py index 1dbca4ce3..53b828147 100644 --- a/per/custom_renderers.py +++ b/per/custom_renderers.py @@ -1,7 +1,9 @@ -from rest_framework_csv.renderers import PaginatedCSVRenderer +from collections import OrderedDict + from rest_framework.utils.serializer_helpers import ReturnDict +from rest_framework_csv.renderers import PaginatedCSVRenderer + from main.settings import SEP -from collections import OrderedDict class NarrowCSVRenderer(PaginatedCSVRenderer): @@ -23,16 +25,16 @@ def render(self, data, *args, **kwargs): data = data.get(self.results_field, []) data2 = [] for i, d in enumerate(data): - for orgn in d['organization'].split(SEP): - for sect in d['sector'].split(SEP): - for pcom in d['per_component'].split(SEP): + for orgn in d["organization"].split(SEP): + for sect in d["sector"].split(SEP): + for pcom in d["per_component"].split(SEP): row = OrderedDict() for k, v in d.items(): - if k == 'organization': + if k == "organization": row[k] = orgn - elif k == 'sector': + elif k == "sector": row[k] = sect - elif k == 'per_component': + elif k == "per_component": row[k] = pcom else: row[k] = v diff --git a/per/drf_views.py b/per/drf_views.py index d93a16149..b736e9eba 100644 --- a/per/drf_views.py +++ b/per/drf_views.py @@ -1,97 +1,92 @@ -from rest_framework.settings import api_settings from datetime import datetime + import pytz -from rest_framework.authentication import TokenAuthentication -from rest_framework.permissions import IsAuthenticated -from rest_framework import ( - viewsets, - views, - response, - permissions, - mixins, - status as drf_status, -) -from rest_framework.decorators import action -from django_filters import rest_framework as filters -from django.db.models import Q from django.conf import settings +from django.db.models import Prefetch, Q +from django.http import HttpResponse from django.shortcuts import get_object_or_404 +from django_filters import rest_framework as filters +from django_filters.widgets import CSVWidget from drf_spectacular.utils import extend_schema -from django.db.models import Prefetch +from openpyxl import Workbook +from rest_framework import mixins, permissions, response +from rest_framework import status as drf_status +from rest_framework import views, viewsets +from rest_framework.authentication import TokenAuthentication +from rest_framework.decorators import action +from rest_framework.permissions import IsAuthenticated +from rest_framework.settings import api_settings -from main.utils import SpreadSheetContentNegotiation -from .admin_classes import RegionRestrictedAdmin from api.models import Country from deployments.models import SectorTag +from main.utils import SpreadSheetContentNegotiation +from per.filter_set import ( + PerDocumentFilter, + PerOverviewFilter, + PerPrioritizationFilter, + PerWorkPlanFilter, +) +from per.permissions import ( + OpsLearningPermission, + PerDocumentUploadPermission, + PerGeneralPermission, + PerPermission, +) +from per.utils import filter_per_queryset_by_user_access + +from .admin_classes import RegionRestrictedAdmin +from .custom_renderers import NarrowCSVRenderer from .models import ( - FormData, + AreaResponse, + AssessmentType, + FormAnswer, FormArea, FormComponent, + FormComponentQuestionAndAnswer, + FormComponentResponse, + FormData, + FormPrioritization, + FormPrioritizationComponent, FormQuestion, - FormAnswer, - OrganizationTypes, + FormQuestionGroup, + NiceDocument, OpsLearning, + OrganizationTypes, Overview, - NiceDocument, - AssessmentType, - PerWorkPlan, - FormPrioritization, PerAssessment, - PerFile, PerComponentRating, PerDocumentUpload, - FormQuestionGroup, - FormPrioritizationComponent, - AreaResponse, - FormComponentResponse, - FormComponentQuestionAndAnswer + PerFile, + PerWorkPlan, ) from .serializers import ( - LatestCountryOverviewSerializer, - ListNiceDocSerializer, - NiceDocumentSerializer, + FormAnswerSerializer, FormAreaSerializer, FormComponentSerializer, - FormQuestionSerializer, - FormAnswerSerializer, - PerOverviewSerializer, - PerWorkPlanSerializer, - PerFormDataSerializer, FormPrioritizationSerializer, - PerProcessSerializer, + FormQuestionGroupSerializer, + FormQuestionSerializer, + LatestCountryOverviewSerializer, + ListNiceDocSerializer, + NiceDocumentSerializer, + OpsLearningCSVSerializer, + OpsLearningInSerializer, + OpsLearningSerializer, PerAssessmentSerializer, + PerDocumentUploadSerializer, + PerFileInputSerializer, PerFileSerializer, - PublicPerCountrySerializer, - UserPerCountrySerializer, + PerFormDataSerializer, PerOptionsSerializer, - PerFileInputSerializer, - PublicPerProcessSerializer, - PublicPerAssessmentSerializer, - OpsLearningSerializer, - OpsLearningInSerializer, - OpsLearningCSVSerializer, + PerOverviewSerializer, + PerProcessSerializer, + PerWorkPlanSerializer, PublicOpsLearningSerializer, - PerDocumentUploadSerializer, - FormQuestionGroupSerializer -) -from per.permissions import ( - PerPermission, - OpsLearningPermission, - PerDocumentUploadPermission, - PerGeneralPermission, -) -from per.filter_set import ( - PerDocumentFilter, - PerOverviewFilter, - PerPrioritizationFilter, - PerWorkPlanFilter, + PublicPerAssessmentSerializer, + PublicPerCountrySerializer, + PublicPerProcessSerializer, + UserPerCountrySerializer, ) -from per.utils import filter_per_queryset_by_user_access -from django_filters.widgets import CSVWidget -from .custom_renderers import NarrowCSVRenderer -from openpyxl import Workbook - -from django.http import HttpResponse class PERDocsFilter(filters.FilterSet): @@ -176,11 +171,7 @@ class FormComponentViewset(viewsets.ReadOnlyModelViewSet): filterset_class = FormComponentFilter def get_queryset(self): - return ( - FormComponent.objects.all() - .order_by("area__area_num", "component_num", "component_letter") - .select_related("area") - ) + return FormComponent.objects.all().order_by("area__area_num", "component_num", "component_letter").select_related("area") class FormQuestionFilter(filters.FilterSet): @@ -208,12 +199,12 @@ def get_queryset(self): class FormQuestionGroupViewset(viewsets.ReadOnlyModelViewSet): - """ PER From Question Group ViewSet""" + """PER From Question Group ViewSet""" serializer_class = FormQuestionGroupSerializer def get_queryset(self): - return FormQuestionGroup.objects.select_related('component') + return FormQuestionGroup.objects.select_related("component") class FormAnswerViewset(viewsets.ReadOnlyModelViewSet): @@ -224,10 +215,7 @@ class FormAnswerViewset(viewsets.ReadOnlyModelViewSet): ordering_fields = "__all__" -class CountryPublicPerStatsViewset( - mixins.ListModelMixin, - viewsets.GenericViewSet -): +class CountryPublicPerStatsViewset(mixins.ListModelMixin, viewsets.GenericViewSet): serializer_class = LatestCountryOverviewSerializer filterset_class = PerOverviewFilter @@ -235,10 +223,7 @@ def get_queryset(self): return Overview.objects.select_related("country", "type_of_assessment").order_by("-created_at") -class CountryPerStatsViewset( - mixins.ListModelMixin, - viewsets.GenericViewSet -): +class CountryPerStatsViewset(mixins.ListModelMixin, viewsets.GenericViewSet): serializer_class = LatestCountryOverviewSerializer filterset_class = PerOverviewFilter permission_classes = [IsAuthenticated] @@ -275,35 +260,35 @@ def get(self, request, pk, format=None): # Overview Columns ws.row_dimensions[1].height = 70 overview_columns = [ - 'National Society', - 'Date of creation (register)', - 'Date of last update (of the whole process)', - 'Date of Orientation', - 'Orientation document uploaded? (Yes/No)', - 'Date of Current PER Assessment', - 'Type of Assessment', - 'Branches involved', - 'Method', - 'EPI Considerations', - 'Urban Considerations', - 'Climate and env considerations', - 'PER process cycle', - 'Work-plan development date planned', - 'Work-plan revision date planned', - 'NS FP name', - 'NS FP email', - 'NS FP phone number', - 'NS Second FP name', - 'NS Second FP email', - 'NS Second FP phone number', - 'Partner FP name', - 'Partner FP email', - 'Partner FP phone number', - 'Partner FP organization', - 'PER facilitator name', - 'PER facilitator email', - 'PER facilitator phone number', - 'PER facilitator other contact' + "National Society", + "Date of creation (register)", + "Date of last update (of the whole process)", + "Date of Orientation", + "Orientation document uploaded? (Yes/No)", + "Date of Current PER Assessment", + "Type of Assessment", + "Branches involved", + "Method", + "EPI Considerations", + "Urban Considerations", + "Climate and env considerations", + "PER process cycle", + "Work-plan development date planned", + "Work-plan revision date planned", + "NS FP name", + "NS FP email", + "NS FP phone number", + "NS Second FP name", + "NS Second FP email", + "NS Second FP phone number", + "Partner FP name", + "Partner FP email", + "Partner FP phone number", + "Partner FP organization", + "PER facilitator name", + "PER facilitator email", + "PER facilitator phone number", + "PER facilitator other contact", ] row_num = 1 @@ -343,7 +328,7 @@ def get(self, request, pk, format=None): per.facilitator_name, per.facilitator_email, per.facilitator_phone, - per.facilitator_contact + per.facilitator_contact, ] for col_num, cell_value in enumerate(overview_rows, 1): @@ -351,21 +336,21 @@ def get(self, request, pk, format=None): cell.value = cell_value # Assessment - ws_assessment = wb.create_sheet('Assessment') + ws_assessment = wb.create_sheet("Assessment") ws_assessment.row_dimensions[1].height = 70 assessment_columns = [ - 'Component number', - 'Component letter', - 'Component description', - 'Benchmark number', - 'Benchmark descprition', - 'Benchmark answer (Yes/No/Partially)', - 'Benchmark notes', - 'Consideration notes epi', - 'Consideration notes urban', - 'Consideration notes climate', - 'Component rating', - 'Component notes' + "Component number", + "Component letter", + "Component description", + "Benchmark number", + "Benchmark descprition", + "Benchmark answer (Yes/No/Partially)", + "Benchmark notes", + "Consideration notes epi", + "Consideration notes urban", + "Consideration notes climate", + "Component rating", + "Component notes", ] assessment_num = 1 for col_num, column_title in enumerate(assessment_columns, 1): @@ -379,21 +364,19 @@ def get(self, request, pk, format=None): .prefetch_related( Prefetch( "area_responses", - queryset=AreaResponse.objects.filter( - perassessment__overview=per.id - ).prefetch_related( + queryset=AreaResponse.objects.filter(perassessment__overview=per.id).prefetch_related( Prefetch( "component_response", - queryset=FormComponentResponse.objects.filter( - arearesponse__perassessment__overview=per.id - ).exclude(component_id=14).prefetch_related( + queryset=FormComponentResponse.objects.filter(arearesponse__perassessment__overview=per.id) + .exclude(component_id=14) + .prefetch_related( Prefetch( "question_responses", queryset=FormComponentQuestionAndAnswer.objects.filter( formcomponentresponse__arearesponse__perassessment__overview=per.id ), ) - ) + ), ) ), ) @@ -408,7 +391,11 @@ def get(self, request, pk, format=None): co.component.component_num, co.component.component_letter, co.component.description_en, - str(question.question.component.component_num) + '.' + str(question.question.question_num) if question.question else None, + ( + str(question.question.component.component_num) + "." + str(question.question.question_num) + if question.question + else None + ), question.question.question if question.question else None, question.answer.text if question.answer else None, question.notes, @@ -416,7 +403,7 @@ def get(self, request, pk, format=None): co.urban_considerations, co.climate_environmental_considerations, co.rating.title if co.rating else None, - co.notes + co.notes, ] assessment_rows.append(assessment_inner) @@ -426,13 +413,13 @@ def get(self, request, pk, format=None): cell.value = cell_value # Prioritization - ws_prioritization = wb.create_sheet('Prioritization') + ws_prioritization = wb.create_sheet("Prioritization") ws_prioritization.row_dimensions[1].height = 70 prioritization_columns = [ - 'Prioritized component number', - 'Prioritized component letter', - 'Prioritized component description', - 'Justification' + "Prioritized component number", + "Prioritized component letter", + "Prioritized component description", + "Justification", ] prioritization_rows = [] prioritization_num = 1 @@ -440,35 +427,37 @@ def get(self, request, pk, format=None): cell = ws_prioritization.cell(row=prioritization_num, column=col_num) cell.value = column_title - prioritization_queryset = FormPrioritizationComponent.objects.filter( - formprioritization__overview=per.id, - ).order_by('component__component_num').exclude(component_id=14) + prioritization_queryset = ( + FormPrioritizationComponent.objects.filter( + formprioritization__overview=per.id, + ) + .order_by("component__component_num") + .exclude(component_id=14) + ) for prioritization in prioritization_queryset: prioritization_inner = [ prioritization.component.component_num, prioritization.component.component_letter, prioritization.component.description, - prioritization.justification_text + prioritization.justification_text, ] - prioritization_rows.append( - prioritization_inner - ) + prioritization_rows.append(prioritization_inner) for row_num, row_data in enumerate(prioritization_rows, 2): for col_num, cell_value in enumerate(row_data, 1): cell = ws_prioritization.cell(row=row_num, column=col_num) cell.value = cell_value # Workplan - ws_workplan = wb.create_sheet('Workplan') + ws_workplan = wb.create_sheet("Workplan") ws_workplan.row_dimensions[1].height = 70 workplan_columns = [ - 'Actions', - 'Number of component related', - 'Letter of component related', - 'Description of component related', - 'Due date', - 'Supported by', - 'Supporting National Society', - 'Status', + "Actions", + "Number of component related", + "Letter of component related", + "Description of component related", + "Due date", + "Supported by", + "Supporting National Society", + "Status", ] workplan_rows = [] workplan_num = 1 @@ -487,7 +476,7 @@ def get(self, request, pk, format=None): workplan.due_date, workplan.get_supported_by_organization_type_display(), workplan.supported_by.name if workplan.supported_by else None, - workplan.get_status_display() + workplan.get_status_display(), ] workplan_rows.append(workplan_inner) if workplan_queryset.exists(): @@ -500,7 +489,7 @@ def get(self, request, pk, format=None): workplan.due_date, workplan.get_supported_by_organization_type_display(), workplan.supported_by.name if workplan.supported_by else None, - workplan.get_status_display() + workplan.get_status_display(), ] workplan_rows.append(workplan_inner) for row_num, row_data in enumerate(workplan_rows, 2): @@ -656,9 +645,7 @@ class PerAggregatedViewSet(viewsets.ReadOnlyModelViewSet): def get_queryset(self): queryset = Overview.objects.filter( - id__in=Overview.objects.order_by( - "country_id", - "-assessment_number").distinct("country_id").values("id") + id__in=Overview.objects.order_by("country_id", "-assessment_number").distinct("country_id").values("id") ) return self.get_filtered_queryset(self.request, queryset, dispatch=0) @@ -718,6 +705,7 @@ class OpsLearningViewset(viewsets.ModelViewSet): """ A simple ViewSet for viewing and editing OpsLearning records. """ + queryset = OpsLearning.objects.all() permission_classes = [OpsLearningPermission] filterset_class = OpsLearningFilter @@ -729,7 +717,7 @@ class OpsLearningViewset(viewsets.ModelViewSet): "appeal_code__name_en", "appeal_code__name_es", "appeal_code__name_fr", - "appeal_code__name_ar" + "appeal_code__name_ar", ) def get_renderers(self): @@ -741,12 +729,20 @@ def get_renderers(self): def get_queryset(self): qs = super().get_queryset() if OpsLearning.is_user_admin(self.request.user): - return qs.select_related("appeal_code",).prefetch_related( - "sector", "organization", "per_component", "sector_validated", - "organization_validated", "per_component_validated") - return qs.filter(is_validated=True).select_related("appeal_code",).prefetch_related( - "sector", "organization", "per_component", "sector_validated", - "organization_validated", "per_component_validated") + return qs.select_related( + "appeal_code", + ).prefetch_related( + "sector", "organization", "per_component", "sector_validated", "organization_validated", "per_component_validated" + ) + return ( + qs.filter(is_validated=True) + .select_related( + "appeal_code", + ) + .prefetch_related( + "sector", "organization", "per_component", "sector_validated", "organization_validated", "per_component_validated" + ) + ) def get_serializer_class(self): if self.request.method == "GET": @@ -763,20 +759,40 @@ def get_renderer_context(self): # Force the order from the serializer. Otherwise redundant literal list original = [ - "id", "appeal_code.code", "appeal_code.name", - "learning", "finding", "sector", "per_component", "organization", - "appeal_code.country", "appeal_code.country_name", - "appeal_code.region", "appeal_code.region_name", - "appeal_code.dtype", "appeal_code.start_date", - "appeal_code.num_beneficiaries", "modified_at" + "id", + "appeal_code.code", + "appeal_code.name", + "learning", + "finding", + "sector", + "per_component", + "organization", + "appeal_code.country", + "appeal_code.country_name", + "appeal_code.region", + "appeal_code.region_name", + "appeal_code.dtype", + "appeal_code.start_date", + "appeal_code.num_beneficiaries", + "modified_at", ] displayed = [ - "id", "appeal_code", "appeal_name", - "learning", "finding", "sector", "component", "organization", - "country_id", "country_name", - "region_id", "region_name", - "dtype_name", "appeal_year", - "appeal_num_beneficiaries", "modified_at" + "id", + "appeal_code", + "appeal_name", + "learning", + "finding", + "sector", + "component", + "organization", + "country_id", + "country_name", + "region_id", + "region_name", + "dtype_name", + "appeal_year", + "appeal_num_beneficiaries", + "modified_at", ] context["header"] = original diff --git a/per/factories.py b/per/factories.py index 752040708..049ce0ed6 100644 --- a/per/factories.py +++ b/per/factories.py @@ -1,19 +1,20 @@ -import factory import datetime + +import factory from factory import fuzzy from per.models import ( - Overview, - PerWorkPlan, - PerWorkPlanComponent, - FormArea, - FormComponent, AssessmentType, - FormAnswer, - FormQuestion, Form, + FormAnswer, + FormArea, + FormComponent, FormData, FormPrioritization, + FormQuestion, + Overview, + PerWorkPlan, + PerWorkPlanComponent, ) diff --git a/per/filter_set.py b/per/filter_set.py index d59d864f4..8b3c33608 100644 --- a/per/filter_set.py +++ b/per/filter_set.py @@ -1,13 +1,13 @@ import django_filters as filters +from api.models import Country from per.models import ( - Overview, + Form, FormPrioritization, + Overview, PerDocumentUpload, PerWorkPlan, - Form, ) -from api.models import Country class PerOverviewFilter(filters.FilterSet): diff --git a/per/management/commands/add_partially_answers.py b/per/management/commands/add_partially_answers.py index f29d2c883..7d97e2ad8 100644 --- a/per/management/commands/add_partially_answers.py +++ b/per/management/commands/add_partially_answers.py @@ -1,6 +1,6 @@ from django.core.management.base import BaseCommand -from per.models import FormQuestion, FormAnswer +from per.models import FormAnswer, FormQuestion class Command(BaseCommand): diff --git a/per/migrations/0001_initial.py b/per/migrations/0001_initial.py index 3406b7cd9..fdff0ac44 100644 --- a/per/migrations/0001_initial.py +++ b/per/migrations/0001_initial.py @@ -1,7 +1,8 @@ # Generated by Django 2.0.12 on 2019-04-13 14:41 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + import per.models @@ -9,40 +10,39 @@ class Migration(migrations.Migration): initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='Form', + name="Form", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.CharField(max_length=10)), - ('name', models.CharField(max_length=100)), - ('language', models.IntegerField(choices=per.models.Language.choices, default=0)), - ('user', models.CharField(blank=True, max_length=100, null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('finalized', models.BooleanField(default=False)), - ('ip_address', models.GenericIPAddressField(default='192.168.0.1')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("code", models.CharField(max_length=10)), + ("name", models.CharField(max_length=100)), + ("language", models.IntegerField(choices=per.models.Language.choices, default=0)), + ("user", models.CharField(blank=True, max_length=100, null=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ("finalized", models.BooleanField(default=False)), + ("ip_address", models.GenericIPAddressField(default="192.168.0.1")), ], options={ - 'ordering': ('code', 'name', 'language', 'created_at'), + "ordering": ("code", "name", "language", "created_at"), }, ), migrations.CreateModel( - name='FormData', + name="FormData", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('question_id', models.CharField(max_length=10)), - ('selected_option', models.IntegerField(choices=per.models.Status.choices, default=0)), - ('notes', models.TextField()), - ('form', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='per.Form')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("question_id", models.CharField(max_length=10)), + ("selected_option", models.IntegerField(choices=per.models.Status.choices, default=0)), + ("notes", models.TextField()), + ("form", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="per.Form")), ], options={ - 'verbose_name': 'Form Data', - 'verbose_name_plural': 'Form Data', - 'ordering': ('form', 'question_id'), + "verbose_name": "Form Data", + "verbose_name_plural": "Form Data", + "ordering": ("form", "question_id"), }, ), ] diff --git a/per/migrations/0002_form_ns.py b/per/migrations/0002_form_ns.py index d79cdce6d..54a5b4da8 100644 --- a/per/migrations/0002_form_ns.py +++ b/per/migrations/0002_form_ns.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0001_initial'), + ("per", "0001_initial"), ] operations = [ migrations.AddField( - model_name='form', - name='ns', + model_name="form", + name="ns", field=models.CharField(blank=True, max_length=100, null=True), ), ] diff --git a/per/migrations/0003_auto_20190416_1021.py b/per/migrations/0003_auto_20190416_1021.py index 8990b7210..ed644eb1b 100644 --- a/per/migrations/0003_auto_20190416_1021.py +++ b/per/migrations/0003_auto_20190416_1021.py @@ -1,45 +1,46 @@ # Generated by Django 2.0.12 on 2019-04-16 10:21 -from django.db import migrations, models -import django.utils.timezone import uuid +import django.utils.timezone +from django.db import migrations, models + class Migration(migrations.Migration): dependencies = [ - ('per', '0002_form_ns'), + ("per", "0002_form_ns"), ] operations = [ migrations.AddField( - model_name='form', - name='comment', + model_name="form", + name="comment", field=models.TextField(blank=True, null=True), ), migrations.AddField( - model_name='form', - name='ended_at', + model_name="form", + name="ended_at", field=models.DateTimeField(default=django.utils.timezone.now), ), migrations.AddField( - model_name='form', - name='started_at', + model_name="form", + name="started_at", field=models.DateTimeField(default=django.utils.timezone.now), ), migrations.AddField( - model_name='form', - name='submitted_at', + model_name="form", + name="submitted_at", field=models.DateTimeField(default=django.utils.timezone.now), ), migrations.AddField( - model_name='form', - name='unique_id', + model_name="form", + name="unique_id", field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True), ), migrations.AddField( - model_name='form', - name='validated', + model_name="form", + name="validated", field=models.BooleanField(default=False), ), ] diff --git a/per/migrations/0004_auto_20190520_1436.py b/per/migrations/0004_auto_20190520_1436.py index 19bc182e8..60fb02493 100644 --- a/per/migrations/0004_auto_20190520_1436.py +++ b/per/migrations/0004_auto_20190520_1436.py @@ -1,26 +1,28 @@ # Generated by Django 2.0.12 on 2019-05-20 14:36 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('api', '0017_auto_20190424_1508'), - ('per', '0003_auto_20190416_1021'), + ("api", "0017_auto_20190424_1508"), + ("per", "0003_auto_20190416_1021"), ] operations = [ migrations.AddField( - model_name='form', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country'), + model_name="form", + name="country", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), ), migrations.AlterField( - model_name='form', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + model_name="form", + name="user", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL + ), ), ] diff --git a/per/migrations/0005_auto_20190603_1703.py b/per/migrations/0005_auto_20190603_1703.py index 128067365..4b53accfc 100644 --- a/per/migrations/0005_auto_20190603_1703.py +++ b/per/migrations/0005_auto_20190603_1703.py @@ -6,12 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0004_auto_20190520_1436'), + ("per", "0004_auto_20190520_1436"), ] operations = [ migrations.AlterModelOptions( - name='form', - options={'ordering': ('code', 'name', 'language', 'created_at'), 'verbose_name': 'Form', 'verbose_name_plural': 'Forms'}, + name="form", + options={ + "ordering": ("code", "name", "language", "created_at"), + "verbose_name": "Form", + "verbose_name_plural": "Forms", + }, ), ] diff --git a/per/migrations/0006_draft.py b/per/migrations/0006_draft.py index 1eaa1e363..68292468f 100644 --- a/per/migrations/0006_draft.py +++ b/per/migrations/0006_draft.py @@ -1,31 +1,36 @@ # Generated by Django 2.0.12 on 2019-06-11 12:50 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('per', '0005_auto_20190603_1703'), + ("per", "0005_auto_20190603_1703"), ] operations = [ migrations.CreateModel( - name='Draft', + name="Draft", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.CharField(max_length=10)), - ('data', models.TextField(blank=True, null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("code", models.CharField(max_length=10)), + ("data", models.TextField(blank=True, null=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ( + "user", + models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL + ), + ), ], options={ - 'verbose_name': 'Draft Form', - 'verbose_name_plural': 'Draft Forms', - 'ordering': ('code', 'created_at'), + "verbose_name": "Draft Form", + "verbose_name_plural": "Draft Forms", + "ordering": ("code", "created_at"), }, ), ] diff --git a/per/migrations/0007_nsphase.py b/per/migrations/0007_nsphase.py index 68892d8d2..81ecb1be1 100644 --- a/per/migrations/0007_nsphase.py +++ b/per/migrations/0007_nsphase.py @@ -1,30 +1,34 @@ # Generated by Django 2.0.12 on 2019-07-01 11:32 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + import per.models class Migration(migrations.Migration): dependencies = [ - ('api', '0019_auto_20190626_1420'), - ('per', '0006_draft'), + ("api", "0019_auto_20190626_1420"), + ("per", "0006_draft"), ] operations = [ migrations.CreateModel( - name='NSPhase', + name="NSPhase", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('phase', models.IntegerField(default=0, choices=per.models.ProcessPhase.choices)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('country', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("phase", models.IntegerField(default=0, choices=per.models.ProcessPhase.choices)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "country", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), + ), ], options={ - 'verbose_name': 'NS PER Process Phase', - 'verbose_name_plural': 'NS-es PER Process Phase', - 'ordering': ('updated_at', 'country'), + "verbose_name": "NS PER Process Phase", + "verbose_name_plural": "NS-es PER Process Phase", + "ordering": ("updated_at", "country"), }, ), ] diff --git a/per/migrations/0008_erureadiness.py b/per/migrations/0008_erureadiness.py index 3be592332..6856e36e0 100644 --- a/per/migrations/0008_erureadiness.py +++ b/per/migrations/0008_erureadiness.py @@ -1,32 +1,36 @@ # Generated by Django 2.0.12 on 2019-07-08 16:26 -import deployments.models -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + +import deployments.models class Migration(migrations.Migration): dependencies = [ - ('api', '0020_auto_20190703_0614'), - ('per', '0007_nsphase'), + ("api", "0020_auto_20190703_0614"), + ("per", "0007_nsphase"), ] operations = [ migrations.CreateModel( - name='ERUReadiness', + name="ERUReadiness", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('ERU_type', models.IntegerField(default=0, choices=deployments.models.ERUType.choices)), - ('is_personnel', models.BooleanField(default=False)), - ('is_equipment', models.BooleanField(default=False)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('national_society', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("ERU_type", models.IntegerField(default=0, choices=deployments.models.ERUType.choices)), + ("is_personnel", models.BooleanField(default=False)), + ("is_equipment", models.BooleanField(default=False)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "national_society", + models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), + ), ], options={ - 'verbose_name': 'ERU Readiness', - 'verbose_name_plural': 'NS-es ERU Readiness', - 'ordering': ('updated_at', 'national_society'), + "verbose_name": "ERU Readiness", + "verbose_name_plural": "NS-es ERU Readiness", + "ordering": ("updated_at", "national_society"), }, ), ] diff --git a/per/migrations/0009_auto_20190709_0835.py b/per/migrations/0009_auto_20190709_0835.py index ced17a346..2e0f76bbc 100644 --- a/per/migrations/0009_auto_20190709_0835.py +++ b/per/migrations/0009_auto_20190709_0835.py @@ -1,19 +1,19 @@ # Generated by Django 2.0.12 on 2019-07-09 08:35 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0008_erureadiness'), + ("per", "0008_erureadiness"), ] operations = [ migrations.AlterField( - model_name='nsphase', - name='country', - field=models.OneToOneField(default=1, on_delete=django.db.models.deletion.CASCADE, to='api.Country'), + model_name="nsphase", + name="country", + field=models.OneToOneField(default=1, on_delete=django.db.models.deletion.CASCADE, to="api.Country"), ), ] diff --git a/per/migrations/0010_workplan.py b/per/migrations/0010_workplan.py index cf17f2f49..a0f3d0b68 100644 --- a/per/migrations/0010_workplan.py +++ b/per/migrations/0010_workplan.py @@ -1,34 +1,35 @@ # Generated by Django 2.0.12 on 2019-07-10 15:55 from django.db import migrations, models + import per.models class Migration(migrations.Migration): dependencies = [ - ('per', '0009_auto_20190709_0835'), + ("per", "0009_auto_20190709_0835"), ] operations = [ migrations.CreateModel( - name='WorkPlan', + name="WorkPlan", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('prioritization', models.IntegerField(choices=per.models.PriorityValue.choices, default=0)), - ('components', models.CharField(max_length=900)), - ('benchmark', models.CharField(max_length=900)), - ('actions', models.CharField(max_length=900)), - ('comments', models.CharField(max_length=900)), - ('timeline', models.DateTimeField(auto_now=True)), - ('status', models.IntegerField(choices=per.models.WorkPlanStatus.choices, default=0)), - ('support_required', models.BooleanField(default=False)), - ('focal_point', models.CharField(max_length=90)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("prioritization", models.IntegerField(choices=per.models.PriorityValue.choices, default=0)), + ("components", models.CharField(max_length=900)), + ("benchmark", models.CharField(max_length=900)), + ("actions", models.CharField(max_length=900)), + ("comments", models.CharField(max_length=900)), + ("timeline", models.DateTimeField(auto_now=True)), + ("status", models.IntegerField(choices=per.models.WorkPlanStatus.choices, default=0)), + ("support_required", models.BooleanField(default=False)), + ("focal_point", models.CharField(max_length=90)), ], options={ - 'verbose_name': 'PER Work Plan', - 'verbose_name_plural': 'PER Work Plans', - 'ordering': ('prioritization',), + "verbose_name": "PER Work Plan", + "verbose_name_plural": "PER Work Plans", + "ordering": ("prioritization",), }, ), ] diff --git a/per/migrations/0011_auto_20190711_0757.py b/per/migrations/0011_auto_20190711_0757.py index affda6d08..940f958e5 100644 --- a/per/migrations/0011_auto_20190711_0757.py +++ b/per/migrations/0011_auto_20190711_0757.py @@ -1,64 +1,68 @@ # Generated by Django 2.0.12 on 2019-07-11 07:57 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0020_auto_20190703_0614'), - ('per', '0010_workplan'), + ("api", "0020_auto_20190703_0614"), + ("per", "0010_workplan"), ] operations = [ migrations.AlterModelOptions( - name='workplan', - options={'ordering': ('prioritization', 'country'), 'verbose_name': 'PER Work Plan', 'verbose_name_plural': 'PER Work Plans'}, + name="workplan", + options={ + "ordering": ("prioritization", "country"), + "verbose_name": "PER Work Plan", + "verbose_name_plural": "PER Work Plans", + }, ), migrations.AddField( - model_name='workplan', - name='code', + model_name="workplan", + name="code", field=models.CharField(blank=True, max_length=10, null=True), ), migrations.AddField( - model_name='workplan', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country'), + model_name="workplan", + name="country", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), ), migrations.AddField( - model_name='workplan', - name='form', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.Form'), + model_name="workplan", + name="form", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="per.Form"), ), migrations.AddField( - model_name='workplan', - name='question_id', + model_name="workplan", + name="question_id", field=models.CharField(blank=True, max_length=10, null=True), ), migrations.AlterField( - model_name='workplan', - name='actions', + model_name="workplan", + name="actions", field=models.CharField(blank=True, max_length=900, null=True), ), migrations.AlterField( - model_name='workplan', - name='benchmark', + model_name="workplan", + name="benchmark", field=models.CharField(blank=True, max_length=900, null=True), ), migrations.AlterField( - model_name='workplan', - name='comments', + model_name="workplan", + name="comments", field=models.CharField(blank=True, max_length=900, null=True), ), migrations.AlterField( - model_name='workplan', - name='components', + model_name="workplan", + name="components", field=models.CharField(blank=True, max_length=900, null=True), ), migrations.AlterField( - model_name='workplan', - name='focal_point', + model_name="workplan", + name="focal_point", field=models.CharField(blank=True, max_length=90, null=True), ), ] diff --git a/per/migrations/0012_auto_20190711_0859.py b/per/migrations/0012_auto_20190711_0859.py index bbd59ef37..ee98214cb 100644 --- a/per/migrations/0012_auto_20190711_0859.py +++ b/per/migrations/0012_auto_20190711_0859.py @@ -1,31 +1,39 @@ # Generated by Django 2.0.12 on 2019-07-11 08:59 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0011_auto_20190711_0757'), + ("per", "0011_auto_20190711_0757"), ] operations = [ migrations.RemoveField( - model_name='erureadiness', - name='national_society', + model_name="erureadiness", + name="national_society", ), migrations.AlterField( - model_name='workplan', - name='components', - field=models.CharField(blank=True, help_text='Redundant, if the form details are given below', max_length=900, null=True), + model_name="workplan", + name="components", + field=models.CharField( + blank=True, help_text="Redundant, if the form details are given below", max_length=900, null=True + ), ), migrations.AlterField( - model_name='workplan', - name='country', - field=models.ForeignKey(blank=True, help_text='Redundant, if the form is given below', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country'), + model_name="workplan", + name="country", + field=models.ForeignKey( + blank=True, + help_text="Redundant, if the form is given below", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.Country", + ), ), migrations.DeleteModel( - name='ERUReadiness', + name="ERUReadiness", ), ] diff --git a/per/migrations/0013_remove_workplan_form.py b/per/migrations/0013_remove_workplan_form.py index a35fbb495..1c87f6770 100644 --- a/per/migrations/0013_remove_workplan_form.py +++ b/per/migrations/0013_remove_workplan_form.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0012_auto_20190711_0859'), + ("per", "0012_auto_20190711_0859"), ] operations = [ migrations.RemoveField( - model_name='workplan', - name='form', + model_name="workplan", + name="form", ), ] diff --git a/per/migrations/0014_overview.py b/per/migrations/0014_overview.py index d1920b66e..3d1bee79b 100644 --- a/per/migrations/0014_overview.py +++ b/per/migrations/0014_overview.py @@ -1,41 +1,51 @@ # Generated by Django 2.0.12 on 2019-07-11 10:31 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + import per.models class Migration(migrations.Migration): dependencies = [ - ('api', '0020_auto_20190703_0614'), - ('per', '0013_remove_workplan_form'), + ("api", "0020_auto_20190703_0614"), + ("per", "0013_remove_workplan_form"), ] operations = [ migrations.CreateModel( - name='Overview', + name="Overview", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date_of_current_capacity_assessment', models.DateTimeField(auto_now=True)), - ('type_of_capacity_assessment', models.IntegerField(default=0, choices=per.models.CAssessmentType.choices)), - ('branch_involved', models.CharField(blank=True, max_length=90, null=True)), - ('focal_point_name', models.CharField(blank=True, max_length=90, null=True)), - ('focal_point_email', models.CharField(blank=True, max_length=90, null=True)), - ('had_previous_assessment', models.BooleanField(default=False)), - ('focus', models.CharField(blank=True, max_length=90, null=True)), - ('facilitated_by', models.CharField(blank=True, max_length=90, null=True)), - ('facilitator_email', models.CharField(blank=True, max_length=90, null=True)), - ('phone_number', models.CharField(blank=True, max_length=90, null=True)), - ('skype_address', models.CharField(blank=True, max_length=90, null=True)), - ('date_of_mid_term_review', models.DateTimeField(auto_now=True)), - ('approximate_date_next_capacity_assmt', models.DateTimeField(auto_now=True)), - ('country', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='asmt_country', to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("date_of_current_capacity_assessment", models.DateTimeField(auto_now=True)), + ("type_of_capacity_assessment", models.IntegerField(default=0, choices=per.models.CAssessmentType.choices)), + ("branch_involved", models.CharField(blank=True, max_length=90, null=True)), + ("focal_point_name", models.CharField(blank=True, max_length=90, null=True)), + ("focal_point_email", models.CharField(blank=True, max_length=90, null=True)), + ("had_previous_assessment", models.BooleanField(default=False)), + ("focus", models.CharField(blank=True, max_length=90, null=True)), + ("facilitated_by", models.CharField(blank=True, max_length=90, null=True)), + ("facilitator_email", models.CharField(blank=True, max_length=90, null=True)), + ("phone_number", models.CharField(blank=True, max_length=90, null=True)), + ("skype_address", models.CharField(blank=True, max_length=90, null=True)), + ("date_of_mid_term_review", models.DateTimeField(auto_now=True)), + ("approximate_date_next_capacity_assmt", models.DateTimeField(auto_now=True)), + ( + "country", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="asmt_country", + to="api.Country", + ), + ), ], options={ - 'verbose_name': 'PER General Overview', - 'verbose_name_plural': 'PER General Overviews', - 'ordering': ('country',), + "verbose_name": "PER General Overview", + "verbose_name_plural": "PER General Overviews", + "ordering": ("country",), }, ), ] diff --git a/per/migrations/0015_auto_20190711_1236.py b/per/migrations/0015_auto_20190711_1236.py index 744479e34..f234329ce 100644 --- a/per/migrations/0015_auto_20190711_1236.py +++ b/per/migrations/0015_auto_20190711_1236.py @@ -1,36 +1,40 @@ # Generated by Django 2.0.12 on 2019-07-11 12:36 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('per', '0014_overview'), + ("per", "0014_overview"), ] operations = [ migrations.AddField( - model_name='overview', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + model_name="overview", + name="user", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL + ), ), migrations.AddField( - model_name='workplan', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + model_name="workplan", + name="user", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL + ), ), migrations.AlterField( - model_name='workplan', - name='components', + model_name="workplan", + name="components", field=models.CharField(blank=True, max_length=900, null=True), ), migrations.AlterField( - model_name='workplan', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country'), + model_name="workplan", + name="country", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), ), ] diff --git a/per/migrations/0016_auto_20190711_1305.py b/per/migrations/0016_auto_20190711_1305.py index 9017cb49c..a13cd90f1 100644 --- a/per/migrations/0016_auto_20190711_1305.py +++ b/per/migrations/0016_auto_20190711_1305.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0015_auto_20190711_1236'), + ("per", "0015_auto_20190711_1236"), ] operations = [ migrations.AlterField( - model_name='overview', - name='approximate_date_next_capacity_assmt', + model_name="overview", + name="approximate_date_next_capacity_assmt", field=models.DateTimeField(), ), migrations.AlterField( - model_name='overview', - name='date_of_current_capacity_assessment', + model_name="overview", + name="date_of_current_capacity_assessment", field=models.DateTimeField(), ), migrations.AlterField( - model_name='overview', - name='date_of_mid_term_review', + model_name="overview", + name="date_of_mid_term_review", field=models.DateTimeField(), ), migrations.AlterField( - model_name='workplan', - name='timeline', + model_name="workplan", + name="timeline", field=models.DateTimeField(), ), ] diff --git a/per/migrations/0017_nicedocument.py b/per/migrations/0017_nicedocument.py index fbe50ce39..a52a3b99f 100644 --- a/per/migrations/0017_nicedocument.py +++ b/per/migrations/0017_nicedocument.py @@ -1,33 +1,43 @@ # Generated by Django 2.0.12 on 2019-07-15 11:17 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + import per.models class Migration(migrations.Migration): dependencies = [ - ('api', '0020_auto_20190703_0614'), - ('per', '0016_auto_20190711_1305'), + ("api", "0020_auto_20190703_0614"), + ("per", "0016_auto_20190711_1305"), ] operations = [ migrations.CreateModel( - name='NiceDocument', + name="NiceDocument", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('name', models.CharField(max_length=100)), - ('document', models.FileField(blank=True, null=True, upload_to=per.models.nice_document_path)), - ('document_url', models.URLField(blank=True)), - ('visibility', models.IntegerField(default=1, choices=per.models.Visibilities.choices)), - ('country', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='perdoc_country', to='api.Country')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("name", models.CharField(max_length=100)), + ("document", models.FileField(blank=True, null=True, upload_to=per.models.nice_document_path)), + ("document_url", models.URLField(blank=True)), + ("visibility", models.IntegerField(default=1, choices=per.models.Visibilities.choices)), + ( + "country", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="perdoc_country", + to="api.Country", + ), + ), ], options={ - 'verbose_name': 'PER Document', - 'verbose_name_plural': 'PER Documents', - 'ordering': ('visibility', 'country'), + "verbose_name": "PER Document", + "verbose_name_plural": "PER Documents", + "ordering": ("visibility", "country"), }, ), ] diff --git a/per/migrations/0018_draft_country.py b/per/migrations/0018_draft_country.py index f996042c2..95873c522 100644 --- a/per/migrations/0018_draft_country.py +++ b/per/migrations/0018_draft_country.py @@ -1,20 +1,20 @@ # Generated by Django 2.0.12 on 2019-07-16 12:55 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0020_auto_20190703_0614'), - ('per', '0017_nicedocument'), + ("api", "0020_auto_20190703_0614"), + ("per", "0017_nicedocument"), ] operations = [ migrations.AddField( - model_name='draft', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country'), + model_name="draft", + name="country", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country"), ), ] diff --git a/per/migrations/0019_auto_20190716_1422.py b/per/migrations/0019_auto_20190716_1422.py index 83cebbdb6..c59bb1c40 100644 --- a/per/migrations/0019_auto_20190716_1422.py +++ b/per/migrations/0019_auto_20190716_1422.py @@ -1,24 +1,25 @@ # Generated by Django 2.0.12 on 2019-07-16 14:22 from django.db import migrations, models + import per.models class Migration(migrations.Migration): dependencies = [ - ('per', '0018_draft_country'), + ("per", "0018_draft_country"), ] operations = [ migrations.AddField( - model_name='overview', - name='date_of_last_capacity_assessment', + model_name="overview", + name="date_of_last_capacity_assessment", field=models.DateTimeField(blank=True, null=True), ), migrations.AddField( - model_name='overview', - name='type_of_last_capacity_assessment', + model_name="overview", + name="type_of_last_capacity_assessment", field=models.IntegerField(default=0, choices=per.models.CAssessmentType.choices), ), ] diff --git a/per/migrations/0020_auto_20200618_0904.py b/per/migrations/0020_auto_20200618_0904.py index 8eabc44aa..2504fefa8 100644 --- a/per/migrations/0020_auto_20200618_0904.py +++ b/per/migrations/0020_auto_20200618_0904.py @@ -1,323 +1,373 @@ # Generated by Django 2.2.13 on 2020-06-18 09:04 -from django.conf import settings -from django.db import migrations, models +import uuid + import django.db.models.deletion import django.utils.timezone +from django.conf import settings +from django.db import migrations, models + import per.models -import uuid class Migration(migrations.Migration): dependencies = [ - ('per', '0019_auto_20190716_1422'), + ("per", "0019_auto_20190716_1422"), ] operations = [ migrations.AlterField( - model_name='draft', - name='code', - field=models.CharField(max_length=10, verbose_name='code'), + model_name="draft", + name="code", + field=models.CharField(max_length=10, verbose_name="code"), ), migrations.AlterField( - model_name='draft', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country'), + model_name="draft", + name="country", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='draft', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="draft", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='draft', - name='data', - field=models.TextField(blank=True, null=True, verbose_name='data'), + model_name="draft", + name="data", + field=models.TextField(blank=True, null=True, verbose_name="data"), ), migrations.AlterField( - model_name='draft', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="draft", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), migrations.AlterField( - model_name='form', - name='code', - field=models.CharField(max_length=10, verbose_name='code'), + model_name="form", + name="code", + field=models.CharField(max_length=10, verbose_name="code"), ), migrations.AlterField( - model_name='form', - name='comment', - field=models.TextField(blank=True, null=True, verbose_name='comment'), + model_name="form", + name="comment", + field=models.TextField(blank=True, null=True, verbose_name="comment"), ), migrations.AlterField( - model_name='form', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country'), + model_name="form", + name="country", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='form', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="form", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='form', - name='ended_at', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='ended at'), + model_name="form", + name="ended_at", + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name="ended at"), ), migrations.AlterField( - model_name='form', - name='finalized', - field=models.BooleanField(default=False, verbose_name='finalized'), + model_name="form", + name="finalized", + field=models.BooleanField(default=False, verbose_name="finalized"), ), migrations.AlterField( - model_name='form', - name='ip_address', - field=models.GenericIPAddressField(default='192.168.0.1', verbose_name='IP address'), + model_name="form", + name="ip_address", + field=models.GenericIPAddressField(default="192.168.0.1", verbose_name="IP address"), ), migrations.AlterField( - model_name='form', - name='language', - field=models.IntegerField(choices=per.models.Language.choices, default=0, verbose_name='language'), + model_name="form", + name="language", + field=models.IntegerField(choices=per.models.Language.choices, default=0, verbose_name="language"), ), migrations.AlterField( - model_name='form', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="form", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='form', - name='ns', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='NS'), + model_name="form", + name="ns", + field=models.CharField(blank=True, max_length=100, null=True, verbose_name="NS"), ), migrations.AlterField( - model_name='form', - name='started_at', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='started at'), + model_name="form", + name="started_at", + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name="started at"), ), migrations.AlterField( - model_name='form', - name='submitted_at', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='submitted at'), + model_name="form", + name="submitted_at", + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name="submitted at"), ), migrations.AlterField( - model_name='form', - name='unique_id', - field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='unique id'), + model_name="form", + name="unique_id", + field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name="unique id"), ), migrations.AlterField( - model_name='form', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='updated at'), + model_name="form", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="updated at"), ), migrations.AlterField( - model_name='form', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="form", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), migrations.AlterField( - model_name='form', - name='validated', - field=models.BooleanField(default=False, verbose_name='validated'), + model_name="form", + name="validated", + field=models.BooleanField(default=False, verbose_name="validated"), ), migrations.AlterField( - model_name='formdata', - name='form', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='per.Form', verbose_name='form'), + model_name="formdata", + name="form", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="per.Form", verbose_name="form"), ), migrations.AlterField( - model_name='formdata', - name='notes', - field=models.TextField(verbose_name='notes'), + model_name="formdata", + name="notes", + field=models.TextField(verbose_name="notes"), ), migrations.AlterField( - model_name='formdata', - name='question_id', - field=models.CharField(max_length=10, verbose_name='question id'), + model_name="formdata", + name="question_id", + field=models.CharField(max_length=10, verbose_name="question id"), ), migrations.AlterField( - model_name='formdata', - name='selected_option', - field=models.IntegerField(choices=per.models.Status.choices, default=0, verbose_name='selected option'), + model_name="formdata", + name="selected_option", + field=models.IntegerField(choices=per.models.Status.choices, default=0, verbose_name="selected option"), ), migrations.AlterField( - model_name='nicedocument', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='perdoc_country', to='api.Country', verbose_name='country'), + model_name="nicedocument", + name="country", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="perdoc_country", + to="api.Country", + verbose_name="country", + ), ), migrations.AlterField( - model_name='nicedocument', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="nicedocument", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='nicedocument', - name='document', - field=models.FileField(blank=True, null=True, upload_to=per.models.nice_document_path, verbose_name='document'), + model_name="nicedocument", + name="document", + field=models.FileField(blank=True, null=True, upload_to=per.models.nice_document_path, verbose_name="document"), ), migrations.AlterField( - model_name='nicedocument', - name='document_url', - field=models.URLField(blank=True, verbose_name='document url'), + model_name="nicedocument", + name="document_url", + field=models.URLField(blank=True, verbose_name="document url"), ), migrations.AlterField( - model_name='nicedocument', - name='name', - field=models.CharField(max_length=100, verbose_name='name'), + model_name="nicedocument", + name="name", + field=models.CharField(max_length=100, verbose_name="name"), ), migrations.AlterField( - model_name='nicedocument', - name='visibility', - field=models.IntegerField(default=1, choices=per.models.Visibilities.choices, verbose_name='visibility'), + model_name="nicedocument", + name="visibility", + field=models.IntegerField(default=1, choices=per.models.Visibilities.choices, verbose_name="visibility"), ), migrations.AlterField( - model_name='overview', - name='approximate_date_next_capacity_assmt', - field=models.DateTimeField(verbose_name='approximate date next capacity assessment'), + model_name="overview", + name="approximate_date_next_capacity_assmt", + field=models.DateTimeField(verbose_name="approximate date next capacity assessment"), ), migrations.AlterField( - model_name='overview', - name='branch_involved', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='branch involved'), + model_name="overview", + name="branch_involved", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="branch involved"), ), migrations.AlterField( - model_name='overview', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='asmt_country', to='api.Country', verbose_name='country'), + model_name="overview", + name="country", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="asmt_country", + to="api.Country", + verbose_name="country", + ), ), migrations.AlterField( - model_name='overview', - name='date_of_current_capacity_assessment', - field=models.DateTimeField(verbose_name='date of current capacity assessment'), + model_name="overview", + name="date_of_current_capacity_assessment", + field=models.DateTimeField(verbose_name="date of current capacity assessment"), ), migrations.AlterField( - model_name='overview', - name='date_of_last_capacity_assessment', - field=models.DateTimeField(blank=True, null=True, verbose_name='date of last capacity assessment'), + model_name="overview", + name="date_of_last_capacity_assessment", + field=models.DateTimeField(blank=True, null=True, verbose_name="date of last capacity assessment"), ), migrations.AlterField( - model_name='overview', - name='date_of_mid_term_review', - field=models.DateTimeField(verbose_name='date of mid term review'), + model_name="overview", + name="date_of_mid_term_review", + field=models.DateTimeField(verbose_name="date of mid term review"), ), migrations.AlterField( - model_name='overview', - name='facilitated_by', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='facilitated by'), + model_name="overview", + name="facilitated_by", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="facilitated by"), ), migrations.AlterField( - model_name='overview', - name='facilitator_email', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='facilitated email'), + model_name="overview", + name="facilitator_email", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="facilitated email"), ), migrations.AlterField( - model_name='overview', - name='focal_point_email', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='focal point email'), + model_name="overview", + name="focal_point_email", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="focal point email"), ), migrations.AlterField( - model_name='overview', - name='focal_point_name', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='focal point name'), + model_name="overview", + name="focal_point_name", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="focal point name"), ), migrations.AlterField( - model_name='overview', - name='focus', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='focus'), + model_name="overview", + name="focus", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="focus"), ), migrations.AlterField( - model_name='overview', - name='had_previous_assessment', - field=models.BooleanField(default=False, verbose_name='had previous assessment'), + model_name="overview", + name="had_previous_assessment", + field=models.BooleanField(default=False, verbose_name="had previous assessment"), ), migrations.AlterField( - model_name='overview', - name='phone_number', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='phone number'), + model_name="overview", + name="phone_number", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="phone number"), ), migrations.AlterField( - model_name='overview', - name='skype_address', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='skype address'), + model_name="overview", + name="skype_address", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="skype address"), ), migrations.AlterField( - model_name='overview', - name='type_of_capacity_assessment', - field=models.IntegerField(default=0, choices=per.models.CAssessmentType.choices, verbose_name='type of capacity assessment'), + model_name="overview", + name="type_of_capacity_assessment", + field=models.IntegerField( + default=0, choices=per.models.CAssessmentType.choices, verbose_name="type of capacity assessment" + ), ), migrations.AlterField( - model_name='overview', - name='type_of_last_capacity_assessment', - field=models.IntegerField(default=0, choices=per.models.CAssessmentType.choices, verbose_name='type of last capacity assessment'), + model_name="overview", + name="type_of_last_capacity_assessment", + field=models.IntegerField( + default=0, choices=per.models.CAssessmentType.choices, verbose_name="type of last capacity assessment" + ), ), migrations.AlterField( - model_name='overview', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="overview", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), migrations.AlterField( - model_name='workplan', - name='actions', - field=models.CharField(blank=True, max_length=900, null=True, verbose_name='actions'), + model_name="workplan", + name="actions", + field=models.CharField(blank=True, max_length=900, null=True, verbose_name="actions"), ), migrations.AlterField( - model_name='workplan', - name='benchmark', - field=models.CharField(blank=True, max_length=900, null=True, verbose_name='benchmark'), + model_name="workplan", + name="benchmark", + field=models.CharField(blank=True, max_length=900, null=True, verbose_name="benchmark"), ), migrations.AlterField( - model_name='workplan', - name='code', - field=models.CharField(blank=True, max_length=10, null=True, verbose_name='code'), + model_name="workplan", + name="code", + field=models.CharField(blank=True, max_length=10, null=True, verbose_name="code"), ), migrations.AlterField( - model_name='workplan', - name='comments', - field=models.CharField(blank=True, max_length=900, null=True, verbose_name='comments'), + model_name="workplan", + name="comments", + field=models.CharField(blank=True, max_length=900, null=True, verbose_name="comments"), ), migrations.AlterField( - model_name='workplan', - name='components', - field=models.CharField(blank=True, max_length=900, null=True, verbose_name='components'), + model_name="workplan", + name="components", + field=models.CharField(blank=True, max_length=900, null=True, verbose_name="components"), ), migrations.AlterField( - model_name='workplan', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Country', verbose_name='country'), + model_name="workplan", + name="country", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="api.Country", verbose_name="country" + ), ), migrations.AlterField( - model_name='workplan', - name='focal_point', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='focal point'), + model_name="workplan", + name="focal_point", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="focal point"), ), migrations.AlterField( - model_name='workplan', - name='prioritization', - field=models.IntegerField(choices=per.models.PriorityValue.choices, default=0, verbose_name='prioritization'), + model_name="workplan", + name="prioritization", + field=models.IntegerField(choices=per.models.PriorityValue.choices, default=0, verbose_name="prioritization"), ), migrations.AlterField( - model_name='workplan', - name='question_id', - field=models.CharField(blank=True, max_length=10, null=True, verbose_name='question id'), + model_name="workplan", + name="question_id", + field=models.CharField(blank=True, max_length=10, null=True, verbose_name="question id"), ), migrations.AlterField( - model_name='workplan', - name='status', - field=models.IntegerField(choices=per.models.WorkPlanStatus.choices, default=0, verbose_name='status'), + model_name="workplan", + name="status", + field=models.IntegerField(choices=per.models.WorkPlanStatus.choices, default=0, verbose_name="status"), ), migrations.AlterField( - model_name='workplan', - name='support_required', - field=models.BooleanField(default=False, verbose_name='support required'), + model_name="workplan", + name="support_required", + field=models.BooleanField(default=False, verbose_name="support required"), ), migrations.AlterField( - model_name='workplan', - name='timeline', - field=models.DateTimeField(verbose_name='timeline'), + model_name="workplan", + name="timeline", + field=models.DateTimeField(verbose_name="timeline"), ), migrations.AlterField( - model_name='workplan', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="workplan", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), ] diff --git a/per/migrations/0021_auto_20200903_0843.py b/per/migrations/0021_auto_20200903_0843.py index 49f0bdc19..21ee14018 100644 --- a/per/migrations/0021_auto_20200903_0843.py +++ b/per/migrations/0021_auto_20200903_0843.py @@ -1,19 +1,20 @@ # Generated by Django 2.2.13 on 2020-09-03 08:43 from django.db import migrations, models + import per.models class Migration(migrations.Migration): dependencies = [ - ('per', '0020_auto_20200618_0904'), + ("per", "0020_auto_20200618_0904"), ] operations = [ migrations.AlterField( - model_name='nicedocument', - name='document', - field=models.FileField(blank=True, null=True, upload_to=per.models.nice_document_path, verbose_name='document'), + model_name="nicedocument", + name="document", + field=models.FileField(blank=True, null=True, upload_to=per.models.nice_document_path, verbose_name="document"), ), ] diff --git a/per/migrations/0022_auto_20201012_1225.py b/per/migrations/0022_auto_20201012_1225.py index 38e500a24..8ff803149 100644 --- a/per/migrations/0022_auto_20201012_1225.py +++ b/per/migrations/0022_auto_20201012_1225.py @@ -1,143 +1,158 @@ # Generated by Django 2.2.13 on 2020-10-12 12:25 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0021_auto_20200903_0843'), + ("per", "0021_auto_20200903_0843"), ] operations = [ migrations.CreateModel( - name='FormAnswer', + name="FormAnswer", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text', models.CharField(max_length=40, verbose_name='text')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("text", models.CharField(max_length=40, verbose_name="text")), ], ), migrations.CreateModel( - name='FormArea', + name="FormArea", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=250, verbose_name='title')), - ('area_num', models.IntegerField(default=1, verbose_name='area number')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=250, verbose_name="title")), + ("area_num", models.IntegerField(default=1, verbose_name="area number")), ], ), migrations.CreateModel( - name='FormComponent', + name="FormComponent", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=250, verbose_name='title')), - ('component_num', models.IntegerField(default=1, verbose_name='component number')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), - ('area', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='per.FormArea', verbose_name='area')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=250, verbose_name="title")), + ("component_num", models.IntegerField(default=1, verbose_name="component number")), + ("description", models.TextField(blank=True, null=True, verbose_name="description")), + ("area", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="per.FormArea", verbose_name="area")), ], ), migrations.CreateModel( - name='FormQuestion', + name="FormQuestion", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('question', models.CharField(max_length=500, verbose_name='question')), - ('question_num', models.IntegerField(default=1, verbose_name='question number')), - ('answers', models.ManyToManyField(blank=True, to='per.FormAnswer', verbose_name='districts')), - ('component', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='per.FormComponent', verbose_name='component')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("question", models.CharField(max_length=500, verbose_name="question")), + ("question_num", models.IntegerField(default=1, verbose_name="question number")), + ("answers", models.ManyToManyField(blank=True, to="per.FormAnswer", verbose_name="districts")), + ( + "component", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="per.FormComponent", verbose_name="component" + ), + ), ], ), migrations.AlterModelOptions( - name='form', - options={'ordering': ('area', 'created_at'), 'verbose_name': 'Form', 'verbose_name_plural': 'Forms'}, + name="form", + options={"ordering": ("area", "created_at"), "verbose_name": "Form", "verbose_name_plural": "Forms"}, ), migrations.AlterModelOptions( - name='formdata', - options={'ordering': ('form', 'question__question_num'), 'verbose_name': 'Form Data', 'verbose_name_plural': 'Form Data'}, + name="formdata", + options={ + "ordering": ("form", "question__question_num"), + "verbose_name": "Form Data", + "verbose_name_plural": "Form Data", + }, ), migrations.RemoveField( - model_name='form', - name='code', + model_name="form", + name="code", ), migrations.RemoveField( - model_name='form', - name='ended_at', + model_name="form", + name="ended_at", ), migrations.RemoveField( - model_name='form', - name='finalized', + model_name="form", + name="finalized", ), migrations.RemoveField( - model_name='form', - name='ip_address', + model_name="form", + name="ip_address", ), migrations.RemoveField( - model_name='form', - name='name', + model_name="form", + name="name", ), migrations.RemoveField( - model_name='form', - name='ns', + model_name="form", + name="ns", ), migrations.RemoveField( - model_name='form', - name='started_at', + model_name="form", + name="started_at", ), migrations.RemoveField( - model_name='form', - name='submitted_at', + model_name="form", + name="submitted_at", ), migrations.RemoveField( - model_name='form', - name='unique_id', + model_name="form", + name="unique_id", ), migrations.RemoveField( - model_name='form', - name='validated', + model_name="form", + name="validated", ), migrations.RemoveField( - model_name='formdata', - name='question_id', + model_name="formdata", + name="question_id", ), migrations.RemoveField( - model_name='formdata', - name='selected_option', + model_name="formdata", + name="selected_option", ), migrations.AddField( - model_name='form', - name='is_draft', - field=models.BooleanField(default=True, verbose_name='is draft'), + model_name="form", + name="is_draft", + field=models.BooleanField(default=True, verbose_name="is draft"), ), migrations.AddField( - model_name='form', - name='is_finalized', - field=models.BooleanField(default=False, verbose_name='is finalized'), + model_name="form", + name="is_finalized", + field=models.BooleanField(default=False, verbose_name="is finalized"), ), migrations.AddField( - model_name='form', - name='is_validated', - field=models.BooleanField(default=False, verbose_name='is validated'), + model_name="form", + name="is_validated", + field=models.BooleanField(default=False, verbose_name="is validated"), ), migrations.AlterField( - model_name='formdata', - name='notes', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="formdata", + name="notes", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), migrations.DeleteModel( - name='Draft', + name="Draft", ), migrations.AddField( - model_name='form', - name='area', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='per.FormArea', verbose_name='area'), + model_name="form", + name="area", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.PROTECT, to="per.FormArea", verbose_name="area" + ), ), migrations.AddField( - model_name='formdata', - name='question', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='per.FormQuestion', verbose_name='question'), + model_name="formdata", + name="question", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.CASCADE, to="per.FormQuestion", verbose_name="question" + ), ), migrations.AddField( - model_name='formdata', - name='selected_answer', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='per.FormAnswer', verbose_name='answer'), + model_name="formdata", + name="selected_answer", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.CASCADE, to="per.FormAnswer", verbose_name="answer" + ), ), ] diff --git a/per/migrations/0023_auto_20201012_1241.py b/per/migrations/0023_auto_20201012_1241.py index 3858ea5ec..64fb8d0ba 100644 --- a/per/migrations/0023_auto_20201012_1241.py +++ b/per/migrations/0023_auto_20201012_1241.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0022_auto_20201012_1225'), + ("per", "0022_auto_20201012_1225"), ] operations = [ migrations.AlterField( - model_name='formquestion', - name='answers', - field=models.ManyToManyField(blank=True, to='per.FormAnswer', verbose_name='answers'), + model_name="formquestion", + name="answers", + field=models.ManyToManyField(blank=True, to="per.FormAnswer", verbose_name="answers"), ), ] diff --git a/per/migrations/0024_formcomponent_component_letter.py b/per/migrations/0024_formcomponent_component_letter.py index 80c219d42..e79c0baa0 100644 --- a/per/migrations/0024_formcomponent_component_letter.py +++ b/per/migrations/0024_formcomponent_component_letter.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0023_auto_20201012_1241'), + ("per", "0023_auto_20201012_1241"), ] operations = [ migrations.AddField( - model_name='formcomponent', - name='component_letter', - field=models.CharField(blank=True, max_length=3, null=True, verbose_name='component letter'), + model_name="formcomponent", + name="component_letter", + field=models.CharField(blank=True, max_length=3, null=True, verbose_name="component letter"), ), ] diff --git a/per/migrations/0025_auto_20201028_1606.py b/per/migrations/0025_auto_20201028_1606.py index ec16d49c0..79aae3a11 100644 --- a/per/migrations/0025_auto_20201028_1606.py +++ b/per/migrations/0025_auto_20201028_1606.py @@ -6,32 +6,32 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0024_formcomponent_component_letter'), + ("per", "0024_formcomponent_component_letter"), ] operations = [ migrations.RemoveField( - model_name='form', - name='language', + model_name="form", + name="language", ), migrations.AddField( - model_name='form', - name='saved_at', - field=models.DateTimeField(blank=True, null=True, verbose_name='saved at'), + model_name="form", + name="saved_at", + field=models.DateTimeField(blank=True, null=True, verbose_name="saved at"), ), migrations.AddField( - model_name='form', - name='started_at', - field=models.DateTimeField(blank=True, null=True, verbose_name='started at'), + model_name="form", + name="started_at", + field=models.DateTimeField(blank=True, null=True, verbose_name="started at"), ), migrations.AddField( - model_name='form', - name='submitted_at', - field=models.DateTimeField(blank=True, null=True, verbose_name='updated at'), + model_name="form", + name="submitted_at", + field=models.DateTimeField(blank=True, null=True, verbose_name="updated at"), ), migrations.AddField( - model_name='overview', - name='is_draft', - field=models.BooleanField(default=True, verbose_name='is draft'), + model_name="overview", + name="is_draft", + field=models.BooleanField(default=True, verbose_name="is draft"), ), ] diff --git a/per/migrations/0026_auto_20201029_0851.py b/per/migrations/0026_auto_20201029_0851.py index 5a4febf6a..7b37e5d89 100644 --- a/per/migrations/0026_auto_20201029_0851.py +++ b/per/migrations/0026_auto_20201029_0851.py @@ -1,43 +1,55 @@ # Generated by Django 2.2.13 on 2020-10-29 08:51 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0025_auto_20201028_1606'), + ("per", "0025_auto_20201028_1606"), ] operations = [ migrations.CreateModel( - name='AssessmentType', + name="AssessmentType", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200, verbose_name='name')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("name", models.CharField(max_length=200, verbose_name="name")), ], options={ - 'verbose_name': 'PER Assessment Type', - 'verbose_name_plural': 'PER Assessment Types', + "verbose_name": "PER Assessment Type", + "verbose_name_plural": "PER Assessment Types", }, ), migrations.RemoveField( - model_name='overview', - name='type_of_capacity_assessment', + model_name="overview", + name="type_of_capacity_assessment", ), migrations.RemoveField( - model_name='overview', - name='type_of_last_capacity_assessment', + model_name="overview", + name="type_of_last_capacity_assessment", ), migrations.AddField( - model_name='overview', - name='type_of_ca', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='type_of_capacity_assessment', to='per.AssessmentType', verbose_name='type of capacity assessment'), + model_name="overview", + name="type_of_ca", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="type_of_capacity_assessment", + to="per.AssessmentType", + verbose_name="type of capacity assessment", + ), ), migrations.AddField( - model_name='overview', - name='type_of_last_ca', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='type_of_last_capacity_assessment', to='per.AssessmentType', verbose_name='type of last capacity assessment'), + model_name="overview", + name="type_of_last_ca", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="type_of_last_capacity_assessment", + to="per.AssessmentType", + verbose_name="type of last capacity assessment", + ), ), ] diff --git a/per/migrations/0027_auto_20201030_1539.py b/per/migrations/0027_auto_20201030_1539.py index 8e0a197ee..393d58d9a 100644 --- a/per/migrations/0027_auto_20201030_1539.py +++ b/per/migrations/0027_auto_20201030_1539.py @@ -6,128 +6,128 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0026_auto_20201029_0851'), + ("per", "0026_auto_20201029_0851"), ] operations = [ migrations.AddField( - model_name='assessmenttype', - name='name_ar', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="assessmenttype", + name="name_ar", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='assessmenttype', - name='name_en', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="assessmenttype", + name="name_en", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='assessmenttype', - name='name_es', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="assessmenttype", + name="name_es", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='assessmenttype', - name='name_fr', - field=models.CharField(max_length=200, null=True, verbose_name='name'), + model_name="assessmenttype", + name="name_fr", + field=models.CharField(max_length=200, null=True, verbose_name="name"), ), migrations.AddField( - model_name='formanswer', - name='text_ar', - field=models.CharField(max_length=40, null=True, verbose_name='text'), + model_name="formanswer", + name="text_ar", + field=models.CharField(max_length=40, null=True, verbose_name="text"), ), migrations.AddField( - model_name='formanswer', - name='text_en', - field=models.CharField(max_length=40, null=True, verbose_name='text'), + model_name="formanswer", + name="text_en", + field=models.CharField(max_length=40, null=True, verbose_name="text"), ), migrations.AddField( - model_name='formanswer', - name='text_es', - field=models.CharField(max_length=40, null=True, verbose_name='text'), + model_name="formanswer", + name="text_es", + field=models.CharField(max_length=40, null=True, verbose_name="text"), ), migrations.AddField( - model_name='formanswer', - name='text_fr', - field=models.CharField(max_length=40, null=True, verbose_name='text'), + model_name="formanswer", + name="text_fr", + field=models.CharField(max_length=40, null=True, verbose_name="text"), ), migrations.AddField( - model_name='formarea', - name='title_ar', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="formarea", + name="title_ar", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='formarea', - name='title_en', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="formarea", + name="title_en", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='formarea', - name='title_es', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="formarea", + name="title_es", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='formarea', - name='title_fr', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="formarea", + name="title_fr", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='formcomponent', - name='description_ar', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="formcomponent", + name="description_ar", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='formcomponent', - name='description_en', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="formcomponent", + name="description_en", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='formcomponent', - name='description_es', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="formcomponent", + name="description_es", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='formcomponent', - name='description_fr', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="formcomponent", + name="description_fr", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='formdata', - name='notes_ar', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="formdata", + name="notes_ar", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), migrations.AddField( - model_name='formdata', - name='notes_en', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="formdata", + name="notes_en", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), migrations.AddField( - model_name='formdata', - name='notes_es', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="formdata", + name="notes_es", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), migrations.AddField( - model_name='formdata', - name='notes_fr', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="formdata", + name="notes_fr", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), migrations.AddField( - model_name='formquestion', - name='question_ar', - field=models.CharField(max_length=500, null=True, verbose_name='question'), + model_name="formquestion", + name="question_ar", + field=models.CharField(max_length=500, null=True, verbose_name="question"), ), migrations.AddField( - model_name='formquestion', - name='question_en', - field=models.CharField(max_length=500, null=True, verbose_name='question'), + model_name="formquestion", + name="question_en", + field=models.CharField(max_length=500, null=True, verbose_name="question"), ), migrations.AddField( - model_name='formquestion', - name='question_es', - field=models.CharField(max_length=500, null=True, verbose_name='question'), + model_name="formquestion", + name="question_es", + field=models.CharField(max_length=500, null=True, verbose_name="question"), ), migrations.AddField( - model_name='formquestion', - name='question_fr', - field=models.CharField(max_length=500, null=True, verbose_name='question'), + model_name="formquestion", + name="question_fr", + field=models.CharField(max_length=500, null=True, verbose_name="question"), ), ] diff --git a/per/migrations/0028_auto_20201102_1154.py b/per/migrations/0028_auto_20201102_1154.py index 4d0209210..379b387e3 100644 --- a/per/migrations/0028_auto_20201102_1154.py +++ b/per/migrations/0028_auto_20201102_1154.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0027_auto_20201030_1539'), + ("per", "0027_auto_20201030_1539"), ] operations = [ migrations.AddField( - model_name='formcomponent', - name='title_ar', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="formcomponent", + name="title_ar", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='formcomponent', - name='title_en', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="formcomponent", + name="title_en", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='formcomponent', - name='title_es', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="formcomponent", + name="title_es", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='formcomponent', - name='title_fr', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="formcomponent", + name="title_fr", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), ] diff --git a/per/migrations/0029_auto_20201105_1529.py b/per/migrations/0029_auto_20201105_1529.py index 6a5260291..24b207ff3 100644 --- a/per/migrations/0029_auto_20201105_1529.py +++ b/per/migrations/0029_auto_20201105_1529.py @@ -1,84 +1,86 @@ # Generated by Django 2.2.13 on 2020-11-05 15:29 -from django.db import migrations, models import django.db.models.deletion import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0028_auto_20201102_1154'), + ("per", "0028_auto_20201102_1154"), ] operations = [ migrations.RemoveField( - model_name='form', - name='is_draft', + model_name="form", + name="is_draft", ), migrations.RemoveField( - model_name='form', - name='is_finalized', + model_name="form", + name="is_finalized", ), migrations.RemoveField( - model_name='form', - name='is_validated', + model_name="form", + name="is_validated", ), migrations.RemoveField( - model_name='form', - name='saved_at', + model_name="form", + name="saved_at", ), migrations.RemoveField( - model_name='form', - name='started_at', + model_name="form", + name="started_at", ), migrations.RemoveField( - model_name='form', - name='submitted_at', + model_name="form", + name="submitted_at", ), migrations.RemoveField( - model_name='overview', - name='is_draft', + model_name="overview", + name="is_draft", ), migrations.AddField( - model_name='form', - name='overview', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='per.Overview', verbose_name='overview'), + model_name="form", + name="overview", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.CASCADE, to="per.Overview", verbose_name="overview" + ), ), migrations.AddField( - model_name='formquestion', - name='is_benchmark', - field=models.BooleanField(default=False, verbose_name='is benchmark'), + model_name="formquestion", + name="is_benchmark", + field=models.BooleanField(default=False, verbose_name="is benchmark"), ), migrations.AddField( - model_name='formquestion', - name='is_epi', - field=models.BooleanField(default=False, verbose_name='is epi'), + model_name="formquestion", + name="is_epi", + field=models.BooleanField(default=False, verbose_name="is epi"), ), migrations.AddField( - model_name='overview', - name='created_at', - field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created at'), + model_name="overview", + name="created_at", + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name="created at"), preserve_default=False, ), migrations.AddField( - model_name='overview', - name='is_epi', - field=models.BooleanField(default=False, verbose_name='is epi'), + model_name="overview", + name="is_epi", + field=models.BooleanField(default=False, verbose_name="is epi"), ), migrations.AddField( - model_name='overview', - name='is_finalized', - field=models.BooleanField(default=False, verbose_name='is finalized'), + model_name="overview", + name="is_finalized", + field=models.BooleanField(default=False, verbose_name="is finalized"), ), migrations.AddField( - model_name='overview', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='updated at'), + model_name="overview", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="updated at"), ), migrations.AlterField( - model_name='formquestion', - name='question_num', - field=models.IntegerField(blank=True, null=True, verbose_name='question number'), + model_name="formquestion", + name="question_num", + field=models.IntegerField(blank=True, null=True, verbose_name="question number"), ), ] diff --git a/per/migrations/0030_auto_20201106_1205.py b/per/migrations/0030_auto_20201106_1205.py index 3f42aa9e5..2e38ba8af 100644 --- a/per/migrations/0030_auto_20201106_1205.py +++ b/per/migrations/0030_auto_20201106_1205.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0029_auto_20201105_1529'), + ("per", "0029_auto_20201105_1529"), ] operations = [ migrations.AlterField( - model_name='overview', - name='approximate_date_next_capacity_assmt', - field=models.DateTimeField(blank=True, null=True, verbose_name='approximate date next capacity assessment'), + model_name="overview", + name="approximate_date_next_capacity_assmt", + field=models.DateTimeField(blank=True, null=True, verbose_name="approximate date next capacity assessment"), ), migrations.AlterField( - model_name='overview', - name='date_of_current_capacity_assessment', - field=models.DateTimeField(blank=True, null=True, verbose_name='date of current capacity assessment'), + model_name="overview", + name="date_of_current_capacity_assessment", + field=models.DateTimeField(blank=True, null=True, verbose_name="date of current capacity assessment"), ), migrations.AlterField( - model_name='overview', - name='date_of_mid_term_review', - field=models.DateTimeField(blank=True, null=True, verbose_name='date of mid term review'), + model_name="overview", + name="date_of_mid_term_review", + field=models.DateTimeField(blank=True, null=True, verbose_name="date of mid term review"), ), ] diff --git a/per/migrations/0031_auto_20201106_1222.py b/per/migrations/0031_auto_20201106_1222.py index c3913f75e..e4f7fad33 100644 --- a/per/migrations/0031_auto_20201106_1222.py +++ b/per/migrations/0031_auto_20201106_1222.py @@ -1,20 +1,20 @@ # Generated by Django 2.2.13 on 2020-11-06 12:22 -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0030_auto_20201106_1205'), + ("per", "0030_auto_20201106_1205"), ] operations = [ migrations.AlterField( - model_name='overview', - name='date_of_current_capacity_assessment', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='date of current capacity assessment'), + model_name="overview", + name="date_of_current_capacity_assessment", + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name="date of current capacity assessment"), preserve_default=False, ), ] diff --git a/per/migrations/0032_remove_form_country.py b/per/migrations/0032_remove_form_country.py index c67702ed2..e94373723 100644 --- a/per/migrations/0032_remove_form_country.py +++ b/per/migrations/0032_remove_form_country.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0031_auto_20201106_1222'), + ("per", "0031_auto_20201106_1222"), ] operations = [ migrations.RemoveField( - model_name='form', - name='country', + model_name="form", + name="country", ), ] diff --git a/per/migrations/0033_auto_20201116_1521.py b/per/migrations/0033_auto_20201116_1521.py index 45ca24913..bcc8cbabb 100644 --- a/per/migrations/0033_auto_20201116_1521.py +++ b/per/migrations/0033_auto_20201116_1521.py @@ -1,153 +1,159 @@ # Generated by Django 2.2.13 on 2020-11-16 15:21 -from django.db import migrations, models import django.db.models.deletion import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0032_remove_form_country'), + ("per", "0032_remove_form_country"), ] operations = [ migrations.RemoveField( - model_name='overview', - name='approximate_date_next_capacity_assmt', + model_name="overview", + name="approximate_date_next_capacity_assmt", ), migrations.RemoveField( - model_name='overview', - name='branch_involved', + model_name="overview", + name="branch_involved", ), migrations.RemoveField( - model_name='overview', - name='date_of_current_capacity_assessment', + model_name="overview", + name="date_of_current_capacity_assessment", ), migrations.RemoveField( - model_name='overview', - name='date_of_last_capacity_assessment', + model_name="overview", + name="date_of_last_capacity_assessment", ), migrations.RemoveField( - model_name='overview', - name='facilitated_by', + model_name="overview", + name="facilitated_by", ), migrations.RemoveField( - model_name='overview', - name='focal_point_email', + model_name="overview", + name="focal_point_email", ), migrations.RemoveField( - model_name='overview', - name='focal_point_name', + model_name="overview", + name="focal_point_name", ), migrations.RemoveField( - model_name='overview', - name='focus', + model_name="overview", + name="focus", ), migrations.RemoveField( - model_name='overview', - name='had_previous_assessment', + model_name="overview", + name="had_previous_assessment", ), migrations.RemoveField( - model_name='overview', - name='phone_number', + model_name="overview", + name="phone_number", ), migrations.RemoveField( - model_name='overview', - name='skype_address', + model_name="overview", + name="skype_address", ), migrations.RemoveField( - model_name='overview', - name='type_of_ca', + model_name="overview", + name="type_of_ca", ), migrations.RemoveField( - model_name='overview', - name='type_of_last_ca', + model_name="overview", + name="type_of_last_ca", ), migrations.AddField( - model_name='overview', - name='branches_involved', - field=models.CharField(blank=True, max_length=400, null=True, verbose_name='branches involved'), + model_name="overview", + name="branches_involved", + field=models.CharField(blank=True, max_length=400, null=True, verbose_name="branches involved"), ), migrations.AddField( - model_name='overview', - name='date_of_assessment', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='date of assessment'), + model_name="overview", + name="date_of_assessment", + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name="date of assessment"), preserve_default=False, ), migrations.AddField( - model_name='overview', - name='date_of_next_asmt', - field=models.DateTimeField(blank=True, null=True, verbose_name='estimated date of next assessment'), + model_name="overview", + name="date_of_next_asmt", + field=models.DateTimeField(blank=True, null=True, verbose_name="estimated date of next assessment"), ), migrations.AddField( - model_name='overview', - name='facilitator_contact', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='facilitated other contacts'), + model_name="overview", + name="facilitator_contact", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="facilitated other contacts"), ), migrations.AddField( - model_name='overview', - name='facilitator_name', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='facilitator name'), + model_name="overview", + name="facilitator_name", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="facilitator name"), ), migrations.AddField( - model_name='overview', - name='facilitator_phone', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='facilitated phone'), + model_name="overview", + name="facilitator_phone", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="facilitated phone"), ), migrations.AddField( - model_name='overview', - name='method_asmt_used', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='what method has this assessment used'), + model_name="overview", + name="method_asmt_used", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="what method has this assessment used"), ), migrations.AddField( - model_name='overview', - name='ns_focal_point_email', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='ns focal point email'), + model_name="overview", + name="ns_focal_point_email", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="ns focal point email"), ), migrations.AddField( - model_name='overview', - name='ns_focal_point_name', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='ns focal point name'), + model_name="overview", + name="ns_focal_point_name", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="ns focal point name"), ), migrations.AddField( - model_name='overview', - name='ns_focal_point_phone', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='ns focal point phone'), + model_name="overview", + name="ns_focal_point_phone", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="ns focal point phone"), ), migrations.AddField( - model_name='overview', - name='other_consideration', - field=models.CharField(blank=True, max_length=400, null=True, verbose_name='other consideration'), + model_name="overview", + name="other_consideration", + field=models.CharField(blank=True, max_length=400, null=True, verbose_name="other consideration"), ), migrations.AddField( - model_name='overview', - name='partner_focal_point_email', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='partner focal point email'), + model_name="overview", + name="partner_focal_point_email", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="partner focal point email"), ), migrations.AddField( - model_name='overview', - name='partner_focal_point_name', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='partner focal point name'), + model_name="overview", + name="partner_focal_point_name", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="partner focal point name"), ), migrations.AddField( - model_name='overview', - name='partner_focal_point_organization', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='partner focal point organization name'), + model_name="overview", + name="partner_focal_point_organization", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="partner focal point organization name"), ), migrations.AddField( - model_name='overview', - name='partner_focal_point_phone', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='partner focal point phone'), + model_name="overview", + name="partner_focal_point_phone", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="partner focal point phone"), ), migrations.AddField( - model_name='overview', - name='type_of_assessment', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='type_of_assessment', to='per.AssessmentType', verbose_name='type of assessment'), + model_name="overview", + name="type_of_assessment", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="type_of_assessment", + to="per.AssessmentType", + verbose_name="type of assessment", + ), ), migrations.AlterField( - model_name='overview', - name='date_of_mid_term_review', - field=models.DateTimeField(blank=True, null=True, verbose_name='estimated date of mid term review'), + model_name="overview", + name="date_of_mid_term_review", + field=models.DateTimeField(blank=True, null=True, verbose_name="estimated date of mid term review"), ), ] diff --git a/per/migrations/0034_auto_20201119_1502.py b/per/migrations/0034_auto_20201119_1502.py index a7de8b354..0cce07852 100644 --- a/per/migrations/0034_auto_20201119_1502.py +++ b/per/migrations/0034_auto_20201119_1502.py @@ -1,19 +1,26 @@ # Generated by Django 2.2.13 on 2020-11-19 15:02 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0033_auto_20201116_1521'), + ("per", "0033_auto_20201116_1521"), ] operations = [ migrations.AlterField( - model_name='overview', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='per_overviews', to='api.Country', verbose_name='country'), + model_name="overview", + name="country", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="per_overviews", + to="api.Country", + verbose_name="country", + ), ), ] diff --git a/per/migrations/0035_overview_assessment_number.py b/per/migrations/0035_overview_assessment_number.py index 04807b991..24386fdf5 100644 --- a/per/migrations/0035_overview_assessment_number.py +++ b/per/migrations/0035_overview_assessment_number.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0034_auto_20201119_1502'), + ("per", "0034_auto_20201119_1502"), ] operations = [ migrations.AddField( - model_name='overview', - name='assessment_number', - field=models.IntegerField(default=1, verbose_name='assessment number'), + model_name="overview", + name="assessment_number", + field=models.IntegerField(default=1, verbose_name="assessment number"), ), ] diff --git a/per/migrations/0036_auto_20201123_1055.py b/per/migrations/0036_auto_20201123_1055.py index 655f8ff32..7b3e089e7 100644 --- a/per/migrations/0036_auto_20201123_1055.py +++ b/per/migrations/0036_auto_20201123_1055.py @@ -1,19 +1,21 @@ # Generated by Django 2.2.13 on 2020-11-23 10:55 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0035_overview_assessment_number'), + ("per", "0035_overview_assessment_number"), ] operations = [ migrations.AlterField( - model_name='formdata', - name='form', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='form_data', to='per.Form', verbose_name='form'), + model_name="formdata", + name="form", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name="form_data", to="per.Form", verbose_name="form" + ), ), ] diff --git a/per/migrations/0037_formquestion_description.py b/per/migrations/0037_formquestion_description.py index be36d0426..9d64190b0 100644 --- a/per/migrations/0037_formquestion_description.py +++ b/per/migrations/0037_formquestion_description.py @@ -1,19 +1,19 @@ # Generated by Django 2.2.13 on 2020-11-30 14:16 -from django.db import models, migrations import tinymce.models +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0036_auto_20201123_1055'), + ("per", "0036_auto_20201123_1055"), ] operations = [ migrations.AddField( - model_name='formquestion', - name='description', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='description'), + model_name="formquestion", + name="description", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="description"), ), ] diff --git a/per/migrations/0038_auto_20201130_1417.py b/per/migrations/0038_auto_20201130_1417.py index c123f8476..a7fedd8d7 100644 --- a/per/migrations/0038_auto_20201130_1417.py +++ b/per/migrations/0038_auto_20201130_1417.py @@ -1,34 +1,34 @@ # Generated by Django 2.2.13 on 2020-11-30 14:17 -from django.db import models, migrations import tinymce.models +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0037_formquestion_description'), + ("per", "0037_formquestion_description"), ] operations = [ migrations.AddField( - model_name='formquestion', - name='description_ar', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='description'), + model_name="formquestion", + name="description_ar", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='formquestion', - name='description_en', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='description'), + model_name="formquestion", + name="description_en", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='formquestion', - name='description_es', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='description'), + model_name="formquestion", + name="description_es", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="description"), ), migrations.AddField( - model_name='formquestion', - name='description_fr', - field=tinymce.models.HTMLField(blank=True, null=True, verbose_name='description'), + model_name="formquestion", + name="description_fr", + field=tinymce.models.HTMLField(blank=True, null=True, verbose_name="description"), ), ] diff --git a/per/migrations/0039_auto_20201208_1348.py b/per/migrations/0039_auto_20201208_1348.py index 6a5332d04..cc5727acd 100644 --- a/per/migrations/0039_auto_20201208_1348.py +++ b/per/migrations/0039_auto_20201208_1348.py @@ -1,19 +1,25 @@ # Generated by Django 2.2.13 on 2020-12-08 13:48 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0038_auto_20201130_1417'), + ("per", "0038_auto_20201130_1417"), ] operations = [ migrations.AlterField( - model_name='form', - name='overview', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='forms', to='per.Overview', verbose_name='overview'), + model_name="form", + name="overview", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="forms", + to="per.Overview", + verbose_name="overview", + ), ), ] diff --git a/per/migrations/0040_auto_20201214_1255.py b/per/migrations/0040_auto_20201214_1255.py index 712da35a2..7ef547f4f 100644 --- a/per/migrations/0040_auto_20201214_1255.py +++ b/per/migrations/0040_auto_20201214_1255.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0039_auto_20201208_1348'), + ("per", "0039_auto_20201208_1348"), ] operations = [ migrations.AlterField( - model_name='overview', - name='facilitator_contact', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='facilitator other contacts'), + model_name="overview", + name="facilitator_contact", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="facilitator other contacts"), ), migrations.AlterField( - model_name='overview', - name='facilitator_email', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='facilitator email'), + model_name="overview", + name="facilitator_email", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="facilitator email"), ), migrations.AlterField( - model_name='overview', - name='facilitator_phone', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='facilitator phone'), + model_name="overview", + name="facilitator_phone", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="facilitator phone"), ), ] diff --git a/per/migrations/0041_auto_20230410_0720.py b/per/migrations/0041_auto_20230410_0720.py index 6d2edbded..dd678de14 100644 --- a/per/migrations/0041_auto_20230410_0720.py +++ b/per/migrations/0041_auto_20230410_0720.py @@ -6,68 +6,116 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0040_auto_20201214_1255'), + ("per", "0040_auto_20201214_1255"), ] operations = [ migrations.AddField( - model_name='assessmenttype', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="assessmenttype", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='assessmenttype', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="assessmenttype", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='formanswer', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="formanswer", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='formanswer', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="formanswer", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='formarea', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="formarea", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='formarea', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="formarea", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='formcomponent', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="formcomponent", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='formcomponent', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="formcomponent", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='formdata', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="formdata", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='formdata', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="formdata", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='formquestion', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="formquestion", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='formquestion', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="formquestion", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/per/migrations/0041_auto_20230417_0402.py b/per/migrations/0041_auto_20230417_0402.py index 5e5b4e6d6..87aa60938 100644 --- a/per/migrations/0041_auto_20230417_0402.py +++ b/per/migrations/0041_auto_20230417_0402.py @@ -1,92 +1,174 @@ # Generated by Django 3.2.18 on 2023-04-17 04:02 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0040_auto_20201214_1255'), + ("per", "0040_auto_20201214_1255"), ] operations = [ migrations.AddField( - model_name='formcomponent', - name='status', - field=models.CharField(blank=True, choices=[('high_performance', 'High Performance'), ('exists_could_be_strengthened', 'Exits Could be Strengthened'), ('needs_improvement', 'Needs Improvement'), ('partially_exists', 'Partially Exists'), ('does_not_exist', 'Does Not Exist')], max_length=100, null=True, verbose_name='status'), + model_name="formcomponent", + name="status", + field=models.CharField( + blank=True, + choices=[ + ("high_performance", "High Performance"), + ("exists_could_be_strengthened", "Exits Could be Strengthened"), + ("needs_improvement", "Needs Improvement"), + ("partially_exists", "Partially Exists"), + ("does_not_exist", "Does Not Exist"), + ], + max_length=100, + null=True, + verbose_name="status", + ), ), migrations.AddField( - model_name='overview', - name='assess_climate_environment_of_country', - field=models.BooleanField(blank=True, null=True, verbose_name='Do you want to assess the climate and environment of your National Society?'), + model_name="overview", + name="assess_climate_environment_of_country", + field=models.BooleanField( + blank=True, null=True, verbose_name="Do you want to assess the climate and environment of your National Society?" + ), ), migrations.AddField( - model_name='overview', - name='assess_preparedness_of_country', - field=models.BooleanField(blank=True, null=True, verbose_name='Do you want to assess the preparedness of your National Society for epidemics and pandemics?'), + model_name="overview", + name="assess_preparedness_of_country", + field=models.BooleanField( + blank=True, + null=True, + verbose_name="Do you want to assess the preparedness of your National Society for epidemics and pandemics?", + ), ), migrations.AddField( - model_name='overview', - name='assess_urban_aspect_of_country', - field=models.BooleanField(blank=True, null=True, verbose_name='Do you want to assess the urban aspects of your National Society?'), + model_name="overview", + name="assess_urban_aspect_of_country", + field=models.BooleanField( + blank=True, null=True, verbose_name="Do you want to assess the urban aspects of your National Society?" + ), ), migrations.AddField( - model_name='overview', - name='date_of_orientation', - field=models.DateTimeField(blank=True, null=True, verbose_name='Date of Orientation'), + model_name="overview", + name="date_of_orientation", + field=models.DateTimeField(blank=True, null=True, verbose_name="Date of Orientation"), ), migrations.AddField( - model_name='overview', - name='date_of_previous_assessment', - field=models.DateTimeField(blank=True, null=True, verbose_name='Date of previous assessment'), + model_name="overview", + name="date_of_previous_assessment", + field=models.DateTimeField(blank=True, null=True, verbose_name="Date of previous assessment"), ), migrations.AddField( - model_name='overview', - name='orientation_document', - field=models.FileField(blank=True, null=True, upload_to='per/documents/', verbose_name='Orientation Document'), + model_name="overview", + name="orientation_document", + field=models.FileField(blank=True, null=True, upload_to="per/documents/", verbose_name="Orientation Document"), ), migrations.AddField( - model_name='overview', - name='type_of_per_assessment', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Type of Per Asessement'), + model_name="overview", + name="type_of_per_assessment", + field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Type of Per Asessement"), ), migrations.CreateModel( - name='PerWorkPlanComponent', + name="PerWorkPlanComponent", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('actions', models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions')), - ('due_date', models.DateTimeField(blank=True, null=True, verbose_name='Due date')), - ('responsible_email', models.CharField(blank=True, max_length=255, null=True, verbose_name='Responsible email')), - ('responsible_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Responsible name')), - ('status', models.IntegerField(choices=[(0, 'standby'), (1, 'ongoing'), (2, 'cancelled'), (3, 'delayed'), (4, 'pending'), (5, 'need improvements'), (6, 'finished'), (7, 'approved'), (8, 'closed')], default=0, verbose_name='status')), - ('area', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='per.formarea', verbose_name='Area')), - ('component', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='per.formcomponent', verbose_name='Component')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("actions", models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions")), + ("due_date", models.DateTimeField(blank=True, null=True, verbose_name="Due date")), + ("responsible_email", models.CharField(blank=True, max_length=255, null=True, verbose_name="Responsible email")), + ("responsible_name", models.CharField(blank=True, max_length=255, null=True, verbose_name="Responsible name")), + ( + "status", + models.IntegerField( + choices=[ + (0, "standby"), + (1, "ongoing"), + (2, "cancelled"), + (3, "delayed"), + (4, "pending"), + (5, "need improvements"), + (6, "finished"), + (7, "approved"), + (8, "closed"), + ], + default=0, + verbose_name="status", + ), + ), + ( + "area", + models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to="per.formarea", verbose_name="Area" + ), + ), + ( + "component", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="per.formcomponent", + verbose_name="Component", + ), + ), ], ), migrations.CreateModel( - name='PerWorkPlan', + name="PerWorkPlan", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('overview', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='per.overview', verbose_name='Overview')), - ('workplan_component', models.ManyToManyField(blank=True, to='per.PerWorkPlanComponent', verbose_name='WorkPlan Component')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "overview", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="per.overview", + verbose_name="Overview", + ), + ), + ( + "workplan_component", + models.ManyToManyField(blank=True, to="per.PerWorkPlanComponent", verbose_name="WorkPlan Component"), + ), ], ), migrations.CreateModel( - name='FormPrioritizationComponent', + name="FormPrioritizationComponent", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_prioritized', models.BooleanField(blank=True, null=True, verbose_name='Is prioritized')), - ('justification_text', models.TextField(blank=True, null=True, verbose_name='Justification Text')), - ('component', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='per.formcomponent', verbose_name='component')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("is_prioritized", models.BooleanField(blank=True, null=True, verbose_name="Is prioritized")), + ("justification_text", models.TextField(blank=True, null=True, verbose_name="Justification Text")), + ( + "component", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="per.formcomponent", verbose_name="component" + ), + ), ], ), migrations.CreateModel( - name='FormPrioritization', + name="FormPrioritization", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('form_proritization_component', models.ManyToManyField(blank=True, to='per.FormPrioritizationComponent', verbose_name='Form prioritization component')), - ('overview', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='per.overview', verbose_name='Overview')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "form_proritization_component", + models.ManyToManyField( + blank=True, to="per.FormPrioritizationComponent", verbose_name="Form prioritization component" + ), + ), + ( + "overview", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="per.overview", + verbose_name="Overview", + ), + ), ], ), ] diff --git a/per/migrations/0042_auto_20230502_0611.py b/per/migrations/0042_auto_20230502_0611.py index 8c4c322a7..d48d534a6 100644 --- a/per/migrations/0042_auto_20230502_0611.py +++ b/per/migrations/0042_auto_20230502_0611.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0041_auto_20230417_0402'), + ("per", "0041_auto_20230417_0402"), ] operations = [ migrations.AddField( - model_name='formcomponent', - name='urban_considerations', - field=models.TextField(blank=True, null=True, verbose_name='Urban Considerations'), + model_name="formcomponent", + name="urban_considerations", + field=models.TextField(blank=True, null=True, verbose_name="Urban Considerations"), ), migrations.AddField( - model_name='overview', - name='workplan_development_date', - field=models.DateTimeField(blank=True, null=True, verbose_name='Workplan Development Date'), + model_name="overview", + name="workplan_development_date", + field=models.DateTimeField(blank=True, null=True, verbose_name="Workplan Development Date"), ), migrations.AddField( - model_name='overview', - name='workplan_revision_date', - field=models.DateTimeField(blank=True, null=True, verbose_name='Workplan Revision Date'), + model_name="overview", + name="workplan_revision_date", + field=models.DateTimeField(blank=True, null=True, verbose_name="Workplan Revision Date"), ), ] diff --git a/per/migrations/0043_auto_20230505_0826.py b/per/migrations/0043_auto_20230505_0826.py index 13563f7f4..e780c7907 100644 --- a/per/migrations/0043_auto_20230505_0826.py +++ b/per/migrations/0043_auto_20230505_0826.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0042_auto_20230502_0611'), + ("per", "0042_auto_20230502_0611"), ] operations = [ migrations.AddField( - model_name='formcomponent', - name='climate_environmental_conisderations', - field=models.TextField(blank=True, null=True, verbose_name='Climate Environmental Considerations'), + model_name="formcomponent", + name="climate_environmental_conisderations", + field=models.TextField(blank=True, null=True, verbose_name="Climate Environmental Considerations"), ), migrations.AddField( - model_name='formcomponent', - name='epi_considerations', - field=models.TextField(blank=True, null=True, verbose_name='Epi Considerations'), + model_name="formcomponent", + name="epi_considerations", + field=models.TextField(blank=True, null=True, verbose_name="Epi Considerations"), ), ] diff --git a/per/migrations/0044_auto_20230508_0535.py b/per/migrations/0044_auto_20230508_0535.py index c779ee725..3b64f15e3 100644 --- a/per/migrations/0044_auto_20230508_0535.py +++ b/per/migrations/0044_auto_20230508_0535.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0043_auto_20230505_0826'), + ("per", "0043_auto_20230505_0826"), ] operations = [ migrations.AddField( - model_name='overview', - name='ns_second_focal_point_email', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='ns second focal point email'), + model_name="overview", + name="ns_second_focal_point_email", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="ns second focal point email"), ), migrations.AddField( - model_name='overview', - name='ns_second_focal_point_name', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='ns second focal point name'), + model_name="overview", + name="ns_second_focal_point_name", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="ns second focal point name"), ), migrations.AddField( - model_name='overview', - name='ns_second_focal_point_phone', - field=models.CharField(blank=True, max_length=90, null=True, verbose_name='ns second focal point phone'), + model_name="overview", + name="ns_second_focal_point_phone", + field=models.CharField(blank=True, max_length=90, null=True, verbose_name="ns second focal point phone"), ), ] diff --git a/per/migrations/0045_auto_20230508_0839.py b/per/migrations/0045_auto_20230508_0839.py index cedafd8f2..239bddd18 100644 --- a/per/migrations/0045_auto_20230508_0839.py +++ b/per/migrations/0045_auto_20230508_0839.py @@ -6,43 +6,43 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0044_auto_20230508_0535'), + ("per", "0044_auto_20230508_0535"), ] operations = [ migrations.AlterField( - model_name='overview', - name='date_of_assessment', - field=models.DateField(verbose_name='date of assessment'), + model_name="overview", + name="date_of_assessment", + field=models.DateField(verbose_name="date of assessment"), ), migrations.AlterField( - model_name='overview', - name='date_of_mid_term_review', - field=models.DateField(blank=True, null=True, verbose_name='estimated date of mid term review'), + model_name="overview", + name="date_of_mid_term_review", + field=models.DateField(blank=True, null=True, verbose_name="estimated date of mid term review"), ), migrations.AlterField( - model_name='overview', - name='date_of_next_asmt', - field=models.DateField(blank=True, null=True, verbose_name='estimated date of next assessment'), + model_name="overview", + name="date_of_next_asmt", + field=models.DateField(blank=True, null=True, verbose_name="estimated date of next assessment"), ), migrations.AlterField( - model_name='overview', - name='date_of_orientation', - field=models.DateField(blank=True, null=True, verbose_name='Date of Orientation'), + model_name="overview", + name="date_of_orientation", + field=models.DateField(blank=True, null=True, verbose_name="Date of Orientation"), ), migrations.AlterField( - model_name='overview', - name='date_of_previous_assessment', - field=models.DateField(blank=True, null=True, verbose_name='Date of previous assessment'), + model_name="overview", + name="date_of_previous_assessment", + field=models.DateField(blank=True, null=True, verbose_name="Date of previous assessment"), ), migrations.AlterField( - model_name='overview', - name='workplan_development_date', - field=models.DateField(blank=True, null=True, verbose_name='Workplan Development Date'), + model_name="overview", + name="workplan_development_date", + field=models.DateField(blank=True, null=True, verbose_name="Workplan Development Date"), ), migrations.AlterField( - model_name='overview', - name='workplan_revision_date', - field=models.DateField(blank=True, null=True, verbose_name='Workplan Revision Date'), + model_name="overview", + name="workplan_revision_date", + field=models.DateField(blank=True, null=True, verbose_name="Workplan Revision Date"), ), ] diff --git a/per/migrations/0046_form_is_draft.py b/per/migrations/0046_form_is_draft.py index da5fc3cd8..b738844f5 100644 --- a/per/migrations/0046_form_is_draft.py +++ b/per/migrations/0046_form_is_draft.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0045_auto_20230508_0839'), + ("per", "0045_auto_20230508_0839"), ] operations = [ migrations.AddField( - model_name='form', - name='is_draft', - field=models.BooleanField(blank=True, null=True, verbose_name='is draft'), + model_name="form", + name="is_draft", + field=models.BooleanField(blank=True, null=True, verbose_name="is draft"), ), ] diff --git a/per/migrations/0047_auto_20230510_0527.py b/per/migrations/0047_auto_20230510_0527.py index b8d9a2e29..5ad700e70 100644 --- a/per/migrations/0047_auto_20230510_0527.py +++ b/per/migrations/0047_auto_20230510_0527.py @@ -1,32 +1,35 @@ # Generated by Django 3.2.18 on 2023-05-10 05:27 from django.db import migrations, models + import per.validators class Migration(migrations.Migration): dependencies = [ - ('per', '0046_form_is_draft'), + ("per", "0046_form_is_draft"), ] operations = [ migrations.RemoveField( - model_name='perworkplancomponent', - name='responsible_email', + model_name="perworkplancomponent", + name="responsible_email", ), migrations.RemoveField( - model_name='perworkplancomponent', - name='responsible_name', + model_name="perworkplancomponent", + name="responsible_name", ), migrations.AddField( - model_name='perworkplan', - name='custom_component', - field=models.JSONField(blank=True, default=dict, validators=[per.validators.validate_custom_component], verbose_name='Custom Component'), + model_name="perworkplan", + name="custom_component", + field=models.JSONField( + blank=True, default=dict, validators=[per.validators.validate_custom_component], verbose_name="Custom Component" + ), ), migrations.AlterField( - model_name='perworkplancomponent', - name='due_date', - field=models.DateField(blank=True, null=True, verbose_name='Due date'), + model_name="perworkplancomponent", + name="due_date", + field=models.DateField(blank=True, null=True, verbose_name="Due date"), ), ] diff --git a/per/migrations/0048_auto_20230608_0615.py b/per/migrations/0048_auto_20230608_0615.py index c95397ba2..700ececbc 100644 --- a/per/migrations/0048_auto_20230608_0615.py +++ b/per/migrations/0048_auto_20230608_0615.py @@ -1,99 +1,147 @@ # Generated by Django 3.2.19 on 2023-06-08 06:15 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('per', '0047_auto_20230510_0527'), + ("per", "0047_auto_20230510_0527"), ] operations = [ migrations.CreateModel( - name='AreaResponse', + name="AreaResponse", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('area', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='per.formarea', verbose_name='Area')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("area", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="per.formarea", verbose_name="Area")), ], ), migrations.CreateModel( - name='CustomPerWorkPlanComponent', + name="CustomPerWorkPlanComponent", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('actions', models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions')), - ('due_date', models.DateField(blank=True, null=True, verbose_name='Due date')), - ('status', models.IntegerField(choices=[(0, 'standby'), (1, 'ongoing'), (2, 'cancelled'), (3, 'delayed'), (4, 'pending'), (5, 'need improvements'), (6, 'finished'), (7, 'approved'), (8, 'closed')], default=0, verbose_name='status')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("actions", models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions")), + ("due_date", models.DateField(blank=True, null=True, verbose_name="Due date")), + ( + "status", + models.IntegerField( + choices=[ + (0, "standby"), + (1, "ongoing"), + (2, "cancelled"), + (3, "delayed"), + (4, "pending"), + (5, "need improvements"), + (6, "finished"), + (7, "approved"), + (8, "closed"), + ], + default=0, + verbose_name="status", + ), + ), ], ), migrations.CreateModel( - name='FormComponentConsiderations', + name="FormComponentConsiderations", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('urban_considerations', models.TextField(blank=True, null=True, verbose_name='Urban Considerations')), - ('epi_considerations', models.TextField(blank=True, null=True, verbose_name='Epi Considerations')), - ('climate_environmental_conisderations', models.TextField(blank=True, null=True, verbose_name='Climate Environmental Considerations')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("urban_considerations", models.TextField(blank=True, null=True, verbose_name="Urban Considerations")), + ("epi_considerations", models.TextField(blank=True, null=True, verbose_name="Epi Considerations")), + ( + "climate_environmental_conisderations", + models.TextField(blank=True, null=True, verbose_name="Climate Environmental Considerations"), + ), ], ), migrations.RemoveField( - model_name='formcomponent', - name='climate_environmental_conisderations', + model_name="formcomponent", + name="climate_environmental_conisderations", ), migrations.RemoveField( - model_name='formcomponent', - name='epi_considerations', + model_name="formcomponent", + name="epi_considerations", ), migrations.RemoveField( - model_name='formcomponent', - name='urban_considerations', + model_name="formcomponent", + name="urban_considerations", ), migrations.RemoveField( - model_name='perworkplan', - name='custom_component', + model_name="perworkplan", + name="custom_component", ), migrations.RemoveField( - model_name='perworkplancomponent', - name='area', + model_name="perworkplancomponent", + name="area", ), migrations.CreateModel( - name='PerAssessment', + name="PerAssessment", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('area_response', models.ManyToManyField(blank=True, to='per.AreaResponse', verbose_name='Area Response')), - ('overview', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='per.overview', verbose_name='PerAssessment')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("area_response", models.ManyToManyField(blank=True, to="per.AreaResponse", verbose_name="Area Response")), + ( + "overview", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="per.overview", verbose_name="PerAssessment" + ), + ), + ( + "user", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), + ), ], ), migrations.CreateModel( - name='FormComponentQuestionAndAnswer', + name="FormComponentQuestionAndAnswer", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('notes', models.TextField(blank=True, null=True, verbose_name='notes')), - ('answer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='per.formanswer', verbose_name='answer')), - ('question', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='per.formquestion', verbose_name='question')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("notes", models.TextField(blank=True, null=True, verbose_name="notes")), + ( + "answer", + models.ForeignKey( + null=True, on_delete=django.db.models.deletion.CASCADE, to="per.formanswer", verbose_name="answer" + ), + ), + ( + "question", + models.ForeignKey( + null=True, on_delete=django.db.models.deletion.CASCADE, to="per.formquestion", verbose_name="question" + ), + ), ], ), migrations.AddField( - model_name='arearesponse', - name='component_response', - field=models.ManyToManyField(blank=True, to='per.FormComponent', verbose_name='Component Response'), + model_name="arearesponse", + name="component_response", + field=models.ManyToManyField(blank=True, to="per.FormComponent", verbose_name="Component Response"), ), migrations.AddField( - model_name='formcomponent', - name='consideration_responses', - field=models.ManyToManyField(blank=True, to='per.FormComponentConsiderations', verbose_name='Consideration responses'), + model_name="formcomponent", + name="consideration_responses", + field=models.ManyToManyField( + blank=True, to="per.FormComponentConsiderations", verbose_name="Consideration responses" + ), ), migrations.AddField( - model_name='formcomponent', - name='question_responses', - field=models.ManyToManyField(blank=True, to='per.FormComponentQuestionAndAnswer', verbose_name='Question responses'), + model_name="formcomponent", + name="question_responses", + field=models.ManyToManyField(blank=True, to="per.FormComponentQuestionAndAnswer", verbose_name="Question responses"), ), migrations.AddField( - model_name='perworkplan', - name='custom_component_responses', - field=models.ManyToManyField(blank=True, to='per.CustomPerWorkPlanComponent', verbose_name='Custom Per-WorkPlan Component'), + model_name="perworkplan", + name="custom_component_responses", + field=models.ManyToManyField( + blank=True, to="per.CustomPerWorkPlanComponent", verbose_name="Custom Per-WorkPlan Component" + ), ), ] diff --git a/per/migrations/0049_auto_20230608_0621.py b/per/migrations/0049_auto_20230608_0621.py index dff4ad0fd..e2eb52d1e 100644 --- a/per/migrations/0049_auto_20230608_0621.py +++ b/per/migrations/0049_auto_20230608_0621.py @@ -6,17 +6,17 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0048_auto_20230608_0615'), + ("per", "0048_auto_20230608_0615"), ] operations = [ migrations.RemoveField( - model_name='form', - name='is_draft', + model_name="form", + name="is_draft", ), migrations.AddField( - model_name='arearesponse', - name='is_draft', - field=models.BooleanField(blank=True, null=True, verbose_name='is draft'), + model_name="arearesponse", + name="is_draft", + field=models.BooleanField(blank=True, null=True, verbose_name="is draft"), ), ] diff --git a/per/migrations/0050_alter_perassessment_overview.py b/per/migrations/0050_alter_perassessment_overview.py index b9e7a75ce..4f2e40ef8 100644 --- a/per/migrations/0050_alter_perassessment_overview.py +++ b/per/migrations/0050_alter_perassessment_overview.py @@ -1,19 +1,19 @@ # Generated by Django 3.2.19 on 2023-06-08 06:27 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0049_auto_20230608_0621'), + ("per", "0049_auto_20230608_0621"), ] operations = [ migrations.AlterField( - model_name='perassessment', - name='overview', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='per.overview', verbose_name='Overview'), + model_name="perassessment", + name="overview", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="per.overview", verbose_name="Overview"), ), ] diff --git a/per/migrations/0051_rename_area_response_perassessment_area_responses.py b/per/migrations/0051_rename_area_response_perassessment_area_responses.py index 9c4ff83fd..6ad917f18 100644 --- a/per/migrations/0051_rename_area_response_perassessment_area_responses.py +++ b/per/migrations/0051_rename_area_response_perassessment_area_responses.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0050_alter_perassessment_overview'), + ("per", "0050_alter_perassessment_overview"), ] operations = [ migrations.RenameField( - model_name='perassessment', - old_name='area_response', - new_name='area_responses', + model_name="perassessment", + old_name="area_response", + new_name="area_responses", ), ] diff --git a/per/migrations/0052_auto_20230608_0837.py b/per/migrations/0052_auto_20230608_0837.py index a4cef42d3..90db973b8 100644 --- a/per/migrations/0052_auto_20230608_0837.py +++ b/per/migrations/0052_auto_20230608_0837.py @@ -1,29 +1,59 @@ # Generated by Django 3.2.19 on 2023-06-08 08:37 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0051_rename_area_response_perassessment_area_responses'), + ("per", "0051_rename_area_response_perassessment_area_responses"), ] operations = [ migrations.CreateModel( - name='FormComponentResponse', + name="FormComponentResponse", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('status', models.CharField(blank=True, choices=[('high_performance', 'High Performance'), ('exists_could_be_strengthened', 'Exits Could be Strengthened'), ('needs_improvement', 'Needs Improvement'), ('partially_exists', 'Partially Exists'), ('does_not_exist', 'Does Not Exist')], max_length=100, null=True, verbose_name='status')), - ('component', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='per.formcomponent', verbose_name='Form Component')), - ('consideration_responses', models.ManyToManyField(blank=True, to='per.FormComponentConsiderations', verbose_name='Consideration responses')), - ('question_responses', models.ManyToManyField(blank=True, to='per.FormComponentQuestionAndAnswer', verbose_name='Question responses')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ( + "status", + models.CharField( + blank=True, + choices=[ + ("high_performance", "High Performance"), + ("exists_could_be_strengthened", "Exits Could be Strengthened"), + ("needs_improvement", "Needs Improvement"), + ("partially_exists", "Partially Exists"), + ("does_not_exist", "Does Not Exist"), + ], + max_length=100, + null=True, + verbose_name="status", + ), + ), + ( + "component", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="per.formcomponent", verbose_name="Form Component" + ), + ), + ( + "consideration_responses", + models.ManyToManyField( + blank=True, to="per.FormComponentConsiderations", verbose_name="Consideration responses" + ), + ), + ( + "question_responses", + models.ManyToManyField( + blank=True, to="per.FormComponentQuestionAndAnswer", verbose_name="Question responses" + ), + ), ], ), migrations.AlterField( - model_name='arearesponse', - name='component_response', - field=models.ManyToManyField(blank=True, to='per.FormComponentResponse', verbose_name='Component Response'), + model_name="arearesponse", + name="component_response", + field=models.ManyToManyField(blank=True, to="per.FormComponentResponse", verbose_name="Component Response"), ), ] diff --git a/per/migrations/0053_auto_20230608_0919.py b/per/migrations/0053_auto_20230608_0919.py index 349cfc201..a44b0610f 100644 --- a/per/migrations/0053_auto_20230608_0919.py +++ b/per/migrations/0053_auto_20230608_0919.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0052_auto_20230608_0837'), + ("per", "0052_auto_20230608_0837"), ] operations = [ migrations.RenameField( - model_name='formprioritization', - old_name='form_proritization_component', - new_name='component_responses', + model_name="formprioritization", + old_name="form_proritization_component", + new_name="component_responses", ), migrations.RenameField( - model_name='perworkplan', - old_name='workplan_component', - new_name='component_responses', + model_name="perworkplan", + old_name="workplan_component", + new_name="component_responses", ), ] diff --git a/per/migrations/0054_auto_20230608_1022.py b/per/migrations/0054_auto_20230608_1022.py index 3727ca167..632704882 100644 --- a/per/migrations/0054_auto_20230608_1022.py +++ b/per/migrations/0054_auto_20230608_1022.py @@ -1,24 +1,32 @@ # Generated by Django 3.2.19 on 2023-06-08 10:22 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0053_auto_20230608_0919'), + ("per", "0053_auto_20230608_0919"), ] operations = [ migrations.AlterField( - model_name='formprioritizationcomponent', - name='component', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='per.formcomponent', verbose_name='component'), + model_name="formprioritizationcomponent", + name="component", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="per.formcomponent", + verbose_name="component", + ), ), migrations.AlterField( - model_name='perworkplan', - name='overview', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.overview', verbose_name='Overview'), + model_name="perworkplan", + name="overview", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="per.overview", verbose_name="Overview" + ), ), ] diff --git a/per/migrations/0055_auto_20230609_0516.py b/per/migrations/0055_auto_20230609_0516.py index 0e4bb792b..73164d472 100644 --- a/per/migrations/0055_auto_20230609_0516.py +++ b/per/migrations/0055_auto_20230609_0516.py @@ -1,24 +1,32 @@ # Generated by Django 3.2.19 on 2023-06-09 05:16 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0054_auto_20230608_1022'), + ("per", "0054_auto_20230608_1022"), ] operations = [ migrations.AlterField( - model_name='formcomponentresponse', - name='component', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='per.formcomponent', verbose_name='Form Component'), + model_name="formcomponentresponse", + name="component", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="per.formcomponent", + verbose_name="Form Component", + ), ), migrations.AlterField( - model_name='perassessment', - name='overview', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='per.overview', verbose_name='Overview'), + model_name="perassessment", + name="overview", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to="per.overview", verbose_name="Overview" + ), ), ] diff --git a/per/migrations/0056_perfile.py b/per/migrations/0056_perfile.py index 7b12fb0a4..a54bb0db4 100644 --- a/per/migrations/0056_perfile.py +++ b/per/migrations/0056_perfile.py @@ -1,30 +1,38 @@ # Generated by Django 3.2.19 on 2023-06-13 05:24 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('per', '0055_auto_20230609_0516'), + ("per", "0055_auto_20230609_0516"), ] operations = [ migrations.CreateModel( - name='PerFile', + name="PerFile", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.FileField(upload_to='per/images/', verbose_name='file')), - ('caption', models.CharField(blank=True, max_length=225, null=True)), - ('client_id', models.CharField(blank=True, max_length=50, null=True)), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='created_by')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("file", models.FileField(upload_to="per/images/", verbose_name="file")), + ("caption", models.CharField(blank=True, max_length=225, null=True)), + ("client_id", models.CharField(blank=True, max_length=50, null=True)), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="created_by", + ), + ), ], options={ - 'verbose_name': 'per file', - 'verbose_name_plural': 'per files', + "verbose_name": "per file", + "verbose_name_plural": "per files", }, ), ] diff --git a/per/migrations/0057_remove_overview_orientation_document.py b/per/migrations/0057_remove_overview_orientation_document.py index b8d836a4f..8c81155cd 100644 --- a/per/migrations/0057_remove_overview_orientation_document.py +++ b/per/migrations/0057_remove_overview_orientation_document.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0056_perfile'), + ("per", "0056_perfile"), ] operations = [ migrations.RemoveField( - model_name='overview', - name='orientation_document', + model_name="overview", + name="orientation_document", ), ] diff --git a/per/migrations/0058_overview_orientation_document.py b/per/migrations/0058_overview_orientation_document.py index 0ea50967c..02eea571b 100644 --- a/per/migrations/0058_overview_orientation_document.py +++ b/per/migrations/0058_overview_orientation_document.py @@ -1,19 +1,26 @@ # Generated by Django 3.2.19 on 2023-06-13 05:31 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0057_remove_overview_orientation_document'), + ("per", "0057_remove_overview_orientation_document"), ] operations = [ migrations.AddField( - model_name='overview', - name='orientation_document', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='orientation_document_dref', to='per.perfile', verbose_name='orientation document'), + model_name="overview", + name="orientation_document", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="orientation_document_dref", + to="per.perfile", + verbose_name="orientation document", + ), ), ] diff --git a/per/migrations/0059_auto_20230614_0820.py b/per/migrations/0059_auto_20230614_0820.py index 79c970f5f..4f2d01b0e 100644 --- a/per/migrations/0059_auto_20230614_0820.py +++ b/per/migrations/0059_auto_20230614_0820.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0058_overview_orientation_document'), + ("per", "0058_overview_orientation_document"), ] operations = [ migrations.AlterField( - model_name='overview', - name='is_epi', - field=models.BooleanField(blank=True, default=False, null=True, verbose_name='is epi'), + model_name="overview", + name="is_epi", + field=models.BooleanField(blank=True, default=False, null=True, verbose_name="is epi"), ), migrations.AlterField( - model_name='overview', - name='is_finalized', - field=models.BooleanField(blank=True, default=False, null=True, verbose_name='is finalized'), + model_name="overview", + name="is_finalized", + field=models.BooleanField(blank=True, default=False, null=True, verbose_name="is finalized"), ), ] diff --git a/per/migrations/0060_perassessment_is_draft.py b/per/migrations/0060_perassessment_is_draft.py index 8a3902e29..00c51f9e1 100644 --- a/per/migrations/0060_perassessment_is_draft.py +++ b/per/migrations/0060_perassessment_is_draft.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0059_auto_20230614_0820'), + ("per", "0059_auto_20230614_0820"), ] operations = [ migrations.AddField( - model_name='perassessment', - name='is_draft', - field=models.BooleanField(blank=True, null=True, verbose_name='is draft'), + model_name="perassessment", + name="is_draft", + field=models.BooleanField(blank=True, null=True, verbose_name="is draft"), ), ] diff --git a/per/migrations/0061_overview_phase.py b/per/migrations/0061_overview_phase.py index 6c2093308..afec5fe5c 100644 --- a/per/migrations/0061_overview_phase.py +++ b/per/migrations/0061_overview_phase.py @@ -6,13 +6,24 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0060_perassessment_is_draft'), + ("per", "0060_perassessment_is_draft"), ] operations = [ migrations.AddField( - model_name='overview', - name='phase', - field=models.IntegerField(blank=True, choices=[(1, 'Orientation'), (2, 'Assessment'), (3, 'Prioritisation'), (4, 'WorkPlan'), (5, 'Action And Accoutability')], null=True, verbose_name='phase'), + model_name="overview", + name="phase", + field=models.IntegerField( + blank=True, + choices=[ + (1, "Orientation"), + (2, "Assessment"), + (3, "Prioritisation"), + (4, "WorkPlan"), + (5, "Action And Accoutability"), + ], + null=True, + verbose_name="phase", + ), ), ] diff --git a/per/migrations/0062_alter_overview_phase.py b/per/migrations/0062_alter_overview_phase.py index 563b81f6c..5b95324d3 100644 --- a/per/migrations/0062_alter_overview_phase.py +++ b/per/migrations/0062_alter_overview_phase.py @@ -6,13 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0061_overview_phase'), + ("per", "0061_overview_phase"), ] operations = [ migrations.AlterField( - model_name='overview', - name='phase', - field=models.IntegerField(blank=True, choices=[(1, 'Orientation'), (2, 'Assessment'), (3, 'Prioritisation'), (4, 'WorkPlan'), (5, 'Action And Accoutability')], default=1, null=True, verbose_name='phase'), + model_name="overview", + name="phase", + field=models.IntegerField( + blank=True, + choices=[ + (1, "Orientation"), + (2, "Assessment"), + (3, "Prioritisation"), + (4, "WorkPlan"), + (5, "Action And Accoutability"), + ], + default=1, + null=True, + verbose_name="phase", + ), ), ] diff --git a/per/migrations/0063_perworkplancomponent_supported_by.py b/per/migrations/0063_perworkplancomponent_supported_by.py index e41ff7506..07cc96c3a 100644 --- a/per/migrations/0063_perworkplancomponent_supported_by.py +++ b/per/migrations/0063_perworkplancomponent_supported_by.py @@ -1,20 +1,20 @@ # Generated by Django 3.2.19 on 2023-06-21 05:34 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0169_auto_20230425_1120'), - ('per', '0062_alter_overview_phase'), + ("api", "0169_auto_20230425_1120"), + ("per", "0062_alter_overview_phase"), ] operations = [ migrations.AddField( - model_name='perworkplancomponent', - name='supported_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='api.country'), + model_name="perworkplancomponent", + name="supported_by", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="api.country"), ), ] diff --git a/per/migrations/0064_overview_is_draft.py b/per/migrations/0064_overview_is_draft.py index 430fac2ab..65890aabe 100644 --- a/per/migrations/0064_overview_is_draft.py +++ b/per/migrations/0064_overview_is_draft.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0063_perworkplancomponent_supported_by'), + ("per", "0063_perworkplancomponent_supported_by"), ] operations = [ migrations.AddField( - model_name='overview', - name='is_draft', - field=models.BooleanField(blank=True, null=True, verbose_name='is draft'), + model_name="overview", + name="is_draft", + field=models.BooleanField(blank=True, null=True, verbose_name="is draft"), ), ] diff --git a/per/migrations/0065_rename_status_formcomponentresponse_rating.py b/per/migrations/0065_rename_status_formcomponentresponse_rating.py index be31c6628..e38112fa1 100644 --- a/per/migrations/0065_rename_status_formcomponentresponse_rating.py +++ b/per/migrations/0065_rename_status_formcomponentresponse_rating.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0064_overview_is_draft'), + ("per", "0064_overview_is_draft"), ] operations = [ migrations.RenameField( - model_name='formcomponentresponse', - old_name='status', - new_name='rating', + model_name="formcomponentresponse", + old_name="status", + new_name="rating", ), ] diff --git a/per/migrations/0066_remove_formcomponentresponse_rating.py b/per/migrations/0066_remove_formcomponentresponse_rating.py index c984cb123..0802c992e 100644 --- a/per/migrations/0066_remove_formcomponentresponse_rating.py +++ b/per/migrations/0066_remove_formcomponentresponse_rating.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0065_rename_status_formcomponentresponse_rating'), + ("per", "0065_rename_status_formcomponentresponse_rating"), ] operations = [ migrations.RemoveField( - model_name='formcomponentresponse', - name='rating', + model_name="formcomponentresponse", + name="rating", ), ] diff --git a/per/migrations/0067_auto_20230621_1003.py b/per/migrations/0067_auto_20230621_1003.py index a24f964d3..2fdf526ff 100644 --- a/per/migrations/0067_auto_20230621_1003.py +++ b/per/migrations/0067_auto_20230621_1003.py @@ -1,27 +1,29 @@ # Generated by Django 3.2.19 on 2023-06-21 10:03 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0066_remove_formcomponentresponse_rating'), + ("per", "0066_remove_formcomponentresponse_rating"), ] operations = [ migrations.CreateModel( - name='PerComponentRating', + name="PerComponentRating", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=250, verbose_name='title')), - ('value', models.IntegerField(verbose_name='value')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=250, verbose_name="title")), + ("value", models.IntegerField(verbose_name="value")), ], ), migrations.AddField( - model_name='formcomponentresponse', - name='rating', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='per.percomponentrating'), + model_name="formcomponentresponse", + name="rating", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="per.percomponentrating" + ), ), ] diff --git a/per/migrations/0068_auto_20230622_0420.py b/per/migrations/0068_auto_20230622_0420.py index 90311fc11..8c70b7f5d 100644 --- a/per/migrations/0068_auto_20230622_0420.py +++ b/per/migrations/0068_auto_20230622_0420.py @@ -6,33 +6,39 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0067_auto_20230621_1003'), + ("per", "0067_auto_20230621_1003"), ] operations = [ migrations.RemoveField( - model_name='overview', - name='date_of_mid_term_review', + model_name="overview", + name="date_of_mid_term_review", ), migrations.RemoveField( - model_name='overview', - name='date_of_next_asmt', + model_name="overview", + name="date_of_next_asmt", ), migrations.RemoveField( - model_name='overview', - name='is_epi', + model_name="overview", + name="is_epi", ), migrations.RemoveField( - model_name='overview', - name='is_finalized', + model_name="overview", + name="is_finalized", ), migrations.RemoveField( - model_name='overview', - name='other_consideration', + model_name="overview", + name="other_consideration", ), migrations.AlterField( - model_name='overview', - name='method_asmt_used', - field=models.CharField(blank=True, choices=[('per', 'Per'), ('drce', 'Drce'), ('wpns', 'WPNS')], max_length=90, null=True, verbose_name='what method has this assessment used'), + model_name="overview", + name="method_asmt_used", + field=models.CharField( + blank=True, + choices=[("per", "Per"), ("drce", "Drce"), ("wpns", "WPNS")], + max_length=90, + null=True, + verbose_name="what method has this assessment used", + ), ), ] diff --git a/per/migrations/0069_auto_20230622_0426.py b/per/migrations/0069_auto_20230622_0426.py index 429a3ea96..862ee7845 100644 --- a/per/migrations/0069_auto_20230622_0426.py +++ b/per/migrations/0069_auto_20230622_0426.py @@ -6,16 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0068_auto_20230622_0420'), + ("per", "0068_auto_20230622_0420"), ] operations = [ migrations.RemoveField( - model_name='formquestion', - name='is_benchmark', + model_name="formquestion", + name="is_benchmark", ), migrations.RemoveField( - model_name='formquestion', - name='is_epi', + model_name="formquestion", + name="is_epi", ), ] diff --git a/per/migrations/0070_auto_20230622_0531.py b/per/migrations/0070_auto_20230622_0531.py index 669d7ee4b..5af8576f0 100644 --- a/per/migrations/0070_auto_20230622_0531.py +++ b/per/migrations/0070_auto_20230622_0531.py @@ -1,26 +1,28 @@ # Generated by Django 3.2.19 on 2023-06-22 05:31 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0169_auto_20230425_1120'), - ('per', '0069_auto_20230622_0426'), + ("api", "0169_auto_20230425_1120"), + ("per", "0069_auto_20230622_0426"), ] operations = [ migrations.AddField( - model_name='customperworkplancomponent', - name='supported_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='api.country'), + model_name="customperworkplancomponent", + name="supported_by", + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="api.country"), ), migrations.AlterField( - model_name='perworkplancomponent', - name='component', - field=models.ForeignKey(default=85, on_delete=django.db.models.deletion.CASCADE, to='per.formcomponent', verbose_name='Component'), + model_name="perworkplancomponent", + name="component", + field=models.ForeignKey( + default=85, on_delete=django.db.models.deletion.CASCADE, to="per.formcomponent", verbose_name="Component" + ), preserve_default=False, ), ] diff --git a/per/migrations/0071_remove_arearesponse_is_draft.py b/per/migrations/0071_remove_arearesponse_is_draft.py index 4ed3b3f26..ca4603b2d 100644 --- a/per/migrations/0071_remove_arearesponse_is_draft.py +++ b/per/migrations/0071_remove_arearesponse_is_draft.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0070_auto_20230622_0531'), + ("per", "0070_auto_20230622_0531"), ] operations = [ migrations.RemoveField( - model_name='arearesponse', - name='is_draft', + model_name="arearesponse", + name="is_draft", ), ] diff --git a/per/migrations/0072_remove_overview_orientation_document.py b/per/migrations/0072_remove_overview_orientation_document.py index 0490cb4b4..7cea2c1c4 100644 --- a/per/migrations/0072_remove_overview_orientation_document.py +++ b/per/migrations/0072_remove_overview_orientation_document.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0071_remove_arearesponse_is_draft'), + ("per", "0071_remove_arearesponse_is_draft"), ] operations = [ migrations.RemoveField( - model_name='overview', - name='orientation_document', + model_name="overview", + name="orientation_document", ), ] diff --git a/per/migrations/0073_overview_orientation_documents.py b/per/migrations/0073_overview_orientation_documents.py index 8d17e0c4f..22ca0f616 100644 --- a/per/migrations/0073_overview_orientation_documents.py +++ b/per/migrations/0073_overview_orientation_documents.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0072_remove_overview_orientation_document'), + ("per", "0072_remove_overview_orientation_document"), ] operations = [ migrations.AddField( - model_name='overview', - name='orientation_documents', - field=models.ManyToManyField(blank=True, to='per.PerFile', verbose_name='orientation documents'), + model_name="overview", + name="orientation_documents", + field=models.ManyToManyField(blank=True, to="per.PerFile", verbose_name="orientation documents"), ), ] diff --git a/per/migrations/0074_auto_20230628_0541.py b/per/migrations/0074_auto_20230628_0541.py index 55e367a06..c01912a2c 100644 --- a/per/migrations/0074_auto_20230628_0541.py +++ b/per/migrations/0074_auto_20230628_0541.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0073_overview_orientation_documents'), + ("per", "0073_overview_orientation_documents"), ] operations = [ migrations.AddField( - model_name='formprioritization', - name='is_draft', - field=models.BooleanField(default=True, verbose_name='is draft'), + model_name="formprioritization", + name="is_draft", + field=models.BooleanField(default=True, verbose_name="is draft"), ), migrations.AddField( - model_name='perworkplan', - name='is_draft', - field=models.BooleanField(default=True, verbose_name='is draft'), + model_name="perworkplan", + name="is_draft", + field=models.BooleanField(default=True, verbose_name="is draft"), ), migrations.AlterField( - model_name='overview', - name='is_draft', - field=models.BooleanField(default=True, verbose_name='is draft'), + model_name="overview", + name="is_draft", + field=models.BooleanField(default=True, verbose_name="is draft"), ), migrations.AlterField( - model_name='perassessment', - name='is_draft', - field=models.BooleanField(default=True, verbose_name='is draft'), + model_name="perassessment", + name="is_draft", + field=models.BooleanField(default=True, verbose_name="is draft"), ), ] diff --git a/per/migrations/0075_auto_20230628_0552.py b/per/migrations/0075_auto_20230628_0552.py index 99be6b2e9..b6e1bcc35 100644 --- a/per/migrations/0075_auto_20230628_0552.py +++ b/per/migrations/0075_auto_20230628_0552.py @@ -6,34 +6,34 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0074_auto_20230628_0541'), + ("per", "0074_auto_20230628_0541"), ] operations = [ migrations.RemoveField( - model_name='formcomponent', - name='consideration_responses', + model_name="formcomponent", + name="consideration_responses", ), migrations.RemoveField( - model_name='formcomponentresponse', - name='consideration_responses', + model_name="formcomponentresponse", + name="consideration_responses", ), migrations.AddField( - model_name='formcomponentresponse', - name='climate_environmental_considerations', - field=models.TextField(blank=True, null=True, verbose_name='Climate Environmental Considerations'), + model_name="formcomponentresponse", + name="climate_environmental_considerations", + field=models.TextField(blank=True, null=True, verbose_name="Climate Environmental Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='epi_considerations', - field=models.TextField(blank=True, null=True, verbose_name='Epi Considerations'), + model_name="formcomponentresponse", + name="epi_considerations", + field=models.TextField(blank=True, null=True, verbose_name="Epi Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='urban_considerations', - field=models.TextField(blank=True, null=True, verbose_name='Urban Considerations'), + model_name="formcomponentresponse", + name="urban_considerations", + field=models.TextField(blank=True, null=True, verbose_name="Urban Considerations"), ), migrations.DeleteModel( - name='FormComponentConsiderations', + name="FormComponentConsiderations", ), ] diff --git a/per/migrations/0076_merge_0041_auto_20230410_0720_0075_auto_20230628_0552.py b/per/migrations/0076_merge_0041_auto_20230410_0720_0075_auto_20230628_0552.py index 69184f5d4..3c6a9ae43 100644 --- a/per/migrations/0076_merge_0041_auto_20230410_0720_0075_auto_20230628_0552.py +++ b/per/migrations/0076_merge_0041_auto_20230410_0720_0075_auto_20230628_0552.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0041_auto_20230410_0720'), - ('per', '0075_auto_20230628_0552'), + ("per", "0041_auto_20230410_0720"), + ("per", "0075_auto_20230628_0552"), ] - operations = [ - ] + operations = [] diff --git a/per/migrations/0077_alter_formanswer_options.py b/per/migrations/0077_alter_formanswer_options.py index 11bba483c..d915ebfc8 100644 --- a/per/migrations/0077_alter_formanswer_options.py +++ b/per/migrations/0077_alter_formanswer_options.py @@ -6,12 +6,12 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0076_merge_0041_auto_20230410_0720_0075_auto_20230628_0552'), + ("per", "0076_merge_0041_auto_20230410_0720_0075_auto_20230628_0552"), ] operations = [ migrations.AlterModelOptions( - name='formanswer', - options={'ordering': ('id',)}, + name="formanswer", + options={"ordering": ("id",)}, ), ] diff --git a/per/migrations/0078_auto_20230711_0938.py b/per/migrations/0078_auto_20230711_0938.py index ed39a699f..f3071147a 100644 --- a/per/migrations/0078_auto_20230711_0938.py +++ b/per/migrations/0078_auto_20230711_0938.py @@ -1,28 +1,34 @@ # Generated by Django 3.2.20 on 2023-07-11 09:38 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0077_alter_formanswer_options'), + ("per", "0077_alter_formanswer_options"), ] operations = [ migrations.RenameField( - model_name='overview', - old_name='method_asmt_used', - new_name='assessment_method', + model_name="overview", + old_name="method_asmt_used", + new_name="assessment_method", ), migrations.RemoveField( - model_name='overview', - name='type_of_per_assessment', + model_name="overview", + name="type_of_per_assessment", ), migrations.AddField( - model_name='overview', - name='type_of_previous_assessment', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='type_of_previous_assessment', to='per.assessmenttype', verbose_name='type of previous assessment'), + model_name="overview", + name="type_of_previous_assessment", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="type_of_previous_assessment", + to="per.assessmenttype", + verbose_name="type of previous assessment", + ), ), ] diff --git a/per/migrations/0079_auto_20230712_0627.py b/per/migrations/0079_auto_20230712_0627.py index d89d9f3e7..ecad517b4 100644 --- a/per/migrations/0079_auto_20230712_0627.py +++ b/per/migrations/0079_auto_20230712_0627.py @@ -1,38 +1,46 @@ # Generated by Django 3.2.20 on 2023-07-12 06:27 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0078_auto_20230711_0938'), + ("per", "0078_auto_20230711_0938"), ] operations = [ migrations.AlterField( - model_name='formcomponentquestionandanswer', - name='answer', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='per.formanswer', verbose_name='answer'), + model_name="formcomponentquestionandanswer", + name="answer", + field=models.ForeignKey( + default=1, on_delete=django.db.models.deletion.CASCADE, to="per.formanswer", verbose_name="answer" + ), preserve_default=False, ), migrations.AlterField( - model_name='formcomponentquestionandanswer', - name='question', - field=models.ForeignKey(default=422, on_delete=django.db.models.deletion.CASCADE, to='per.formquestion', verbose_name='question'), + model_name="formcomponentquestionandanswer", + name="question", + field=models.ForeignKey( + default=422, on_delete=django.db.models.deletion.CASCADE, to="per.formquestion", verbose_name="question" + ), preserve_default=False, ), migrations.AlterField( - model_name='formcomponentresponse', - name='component', - field=models.ForeignKey(default=85, on_delete=django.db.models.deletion.CASCADE, to='per.formcomponent', verbose_name='Form Component'), + model_name="formcomponentresponse", + name="component", + field=models.ForeignKey( + default=85, on_delete=django.db.models.deletion.CASCADE, to="per.formcomponent", verbose_name="Form Component" + ), preserve_default=False, ), migrations.AlterField( - model_name='formprioritizationcomponent', - name='component', - field=models.ForeignKey(default=85, on_delete=django.db.models.deletion.CASCADE, to='per.formcomponent', verbose_name='component'), + model_name="formprioritizationcomponent", + name="component", + field=models.ForeignKey( + default=85, on_delete=django.db.models.deletion.CASCADE, to="per.formcomponent", verbose_name="component" + ), preserve_default=False, ), ] diff --git a/per/migrations/0080_formcomponentresponse_notes.py b/per/migrations/0080_formcomponentresponse_notes.py index 1d865f0c8..29e20ab1f 100644 --- a/per/migrations/0080_formcomponentresponse_notes.py +++ b/per/migrations/0080_formcomponentresponse_notes.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0079_auto_20230712_0627'), + ("per", "0079_auto_20230712_0627"), ] operations = [ migrations.AddField( - model_name='formcomponentresponse', - name='notes', - field=models.TextField(blank=True, null=True, verbose_name='Notes'), + model_name="formcomponentresponse", + name="notes", + field=models.TextField(blank=True, null=True, verbose_name="Notes"), ), ] diff --git a/per/migrations/0081_auto_20230731_1426.py b/per/migrations/0081_auto_20230731_1426.py index d03fb812b..34338bd98 100644 --- a/per/migrations/0081_auto_20230731_1426.py +++ b/per/migrations/0081_auto_20230731_1426.py @@ -6,18 +6,26 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0080_formcomponentresponse_notes'), + ("per", "0080_formcomponentresponse_notes"), ] operations = [ migrations.AlterField( - model_name='customperworkplancomponent', - name='status', - field=models.IntegerField(choices=[(0, 'Not Started'), (1, 'Ongoing'), (2, 'Delayed'), (3, 'Standby'), (4, 'Finished')], default=0, verbose_name='status'), + model_name="customperworkplancomponent", + name="status", + field=models.IntegerField( + choices=[(0, "Not Started"), (1, "Ongoing"), (2, "Delayed"), (3, "Standby"), (4, "Finished")], + default=0, + verbose_name="status", + ), ), migrations.AlterField( - model_name='perworkplancomponent', - name='status', - field=models.IntegerField(choices=[(0, 'Not Started'), (1, 'Ongoing'), (2, 'Delayed'), (3, 'Standby'), (4, 'Finished')], default=0, verbose_name='status'), + model_name="perworkplancomponent", + name="status", + field=models.IntegerField( + choices=[(0, "Not Started"), (1, "Ongoing"), (2, "Delayed"), (3, "Standby"), (4, "Finished")], + default=0, + verbose_name="status", + ), ), ] diff --git a/per/migrations/0082_auto_20230822_0833.py b/per/migrations/0082_auto_20230822_0833.py index a30f3b4b5..285201a4d 100644 --- a/per/migrations/0082_auto_20230822_0833.py +++ b/per/migrations/0082_auto_20230822_0833.py @@ -1,24 +1,32 @@ # Generated by Django 3.2.20 on 2023-08-22 08:33 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0081_auto_20230731_1426'), + ("per", "0081_auto_20230731_1426"), ] operations = [ migrations.AlterField( - model_name='formcomponentquestionandanswer', - name='answer', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formanswer', verbose_name='answer'), + model_name="formcomponentquestionandanswer", + name="answer", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="per.formanswer", verbose_name="answer" + ), ), migrations.AlterField( - model_name='formcomponentquestionandanswer', - name='question', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formquestion', verbose_name='question'), + model_name="formcomponentquestionandanswer", + name="question", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="per.formquestion", + verbose_name="question", + ), ), ] diff --git a/per/migrations/0083_auto_20230828_0403.py b/per/migrations/0083_auto_20230828_0403.py index 764bd9b97..4cd9d599a 100644 --- a/per/migrations/0083_auto_20230828_0403.py +++ b/per/migrations/0083_auto_20230828_0403.py @@ -6,23 +6,23 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0082_auto_20230822_0833'), + ("per", "0082_auto_20230822_0833"), ] operations = [ migrations.RenameField( - model_name='formprioritization', - old_name='component_responses', - new_name='prioritized_action_responses', + model_name="formprioritization", + old_name="component_responses", + new_name="prioritized_action_responses", ), migrations.RenameField( - model_name='perworkplan', - old_name='custom_component_responses', - new_name='additional_action_responses', + model_name="perworkplan", + old_name="custom_component_responses", + new_name="additional_action_responses", ), migrations.RenameField( - model_name='perworkplan', - old_name='component_responses', - new_name='prioritized_action_responses', + model_name="perworkplan", + old_name="component_responses", + new_name="prioritized_action_responses", ), ] diff --git a/per/migrations/0084_alter_overview_date_of_assessment.py b/per/migrations/0084_alter_overview_date_of_assessment.py index beb9a5c7b..8faff82b8 100644 --- a/per/migrations/0084_alter_overview_date_of_assessment.py +++ b/per/migrations/0084_alter_overview_date_of_assessment.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0083_auto_20230828_0403'), + ("per", "0083_auto_20230828_0403"), ] operations = [ migrations.AlterField( - model_name='overview', - name='date_of_assessment', - field=models.DateField(blank=True, null=True, verbose_name='date of assessment'), + model_name="overview", + name="date_of_assessment", + field=models.DateField(blank=True, null=True, verbose_name="date of assessment"), ), ] diff --git a/per/migrations/0085_alter_overview_assessment_method.py b/per/migrations/0085_alter_overview_assessment_method.py index be85d121d..6fc1f9dde 100644 --- a/per/migrations/0085_alter_overview_assessment_method.py +++ b/per/migrations/0085_alter_overview_assessment_method.py @@ -6,13 +6,19 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0084_alter_overview_date_of_assessment'), + ("per", "0084_alter_overview_date_of_assessment"), ] operations = [ migrations.AlterField( - model_name='overview', - name='assessment_method', - field=models.CharField(blank=True, choices=[('per', 'PER'), ('drce', 'DRCE'), ('wpns', 'WPNS')], max_length=90, null=True, verbose_name='what method has this assessment used'), + model_name="overview", + name="assessment_method", + field=models.CharField( + blank=True, + choices=[("per", "PER"), ("drce", "DRCE"), ("wpns", "WPNS")], + max_length=90, + null=True, + verbose_name="what method has this assessment used", + ), ), ] diff --git a/per/migrations/0086_migrate_old_form.py b/per/migrations/0086_migrate_old_form.py index 35171f126..5a22564b0 100644 --- a/per/migrations/0086_migrate_old_form.py +++ b/per/migrations/0086_migrate_old_form.py @@ -1,27 +1,27 @@ # Generated by Django 3.2.20 on 2023-09-27 05:07 -from django.db import migrations from django.core.management import call_command +from django.db import migrations class Migration(migrations.Migration): def forwards_func(apps, schema_editor): - print('forwards') - call_command('loaddata', 'componentratings.json', verbosity=2) + print("forwards") + call_command("loaddata", "componentratings.json", verbosity=2) def reverse_func(apps, schema_editor): - print('reverse') + print("reverse") def migrate_data(apps, schema_editor): - Form = apps.get_model('per', 'Form') - FormData = apps.get_model('per', 'FormData') - FormComponentQuestionAndAnswer = apps.get_model('per', 'FormComponentQuestionAndAnswer') - FormComponent = apps.get_model('per', 'FormComponent') - FormComponentResponse = apps.get_model('per', 'FormComponentResponse') - AreaResponse = apps.get_model('per', 'AreaResponse') - PerAssessment = apps.get_model('per', 'PerAssessment') - PerComponentRating = apps.get_model('per', 'PerComponentRating') + Form = apps.get_model("per", "Form") + FormData = apps.get_model("per", "FormData") + FormComponentQuestionAndAnswer = apps.get_model("per", "FormComponentQuestionAndAnswer") + FormComponent = apps.get_model("per", "FormComponent") + FormComponentResponse = apps.get_model("per", "FormComponentResponse") + AreaResponse = apps.get_model("per", "AreaResponse") + PerAssessment = apps.get_model("per", "PerAssessment") + PerComponentRating = apps.get_model("per", "PerComponentRating") per_assessments_by_overview = {} @@ -50,10 +50,7 @@ def migrate_data(apps, schema_editor): ) area_response.component_response.add(form_component_response) - form_data_entries = FormData.objects.filter( - form=form, - question__component=component_response - ) + form_data_entries = FormData.objects.filter(form=form, question__component=component_response) for form_data_entry in form_data_entries: question = form_data_entry.question.question @@ -64,7 +61,7 @@ def migrate_data(apps, schema_editor): question_and_answer = FormComponentQuestionAndAnswer.objects.create( question=form_data_entry.question, answer=form_data_entry.selected_answer, - notes=form_data_entry.notes_en + notes=form_data_entry.notes_en, ) form_component_response.question_responses.add(question_and_answer) question = form_data_entry.question.question @@ -74,18 +71,15 @@ def migrate_data(apps, schema_editor): rating = rating_map.get(answer.id) if rating is not None: form_component_response.rating = PerComponentRating.objects.get(id=rating) - form_component_response.save(update_fields=['rating']) + form_component_response.save(update_fields=["rating"]) else: print(f"No rating found for answer {answer}") dependencies = [ - ('per', '0085_alter_overview_assessment_method'), + ("per", "0085_alter_overview_assessment_method"), ] operations = [ # migrations.RunPython(forwards_func, reverse_func, elidable=False), - migrations.RunPython( - migrate_data, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(migrate_data, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0087_update_phase.py b/per/migrations/0087_update_phase.py index e10d8649b..a52269b74 100644 --- a/per/migrations/0087_update_phase.py +++ b/per/migrations/0087_update_phase.py @@ -6,20 +6,17 @@ class Migration(migrations.Migration): def update_phase(apps, schema_editor): - Overview = apps.get_model('per', 'Overview') - FormPrioritization = apps.get_model('per', 'FormPrioritization') + Overview = apps.get_model("per", "Overview") + FormPrioritization = apps.get_model("per", "FormPrioritization") overviews = Overview.objects.all() for overview in overviews: overview.phase = 2 - overview.save(update_fields=['phase']) + overview.save(update_fields=["phase"]) dependencies = [ - ('per', '0086_migrate_old_form'), + ("per", "0086_migrate_old_form"), ] operations = [ - migrations.RunPython( - update_phase, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(update_phase, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0088_update_assessment_method.py b/per/migrations/0088_update_assessment_method.py index 9edacc307..36e6ee03e 100644 --- a/per/migrations/0088_update_assessment_method.py +++ b/per/migrations/0088_update_assessment_method.py @@ -6,24 +6,21 @@ class Migration(migrations.Migration): def update_overview_assessment_method(apps, schema_editor): - Overview = apps.get_model('per', 'Overview') + Overview = apps.get_model("per", "Overview") overviews = Overview.objects.all() for overview in overviews: - if overview.assessment_method == 'PER': - overview.assessment_method = 'per' - elif overview.assessment_method == 'DRCE': - overview.assessment_method = 'drce' + if overview.assessment_method == "PER": + overview.assessment_method = "per" + elif overview.assessment_method == "DRCE": + overview.assessment_method = "drce" else: - overview.assessment_method = 'per' - overview.save(update_fields=['assessment_method']) + overview.assessment_method = "per" + overview.save(update_fields=["assessment_method"]) dependencies = [ - ('per', '0087_update_phase'), + ("per", "0087_update_phase"), ] operations = [ - migrations.RunPython( - update_overview_assessment_method, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(update_overview_assessment_method, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0089_alter_overview_type_of_previous_assessment.py b/per/migrations/0089_alter_overview_type_of_previous_assessment.py index 7e474a41c..6ce1b0424 100644 --- a/per/migrations/0089_alter_overview_type_of_previous_assessment.py +++ b/per/migrations/0089_alter_overview_type_of_previous_assessment.py @@ -1,19 +1,26 @@ # Generated by Django 3.2.20 on 2023-10-30 09:59 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0088_update_assessment_method'), + ("per", "0088_update_assessment_method"), ] operations = [ migrations.AlterField( - model_name='overview', - name='type_of_previous_assessment', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='type_of_previous_assessment', to='per.assessmenttype', verbose_name='type of previous assessment'), + model_name="overview", + name="type_of_previous_assessment", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="type_of_previous_assessment", + to="per.assessmenttype", + verbose_name="type of previous assessment", + ), ), ] diff --git a/per/migrations/0090_auto_20231030_1505.py b/per/migrations/0090_auto_20231030_1505.py index 6dc140a2a..7dcf38aa5 100644 --- a/per/migrations/0090_auto_20231030_1505.py +++ b/per/migrations/0090_auto_20231030_1505.py @@ -1,7 +1,8 @@ # Generated by Django 3.2.20 on 2023-10-30 15:05 -from django.db import migrations from django.core.management import call_command +from django.db import migrations + def update_question_answer(apps, schema_editor): FormQuestion = apps.get_model("per", "FormQuestion") @@ -10,14 +11,11 @@ def update_question_answer(apps, schema_editor): for form_question in form_questions: form_question.answers.add(FormAnswer.objects.get(id=5)) # Hardcoded for now + class Migration(migrations.Migration): dependencies = [ - ('per', '0089_alter_overview_type_of_previous_assessment'), + ("per", "0089_alter_overview_type_of_previous_assessment"), ] - operations = [ - migrations.RunPython( - update_question_answer, reverse_code=migrations.RunPython.noop - ) - ] + operations = [migrations.RunPython(update_question_answer, reverse_code=migrations.RunPython.noop)] diff --git a/per/migrations/0091_opslearning.py b/per/migrations/0091_opslearning.py index eefed64c2..27de3913b 100644 --- a/per/migrations/0091_opslearning.py +++ b/per/migrations/0091_opslearning.py @@ -6,32 +6,63 @@ class Migration(migrations.Migration): dependencies = [ - ('deployments', '0088_alter_project_visibility'), - ('per', '0090_auto_20231030_1505'), + ("deployments", "0088_alter_project_visibility"), + ("per", "0090_auto_20231030_1505"), ] operations = [ migrations.CreateModel( - name='OpsLearning', + name="OpsLearning", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('learning', models.TextField(blank=True, null=True, verbose_name='learning')), - ('learning_validated', models.TextField(blank=True, null=True, verbose_name='learning (validated)')), - ('appeal_code', models.CharField(blank=True, max_length=20, null=True, verbose_name='appeal (MDR) code')), - ('type', models.IntegerField(choices=[(1, 'Lesson learned'), (2, 'Challenge')], default=1, verbose_name='type')), - ('type_validated', models.IntegerField(choices=[(1, 'Lesson learned'), (2, 'Challenge')], default=1, verbose_name='type (validated)')), - ('is_validated', models.BooleanField(default=False, verbose_name='is validated?')), - ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified_at')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('per_component', models.ManyToManyField(blank=True, related_name='components', to='per.FormComponent', verbose_name='PER Components')), - ('per_component_validated', models.ManyToManyField(blank=True, related_name='validated_components', to='per.FormComponent', verbose_name='PER Components (validated)')), - ('sector', models.ManyToManyField(blank=True, related_name='sectors', to='deployments.SectorTag', verbose_name='Sectors')), - ('sector_validated', models.ManyToManyField(blank=True, related_name='validated_sectors', to='deployments.SectorTag', verbose_name='Sectors (validated)')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("learning", models.TextField(blank=True, null=True, verbose_name="learning")), + ("learning_validated", models.TextField(blank=True, null=True, verbose_name="learning (validated)")), + ("appeal_code", models.CharField(blank=True, max_length=20, null=True, verbose_name="appeal (MDR) code")), + ("type", models.IntegerField(choices=[(1, "Lesson learned"), (2, "Challenge")], default=1, verbose_name="type")), + ( + "type_validated", + models.IntegerField( + choices=[(1, "Lesson learned"), (2, "Challenge")], default=1, verbose_name="type (validated)" + ), + ), + ("is_validated", models.BooleanField(default=False, verbose_name="is validated?")), + ("modified_at", models.DateTimeField(auto_now=True, verbose_name="modified_at")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ( + "per_component", + models.ManyToManyField( + blank=True, related_name="components", to="per.FormComponent", verbose_name="PER Components" + ), + ), + ( + "per_component_validated", + models.ManyToManyField( + blank=True, + related_name="validated_components", + to="per.FormComponent", + verbose_name="PER Components (validated)", + ), + ), + ( + "sector", + models.ManyToManyField( + blank=True, related_name="sectors", to="deployments.SectorTag", verbose_name="Sectors" + ), + ), + ( + "sector_validated", + models.ManyToManyField( + blank=True, + related_name="validated_sectors", + to="deployments.SectorTag", + verbose_name="Sectors (validated)", + ), + ), ], options={ - 'verbose_name': 'Operational Learning', - 'verbose_name_plural': 'Operational Learnings', - 'ordering': ('learning',), + "verbose_name": "Operational Learning", + "verbose_name_plural": "Operational Learnings", + "ordering": ("learning",), }, ), ] diff --git a/per/migrations/0092_auto_20240109_1950.py b/per/migrations/0092_auto_20240109_1950.py index 04bbda38c..bb1b47e02 100644 --- a/per/migrations/0092_auto_20240109_1950.py +++ b/per/migrations/0092_auto_20240109_1950.py @@ -6,18 +6,22 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0091_opslearning'), + ("per", "0091_opslearning"), ] operations = [ migrations.AddField( - model_name='opslearning', - name='organization', - field=models.IntegerField(choices=[(1, 'Secretariat'), (2, 'National Society')], default=1, verbose_name='organization'), + model_name="opslearning", + name="organization", + field=models.IntegerField( + choices=[(1, "Secretariat"), (2, "National Society")], default=1, verbose_name="organization" + ), ), migrations.AddField( - model_name='opslearning', - name='organization_validated', - field=models.IntegerField(choices=[(1, 'Secretariat'), (2, 'National Society')], default=1, verbose_name='organization (validated)'), + model_name="opslearning", + name="organization_validated", + field=models.IntegerField( + choices=[(1, "Secretariat"), (2, "National Society")], default=1, verbose_name="organization (validated)" + ), ), ] diff --git a/per/migrations/0093_auto_20240116_1739.py b/per/migrations/0093_auto_20240116_1739.py index e58e6bfc0..5579e37f6 100644 --- a/per/migrations/0093_auto_20240116_1739.py +++ b/per/migrations/0093_auto_20240116_1739.py @@ -1,47 +1,54 @@ # Generated by Django 3.2.23 on 2024-01-16 17:39 -from django.db import migrations, models from django.core.management import call_command +from django.db import migrations, models class Migration(migrations.Migration): def forwards_func(apps, schema_editor): - print('forwards') - call_command('loaddata', 'organizationtypes.json', verbosity=2) + print("forwards") + call_command("loaddata", "organizationtypes.json", verbosity=2) def reverse_func(apps, schema_editor): - print('reverse') - model = apps.get_model('per', 'organizationtypes') + print("reverse") + model = apps.get_model("per", "organizationtypes") model.objects.all().delete() dependencies = [ - ('per', '0092_auto_20240109_1950'), + ("per", "0092_auto_20240109_1950"), ] operations = [ migrations.CreateModel( - name='OrganizationTypes', + name="OrganizationTypes", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('is_deprecated', models.BooleanField(default=False, help_text='Is this a deprecated Organization type?')), - ('order', models.SmallIntegerField(default=0)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("is_deprecated", models.BooleanField(default=False, help_text="Is this a deprecated Organization type?")), + ("order", models.SmallIntegerField(default=0)), ], options={ - 'verbose_name': 'Organization type', - 'verbose_name_plural': 'Organization types', + "verbose_name": "Organization type", + "verbose_name_plural": "Organization types", }, ), migrations.RunPython(forwards_func, reverse_func, elidable=True), migrations.AddField( - model_name='opslearning', - name='organization2', - field=models.ManyToManyField(blank=True, related_name='organizations', to='per.OrganizationTypes', verbose_name='Organizations'), + model_name="opslearning", + name="organization2", + field=models.ManyToManyField( + blank=True, related_name="organizations", to="per.OrganizationTypes", verbose_name="Organizations" + ), ), migrations.AddField( - model_name='opslearning', - name='organization2_validated', - field=models.ManyToManyField(blank=True, related_name='validated_organizations', to='per.OrganizationTypes', verbose_name='Organizations (validated)'), + model_name="opslearning", + name="organization2_validated", + field=models.ManyToManyField( + blank=True, + related_name="validated_organizations", + to="per.OrganizationTypes", + verbose_name="Organizations (validated)", + ), ), ] diff --git a/per/migrations/0093_perworkplancomponent_supported_by_organization_type.py b/per/migrations/0093_perworkplancomponent_supported_by_organization_type.py index 14e9037ac..314d24af3 100644 --- a/per/migrations/0093_perworkplancomponent_supported_by_organization_type.py +++ b/per/migrations/0093_perworkplancomponent_supported_by_organization_type.py @@ -6,13 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0092_auto_20240109_1950'), + ("per", "0092_auto_20240109_1950"), ] operations = [ migrations.AddField( - model_name='perworkplancomponent', - name='supported_by_organization_type', - field=models.IntegerField(blank=True, choices=[(0, 'UN Organization'), (1, 'Private Sector'), (2, 'Government'), (3, 'National Society')], null=True, verbose_name='Supported By Organization Type'), + model_name="perworkplancomponent", + name="supported_by_organization_type", + field=models.IntegerField( + blank=True, + choices=[(0, "UN Organization"), (1, "Private Sector"), (2, "Government"), (3, "National Society")], + null=True, + verbose_name="Supported By Organization Type", + ), ), ] diff --git a/per/migrations/0094_auto_20240116_1845.py b/per/migrations/0094_auto_20240116_1845.py index 798909e49..8c9067a43 100644 --- a/per/migrations/0094_auto_20240116_1845.py +++ b/per/migrations/0094_auto_20240116_1845.py @@ -6,26 +6,26 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0093_auto_20240116_1739'), + ("per", "0093_auto_20240116_1739"), ] operations = [ migrations.RemoveField( - model_name='opslearning', - name='organization', + model_name="opslearning", + name="organization", ), migrations.RemoveField( - model_name='opslearning', - name='organization_validated', + model_name="opslearning", + name="organization_validated", ), migrations.RenameField( - model_name='opslearning', - old_name='organization2', - new_name='organization', + model_name="opslearning", + old_name="organization2", + new_name="organization", ), migrations.RenameField( - model_name='opslearning', - old_name='organization2_validated', - new_name='organization_validated', + model_name="opslearning", + old_name="organization2_validated", + new_name="organization_validated", ), ] diff --git a/per/migrations/0094_update_supported_by_organization_type.py b/per/migrations/0094_update_supported_by_organization_type.py index 0111a4db4..fb8f54a8e 100644 --- a/per/migrations/0094_update_supported_by_organization_type.py +++ b/per/migrations/0094_update_supported_by_organization_type.py @@ -6,16 +6,13 @@ class Migration(migrations.Migration): def update_suported_by_oragnization_type(apps, schema_editor): - PerWorkPlanComponent = apps.get_model('per', 'PerWorkPlanComponent') + PerWorkPlanComponent = apps.get_model("per", "PerWorkPlanComponent") PerWorkPlanComponent.objects.update(supported_by_organization_type=3) dependencies = [ - ('per', '0093_perworkplancomponent_supported_by_organization_type'), + ("per", "0093_perworkplancomponent_supported_by_organization_type"), ] operations = [ - migrations.RunPython( - update_suported_by_oragnization_type, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(update_suported_by_oragnization_type, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0095_opslearning_appeal_document_id.py b/per/migrations/0095_opslearning_appeal_document_id.py index 8e920ab16..b9f7c94db 100644 --- a/per/migrations/0095_opslearning_appeal_document_id.py +++ b/per/migrations/0095_opslearning_appeal_document_id.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0094_auto_20240116_1845'), + ("per", "0094_auto_20240116_1845"), ] operations = [ migrations.AddField( - model_name='opslearning', - name='appeal_document_id', - field=models.IntegerField(blank=True, null=True, verbose_name='Appeal document ID'), + model_name="opslearning", + name="appeal_document_id", + field=models.IntegerField(blank=True, null=True, verbose_name="Appeal document ID"), ), ] diff --git a/per/migrations/0095_perdocumentupload.py b/per/migrations/0095_perdocumentupload.py index a6a8d1ea8..b75b1365b 100644 --- a/per/migrations/0095_perdocumentupload.py +++ b/per/migrations/0095_perdocumentupload.py @@ -1,27 +1,38 @@ # Generated by Django 3.2.23 on 2024-01-12 05:51 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('api', '0187_auto_20231218_0508'), + ("api", "0187_auto_20231218_0508"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('per', '0094_update_supported_by_organization_type'), + ("per", "0094_update_supported_by_organization_type"), ] operations = [ migrations.CreateModel( - name='PerDocumentUpload', + name="PerDocumentUpload", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.FileField(upload_to='per/documents/', verbose_name='file')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.country', verbose_name='country')), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='created_by')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("file", models.FileField(upload_to="per/documents/", verbose_name="file")), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ( + "country", + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="api.country", verbose_name="country"), + ), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="created_by", + ), + ), ], ), ] diff --git a/per/migrations/0096_alter_opslearning_appeal_code.py b/per/migrations/0096_alter_opslearning_appeal_code.py index 10615d9a9..429d1ee9c 100644 --- a/per/migrations/0096_alter_opslearning_appeal_code.py +++ b/per/migrations/0096_alter_opslearning_appeal_code.py @@ -1,20 +1,27 @@ # Generated by Django 3.2.23 on 2024-01-31 19:22 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0188_auto_20240109_0508'), - ('per', '0095_opslearning_appeal_document_id'), + ("api", "0188_auto_20240109_0508"), + ("per", "0095_opslearning_appeal_document_id"), ] operations = [ migrations.AlterField( - model_name='opslearning', - name='appeal_code', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.appeal', to_field='code', verbose_name='appeal (MDR) code'), + model_name="opslearning", + name="appeal_code", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.appeal", + to_field="code", + verbose_name="appeal (MDR) code", + ), ), ] diff --git a/per/migrations/0096_migrate_formdata_notes.py b/per/migrations/0096_migrate_formdata_notes.py index a0be3d6f2..a5a345747 100644 --- a/per/migrations/0096_migrate_formdata_notes.py +++ b/per/migrations/0096_migrate_formdata_notes.py @@ -9,12 +9,9 @@ def migrate_formdata_notes(apps, schema_editor): pass dependencies = [ - ('per', '0095_perdocumentupload'), + ("per", "0095_perdocumentupload"), ] operations = [ - migrations.RunPython( - migrate_formdata_notes, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(migrate_formdata_notes, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0097_alter_opslearning_appeal_code.py b/per/migrations/0097_alter_opslearning_appeal_code.py index 3bb35cdcb..fb2daaf4a 100644 --- a/per/migrations/0097_alter_opslearning_appeal_code.py +++ b/per/migrations/0097_alter_opslearning_appeal_code.py @@ -1,20 +1,28 @@ # Generated by Django 3.2.23 on 2024-01-31 20:41 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0188_auto_20240109_0508'), - ('per', '0096_alter_opslearning_appeal_code'), + ("api", "0188_auto_20240109_0508"), + ("per", "0096_alter_opslearning_appeal_code"), ] operations = [ migrations.AlterField( - model_name='opslearning', - name='appeal_code', - field=models.ForeignKey(blank=True, db_column='appeal_code', null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.appeal', to_field='code', verbose_name='appeal (MDR) code'), + model_name="opslearning", + name="appeal_code", + field=models.ForeignKey( + blank=True, + db_column="appeal_code", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="api.appeal", + to_field="code", + verbose_name="appeal (MDR) code", + ), ), ] diff --git a/per/migrations/0097_formcomponent_is_parent.py b/per/migrations/0097_formcomponent_is_parent.py index 1a9944303..a33764763 100644 --- a/per/migrations/0097_formcomponent_is_parent.py +++ b/per/migrations/0097_formcomponent_is_parent.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0096_migrate_formdata_notes'), + ("per", "0096_migrate_formdata_notes"), ] operations = [ migrations.AddField( - model_name='formcomponent', - name='is_parent', - field=models.BooleanField(blank=True, null=True, verbose_name='Is parent'), + model_name="formcomponent", + name="is_parent", + field=models.BooleanField(blank=True, null=True, verbose_name="Is parent"), ), ] diff --git a/per/migrations/0098_auto_20240118_0552.py b/per/migrations/0098_auto_20240118_0552.py index 417fb3fb8..4fce08326 100644 --- a/per/migrations/0098_auto_20240118_0552.py +++ b/per/migrations/0098_auto_20240118_0552.py @@ -6,27 +6,21 @@ class Migration(migrations.Migration): def update_component_description(apps, schema_editor): - FormComponent = apps.get_model('per', 'FormComponent') + FormComponent = apps.get_model("per", "FormComponent") # Update formcomponent `14 A` description to 14 and set 14 to `is_parent` - form_component_14_A = FormComponent.objects.filter( - component_num=14, - component_letter="A" - ) + form_component_14_A = FormComponent.objects.filter(component_num=14, component_letter="A") if form_component_14_A.exists(): form_component_14_A_first = form_component_14_A.first() form_component_14 = FormComponent.objects.filter(component_num=14).first() form_component_14.description_en = form_component_14_A_first.description form_component_14.is_parent = True - form_component_14.save(update_fields=['description_en', 'is_parent']) + form_component_14.save(update_fields=["description_en", "is_parent"]) dependencies = [ - ('per', '0097_formcomponent_is_parent'), + ("per", "0097_formcomponent_is_parent"), ] operations = [ - migrations.RunPython( - update_component_description, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(update_component_description, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0098_fix_reversion_data_20240208_0502.py b/per/migrations/0098_fix_reversion_data_20240208_0502.py index 02bec8e38..bc89e1b32 100644 --- a/per/migrations/0098_fix_reversion_data_20240208_0502.py +++ b/per/migrations/0098_fix_reversion_data_20240208_0502.py @@ -1,34 +1,34 @@ # Generated by Django 3.2.23 on 2024-02-08 05:02 from django.db import migrations + from main.utils import DjangoReversionDataFixHelper def modify_per_datetime_data_to_date(self, schema_editor): - ContentType = self.get_model('contenttypes', 'ContentType') - Version = self.get_model('reversion', 'Version') - Overview = self.get_model('per', 'Overview') - DjangoReversionDataFixHelper.datetime_fields_to_date(ContentType, Version, Overview, ['date_of_assessment']) + ContentType = self.get_model("contenttypes", "ContentType") + Version = self.get_model("reversion", "Version") + Overview = self.get_model("per", "Overview") + DjangoReversionDataFixHelper.datetime_fields_to_date(ContentType, Version, Overview, ["date_of_assessment"]) def modify_per_date_data_to_datetime(self, schema_editor): - ContentType = self.get_model('contenttypes', 'ContentType') - Version = self.get_model('reversion', 'Version') - Overview = self.get_model('per', 'Overview') - DjangoReversionDataFixHelper.date_fields_to_datetime(ContentType, Version, Overview, ['date_of_assessment']) + ContentType = self.get_model("contenttypes", "ContentType") + Version = self.get_model("reversion", "Version") + Overview = self.get_model("per", "Overview") + DjangoReversionDataFixHelper.date_fields_to_datetime(ContentType, Version, Overview, ["date_of_assessment"]) class Migration(migrations.Migration): dependencies = [ - ('reversion', '0001_squashed_0004_auto_20160611_1202'), - ('contenttypes', '0002_remove_content_type_name'), - ('per', '0097_alter_opslearning_appeal_code'), + ("reversion", "0001_squashed_0004_auto_20160611_1202"), + ("contenttypes", "0002_remove_content_type_name"), + ("per", "0097_alter_opslearning_appeal_code"), ] operations = [ migrations.RunPython( - modify_per_datetime_data_to_date, # Time data is lost here - reverse_code=modify_per_date_data_to_datetime + modify_per_datetime_data_to_date, reverse_code=modify_per_date_data_to_datetime # Time data is lost here ), ] diff --git a/per/migrations/0099_auto_20240130_0850.py b/per/migrations/0099_auto_20240130_0850.py index cc5475dc5..7c020a688 100644 --- a/per/migrations/0099_auto_20240130_0850.py +++ b/per/migrations/0099_auto_20240130_0850.py @@ -1,38 +1,61 @@ # Generated by Django 3.2.23 on 2024-01-30 08:50 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0098_auto_20240118_0552'), + ("per", "0098_auto_20240118_0552"), ] operations = [ migrations.CreateModel( - name='FormQuestionGroup', + name="FormQuestionGroup", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=250, verbose_name='title')), - ('title_en', models.CharField(max_length=250, null=True, verbose_name='title')), - ('title_es', models.CharField(max_length=250, null=True, verbose_name='title')), - ('title_fr', models.CharField(max_length=250, null=True, verbose_name='title')), - ('title_ar', models.CharField(max_length=250, null=True, verbose_name='title')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), - ('description_en', models.TextField(blank=True, null=True, verbose_name='description')), - ('description_es', models.TextField(blank=True, null=True, verbose_name='description')), - ('description_fr', models.TextField(blank=True, null=True, verbose_name='description')), - ('description_ar', models.TextField(blank=True, null=True, verbose_name='description')), - ('translation_module_original_language', models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language')), - ('translation_module_skip_auto_translation', models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation')), - ('component', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='per.formcomponent', verbose_name='component')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=250, verbose_name="title")), + ("title_en", models.CharField(max_length=250, null=True, verbose_name="title")), + ("title_es", models.CharField(max_length=250, null=True, verbose_name="title")), + ("title_fr", models.CharField(max_length=250, null=True, verbose_name="title")), + ("title_ar", models.CharField(max_length=250, null=True, verbose_name="title")), + ("description", models.TextField(blank=True, null=True, verbose_name="description")), + ("description_en", models.TextField(blank=True, null=True, verbose_name="description")), + ("description_es", models.TextField(blank=True, null=True, verbose_name="description")), + ("description_fr", models.TextField(blank=True, null=True, verbose_name="description")), + ("description_ar", models.TextField(blank=True, null=True, verbose_name="description")), + ( + "translation_module_original_language", + models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), + ), + ( + "translation_module_skip_auto_translation", + models.BooleanField( + default=False, + help_text="Skip auto translation operation for this entity?", + verbose_name="Skip auto translation", + ), + ), + ( + "component", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="per.formcomponent", verbose_name="component" + ), + ), ], ), migrations.AddField( - model_name='formquestion', - name='question_group', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formquestiongroup'), + model_name="formquestion", + name="question_group", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="per.formquestiongroup" + ), ), ] diff --git a/per/migrations/0099_migrate_notes.py b/per/migrations/0099_migrate_notes.py index d1544f74e..0f3698272 100644 --- a/per/migrations/0099_migrate_notes.py +++ b/per/migrations/0099_migrate_notes.py @@ -1,6 +1,5 @@ # Generated by Django 3.2.23 on 2024-02-22 05:45 -from django.db import migrations -from django.db import models +from django.db import migrations, models def migrate_formdata_notes(apps, schema_editor): @@ -11,21 +10,21 @@ def migrate_formdata_notes(apps, schema_editor): new_notes=models.Subquery( # Copy notes from FormData using overview FormData.objects.filter( - form__overview=models.OuterRef('arearesponse__perassessment__overview'), - question__component=models.OuterRef('component'), + form__overview=models.OuterRef("arearesponse__perassessment__overview"), + question__component=models.OuterRef("component"), question=74, - ).values('notes_en'), + ).values("notes_en"), output_field=models.CharField(), ), ).filter(new_notes__isnull=False) form_component_responses = [] for form_component_response_id, assessment_id, new_notes in qs.values_list( - 'id', - models.F('arearesponse__perassessment'), - 'new_notes', + "id", + models.F("arearesponse__perassessment"), + "new_notes", ): - print(f'- Copying data for {assessment_id=} {form_component_response_id=}') + print(f"- Copying data for {assessment_id=} {form_component_response_id=}") form_component_responses.append( FormComponentResponse( id=form_component_response_id, @@ -33,8 +32,8 @@ def migrate_formdata_notes(apps, schema_editor): ) ) - print(f'Total form_component_responses notes copied: {len(form_component_responses)}') - FormComponentResponse.objects.bulk_update(form_component_responses, fields=('notes',)) + print(f"Total form_component_responses notes copied: {len(form_component_responses)}") + FormComponentResponse.objects.bulk_update(form_component_responses, fields=("notes",)) class Migration(migrations.Migration): diff --git a/per/migrations/0100_auto_20240130_0851.py b/per/migrations/0100_auto_20240130_0851.py index e26f32e81..8e223e1ca 100644 --- a/per/migrations/0100_auto_20240130_0851.py +++ b/per/migrations/0100_auto_20240130_0851.py @@ -1,16 +1,17 @@ # Generated by Django 3.2.23 on 2024-01-30 08:51 from django.db import migrations + from api.logger import logger class Migration(migrations.Migration): def migrate_component_to_question_group(apps, schema_editor): - FormComponent = apps.get_model('per', 'FormComponent') - FormQuestionGroup = apps.get_model('per', 'FormQuestionGroup') - FormQuestion = apps.get_model('per', 'FormQuestion') - FormComponentResponse = apps.get_model('per', 'FormComponentResponse') + FormComponent = apps.get_model("per", "FormComponent") + FormQuestionGroup = apps.get_model("per", "FormQuestionGroup") + FormQuestion = apps.get_model("per", "FormQuestion") + FormComponentResponse = apps.get_model("per", "FormComponentResponse") # Fetch components to migrate to_migrate_component_ids = [53, 52, 51, 50, 49] @@ -28,26 +29,24 @@ def migrate_component_to_question_group(apps, schema_editor): description_es=component.description_es, description_ar=component.description_ar, description_fr=component.description_fr, - component_id=48 + component_id=48, ) question_group_count += 1 - logger.info(f'Created QuestionGroup count {question_group_count}') + logger.info(f"Created QuestionGroup count {question_group_count}") # Attach questions to question groups form_questions_to_migrate = FormQuestion.objects.filter(component_id__in=to_migrate_component_ids) question_count = 0 for question in form_questions_to_migrate: - form_question_group = FormQuestionGroup.objects.filter( - title_en=question.component.title_en - ) + form_question_group = FormQuestionGroup.objects.filter(title_en=question.component.title_en) if form_question_group.exists(): form_question_group_first = form_question_group.first() question.question_group = form_question_group_first - question.save(update_fields=['question_group']) + question.save(update_fields=["question_group"]) question_count += 1 - logger.info(f'Attached Question count {question_count}') + logger.info(f"Attached Question count {question_count}") # Update component responses FormComponentResponse.objects.filter(component_id__in=to_migrate_component_ids).update(component_id=48) @@ -55,18 +54,14 @@ def migrate_component_to_question_group(apps, schema_editor): # Update component ID for old data form_questions_to_migrate.update(component_id=48) - #Delete old form components + # Delete old form components deleted_count, _ = to_migrate_components.delete() - print(f'Deleted {deleted_count} FormComponent instances') - + print(f"Deleted {deleted_count} FormComponent instances") dependencies = [ - ('per', '0099_auto_20240130_0850'), + ("per", "0099_auto_20240130_0850"), ] operations = [ - migrations.RunPython( - migrate_component_to_question_group, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(migrate_component_to_question_group, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0100_migrate_all_notes.py b/per/migrations/0100_migrate_all_notes.py index 50833e565..071ad4944 100644 --- a/per/migrations/0100_migrate_all_notes.py +++ b/per/migrations/0100_migrate_all_notes.py @@ -1,6 +1,5 @@ # Generated by Django 3.2.23 on 2024-02-22 05:45 -from django.db import migrations -from django.db import models +from django.db import migrations, models # NOTE: Same as 0099_migrate_notes but this migrates all of the notes using Question "Component performance" @@ -13,21 +12,21 @@ def migrate_formdata_notes(apps, schema_editor): new_notes=models.Subquery( # Copy notes from FormData using overview FormData.objects.filter( - form__overview=models.OuterRef('arearesponse__perassessment__overview'), - question__component=models.OuterRef('component'), - question__question__iexact='Component performance', - ).values('notes_en'), + form__overview=models.OuterRef("arearesponse__perassessment__overview"), + question__component=models.OuterRef("component"), + question__question__iexact="Component performance", + ).values("notes_en"), output_field=models.CharField(), ), ).filter(new_notes__isnull=False) form_component_responses = [] for form_component_response_id, assessment_id, new_notes in qs.values_list( - 'id', - models.F('arearesponse__perassessment'), - 'new_notes', + "id", + models.F("arearesponse__perassessment"), + "new_notes", ): - print(f'- Copying data for {assessment_id=} {form_component_response_id=}') + print(f"- Copying data for {assessment_id=} {form_component_response_id=}") form_component_responses.append( FormComponentResponse( id=form_component_response_id, @@ -35,8 +34,8 @@ def migrate_formdata_notes(apps, schema_editor): ) ) - print(f'Total form_component_responses notes copied: {len(form_component_responses)}') - FormComponentResponse.objects.bulk_update(form_component_responses, fields=('notes',)) + print(f"Total form_component_responses notes copied: {len(form_component_responses)}") + FormComponentResponse.objects.bulk_update(form_component_responses, fields=("notes",)) class Migration(migrations.Migration): diff --git a/per/migrations/0101_merge_20240202_1004.py b/per/migrations/0101_merge_20240202_1004.py index 6233f4621..071e22cff 100644 --- a/per/migrations/0101_merge_20240202_1004.py +++ b/per/migrations/0101_merge_20240202_1004.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0097_alter_opslearning_appeal_code'), - ('per', '0100_auto_20240130_0851'), + ("per", "0097_alter_opslearning_appeal_code"), + ("per", "0100_auto_20240130_0851"), ] - operations = [ - ] + operations = [] diff --git a/per/migrations/0102_merge_20240216_0447.py b/per/migrations/0102_merge_20240216_0447.py index 95a917295..4e922b6c5 100644 --- a/per/migrations/0102_merge_20240216_0447.py +++ b/per/migrations/0102_merge_20240216_0447.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0098_fix_reversion_data_20240208_0502'), - ('per', '0101_merge_20240202_1004'), + ("per", "0098_fix_reversion_data_20240208_0502"), + ("per", "0101_merge_20240202_1004"), ] - operations = [ - ] + operations = [] diff --git a/per/migrations/0103_merge_0100_migrate_all_notes_0102_merge_20240216_0447.py b/per/migrations/0103_merge_0100_migrate_all_notes_0102_merge_20240216_0447.py index 8f8f6484e..9ecb24030 100644 --- a/per/migrations/0103_merge_0100_migrate_all_notes_0102_merge_20240216_0447.py +++ b/per/migrations/0103_merge_0100_migrate_all_notes_0102_merge_20240216_0447.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0100_migrate_all_notes'), - ('per', '0102_merge_20240216_0447'), + ("per", "0100_migrate_all_notes"), + ("per", "0102_merge_20240216_0447"), ] - operations = [ - ] + operations = [] diff --git a/per/migrations/0104_alter_overview_phase.py b/per/migrations/0104_alter_overview_phase.py index 6581758de..a34c34da2 100644 --- a/per/migrations/0104_alter_overview_phase.py +++ b/per/migrations/0104_alter_overview_phase.py @@ -6,13 +6,25 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0103_merge_0100_migrate_all_notes_0102_merge_20240216_0447'), + ("per", "0103_merge_0100_migrate_all_notes_0102_merge_20240216_0447"), ] operations = [ migrations.AlterField( - model_name='overview', - name='phase', - field=models.IntegerField(blank=True, choices=[(1, 'Orientation'), (2, 'Assessment'), (3, 'Prioritisation'), (4, 'WorkPlan'), (5, 'Action And Accountability')], default=1, null=True, verbose_name='phase'), + model_name="overview", + name="phase", + field=models.IntegerField( + blank=True, + choices=[ + (1, "Orientation"), + (2, "Assessment"), + (3, "Prioritisation"), + (4, "WorkPlan"), + (5, "Action And Accountability"), + ], + default=1, + null=True, + verbose_name="phase", + ), ), ] diff --git a/per/migrations/0105_formcomponent_has_question_group.py b/per/migrations/0105_formcomponent_has_question_group.py index d81b0a232..326a2d8b4 100644 --- a/per/migrations/0105_formcomponent_has_question_group.py +++ b/per/migrations/0105_formcomponent_has_question_group.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0104_alter_overview_phase'), + ("per", "0104_alter_overview_phase"), ] operations = [ migrations.AddField( - model_name='formcomponent', - name='has_question_group', - field=models.BooleanField(blank=True, null=True, verbose_name='Has Question Group'), + model_name="formcomponent", + name="has_question_group", + field=models.BooleanField(blank=True, null=True, verbose_name="Has Question Group"), ), ] diff --git a/per/migrations/0106_auto_20240314_1059.py b/per/migrations/0106_auto_20240314_1059.py index 8eb273076..6421dcd75 100644 --- a/per/migrations/0106_auto_20240314_1059.py +++ b/per/migrations/0106_auto_20240314_1059.py @@ -11,7 +11,7 @@ def update_component_question_group(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('per', '0105_formcomponent_has_question_group'), + ("per", "0105_formcomponent_has_question_group"), ] operations = [ diff --git a/per/migrations/0107_customperworkplancomponent_supported_by_organization_type.py b/per/migrations/0107_customperworkplancomponent_supported_by_organization_type.py index 1f24c68d8..c9837abac 100644 --- a/per/migrations/0107_customperworkplancomponent_supported_by_organization_type.py +++ b/per/migrations/0107_customperworkplancomponent_supported_by_organization_type.py @@ -6,13 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0106_auto_20240314_1059'), + ("per", "0106_auto_20240314_1059"), ] operations = [ migrations.AddField( - model_name='customperworkplancomponent', - name='supported_by_organization_type', - field=models.IntegerField(blank=True, choices=[(0, 'UN Organization'), (1, 'Private Sector'), (2, 'Government'), (3, 'National Society')], null=True, verbose_name='Supported By Organization Type'), + model_name="customperworkplancomponent", + name="supported_by_organization_type", + field=models.IntegerField( + blank=True, + choices=[(0, "UN Organization"), (1, "Private Sector"), (2, "Government"), (3, "National Society")], + null=True, + verbose_name="Supported By Organization Type", + ), ), ] diff --git a/per/migrations/0108_auto_20240320_0801.py b/per/migrations/0108_auto_20240320_0801.py index a65e4b201..bcbecd44b 100644 --- a/per/migrations/0108_auto_20240320_0801.py +++ b/per/migrations/0108_auto_20240320_0801.py @@ -2,20 +2,19 @@ from django.db import migrations + def update_suported_by_oragnization_type(apps, schema_editor): - # Update all the data with supported_by_organization_type=3 - CustomPerWorkPlanComponent = apps.get_model('per', 'CustomPerWorkPlanComponent') - CustomPerWorkPlanComponent.objects.update(supported_by_organization_type=3) + # Update all the data with supported_by_organization_type=3 + CustomPerWorkPlanComponent = apps.get_model("per", "CustomPerWorkPlanComponent") + CustomPerWorkPlanComponent.objects.update(supported_by_organization_type=3) + class Migration(migrations.Migration): dependencies = [ - ('per', '0107_customperworkplancomponent_supported_by_organization_type'), + ("per", "0107_customperworkplancomponent_supported_by_organization_type"), ] operations = [ - migrations.RunPython( - update_suported_by_oragnization_type, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(update_suported_by_oragnization_type, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0109_auto_20240320_0804.py b/per/migrations/0109_auto_20240320_0804.py index 9ed3b6a55..b44536310 100644 --- a/per/migrations/0109_auto_20240320_0804.py +++ b/per/migrations/0109_auto_20240320_0804.py @@ -2,21 +2,20 @@ from django.db import migrations + def update_description_to_null(apps, schema_editor): # delete description form component 34 and 14F - FormComponent = apps.get_model('per', 'FormComponent') + FormComponent = apps.get_model("per", "FormComponent") FormComponent.objects.filter(id=48).update(description=None) FormComponent.objects.filter(id=20).update(description=None) + class Migration(migrations.Migration): dependencies = [ - ('per', '0108_auto_20240320_0801'), + ("per", "0108_auto_20240320_0801"), ] operations = [ - migrations.RunPython( - update_description_to_null, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(update_description_to_null, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0110_auto_20240325_0611.py b/per/migrations/0110_auto_20240325_0611.py index 049e64a2f..bc8c7b436 100644 --- a/per/migrations/0110_auto_20240325_0611.py +++ b/per/migrations/0110_auto_20240325_0611.py @@ -2,8 +2,9 @@ from django.db import migrations + def update_description_to_null(apps, schema_editor): - FormComponent = apps.get_model('per', 'FormComponent') + FormComponent = apps.get_model("per", "FormComponent") FormComponent.objects.filter(id__in=[48, 20, 15]).update( description=None, description_en=None, @@ -16,12 +17,9 @@ def update_description_to_null(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('per', '0109_auto_20240320_0804'), + ("per", "0109_auto_20240320_0804"), ] operations = [ - migrations.RunPython( - update_description_to_null, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(update_description_to_null, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0111_perdocumentupload_per.py b/per/migrations/0111_perdocumentupload_per.py index a054914b9..2fd6b4dc4 100644 --- a/per/migrations/0111_perdocumentupload_per.py +++ b/per/migrations/0111_perdocumentupload_per.py @@ -1,19 +1,21 @@ # Generated by Django 3.2.25 on 2024-04-02 05:24 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0110_auto_20240325_0611'), + ("per", "0110_auto_20240325_0611"), ] operations = [ migrations.AddField( - model_name='perdocumentupload', - name='per', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.overview', verbose_name='Per'), + model_name="perdocumentupload", + name="per", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="per.overview", verbose_name="Per" + ), ), ] diff --git a/per/migrations/0112_auto_20240426_0522.py b/per/migrations/0112_auto_20240426_0522.py index 9fbcac83e..5cf80e3e6 100644 --- a/per/migrations/0112_auto_20240426_0522.py +++ b/per/migrations/0112_auto_20240426_0522.py @@ -2,21 +2,19 @@ from django.db import migrations + def delete_form_question(apps, schema_editor): - FormQuestion = apps.get_model('per', 'FormQuestion') - print(FormQuestion.objects.filter(question__icontains='Component Epidemic Preparedness').delete()) - print(FormQuestion.objects.filter(question__icontains='Component performance').delete()) + FormQuestion = apps.get_model("per", "FormQuestion") + print(FormQuestion.objects.filter(question__icontains="Component Epidemic Preparedness").delete()) + print(FormQuestion.objects.filter(question__icontains="Component performance").delete()) class Migration(migrations.Migration): dependencies = [ - ('per', '0111_perdocumentupload_per'), + ("per", "0111_perdocumentupload_per"), ] operations = [ - migrations.RunPython( - delete_form_question, - reverse_code=migrations.RunPython.noop - ), + migrations.RunPython(delete_form_question, reverse_code=migrations.RunPython.noop), ] diff --git a/per/migrations/0113_auto_20240521_0611.py b/per/migrations/0113_auto_20240521_0611.py index f7d0caa9d..94936edd6 100644 --- a/per/migrations/0113_auto_20240521_0611.py +++ b/per/migrations/0113_auto_20240521_0611.py @@ -6,188 +6,220 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0112_auto_20240426_0522'), + ("per", "0112_auto_20240426_0522"), ] operations = [ migrations.AddField( - model_name='formcomponentquestionandanswer', - name='notes_ar', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="formcomponentquestionandanswer", + name="notes_ar", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='notes_en', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="formcomponentquestionandanswer", + name="notes_en", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='notes_es', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="formcomponentquestionandanswer", + name="notes_es", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='notes_fr', - field=models.TextField(blank=True, null=True, verbose_name='notes'), + model_name="formcomponentquestionandanswer", + name="notes_fr", + field=models.TextField(blank=True, null=True, verbose_name="notes"), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="formcomponentquestionandanswer", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="formcomponentquestionandanswer", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='formcomponentresponse', - name='climate_environmental_considerations_ar', - field=models.TextField(blank=True, null=True, verbose_name='Climate Environmental Considerations'), + model_name="formcomponentresponse", + name="climate_environmental_considerations_ar", + field=models.TextField(blank=True, null=True, verbose_name="Climate Environmental Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='climate_environmental_considerations_en', - field=models.TextField(blank=True, null=True, verbose_name='Climate Environmental Considerations'), + model_name="formcomponentresponse", + name="climate_environmental_considerations_en", + field=models.TextField(blank=True, null=True, verbose_name="Climate Environmental Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='climate_environmental_considerations_es', - field=models.TextField(blank=True, null=True, verbose_name='Climate Environmental Considerations'), + model_name="formcomponentresponse", + name="climate_environmental_considerations_es", + field=models.TextField(blank=True, null=True, verbose_name="Climate Environmental Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='climate_environmental_considerations_fr', - field=models.TextField(blank=True, null=True, verbose_name='Climate Environmental Considerations'), + model_name="formcomponentresponse", + name="climate_environmental_considerations_fr", + field=models.TextField(blank=True, null=True, verbose_name="Climate Environmental Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='epi_considerations_ar', - field=models.TextField(blank=True, null=True, verbose_name='Epi Considerations'), + model_name="formcomponentresponse", + name="epi_considerations_ar", + field=models.TextField(blank=True, null=True, verbose_name="Epi Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='epi_considerations_en', - field=models.TextField(blank=True, null=True, verbose_name='Epi Considerations'), + model_name="formcomponentresponse", + name="epi_considerations_en", + field=models.TextField(blank=True, null=True, verbose_name="Epi Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='epi_considerations_es', - field=models.TextField(blank=True, null=True, verbose_name='Epi Considerations'), + model_name="formcomponentresponse", + name="epi_considerations_es", + field=models.TextField(blank=True, null=True, verbose_name="Epi Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='epi_considerations_fr', - field=models.TextField(blank=True, null=True, verbose_name='Epi Considerations'), + model_name="formcomponentresponse", + name="epi_considerations_fr", + field=models.TextField(blank=True, null=True, verbose_name="Epi Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='notes_ar', - field=models.TextField(blank=True, null=True, verbose_name='Notes'), + model_name="formcomponentresponse", + name="notes_ar", + field=models.TextField(blank=True, null=True, verbose_name="Notes"), ), migrations.AddField( - model_name='formcomponentresponse', - name='notes_en', - field=models.TextField(blank=True, null=True, verbose_name='Notes'), + model_name="formcomponentresponse", + name="notes_en", + field=models.TextField(blank=True, null=True, verbose_name="Notes"), ), migrations.AddField( - model_name='formcomponentresponse', - name='notes_es', - field=models.TextField(blank=True, null=True, verbose_name='Notes'), + model_name="formcomponentresponse", + name="notes_es", + field=models.TextField(blank=True, null=True, verbose_name="Notes"), ), migrations.AddField( - model_name='formcomponentresponse', - name='notes_fr', - field=models.TextField(blank=True, null=True, verbose_name='Notes'), + model_name="formcomponentresponse", + name="notes_fr", + field=models.TextField(blank=True, null=True, verbose_name="Notes"), ), migrations.AddField( - model_name='formcomponentresponse', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="formcomponentresponse", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='formcomponentresponse', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="formcomponentresponse", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='formcomponentresponse', - name='urban_considerations_ar', - field=models.TextField(blank=True, null=True, verbose_name='Urban Considerations'), + model_name="formcomponentresponse", + name="urban_considerations_ar", + field=models.TextField(blank=True, null=True, verbose_name="Urban Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='urban_considerations_en', - field=models.TextField(blank=True, null=True, verbose_name='Urban Considerations'), + model_name="formcomponentresponse", + name="urban_considerations_en", + field=models.TextField(blank=True, null=True, verbose_name="Urban Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='urban_considerations_es', - field=models.TextField(blank=True, null=True, verbose_name='Urban Considerations'), + model_name="formcomponentresponse", + name="urban_considerations_es", + field=models.TextField(blank=True, null=True, verbose_name="Urban Considerations"), ), migrations.AddField( - model_name='formcomponentresponse', - name='urban_considerations_fr', - field=models.TextField(blank=True, null=True, verbose_name='Urban Considerations'), + model_name="formcomponentresponse", + name="urban_considerations_fr", + field=models.TextField(blank=True, null=True, verbose_name="Urban Considerations"), ), migrations.AddField( - model_name='overview', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="overview", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='overview', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="overview", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='percomponentrating', - name='title_ar', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="percomponentrating", + name="title_ar", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='percomponentrating', - name='title_en', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="percomponentrating", + name="title_en", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='percomponentrating', - name='title_es', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="percomponentrating", + name="title_es", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='percomponentrating', - name='title_fr', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="percomponentrating", + name="title_fr", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='percomponentrating', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="percomponentrating", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='percomponentrating', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="percomponentrating", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='percomponentrating', - name='value_ar', - field=models.IntegerField(null=True, verbose_name='value'), + model_name="percomponentrating", + name="value_ar", + field=models.IntegerField(null=True, verbose_name="value"), ), migrations.AddField( - model_name='percomponentrating', - name='value_en', - field=models.IntegerField(null=True, verbose_name='value'), + model_name="percomponentrating", + name="value_en", + field=models.IntegerField(null=True, verbose_name="value"), ), migrations.AddField( - model_name='percomponentrating', - name='value_es', - field=models.IntegerField(null=True, verbose_name='value'), + model_name="percomponentrating", + name="value_es", + field=models.IntegerField(null=True, verbose_name="value"), ), migrations.AddField( - model_name='percomponentrating', - name='value_fr', - field=models.IntegerField(null=True, verbose_name='value'), + model_name="percomponentrating", + name="value_fr", + field=models.IntegerField(null=True, verbose_name="value"), ), ] diff --git a/per/migrations/0114_auto_20240521_0801.py b/per/migrations/0114_auto_20240521_0801.py index 7fe9447de..6d837cfa6 100644 --- a/per/migrations/0114_auto_20240521_0801.py +++ b/per/migrations/0114_auto_20240521_0801.py @@ -1,74 +1,122 @@ # Generated by Django 3.2.25 on 2024-05-21 08:01 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('per', '0113_auto_20240521_0611'), + ("per", "0113_auto_20240521_0611"), ] operations = [ migrations.AddField( - model_name='arearesponse', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="arearesponse", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='arearesponse', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="arearesponse", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='answer_ar', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formanswer', verbose_name='answer'), + model_name="formcomponentquestionandanswer", + name="answer_ar", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="per.formanswer", verbose_name="answer" + ), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='answer_en', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formanswer', verbose_name='answer'), + model_name="formcomponentquestionandanswer", + name="answer_en", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="per.formanswer", verbose_name="answer" + ), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='answer_es', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formanswer', verbose_name='answer'), + model_name="formcomponentquestionandanswer", + name="answer_es", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="per.formanswer", verbose_name="answer" + ), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='answer_fr', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formanswer', verbose_name='answer'), + model_name="formcomponentquestionandanswer", + name="answer_fr", + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="per.formanswer", verbose_name="answer" + ), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='question_ar', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formquestion', verbose_name='question'), + model_name="formcomponentquestionandanswer", + name="question_ar", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="per.formquestion", + verbose_name="question", + ), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='question_en', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formquestion', verbose_name='question'), + model_name="formcomponentquestionandanswer", + name="question_en", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="per.formquestion", + verbose_name="question", + ), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='question_es', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formquestion', verbose_name='question'), + model_name="formcomponentquestionandanswer", + name="question_es", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="per.formquestion", + verbose_name="question", + ), ), migrations.AddField( - model_name='formcomponentquestionandanswer', - name='question_fr', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='per.formquestion', verbose_name='question'), + model_name="formcomponentquestionandanswer", + name="question_fr", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="per.formquestion", + verbose_name="question", + ), ), migrations.AddField( - model_name='perassessment', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="perassessment", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='perassessment', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="perassessment", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/per/migrations/0115_auto_20240521_0813.py b/per/migrations/0115_auto_20240521_0813.py index 6b9ee17ce..114856c6c 100644 --- a/per/migrations/0115_auto_20240521_0813.py +++ b/per/migrations/0115_auto_20240521_0813.py @@ -6,24 +6,24 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0114_auto_20240521_0801'), + ("per", "0114_auto_20240521_0801"), ] operations = [ migrations.RemoveField( - model_name='percomponentrating', - name='value_ar', + model_name="percomponentrating", + name="value_ar", ), migrations.RemoveField( - model_name='percomponentrating', - name='value_en', + model_name="percomponentrating", + name="value_en", ), migrations.RemoveField( - model_name='percomponentrating', - name='value_es', + model_name="percomponentrating", + name="value_es", ), migrations.RemoveField( - model_name='percomponentrating', - name='value_fr', + model_name="percomponentrating", + name="value_fr", ), ] diff --git a/per/migrations/0116_auto_20240521_0815.py b/per/migrations/0116_auto_20240521_0815.py index 6bf437c3a..342227a9f 100644 --- a/per/migrations/0116_auto_20240521_0815.py +++ b/per/migrations/0116_auto_20240521_0815.py @@ -6,40 +6,40 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0115_auto_20240521_0813'), + ("per", "0115_auto_20240521_0813"), ] operations = [ migrations.RemoveField( - model_name='formcomponentquestionandanswer', - name='answer_ar', + model_name="formcomponentquestionandanswer", + name="answer_ar", ), migrations.RemoveField( - model_name='formcomponentquestionandanswer', - name='answer_en', + model_name="formcomponentquestionandanswer", + name="answer_en", ), migrations.RemoveField( - model_name='formcomponentquestionandanswer', - name='answer_es', + model_name="formcomponentquestionandanswer", + name="answer_es", ), migrations.RemoveField( - model_name='formcomponentquestionandanswer', - name='answer_fr', + model_name="formcomponentquestionandanswer", + name="answer_fr", ), migrations.RemoveField( - model_name='formcomponentquestionandanswer', - name='question_ar', + model_name="formcomponentquestionandanswer", + name="question_ar", ), migrations.RemoveField( - model_name='formcomponentquestionandanswer', - name='question_en', + model_name="formcomponentquestionandanswer", + name="question_en", ), migrations.RemoveField( - model_name='formcomponentquestionandanswer', - name='question_es', + model_name="formcomponentquestionandanswer", + name="question_es", ), migrations.RemoveField( - model_name='formcomponentquestionandanswer', - name='question_fr', + model_name="formcomponentquestionandanswer", + name="question_fr", ), ] diff --git a/per/migrations/0117_auto_20240522_0529.py b/per/migrations/0117_auto_20240522_0529.py index a6d43f737..8058fae47 100644 --- a/per/migrations/0117_auto_20240522_0529.py +++ b/per/migrations/0117_auto_20240522_0529.py @@ -6,32 +6,32 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0116_auto_20240521_0815'), + ("per", "0116_auto_20240521_0815"), ] operations = [ migrations.RemoveField( - model_name='percomponentrating', - name='title_ar', + model_name="percomponentrating", + name="title_ar", ), migrations.RemoveField( - model_name='percomponentrating', - name='title_en', + model_name="percomponentrating", + name="title_en", ), migrations.RemoveField( - model_name='percomponentrating', - name='title_es', + model_name="percomponentrating", + name="title_es", ), migrations.RemoveField( - model_name='percomponentrating', - name='title_fr', + model_name="percomponentrating", + name="title_fr", ), migrations.RemoveField( - model_name='percomponentrating', - name='translation_module_original_language', + model_name="percomponentrating", + name="translation_module_original_language", ), migrations.RemoveField( - model_name='percomponentrating', - name='translation_module_skip_auto_translation', + model_name="percomponentrating", + name="translation_module_skip_auto_translation", ), ] diff --git a/per/migrations/0118_customperworkplancomponent_actions_ar_and_more.py b/per/migrations/0118_customperworkplancomponent_actions_ar_and_more.py index d39473920..fa21df0d4 100644 --- a/per/migrations/0118_customperworkplancomponent_actions_ar_and_more.py +++ b/per/migrations/0118_customperworkplancomponent_actions_ar_and_more.py @@ -6,98 +6,122 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0117_auto_20240522_0529'), + ("per", "0117_auto_20240522_0529"), ] operations = [ migrations.AddField( - model_name='customperworkplancomponent', - name='actions_ar', - field=models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions'), + model_name="customperworkplancomponent", + name="actions_ar", + field=models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions"), ), migrations.AddField( - model_name='customperworkplancomponent', - name='actions_en', - field=models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions'), + model_name="customperworkplancomponent", + name="actions_en", + field=models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions"), ), migrations.AddField( - model_name='customperworkplancomponent', - name='actions_es', - field=models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions'), + model_name="customperworkplancomponent", + name="actions_es", + field=models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions"), ), migrations.AddField( - model_name='customperworkplancomponent', - name='actions_fr', - field=models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions'), + model_name="customperworkplancomponent", + name="actions_fr", + field=models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions"), ), migrations.AddField( - model_name='customperworkplancomponent', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="customperworkplancomponent", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='customperworkplancomponent', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="customperworkplancomponent", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='formprioritizationcomponent', - name='justification_text_ar', - field=models.TextField(blank=True, null=True, verbose_name='Justification Text'), + model_name="formprioritizationcomponent", + name="justification_text_ar", + field=models.TextField(blank=True, null=True, verbose_name="Justification Text"), ), migrations.AddField( - model_name='formprioritizationcomponent', - name='justification_text_en', - field=models.TextField(blank=True, null=True, verbose_name='Justification Text'), + model_name="formprioritizationcomponent", + name="justification_text_en", + field=models.TextField(blank=True, null=True, verbose_name="Justification Text"), ), migrations.AddField( - model_name='formprioritizationcomponent', - name='justification_text_es', - field=models.TextField(blank=True, null=True, verbose_name='Justification Text'), + model_name="formprioritizationcomponent", + name="justification_text_es", + field=models.TextField(blank=True, null=True, verbose_name="Justification Text"), ), migrations.AddField( - model_name='formprioritizationcomponent', - name='justification_text_fr', - field=models.TextField(blank=True, null=True, verbose_name='Justification Text'), + model_name="formprioritizationcomponent", + name="justification_text_fr", + field=models.TextField(blank=True, null=True, verbose_name="Justification Text"), ), migrations.AddField( - model_name='formprioritizationcomponent', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="formprioritizationcomponent", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='formprioritizationcomponent', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="formprioritizationcomponent", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), migrations.AddField( - model_name='perworkplancomponent', - name='actions_ar', - field=models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions'), + model_name="perworkplancomponent", + name="actions_ar", + field=models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions"), ), migrations.AddField( - model_name='perworkplancomponent', - name='actions_en', - field=models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions'), + model_name="perworkplancomponent", + name="actions_en", + field=models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions"), ), migrations.AddField( - model_name='perworkplancomponent', - name='actions_es', - field=models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions'), + model_name="perworkplancomponent", + name="actions_es", + field=models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions"), ), migrations.AddField( - model_name='perworkplancomponent', - name='actions_fr', - field=models.TextField(blank=True, max_length=900, null=True, verbose_name='Actions'), + model_name="perworkplancomponent", + name="actions_fr", + field=models.TextField(blank=True, max_length=900, null=True, verbose_name="Actions"), ), migrations.AddField( - model_name='perworkplancomponent', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="perworkplancomponent", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='perworkplancomponent', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="perworkplancomponent", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/per/migrations/0118_percomponentrating_title_ar_and_more.py b/per/migrations/0118_percomponentrating_title_ar_and_more.py index bf002f20c..b7db9431a 100644 --- a/per/migrations/0118_percomponentrating_title_ar_and_more.py +++ b/per/migrations/0118_percomponentrating_title_ar_and_more.py @@ -6,38 +6,46 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0117_auto_20240522_0529'), + ("per", "0117_auto_20240522_0529"), ] operations = [ migrations.AddField( - model_name='percomponentrating', - name='title_ar', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="percomponentrating", + name="title_ar", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='percomponentrating', - name='title_en', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="percomponentrating", + name="title_en", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='percomponentrating', - name='title_es', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="percomponentrating", + name="title_es", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='percomponentrating', - name='title_fr', - field=models.CharField(max_length=250, null=True, verbose_name='title'), + model_name="percomponentrating", + name="title_fr", + field=models.CharField(max_length=250, null=True, verbose_name="title"), ), migrations.AddField( - model_name='percomponentrating', - name='translation_module_original_language', - field=models.CharField(choices=[('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('ar', 'Arabic')], default='en', help_text='Language used to create this entity', max_length=2, verbose_name='Entity Original language'), + model_name="percomponentrating", + name="translation_module_original_language", + field=models.CharField( + choices=[("en", "English"), ("es", "Spanish"), ("fr", "French"), ("ar", "Arabic")], + default="en", + help_text="Language used to create this entity", + max_length=2, + verbose_name="Entity Original language", + ), ), migrations.AddField( - model_name='percomponentrating', - name='translation_module_skip_auto_translation', - field=models.BooleanField(default=False, help_text='Skip auto translation operation for this entity?', verbose_name='Skip auto translation'), + model_name="percomponentrating", + name="translation_module_skip_auto_translation", + field=models.BooleanField( + default=False, help_text="Skip auto translation operation for this entity?", verbose_name="Skip auto translation" + ), ), ] diff --git a/per/migrations/0119_merge_20240524_0548.py b/per/migrations/0119_merge_20240524_0548.py index 7a83dba21..c60ef1aae 100644 --- a/per/migrations/0119_merge_20240524_0548.py +++ b/per/migrations/0119_merge_20240524_0548.py @@ -6,9 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('per', '0118_customperworkplancomponent_actions_ar_and_more'), - ('per', '0118_percomponentrating_title_ar_and_more'), + ("per", "0118_customperworkplancomponent_actions_ar_and_more"), + ("per", "0118_percomponentrating_title_ar_and_more"), ] - operations = [ - ] + operations = [] diff --git a/per/models.py b/per/models.py index 50ef67a49..48ba5bf35 100644 --- a/per/models.py +++ b/per/models.py @@ -1,9 +1,10 @@ import reversion -from api.models import Country, Appeal -from django.db import models from django.conf import settings +from django.db import models from django.utils.translation import gettext_lazy as _ from tinymce.models import HTMLField + +from api.models import Appeal, Country from deployments.models import SectorTag @@ -73,9 +74,7 @@ def __str__(self): @reversion.register() class FormComponentQuestionAndAnswer(models.Model): - question = models.ForeignKey( - "FormQuestion", verbose_name=_("question"), null=True, blank=True, on_delete=models.SET_NULL - ) + question = models.ForeignKey("FormQuestion", verbose_name=_("question"), null=True, blank=True, on_delete=models.SET_NULL) answer = models.ForeignKey("FormAnswer", verbose_name=_("answer"), null=True, blank=True, on_delete=models.SET_NULL) notes = models.TextField(verbose_name=_("notes"), null=True, blank=True) @@ -94,31 +93,14 @@ class FormComponentStatus(models.TextChoices): area = models.ForeignKey(FormArea, verbose_name=_("area"), on_delete=models.PROTECT) title = models.CharField(verbose_name=_("title"), max_length=250) component_num = models.IntegerField(verbose_name=_("component number"), default=1) - component_letter = models.CharField( - verbose_name=_("component letter"), - max_length=3, - null=True, blank=True - ) + component_letter = models.CharField(verbose_name=_("component letter"), max_length=3, null=True, blank=True) description = models.TextField(verbose_name=_("description"), null=True, blank=True) status = models.CharField( - verbose_name=_("status"), - max_length=100, - choices=FormComponentStatus.choices, - null=True, blank=True - ) - question_responses = models.ManyToManyField( - FormComponentQuestionAndAnswer, - verbose_name=_("Question responses"), - blank=True - ) - is_parent = models.BooleanField( - verbose_name=_('Is parent'), - null=True, blank=True - ) - has_question_group = models.BooleanField( - verbose_name=_('Has Question Group'), - null=True, blank=True + verbose_name=_("status"), max_length=100, choices=FormComponentStatus.choices, null=True, blank=True ) + question_responses = models.ManyToManyField(FormComponentQuestionAndAnswer, verbose_name=_("Question responses"), blank=True) + is_parent = models.BooleanField(verbose_name=_("Is parent"), null=True, blank=True) + has_question_group = models.BooleanField(verbose_name=_("Has Question Group"), null=True, blank=True) def __str__(self): return f"Component {self.component_num} - {self.title}" @@ -145,9 +127,7 @@ class FormComponentResponse(models.Model): null=True, blank=True, ) - question_responses = models.ManyToManyField( - FormComponentQuestionAndAnswer, verbose_name=_("Question responses"), blank=True - ) + question_responses = models.ManyToManyField(FormComponentQuestionAndAnswer, verbose_name=_("Question responses"), blank=True) # consideration_responses fields urban_considerations = models.TextField(verbose_name=_("Urban Considerations"), null=True, blank=True) epi_considerations = models.TextField(verbose_name=_("Epi Considerations"), null=True, blank=True) @@ -159,11 +139,7 @@ class FormComponentResponse(models.Model): @reversion.register() class AreaResponse(models.Model): - area = models.ForeignKey( - FormArea, - verbose_name=_("Area"), - on_delete=models.CASCADE - ) + area = models.ForeignKey(FormArea, verbose_name=_("Area"), on_delete=models.CASCADE) component_response = models.ManyToManyField( FormComponentResponse, verbose_name=_("Component Response"), @@ -180,12 +156,7 @@ class PerAssessment(models.Model): blank=True, null=True, ) - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - verbose_name=_("user"), - null=True, blank=True, - on_delete=models.SET_NULL - ) + user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("user"), null=True, blank=True, on_delete=models.SET_NULL) area_responses = models.ManyToManyField( AreaResponse, verbose_name=_("Area Response"), @@ -217,7 +188,7 @@ def __str__(self): class FormQuestionGroup(models.Model): component = models.ForeignKey(FormComponent, verbose_name=_("component"), on_delete=models.PROTECT) title = models.CharField(verbose_name=_("title"), max_length=250) - description = models.TextField(verbose_name=_('description'), null=True, blank=True) + description = models.TextField(verbose_name=_("description"), null=True, blank=True) def __str__(self): return self.title @@ -228,11 +199,7 @@ class FormQuestion(models.Model): """PER Form individual questions inside Components""" component = models.ForeignKey(FormComponent, verbose_name=_("component"), on_delete=models.PROTECT) - question_group = models.ForeignKey( - FormQuestionGroup, - null=True, blank=True, - on_delete=models.SET_NULL - ) + question_group = models.ForeignKey(FormQuestionGroup, null=True, blank=True, on_delete=models.SET_NULL) question = models.CharField(verbose_name=_("question"), max_length=500) description = HTMLField(verbose_name=_("description"), null=True, blank=True) question_num = models.IntegerField(verbose_name=_("question number"), null=True, blank=True) @@ -304,22 +271,11 @@ class AssessmentMethod(models.TextChoices): WPNS = "wpns", _("WPNS") country = models.ForeignKey( - Country, - verbose_name=_("country"), - related_name="per_overviews", - null=True, - blank=True, - on_delete=models.SET_NULL + Country, verbose_name=_("country"), related_name="per_overviews", null=True, blank=True, on_delete=models.SET_NULL ) created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) updated_at = models.DateTimeField(verbose_name=_("updated at"), auto_now=True) - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - verbose_name=_("user"), - null=True, - blank=True, - on_delete=models.SET_NULL - ) + user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("user"), null=True, blank=True, on_delete=models.SET_NULL) # Orientation date_of_orientation = models.DateField(verbose_name=_("Date of Orientation"), null=True, blank=True) @@ -378,15 +334,11 @@ class AssessmentMethod(models.TextChoices): facilitator_name = models.CharField(verbose_name=_("facilitator name"), max_length=90, null=True, blank=True) facilitator_email = models.CharField(verbose_name=_("facilitator email"), max_length=90, null=True, blank=True) facilitator_phone = models.CharField(verbose_name=_("facilitator phone"), max_length=90, null=True, blank=True) - facilitator_contact = models.CharField( - verbose_name=_("facilitator other contacts"), max_length=90, null=True, blank=True - ) + facilitator_contact = models.CharField(verbose_name=_("facilitator other contacts"), max_length=90, null=True, blank=True) ns_focal_point_name = models.CharField(verbose_name=_("ns focal point name"), max_length=90, null=True, blank=True) ns_focal_point_email = models.CharField(verbose_name=_("ns focal point email"), max_length=90, null=True, blank=True) ns_focal_point_phone = models.CharField(verbose_name=_("ns focal point phone"), max_length=90, null=True, blank=True) - partner_focal_point_name = models.CharField( - verbose_name=_("partner focal point name"), max_length=90, null=True, blank=True - ) + partner_focal_point_name = models.CharField(verbose_name=_("partner focal point name"), max_length=90, null=True, blank=True) partner_focal_point_email = models.CharField( verbose_name=_("partner focal point email"), max_length=90, null=True, blank=True ) @@ -407,9 +359,7 @@ class AssessmentMethod(models.TextChoices): ) # phase calculation - phase = models.IntegerField( - verbose_name=_("phase"), choices=Phase.choices, null=True, blank=True, default=Phase.ORIENTATION - ) + phase = models.IntegerField(verbose_name=_("phase"), choices=Phase.choices, null=True, blank=True, default=Phase.ORIENTATION) # Added to track the draft overview is_draft = models.BooleanField( @@ -490,12 +440,8 @@ class Form(models.Model): """Individually submitted PER Forms""" area = models.ForeignKey(FormArea, verbose_name=_("area"), null=True, on_delete=models.PROTECT) - user = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_("user"), null=True, blank=True, on_delete=models.SET_NULL - ) - overview = models.ForeignKey( - Overview, verbose_name=_("overview"), related_name="forms", null=True, on_delete=models.CASCADE - ) + user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("user"), null=True, blank=True, on_delete=models.SET_NULL) + overview = models.ForeignKey(Overview, verbose_name=_("overview"), related_name="forms", null=True, on_delete=models.CASCADE) created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True, auto_now=False) updated_at = models.DateTimeField(verbose_name=_("updated at"), auto_now=True) comment = models.TextField(verbose_name=_("comment"), null=True, blank=True) # form level comment @@ -569,9 +515,7 @@ class WorkPlan(models.Model): country = models.ForeignKey(Country, verbose_name=_("country"), null=True, blank=True, on_delete=models.SET_NULL) code = models.CharField(verbose_name=_("code"), max_length=10, null=True, blank=True) question_id = models.CharField(verbose_name=_("question id"), max_length=10, null=True, blank=True) - user = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_("user"), null=True, blank=True, on_delete=models.SET_NULL - ) + user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("user"), null=True, blank=True, on_delete=models.SET_NULL) class Meta: ordering = ("prioritization", "country") @@ -608,9 +552,7 @@ class NiceDocument(models.Model): country = models.ForeignKey( Country, verbose_name=_("country"), related_name="perdoc_country", null=True, blank=True, on_delete=models.SET_NULL ) - visibility = models.IntegerField( - choices=Visibilities.choices, verbose_name=_("visibility"), default=Visibilities.VISIBLE - ) + visibility = models.IntegerField(choices=Visibilities.choices, verbose_name=_("visibility"), default=Visibilities.VISIBLE) class Meta: ordering = ("visibility", "country") @@ -631,10 +573,10 @@ class PerWorkPlanStatus(models.IntegerChoices): class PerWorkPlanComponent(models.Model): class SupportedByOrganizationType(models.IntegerChoices): - UN_ORGANIZATION = 0, _('UN Organization') - PRIVATE_SECTOR = 1, _('Private Sector') - GOVERNMENT = 2, _('Government') - NATIONAL_SOCIETY = 3, _('National Society') + UN_ORGANIZATION = 0, _("UN Organization") + PRIVATE_SECTOR = 1, _("Private Sector") + GOVERNMENT = 2, _("Government") + NATIONAL_SOCIETY = 3, _("National Society") component = models.ForeignKey( FormComponent, @@ -702,55 +644,54 @@ def __str__(self): class LearningType(models.IntegerChoices): - LESSON_LEARNED = 1, _('Lesson learned') - CHALLENGE = 2, _('Challenge') + LESSON_LEARNED = 1, _("Lesson learned") + CHALLENGE = 2, _("Challenge") @reversion.register( follow=( - 'appeal_code', - 'organization', - 'sector', - 'per_component', - 'organization_validated', - 'sector_validated', - 'per_component_validated' + "appeal_code", + "organization", + "sector", + "per_component", + "organization_validated", + "sector_validated", + "per_component_validated", ) ) class OpsLearning(models.Model): learning = models.TextField(verbose_name=_("learning"), null=True, blank=True) learning_validated = models.TextField(verbose_name=_("learning (validated)"), null=True, blank=True) appeal_code = models.ForeignKey( - Appeal, to_field="code", db_column="appeal_code", - verbose_name=_('appeal (MDR) code'), null=True, blank=True, - on_delete=models.SET_NULL + Appeal, + to_field="code", + db_column="appeal_code", + verbose_name=_("appeal (MDR) code"), + null=True, + blank=True, + on_delete=models.SET_NULL, ) appeal_document_id = models.IntegerField(verbose_name=_("Appeal document ID"), null=True, blank=True) type = models.IntegerField(verbose_name=_("type"), choices=LearningType.choices, default=LearningType.LESSON_LEARNED) type_validated = models.IntegerField( - verbose_name=_("type (validated)"), choices=LearningType.choices, - default=LearningType.LESSON_LEARNED + verbose_name=_("type (validated)"), choices=LearningType.choices, default=LearningType.LESSON_LEARNED ) organization = models.ManyToManyField( - OrganizationTypes, related_name="organizations", - verbose_name=_("Organizations"), blank=True + OrganizationTypes, related_name="organizations", verbose_name=_("Organizations"), blank=True ) organization_validated = models.ManyToManyField( - OrganizationTypes, related_name="validated_organizations", - verbose_name=_("Organizations (validated)"), blank=True + OrganizationTypes, related_name="validated_organizations", verbose_name=_("Organizations (validated)"), blank=True ) sector = models.ManyToManyField(SectorTag, related_name="sectors", verbose_name=_("Sectors"), blank=True) sector_validated = models.ManyToManyField( - SectorTag, related_name="validated_sectors", - verbose_name=_("Sectors (validated)"), blank=True + SectorTag, related_name="validated_sectors", verbose_name=_("Sectors (validated)"), blank=True ) per_component = models.ManyToManyField(FormComponent, related_name="components", verbose_name=_("PER Components"), blank=True) per_component_validated = models.ManyToManyField( - FormComponent, related_name="validated_components", - verbose_name=_("PER Components (validated)"), blank=True + FormComponent, related_name="validated_components", verbose_name=_("PER Components (validated)"), blank=True ) is_validated = models.BooleanField(verbose_name=_("is validated?"), default=False) - modified_at = models.DateTimeField(verbose_name=_('modified_at'), auto_now=True) + modified_at = models.DateTimeField(verbose_name=_("modified_at"), auto_now=True) created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) class Meta: @@ -765,22 +706,21 @@ def __str__(self): @staticmethod def is_user_admin(user): return ( - user is not None and - not user.is_anonymous and - ( - user.is_superuser or - user.groups.filter(name="OpsLearning Admin").exists() - ) + user is not None + and not user.is_anonymous + and (user.is_superuser or user.groups.filter(name="OpsLearning Admin").exists()) ) def save(self, *args, **kwargs): if self.is_validated and self.id: - if self.learning_validated is None \ - and self.type_validated == LearningType.LESSON_LEARNED.value \ - and self.organization_validated.count() == 0 \ - and self.sector_validated.count() == 0 \ - and self.per_component_validated.count() == 0: + if ( + self.learning_validated is None + and self.type_validated == LearningType.LESSON_LEARNED.value + and self.organization_validated.count() == 0 + and self.sector_validated.count() == 0 + and self.per_component_validated.count() == 0 + ): self.learning_validated = self.learning self.type_validated = self.type @@ -802,22 +742,9 @@ class PerDocumentUpload(models.Model): on_delete=models.SET_NULL, null=True, ) - country = models.ForeignKey( - Country, - verbose_name=_('country'), - on_delete=models.CASCADE - ) - created_at = models.DateTimeField( - verbose_name=_("created at"), - auto_now_add=True - ) - per = models.ForeignKey( - Overview, - verbose_name=_('Per'), - on_delete=models.SET_NULL, - null=True, - blank=True - ) + country = models.ForeignKey(Country, verbose_name=_("country"), on_delete=models.CASCADE) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + per = models.ForeignKey(Overview, verbose_name=_("Per"), on_delete=models.SET_NULL, null=True, blank=True) def __str__(self): - return f'{self.country.name} - {self.created_by} - {self.per_id}' + return f"{self.country.name} - {self.created_by} - {self.per_id}" diff --git a/per/permissions.py b/per/permissions.py index ca43156b6..8493bfc43 100644 --- a/per/permissions.py +++ b/per/permissions.py @@ -1,5 +1,4 @@ from django.contrib.auth.models import Permission - from rest_framework import permissions from api.models import Region @@ -65,10 +64,7 @@ class OpsLearningPermission(permissions.BasePermission): message = "You don't have permission for Ops Learning records" def has_permission(self, request, view): - if ( - request.method in permissions.SAFE_METHODS or - OpsLearning.is_user_admin(request.user) - ): + if request.method in permissions.SAFE_METHODS or OpsLearning.is_user_admin(request.user): return True return False @@ -86,19 +82,19 @@ def has_object_permission(self, request, view, obj): # Check if country admin per_admin_country_id = [ - codename.replace('per_country_admin_', '') + codename.replace("per_country_admin_", "") for codename in Permission.objects.filter( group__user=user, - codename__startswith='per_country_admin_', - ).values_list('codename', flat=True) + codename__startswith="per_country_admin_", + ).values_list("codename", flat=True) ] per_admin_country_id = list(map(int, per_admin_country_id)) per_admin_region_id = [ - codename.replace('per_region_admin_', '') + codename.replace("per_region_admin_", "") for codename in Permission.objects.filter( group__user=user, - codename__startswith='per_region_admin_', - ).values_list('codename', flat=True) + codename__startswith="per_region_admin_", + ).values_list("codename", flat=True) ] per_admin_region_id = list(map(int, per_admin_region_id)) if country_id in per_admin_country_id or region_id in per_admin_region_id: diff --git a/per/serializers.py b/per/serializers.py index cb22639ef..37be8d3d1 100644 --- a/per/serializers.py +++ b/per/serializers.py @@ -1,51 +1,53 @@ import typing -from rest_framework import serializers -from django.utils.translation import gettext -from django.contrib.auth.models import User + +from django.contrib.auth.models import Permission, User from django.db import models -from django.contrib.auth.models import Permission +from django.utils.translation import gettext +from drf_spectacular.utils import extend_schema_field +from rest_framework import serializers -from api.models import Region, Appeal, Country -from api.serializers import RegoCountrySerializer, UserNameSerializer +from api.models import Appeal, Country, Region +from api.serializers import ( + MiniCountrySerializer, + RegoCountrySerializer, + UserNameSerializer, +) from lang.serializers import ModelSerializer +from main.settings import SEP + +# from .admin_classes import RegionRestrictedAdmin +from main.writable_nested_serializers import NestedCreateMixin, NestedUpdateMixin +from utils.file_check import validate_file_type + from .models import ( + AreaResponse, + AssessmentType, + CustomPerWorkPlanComponent, Form, + FormAnswer, FormArea, FormComponent, - FormQuestion, - FormAnswer, + FormComponentQuestionAndAnswer, + FormComponentResponse, FormData, - NSPhase, - WorkPlan, + FormPrioritization, + FormPrioritizationComponent, + FormQuestion, + FormQuestionGroup, LearningType, + NiceDocument, + NSPhase, OpsLearning, Overview, - NiceDocument, - AssessmentType, - PerWorkPlan, - PerWorkPlanComponent, - FormPrioritization, - FormPrioritizationComponent, PerAssessment, - AreaResponse, - FormComponentQuestionAndAnswer, - FormComponentResponse, - CustomPerWorkPlanComponent, - PerFile, PerComponentRating, PerDocumentUpload, - FormQuestionGroup -) -from api.serializers import ( - MiniCountrySerializer, + PerFile, + PerWorkPlan, + PerWorkPlanComponent, + WorkPlan, ) -# from .admin_classes import RegionRestrictedAdmin -from main.writable_nested_serializers import NestedUpdateMixin, NestedCreateMixin -from drf_spectacular.utils import extend_schema_field -from main.settings import SEP -from utils.file_check import validate_file_type - def check_draft_change( instance, @@ -84,16 +86,7 @@ class FormComponentSerializer(NestedCreateMixin, NestedUpdateMixin, ModelSeriali class Meta: model = FormComponent - fields = ( - "id", - "title", - "component_num", - "description", - "area", - "component_letter", - "is_parent", - "has_question_group" - ) + fields = ("id", "title", "component_num", "description", "area", "component_letter", "is_parent", "has_question_group") class FormAnswerSerializer(ModelSerializer): @@ -119,26 +112,13 @@ class FormQuestionSerializer(ModelSerializer): class Meta: model = FormQuestion - fields = ( - "component", - "question", - "question_num", - "answers", - "description", - "id", - "question_group" - ) + fields = ("component", "question", "question_num", "answers", "description", "id", "question_group") class MiniFormQuestionSerializer(serializers.ModelSerializer): class Meta: model = FormQuestion - fields = ( - "component", - "question", - "id", - "question_group" - ) + fields = ("component", "question", "id", "question_group") class MiniQuestionSerailizer(serializers.ModelSerializer): @@ -360,55 +340,53 @@ def get_assessment_ratings(self, overview): # Check if country admin per_admin_country_id = [ - codename.replace('per_country_admin_', '') + codename.replace("per_country_admin_", "") for codename in Permission.objects.filter( group__user=user, - codename__startswith='per_country_admin_', - ).values_list('codename', flat=True) + codename__startswith="per_country_admin_", + ).values_list("codename", flat=True) ] per_admin_country_id = list(map(int, per_admin_country_id)) per_admin_region_id = [ - codename.replace('per_region_admin_', '') + codename.replace("per_region_admin_", "") for codename in Permission.objects.filter( group__user=user, - codename__startswith='per_region_admin_', - ).values_list('codename', flat=True) + codename__startswith="per_region_admin_", + ).values_list("codename", flat=True) ] per_admin_region_id = list(map(int, per_admin_region_id)) - if country_id in per_admin_country_id or region_id in per_admin_region_id or user.is_superuser or user.has_perm("api.per_core_admin"): + if ( + country_id in per_admin_country_id + or region_id in per_admin_region_id + or user.is_superuser + or user.has_perm("api.per_core_admin") + ): # NOTE: rating_id=1 means Not Reviewed as defined in per/fixtures/componentratings.json filters = ~models.Q( - models.Q(area_responses__component_response__rating__isnull=True) | - models.Q(area_responses__component_response__rating_id=1), + models.Q(area_responses__component_response__rating__isnull=True) + | models.Q(area_responses__component_response__rating_id=1), ) - qs = ( - PerAssessment.objects.filter( - overview__country_id=country_id, - ).annotate( + qs = PerAssessment.objects.filter( + overview__country_id=country_id, + ).annotate( average_rating=models.Avg( "area_responses__component_response__rating__value", filter=filters, ), - date_of_assessment=models.F("overview__date_of_assessment"), - assessment_number=models.F("overview__assessment_number"), - ) + date_of_assessment=models.F("overview__date_of_assessment"), + assessment_number=models.F("overview__assessment_number"), ) return AssessmentRatingSerializer(qs, many=True).data return None -class PerWorkPlanComponentSerializer( - NestedCreateMixin, - NestedUpdateMixin, - ModelSerializer -): +class PerWorkPlanComponentSerializer(NestedCreateMixin, NestedUpdateMixin, ModelSerializer): component_details = FormComponentSerializer(source="component", read_only=True) status_display = serializers.CharField(source="get_status_display", read_only=True) supported_by_details = MiniCountrySerializer(source="supported_by", read_only=True) supported_by_organization_type_details = serializers.CharField( - source="get_supported_by_organization_type_display", - read_only=True + source="get_supported_by_organization_type_display", read_only=True ) class Meta: @@ -424,18 +402,13 @@ class Meta: "component_details", "supported_by_details", "supported_by_organization_type", - "supported_by_organization_type_details" + "supported_by_organization_type_details", ) -class CustomPerWorkPlanComponentSerializer( - NestedCreateMixin, - NestedUpdateMixin, - ModelSerializer -): +class CustomPerWorkPlanComponentSerializer(NestedCreateMixin, NestedUpdateMixin, ModelSerializer): supported_by_organization_type_details = serializers.CharField( - source="get_supported_by_organization_type_display", - read_only=True + source="get_supported_by_organization_type_display", read_only=True ) class Meta: @@ -458,11 +431,7 @@ class Meta: ) -class PerWorkPlanSerializer( - NestedCreateMixin, - NestedUpdateMixin, - ModelSerializer -): +class PerWorkPlanSerializer(NestedCreateMixin, NestedUpdateMixin, ModelSerializer): prioritized_action_responses = PerWorkPlanComponentSerializer(many=True, required=False) additional_action_responses = CustomPerWorkPlanComponentSerializer(many=True, required=False) overview_details = MiniOverviewSerializer(source="overview", read_only=True) @@ -516,11 +485,7 @@ class Meta: fields = "__all__" -class FormPrioritizationComponentSerializer( - NestedCreateMixin, - NestedUpdateMixin, - ModelSerializer -): +class FormPrioritizationComponentSerializer(NestedCreateMixin, NestedUpdateMixin, ModelSerializer): component_details = MiniFormComponentSerializer(source="component", read_only=True) class Meta: @@ -528,11 +493,7 @@ class Meta: fields = ("id", "component", "justification_text", "component_details") -class FormPrioritizationSerializer( - NestedCreateMixin, - NestedUpdateMixin, - ModelSerializer -): +class FormPrioritizationSerializer(NestedCreateMixin, NestedUpdateMixin, ModelSerializer): prioritized_action_responses = FormPrioritizationComponentSerializer(many=True, required=False) class Meta: @@ -720,7 +681,7 @@ class QuestionResponsesSerializer( NestedUpdateMixin, ModelSerializer, ): - question_details = MiniFormQuestionSerializer(source='question', read_only=True) + question_details = MiniFormQuestionSerializer(source="question", read_only=True) class Meta: model = FormComponentQuestionAndAnswer @@ -942,15 +903,14 @@ def get_region_name(obj): class Meta: model = Appeal - fields = ('code', 'name', 'country', 'region', - 'country_name', 'region_name', 'dtype', 'start_date', 'num_beneficiaries') + fields = ("code", "name", "country", "region", "country_name", "region_name", "dtype", "start_date", "num_beneficiaries") class FullAppealSerializer(serializers.ModelSerializer): class Meta: model = Appeal - fields = '__all__' + fields = "__all__" class OpsLearningCSVSerializer(serializers.ModelSerializer): @@ -958,7 +918,7 @@ class OpsLearningCSVSerializer(serializers.ModelSerializer): # get_queryset() only validated records come here in that case. type = serializers.SerializerMethodField(read_only=True) - finding = [''] + [t.label for t in LearningType] + finding = [""] + [t.label for t in LearningType] appeal_code = MiniAppealSerializer(allow_null=True, read_only=True) learning = serializers.SerializerMethodField(read_only=True) organization = serializers.SerializerMethodField(read_only=True) @@ -1003,20 +963,20 @@ def get_modified_at(obj): def to_representation(self, instance): data = super().to_representation(instance) - data['finding'] = data.pop('type') - del (data['learning_validated']) - del (data['type_validated']) - del (data['organization_validated']) - del (data['sector_validated']) - del (data['per_component_validated']) - del (data['appeal_document_id']) - del (data['created_at']) - del (data['is_validated']) + data["finding"] = data.pop("type") + del data["learning_validated"] + del data["type_validated"] + del data["organization_validated"] + del data["sector_validated"] + del data["per_component_validated"] + del data["appeal_document_id"] + del data["created_at"] + del data["is_validated"] return data class Meta: model = OpsLearning - fields = '__all__' + fields = "__all__" read_only_fields = ("modified_at",) @@ -1025,12 +985,12 @@ class OpsLearningSerializer(serializers.ModelSerializer): def to_representation(self, instance): data = super().to_representation(instance) - data['appeal'] = data.pop('appeal_code') + data["appeal"] = data.pop("appeal_code") return data class Meta: model = OpsLearning - fields = '__all__' + fields = "__all__" read_only_fields = ("created_at", "modified_at") @@ -1038,7 +998,7 @@ class OpsLearningInSerializer(serializers.ModelSerializer): class Meta: model = OpsLearning - fields = '__all__' + fields = "__all__" class PublicOpsLearningSerializer(serializers.ModelSerializer): @@ -1059,34 +1019,27 @@ class Meta: fields = "__all__" def validate(self, data): - country = data['country'] - per = data.get('per') + country = data["country"] + per = data.get("per") if per: user_document_count = PerDocumentUpload.objects.filter( - country=country, - created_by=self.context["request"].user, - per=per + country=country, created_by=self.context["request"].user, per=per ).count() if user_document_count > self.MAX_NUMBER_OF_DOCUMENTS: - raise serializers.ValidationError( - { - "file": gettext("Can add utmost %s documents" % self.MAX_NUMBER_OF_DOCUMENTS) - } - ) + raise serializers.ValidationError({"file": gettext("Can add utmost %s documents" % self.MAX_NUMBER_OF_DOCUMENTS)}) return data def validate_per(self, per): if per is None: raise serializers.ValidationError("This field is required") country_per_qs = Country.objects.filter( - id=self.initial_data['country'], + id=self.initial_data["country"], per_overviews=per, ) if not country_per_qs.exists(): raise serializers.ValidationError( gettext( - "Per %(per)s doesn't match country %(country)s" - % {'per': per.id, 'country': self.initial_data['country']} + "Per %(per)s doesn't match country %(country)s" % {"per": per.id, "country": self.initial_data["country"]} ) ) return per diff --git a/per/test_views.py b/per/test_views.py index d76dd2516..f6d79b433 100644 --- a/per/test_views.py +++ b/per/test_views.py @@ -1,17 +1,17 @@ import json -from main.test_case import APITestCase -from .models import WorkPlanStatus - from api.factories.country import CountryFactory +from main.test_case import APITestCase from per.factories import ( - OverviewFactory, FormAreaFactory, FormComponentFactory, FormPrioritizationFactory, + OverviewFactory, PerWorkPlanFactory, ) +from .models import WorkPlanStatus + class PerTestCase(APITestCase): def test_create_peroverview(self): diff --git a/per/translation.py b/per/translation.py index 0f583b0ce..c1786dbd6 100644 --- a/per/translation.py +++ b/per/translation.py @@ -1,21 +1,22 @@ -from modeltranslation.translator import register, TranslationOptions +from modeltranslation.translator import TranslationOptions, register + from .models import ( + AreaResponse, + AssessmentType, + CustomPerWorkPlanComponent, + FormAnswer, FormArea, FormComponent, - FormAnswer, - FormQuestion, + FormComponentQuestionAndAnswer, + FormComponentResponse, FormData, - AssessmentType, + FormPrioritizationComponent, + FormQuestion, FormQuestionGroup, Overview, - FormComponentResponse, - FormComponentQuestionAndAnswer, PerAssessment, - AreaResponse, - FormPrioritizationComponent, - PerWorkPlanComponent, - CustomPerWorkPlanComponent, PerComponentRating, + PerWorkPlanComponent, ) @@ -61,12 +62,7 @@ class OverviewTO(TranslationOptions): @register(FormComponentResponse) class FormComponentResponseTO(TranslationOptions): - fields = ( - 'urban_considerations', - 'epi_considerations', - 'climate_environmental_considerations', - 'notes' - ) + fields = ("urban_considerations", "epi_considerations", "climate_environmental_considerations", "notes") @register(PerComponentRating) @@ -76,9 +72,7 @@ class PerComponentRatingTO(TranslationOptions): @register(FormComponentQuestionAndAnswer) class FormComponentQuestionAndAnswerTO(TranslationOptions): - fields = ( - 'notes', - ) + fields = ("notes",) @register(PerAssessment) @@ -93,20 +87,14 @@ class AreaResponseTO(TranslationOptions): @register(FormPrioritizationComponent) class FormPrioritizationComponentTO(TranslationOptions): - fields = ( - 'justification_text', - ) + fields = ("justification_text",) @register(PerWorkPlanComponent) class PerWorkPlanComponentTo(TranslationOptions): - fields = ( - 'actions', - ) + fields = ("actions",) @register(CustomPerWorkPlanComponent) class CustomPerWorkPlanComponentTO(TranslationOptions): - fields = ( - 'actions', - ) + fields = ("actions",) diff --git a/per/utils.py b/per/utils.py index a7b2c4bea..9392d2f7a 100644 --- a/per/utils.py +++ b/per/utils.py @@ -7,24 +7,22 @@ def filter_per_queryset_by_user_access(user, queryset): return queryset # Check if country admin per_admin_country_id = [ - codename.replace('per_country_admin_', '') + codename.replace("per_country_admin_", "") for codename in Permission.objects.filter( group__user=user, - codename__startswith='per_country_admin_', - ).values_list('codename', flat=True) + codename__startswith="per_country_admin_", + ).values_list("codename", flat=True) ] per_admin_region_id = [ - codename.replace('per_region_admin_', '') + codename.replace("per_region_admin_", "") for codename in Permission.objects.filter( group__user=user, - codename__startswith='per_region_admin_', - ).values_list('codename', flat=True) + codename__startswith="per_region_admin_", + ).values_list("codename", flat=True) ] if len(per_admin_country_id) or len(per_admin_region_id): return queryset.filter( - Q(created_by=user) | - Q(country__in=per_admin_country_id) | - Q(country__region__in=per_admin_region_id) + Q(created_by=user) | Q(country__in=per_admin_country_id) | Q(country__region__in=per_admin_region_id) ).distinct() # Normal access return queryset.filter(created_by=user) diff --git a/per/validators.py b/per/validators.py index 9fe7aa86a..8a2d9048e 100644 --- a/per/validators.py +++ b/per/validators.py @@ -1,10 +1,11 @@ from typing import Any -from jsonschema import validate, ValidationError as JSONValidationError + from django.core.exceptions import ValidationError +from jsonschema import ValidationError as JSONValidationError +from jsonschema import validate from per.models import WorkPlanStatus - custom_component_schema = { "title": "Custom Component", "properties": { diff --git a/per/views.py b/per/views.py index e928faeeb..97a7c110d 100644 --- a/per/views.py +++ b/per/views.py @@ -3,21 +3,22 @@ from django.db import transaction from django.http import JsonResponse - from rest_framework import authentication, permissions from rest_framework.views import APIView + +from api.models import Country +from api.views import bad_request + +from .admin_classes import RegionRestrictedAdmin from .models import ( Form, - FormData, - WorkPlan, - Overview, FormArea, + FormData, FormQuestion, - LearningType + LearningType, + Overview, + WorkPlan, ) -from .admin_classes import RegionRestrictedAdmin -from api.views import bad_request -from api.models import Country logger = logging.getLogger(__name__) @@ -87,7 +88,7 @@ def post(self, request): form=form, question_id=qid, selected_answer_id=questions[qid]["selected_answer"], - notes=questions[qid]["notes"] + notes=questions[qid]["notes"], # TODO: just as in the CreatePerForm ) except Exception: @@ -166,9 +167,7 @@ def post(self, request): if not db_fd: # Missing question - FormData.objects.create( - form_id=fid, question_id=qid, selected_answer_id=selected_answer, notes=notes - ) + FormData.objects.create(form_id=fid, question_id=qid, selected_answer_id=selected_answer, notes=notes) else: if db_fd.selected_answer_id == selected_answer and db_fd.notes == notes: continue diff --git a/pyproject.toml b/pyproject.toml index f725d0d6c..73e3d2b52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -112,13 +112,14 @@ reportMissingTypeStubs = false [tool.black] line-length = 130 -py36 = true +target-version = ['py39'] include = '\.pyi?$' exclude = ''' /( \.git | \.tox | \.venv + | \.db | _build | buck-out | build diff --git a/registrations/admin.py b/registrations/admin.py index 5c58604fa..91503d782 100644 --- a/registrations/admin.py +++ b/registrations/admin.py @@ -1,32 +1,32 @@ +from django.conf import settings from django.contrib import admin -from django.template.loader import render_to_string from django.http import HttpResponseRedirect -from django.conf import settings +from django.template.loader import render_to_string from reversion_compare.admin import CompareVersionAdmin -from api.logger import logger -from api.models import User, UserRegion, Country, Profile import registrations.models as models +from api.logger import logger +from api.models import Country, Profile, User, UserRegion from notifications.notification import send_notification class PendingAdmin(CompareVersionAdmin): readonly_fields = ( - 'get_username_and_mail', - 'get_region', - 'get_country', - 'get_org', - 'get_city', - 'get_department', - 'get_position', - 'get_phone', - 'justification', - 'created_at', + "get_username_and_mail", + "get_region", + "get_country", + "get_org", + "get_city", + "get_department", + "get_position", + "get_phone", + "justification", + "created_at", ) - search_fields = ('user__username', 'user__email', 'admin_contact_1', 'admin_contact_2') - list_display = ('get_username_and_mail', 'get_region', 'get_country', 'created_at', 'email_verified') - actions = ('activate_users',) - list_filter = ['email_verified'] + search_fields = ("user__username", "user__email", "admin_contact_1", "admin_contact_2") + list_display = ("get_username_and_mail", "get_region", "get_country", "created_at", "email_verified") + actions = ("activate_users",) + list_filter = ["email_verified"] change_form_template = "admin/pending_change_form.html" change_list_template = "admin/pending_change_list.html" @@ -34,21 +34,21 @@ class PendingAdmin(CompareVersionAdmin): # Get the 'user' objects with a JOIN query def get_queryset(self, request): if request.user.is_superuser: - retval = super().get_queryset(request).select_related('user').exclude(user__is_active=1) + retval = super().get_queryset(request).select_related("user").exclude(user__is_active=1) else: - region_id = UserRegion.objects.filter(user_id=request.user.id).values_list('region_id', flat=True) - country_ids = Country.objects.filter(region_id__in=region_id).values_list('id', flat=True) - user_ids = Profile.objects.filter(country_id__in=country_ids).values_list('user_id', flat=True) + region_id = UserRegion.objects.filter(user_id=request.user.id).values_list("region_id", flat=True) + country_ids = Country.objects.filter(region_id__in=region_id).values_list("id", flat=True) + user_ids = Profile.objects.filter(country_id__in=country_ids).values_list("user_id", flat=True) - retval = super().get_queryset(request).select_related('user').filter(user_id__in=user_ids).exclude(user__is_active=1) + retval = super().get_queryset(request).select_related("user").filter(user_id__in=user_ids).exclude(user__is_active=1) return retval def get_username_and_mail(self, obj): - return obj.user.username + ' - ' + obj.user.email + return obj.user.username + " - " + obj.user.email - get_username_and_mail.short_description = 'Username - Email' - get_username_and_mail.admin_order_field = 'user__username' + get_username_and_mail.short_description = "Username - Email" + get_username_and_mail.admin_order_field = "user__username" def get_region(self, obj): if obj.user.profile.country: @@ -56,47 +56,47 @@ def get_region(self, obj): else: return obj.user.profile.country - get_region.short_description = 'Region' - get_region.admin_order_field = 'user__profile__country__region' + get_region.short_description = "Region" + get_region.admin_order_field = "user__profile__country__region" def get_country(self, obj): return obj.user.profile.country - get_country.short_description = 'Country' - get_country.admin_order_field = 'user__profile__country' + get_country.short_description = "Country" + get_country.admin_order_field = "user__profile__country" def get_org(self, obj): return obj.user.profile.organization - get_org.short_description = 'Organization' - get_org.admin_order_field = 'user__profile__organization' + get_org.short_description = "Organization" + get_org.admin_order_field = "user__profile__organization" def get_city(self, obj): return obj.user.profile.city - get_city.short_description = 'City' - get_city.admin_order_field = 'user__profile__city' + get_city.short_description = "City" + get_city.admin_order_field = "user__profile__city" def get_department(self, obj): return obj.user.profile.department - get_department.short_description = 'Department' - get_department.admin_order_field = 'user__profile__department' + get_department.short_description = "Department" + get_department.admin_order_field = "user__profile__department" def get_position(self, obj): return obj.user.profile.position - get_position.short_description = 'Position' - get_position.admin_order_field = 'user__profile__position' + get_position.short_description = "Position" + get_position.admin_order_field = "user__profile__position" def get_phone(self, obj): return obj.user.profile.phone - get_phone.short_description = 'Phone' - get_phone.admin_order_field = 'user__profile__phone' + get_phone.short_description = "Phone" + get_phone.admin_order_field = "user__profile__phone" def user_is_active(self, obj): - return 'Yes' if obj.user.is_active else '' + return "Yes" if obj.user.is_active else "" def activate_users(self, request, queryset): for pu in queryset: @@ -104,23 +104,21 @@ def activate_users(self, request, queryset): if usr: if usr.is_active is False: - email_context = { - 'frontend_url': settings.FRONTEND_URL - } + email_context = {"frontend_url": settings.FRONTEND_URL} send_notification( - 'Your account has been approved', + "Your account has been approved", [usr.email], - render_to_string('email/registration/outside-email-success.html', email_context), - f'Approved account successfully - {usr.username}' + render_to_string("email/registration/outside-email-success.html", email_context), + f"Approved account successfully - {usr.username}", ) usr.is_active = True usr.save() else: - logger.info(f'User {usr.username} was already active') + logger.info(f"User {usr.username} was already active") else: - logger.info(f'There is no User record with the ID: {pu.user_id}') + logger.info(f"There is no User record with the ID: {pu.user_id}") def response_change(self, request, obj): if "_activate-user" in request.POST: @@ -129,23 +127,21 @@ def response_change(self, request, obj): if usr: if usr.is_active is False: - email_context = { - 'frontend_url': settings.FRONTEND_URL - } + email_context = {"frontend_url": settings.FRONTEND_URL} send_notification( - 'Your account has been approved', + "Your account has been approved", [usr.email], - render_to_string('email/registration/outside-email-success.html', email_context), - f'Approved account successfully - {usr.username}' + render_to_string("email/registration/outside-email-success.html", email_context), + f"Approved account successfully - {usr.username}", ) usr.is_active = True usr.save() else: - logger.info(f'User {usr.username} was already active') + logger.info(f"User {usr.username} was already active") else: - logger.info(f'There is no User record with the ID: {obj.user.id}') + logger.info(f"There is no User record with the ID: {obj.user.id}") return HttpResponseRedirect(".") return super().response_change(request, obj) @@ -156,9 +152,9 @@ def get_actions(self, request): class DomainWhitelistAdmin(CompareVersionAdmin): - list_display = ('domain_name', 'description', 'is_active') - search_fields = ('domain_name',) - ordering = ('domain_name',) + list_display = ("domain_name", "description", "is_active") + search_fields = ("domain_name",) + ordering = ("domain_name",) admin.site.register(models.Pending, PendingAdmin) diff --git a/registrations/apps.py b/registrations/apps.py index 651629f4f..17b1c3f33 100644 --- a/registrations/apps.py +++ b/registrations/apps.py @@ -1,7 +1,7 @@ -from django.utils.translation import gettext_lazy as _ from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class RegistrationsConfig(AppConfig): - name = 'registrations' - verbose_name = _('registrations') + name = "registrations" + verbose_name = _("registrations") diff --git a/registrations/drf_views.py b/registrations/drf_views.py index 99f7a3158..f04005a06 100644 --- a/registrations/drf_views.py +++ b/registrations/drf_views.py @@ -1,16 +1,12 @@ -from rest_framework import ( - viewsets, - views, - response, - status -) from drf_spectacular.utils import extend_schema +from rest_framework import response, status, views, viewsets + from .models import DomainWhitelist from .serializers import ( - DomainWhitelistSerializer, ChangePasswordSerializer, + ChangeRecoverPasswordSerializer, + DomainWhitelistSerializer, RegistrationSerializer, - ChangeRecoverPasswordSerializer ) @@ -22,23 +18,20 @@ class DomainWhitelistViewset(viewsets.ReadOnlyModelViewSet): class ChangeRecoverPasswordView(views.APIView): @extend_schema(request=ChangeRecoverPasswordSerializer, responses=None) def post(self, request, version=None): - serializer = ChangeRecoverPasswordSerializer(data=request.data, context={'request': request}) + serializer = ChangeRecoverPasswordSerializer(data=request.data, context={"request": request}) serializer.is_valid(raise_exception=True) serializer.save() - return response.Response( - serializer.data, status=status.HTTP_200_OK - ) + return response.Response(serializer.data, status=status.HTTP_200_OK) class ChangePasswordView(views.APIView): @extend_schema(request=ChangePasswordSerializer, responses=None) def post(self, request, version=None): - serializer = ChangePasswordSerializer(data=request.data, context={'request': request}) + serializer = ChangePasswordSerializer(data=request.data, context={"request": request}) serializer.is_valid(raise_exception=True) serializer.save() - return response.Response( - serializer.data, status=status.HTTP_200_OK - ) + return response.Response(serializer.data, status=status.HTTP_200_OK) + class RegistrationView(views.APIView): @@ -47,6 +40,4 @@ def post(self, request, version=None): serializer = RegistrationSerializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() - return response.Response( - serializer.data, status=status.HTTP_200_OK - ) + return response.Response(serializer.data, status=status.HTTP_200_OK) diff --git a/registrations/migrations/0001_initial.py b/registrations/migrations/0001_initial.py index dd0475415..fcd350492 100644 --- a/registrations/migrations/0001_initial.py +++ b/registrations/migrations/0001_initial.py @@ -2,9 +2,9 @@ # Generated by Django 1.11.8 on 2018-02-07 21:09 from __future__ import unicode_literals +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): @@ -12,34 +12,43 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('auth', '0008_alter_user_username_max_length'), + ("auth", "0008_alter_user_username_max_length"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( - name='Pending', + name="Pending", fields=[ - ('user', models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('token', models.CharField(editable=False, max_length=32)), - ('admin_contact_1', models.EmailField(blank=True, max_length=254, null=True)), - ('admin_contact_2', models.EmailField(blank=True, max_length=254, null=True)), - ('admin_token', models.CharField(editable=False, max_length=32, null=True)), - ('email_verified', models.BooleanField(default=False, editable=False)), + ( + "user", + models.OneToOneField( + editable=False, + on_delete=django.db.models.deletion.CASCADE, + primary_key=True, + serialize=False, + to=settings.AUTH_USER_MODEL, + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("token", models.CharField(editable=False, max_length=32)), + ("admin_contact_1", models.EmailField(blank=True, max_length=254, null=True)), + ("admin_contact_2", models.EmailField(blank=True, max_length=254, null=True)), + ("admin_token", models.CharField(editable=False, max_length=32, null=True)), + ("email_verified", models.BooleanField(default=False, editable=False)), ], options={ - 'verbose_name': 'Pending user', - 'verbose_name_plural': 'Pending users', + "verbose_name": "Pending user", + "verbose_name_plural": "Pending users", }, ), migrations.CreateModel( - name='Recovery', + name="Recovery", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('token', models.CharField(editable=False, max_length=32)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("token", models.CharField(editable=False, max_length=32)), + ("user", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), ] diff --git a/registrations/migrations/0002_auto_20180626_1808.py b/registrations/migrations/0002_auto_20180626_1808.py index 8b5fa2702..758057f60 100644 --- a/registrations/migrations/0002_auto_20180626_1808.py +++ b/registrations/migrations/0002_auto_20180626_1808.py @@ -6,28 +6,28 @@ class Migration(migrations.Migration): dependencies = [ - ('registrations', '0001_initial'), + ("registrations", "0001_initial"), ] operations = [ migrations.RenameField( - model_name='pending', - old_name='admin_token', - new_name='admin_token_1', + model_name="pending", + old_name="admin_token", + new_name="admin_token_1", ), migrations.AddField( - model_name='pending', - name='admin_1_validated', + model_name="pending", + name="admin_1_validated", field=models.BooleanField(default=False, editable=False), ), migrations.AddField( - model_name='pending', - name='admin_2_validated', + model_name="pending", + name="admin_2_validated", field=models.BooleanField(default=False, editable=False), ), migrations.AddField( - model_name='pending', - name='admin_token_2', + model_name="pending", + name="admin_token_2", field=models.CharField(editable=False, max_length=32, null=True), ), ] diff --git a/registrations/migrations/0003_auto_20200206_0926.py b/registrations/migrations/0003_auto_20200206_0926.py index 6dfd4825f..c5b1f15ba 100644 --- a/registrations/migrations/0003_auto_20200206_0926.py +++ b/registrations/migrations/0003_auto_20200206_0926.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('registrations', '0002_auto_20180626_1808'), + ("registrations", "0002_auto_20180626_1808"), ] operations = [ migrations.AddField( - model_name='pending', - name='admin_1_validated_date', + model_name="pending", + name="admin_1_validated_date", field=models.DateTimeField(blank=True, null=True), ), migrations.AddField( - model_name='pending', - name='admin_2_validated_date', + model_name="pending", + name="admin_2_validated_date", field=models.DateTimeField(blank=True, null=True), ), ] diff --git a/registrations/migrations/0004_auto_20200211_1514.py b/registrations/migrations/0004_auto_20200211_1514.py index 01391c1c3..aa108d537 100644 --- a/registrations/migrations/0004_auto_20200211_1514.py +++ b/registrations/migrations/0004_auto_20200211_1514.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('registrations', '0003_auto_20200206_0926'), + ("registrations", "0003_auto_20200206_0926"), ] operations = [ migrations.AlterField( - model_name='pending', - name='admin_1_validated_date', + model_name="pending", + name="admin_1_validated_date", field=models.DateTimeField(blank=True, editable=False, null=True), ), migrations.AlterField( - model_name='pending', - name='admin_2_validated_date', + model_name="pending", + name="admin_2_validated_date", field=models.DateTimeField(blank=True, editable=False, null=True), ), ] diff --git a/registrations/migrations/0005_domainwhitelist.py b/registrations/migrations/0005_domainwhitelist.py index d307ee2e2..5924f7ee2 100644 --- a/registrations/migrations/0005_domainwhitelist.py +++ b/registrations/migrations/0005_domainwhitelist.py @@ -6,16 +6,16 @@ class Migration(migrations.Migration): dependencies = [ - ('registrations', '0004_auto_20200211_1514'), + ("registrations", "0004_auto_20200211_1514"), ] operations = [ migrations.CreateModel( - name='DomainWhitelist', + name="DomainWhitelist", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('domain_name', models.CharField(max_length=200)), - ('is_active', models.BooleanField(default=True)), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("domain_name", models.CharField(max_length=200)), + ("is_active", models.BooleanField(default=True)), ], ), ] diff --git a/registrations/migrations/0006_domainwhitelist_description.py b/registrations/migrations/0006_domainwhitelist_description.py index 31f9adcdd..6730a0948 100644 --- a/registrations/migrations/0006_domainwhitelist_description.py +++ b/registrations/migrations/0006_domainwhitelist_description.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('registrations', '0005_domainwhitelist'), + ("registrations", "0005_domainwhitelist"), ] operations = [ migrations.AddField( - model_name='domainwhitelist', - name='description', + model_name="domainwhitelist", + name="description", field=models.TextField(blank=True, null=True), ), ] diff --git a/registrations/migrations/0007_auto_20200618_0904.py b/registrations/migrations/0007_auto_20200618_0904.py index 8a64bb8f0..d50920826 100644 --- a/registrations/migrations/0007_auto_20200618_0904.py +++ b/registrations/migrations/0007_auto_20200618_0904.py @@ -1,113 +1,122 @@ # Generated by Django 2.2.13 on 2020-06-18 09:04 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('registrations', '0006_domainwhitelist_description'), + ("registrations", "0006_domainwhitelist_description"), ] operations = [ migrations.AlterModelOptions( - name='domainwhitelist', - options={'verbose_name': 'Domain Whitelist', 'verbose_name_plural': 'Domains Whitelist'}, + name="domainwhitelist", + options={"verbose_name": "Domain Whitelist", "verbose_name_plural": "Domains Whitelist"}, ), migrations.AlterModelOptions( - name='recovery', - options={'verbose_name': 'Recovery', 'verbose_name_plural': 'Recoveries'}, + name="recovery", + options={"verbose_name": "Recovery", "verbose_name_plural": "Recoveries"}, ), migrations.AlterField( - model_name='domainwhitelist', - name='description', - field=models.TextField(blank=True, null=True, verbose_name='description'), + model_name="domainwhitelist", + name="description", + field=models.TextField(blank=True, null=True, verbose_name="description"), ), migrations.AlterField( - model_name='domainwhitelist', - name='domain_name', - field=models.CharField(max_length=200, verbose_name='domain name'), + model_name="domainwhitelist", + name="domain_name", + field=models.CharField(max_length=200, verbose_name="domain name"), ), migrations.AlterField( - model_name='domainwhitelist', - name='is_active', - field=models.BooleanField(default=True, verbose_name='is active?'), + model_name="domainwhitelist", + name="is_active", + field=models.BooleanField(default=True, verbose_name="is active?"), ), migrations.AlterField( - model_name='pending', - name='admin_1_validated', - field=models.BooleanField(default=False, editable=False, verbose_name='admin 1 validated'), + model_name="pending", + name="admin_1_validated", + field=models.BooleanField(default=False, editable=False, verbose_name="admin 1 validated"), ), migrations.AlterField( - model_name='pending', - name='admin_1_validated_date', - field=models.DateTimeField(blank=True, editable=False, null=True, verbose_name='admin 1 validated date'), + model_name="pending", + name="admin_1_validated_date", + field=models.DateTimeField(blank=True, editable=False, null=True, verbose_name="admin 1 validated date"), ), migrations.AlterField( - model_name='pending', - name='admin_2_validated', - field=models.BooleanField(default=False, editable=False, verbose_name='admin 2 validated'), + model_name="pending", + name="admin_2_validated", + field=models.BooleanField(default=False, editable=False, verbose_name="admin 2 validated"), ), migrations.AlterField( - model_name='pending', - name='admin_2_validated_date', - field=models.DateTimeField(blank=True, editable=False, null=True, verbose_name='admin 2 validated date'), + model_name="pending", + name="admin_2_validated_date", + field=models.DateTimeField(blank=True, editable=False, null=True, verbose_name="admin 2 validated date"), ), migrations.AlterField( - model_name='pending', - name='admin_contact_1', - field=models.EmailField(blank=True, max_length=254, null=True, verbose_name='admin contact 1'), + model_name="pending", + name="admin_contact_1", + field=models.EmailField(blank=True, max_length=254, null=True, verbose_name="admin contact 1"), ), migrations.AlterField( - model_name='pending', - name='admin_contact_2', - field=models.EmailField(blank=True, max_length=254, null=True, verbose_name='admin contact 2'), + model_name="pending", + name="admin_contact_2", + field=models.EmailField(blank=True, max_length=254, null=True, verbose_name="admin contact 2"), ), migrations.AlterField( - model_name='pending', - name='admin_token_1', - field=models.CharField(editable=False, max_length=32, null=True, verbose_name='admin token 1'), + model_name="pending", + name="admin_token_1", + field=models.CharField(editable=False, max_length=32, null=True, verbose_name="admin token 1"), ), migrations.AlterField( - model_name='pending', - name='admin_token_2', - field=models.CharField(editable=False, max_length=32, null=True, verbose_name='admin token 2'), + model_name="pending", + name="admin_token_2", + field=models.CharField(editable=False, max_length=32, null=True, verbose_name="admin token 2"), ), migrations.AlterField( - model_name='pending', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="pending", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='pending', - name='email_verified', - field=models.BooleanField(default=False, editable=False, verbose_name='email verified?'), + model_name="pending", + name="email_verified", + field=models.BooleanField(default=False, editable=False, verbose_name="email verified?"), ), migrations.AlterField( - model_name='pending', - name='token', - field=models.CharField(editable=False, max_length=32, verbose_name='token'), + model_name="pending", + name="token", + field=models.CharField(editable=False, max_length=32, verbose_name="token"), ), migrations.AlterField( - model_name='pending', - name='user', - field=models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="pending", + name="user", + field=models.OneToOneField( + editable=False, + on_delete=django.db.models.deletion.CASCADE, + primary_key=True, + serialize=False, + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), ), migrations.AlterField( - model_name='recovery', - name='created_at', - field=models.DateTimeField(auto_now_add=True, verbose_name='created at'), + model_name="recovery", + name="created_at", + field=models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), migrations.AlterField( - model_name='recovery', - name='token', - field=models.CharField(editable=False, max_length=32, verbose_name='token'), + model_name="recovery", + name="token", + field=models.CharField(editable=False, max_length=32, verbose_name="token"), ), migrations.AlterField( - model_name='recovery', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user'), + model_name="recovery", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name="user" + ), ), ] diff --git a/registrations/migrations/0008_pending_justification.py b/registrations/migrations/0008_pending_justification.py index 94cf35366..c12960ffd 100644 --- a/registrations/migrations/0008_pending_justification.py +++ b/registrations/migrations/0008_pending_justification.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('registrations', '0007_auto_20200618_0904'), + ("registrations", "0007_auto_20200618_0904"), ] operations = [ migrations.AddField( - model_name='pending', - name='justification', - field=models.CharField(blank=True, max_length=500, null=True, verbose_name='justification'), + model_name="pending", + name="justification", + field=models.CharField(blank=True, max_length=500, null=True, verbose_name="justification"), ), ] diff --git a/registrations/migrations/0009_auto_20220104_1632.py b/registrations/migrations/0009_auto_20220104_1632.py index e01220b84..b2ab5acfb 100644 --- a/registrations/migrations/0009_auto_20220104_1632.py +++ b/registrations/migrations/0009_auto_20220104_1632.py @@ -6,18 +6,18 @@ class Migration(migrations.Migration): dependencies = [ - ('registrations', '0008_pending_justification'), + ("registrations", "0008_pending_justification"), ] operations = [ migrations.AlterField( - model_name='pending', - name='admin_contact_1', - field=models.EmailField(blank=True, editable=False, max_length=254, null=True, verbose_name='admin contact 1'), + model_name="pending", + name="admin_contact_1", + field=models.EmailField(blank=True, editable=False, max_length=254, null=True, verbose_name="admin contact 1"), ), migrations.AlterField( - model_name='pending', - name='admin_contact_2', - field=models.EmailField(blank=True, editable=False, max_length=254, null=True, verbose_name='admin contact 2'), + model_name="pending", + name="admin_contact_2", + field=models.EmailField(blank=True, editable=False, max_length=254, null=True, verbose_name="admin contact 2"), ), ] diff --git a/registrations/migrations/0010_pending_reminder_sent_to_admin.py b/registrations/migrations/0010_pending_reminder_sent_to_admin.py index c751ac5d5..0ee780895 100644 --- a/registrations/migrations/0010_pending_reminder_sent_to_admin.py +++ b/registrations/migrations/0010_pending_reminder_sent_to_admin.py @@ -6,13 +6,13 @@ class Migration(migrations.Migration): dependencies = [ - ('registrations', '0009_auto_20220104_1632'), + ("registrations", "0009_auto_20220104_1632"), ] operations = [ migrations.AddField( - model_name='pending', - name='reminder_sent_to_admin', - field=models.BooleanField(default=False, editable=False, verbose_name='reminder sent to admin?'), + model_name="pending", + name="reminder_sent_to_admin", + field=models.BooleanField(default=False, editable=False, verbose_name="reminder sent to admin?"), ), ] diff --git a/registrations/migrations/0011_userexternaltoken.py b/registrations/migrations/0011_userexternaltoken.py index 4ee467ce7..ab06d83c7 100644 --- a/registrations/migrations/0011_userexternaltoken.py +++ b/registrations/migrations/0011_userexternaltoken.py @@ -1,32 +1,43 @@ # Generated by Django 3.2.25 on 2024-05-03 05:51 +import uuid + +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion -import uuid class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('registrations', '0010_pending_reminder_sent_to_admin'), + ("registrations", "0010_pending_reminder_sent_to_admin"), ] operations = [ migrations.CreateModel( - name='UserExternalToken', + name="UserExternalToken", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('jti', models.UUIDField(default=uuid.uuid4, editable=False, help_text='Unique identifier for the token', unique=True)), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('expire_timestamp', models.DateTimeField(verbose_name='expire timestamp')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("title", models.CharField(max_length=255, verbose_name="title")), + ( + "jti", + models.UUIDField( + default=uuid.uuid4, editable=False, help_text="Unique identifier for the token", unique=True + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), + ("expire_timestamp", models.DateTimeField(verbose_name="expire timestamp")), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name="user" + ), + ), ], options={ - 'verbose_name': 'User External Token', - 'verbose_name_plural': 'User External Tokens', + "verbose_name": "User External Token", + "verbose_name_plural": "User External Tokens", }, ), ] diff --git a/registrations/models.py b/registrations/models.py index 97108cc14..39ddb259d 100644 --- a/registrations/models.py +++ b/registrations/models.py @@ -1,59 +1,60 @@ import uuid + import reversion -from django.utils.translation import gettext_lazy as _ from django.conf import settings from django.db import models +from django.utils.translation import gettext_lazy as _ class Pending(models.Model): - """ Pending users requiring admin approval """ + """Pending users requiring admin approval""" user = models.OneToOneField( settings.AUTH_USER_MODEL, - verbose_name=_('user'), + verbose_name=_("user"), on_delete=models.CASCADE, primary_key=True, editable=False, ) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - token = models.CharField(verbose_name=_('token'), max_length=32, editable=False) - - admin_contact_1 = models.EmailField(verbose_name=_('admin contact 1'), blank=True, null=True, editable=False) - admin_contact_2 = models.EmailField(verbose_name=_('admin contact 2'), blank=True, null=True, editable=False) - admin_token_1 = models.CharField(verbose_name=_('admin token 1'), max_length=32, null=True, editable=False) - admin_token_2 = models.CharField(verbose_name=_('admin token 2'), max_length=32, null=True, editable=False) - admin_1_validated = models.BooleanField(verbose_name=_('admin 1 validated'), default=False, editable=False) - admin_2_validated = models.BooleanField(verbose_name=_('admin 2 validated'), default=False, editable=False) - admin_1_validated_date = models.DateTimeField(verbose_name=_('admin 1 validated date'), null=True, blank=True, editable=False) - admin_2_validated_date = models.DateTimeField(verbose_name=_('admin 2 validated date'), null=True, blank=True, editable=False) - email_verified = models.BooleanField(verbose_name=_('email verified?'), default=False, editable=False) - justification = models.CharField(verbose_name=_('justification'), max_length=500, blank=True, null=True) - reminder_sent_to_admin = models.BooleanField(verbose_name=_('reminder sent to admin?'), default=False, editable=False) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + token = models.CharField(verbose_name=_("token"), max_length=32, editable=False) + + admin_contact_1 = models.EmailField(verbose_name=_("admin contact 1"), blank=True, null=True, editable=False) + admin_contact_2 = models.EmailField(verbose_name=_("admin contact 2"), blank=True, null=True, editable=False) + admin_token_1 = models.CharField(verbose_name=_("admin token 1"), max_length=32, null=True, editable=False) + admin_token_2 = models.CharField(verbose_name=_("admin token 2"), max_length=32, null=True, editable=False) + admin_1_validated = models.BooleanField(verbose_name=_("admin 1 validated"), default=False, editable=False) + admin_2_validated = models.BooleanField(verbose_name=_("admin 2 validated"), default=False, editable=False) + admin_1_validated_date = models.DateTimeField(verbose_name=_("admin 1 validated date"), null=True, blank=True, editable=False) + admin_2_validated_date = models.DateTimeField(verbose_name=_("admin 2 validated date"), null=True, blank=True, editable=False) + email_verified = models.BooleanField(verbose_name=_("email verified?"), default=False, editable=False) + justification = models.CharField(verbose_name=_("justification"), max_length=500, blank=True, null=True) + reminder_sent_to_admin = models.BooleanField(verbose_name=_("reminder sent to admin?"), default=False, editable=False) class Meta: - verbose_name = _('Pending user') - verbose_name_plural = _('Pending users') + verbose_name = _("Pending user") + verbose_name_plural = _("Pending users") def __str__(self): return self.user.email class Recovery(models.Model): - """ Password recovery""" + """Password recovery""" user = models.ForeignKey( settings.AUTH_USER_MODEL, - verbose_name=_('user'), + verbose_name=_("user"), on_delete=models.CASCADE, ) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - token = models.CharField(verbose_name=_('token'), max_length=32, editable=False) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + token = models.CharField(verbose_name=_("token"), max_length=32, editable=False) class Meta: - verbose_name = _('Recovery') - verbose_name_plural = _('Recoveries') + verbose_name = _("Recovery") + verbose_name_plural = _("Recoveries") def __str__(self): return self.user.username @@ -61,53 +62,44 @@ def __str__(self): @reversion.register() class DomainWhitelist(models.Model): - """ Whitelisted domains """ - domain_name = models.CharField(verbose_name=_('domain name'), max_length=200) - description = models.TextField(verbose_name=_('description'), null=True, blank=True) - is_active = models.BooleanField(verbose_name=_('is active?'), default=True) + """Whitelisted domains""" + + domain_name = models.CharField(verbose_name=_("domain name"), max_length=200) + description = models.TextField(verbose_name=_("description"), null=True, blank=True) + is_active = models.BooleanField(verbose_name=_("is active?"), default=True) class Meta: - verbose_name = _('Domain Whitelist') - verbose_name_plural = _('Domains Whitelist') + verbose_name = _("Domain Whitelist") + verbose_name_plural = _("Domains Whitelist") def __str__(self): return self.domain_name class UserExternalToken(models.Model): - """ External token for user """ + """External token for user""" title = models.CharField( - verbose_name=_('title'), + verbose_name=_("title"), max_length=255, ) user = models.ForeignKey( settings.AUTH_USER_MODEL, - verbose_name=_('user'), + verbose_name=_("user"), on_delete=models.CASCADE, ) - jti = models.UUIDField( - default=uuid.uuid4, - editable=False, - unique=True, - help_text=_('Unique identifier for the token') - ) - created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True) - expire_timestamp = models.DateTimeField(verbose_name=_('expire timestamp')) + jti = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, help_text=_("Unique identifier for the token")) + created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True) + expire_timestamp = models.DateTimeField(verbose_name=_("expire timestamp")) # @Note: Currently not used, but could be utilized for a blacklist feature. # is_disabled = models.BooleanField(verbose_name=_('is disabled?'), default=False) class Meta: - verbose_name = _('User External Token') - verbose_name_plural = _('User External Tokens') + verbose_name = _("User External Token") + verbose_name_plural = _("User External Tokens") def __str__(self): return f'{self.title}-{self.expire_timestamp.strftime("%Y-%m-%d")}' def get_payload(self) -> dict: - return { - 'jti': str(self.jti), - 'userId': self.user_id, - 'exp': self.expire_timestamp, - 'inMovement': True - } + return {"jti": str(self.jti), "userId": self.user_id, "exp": self.expire_timestamp, "inMovement": True} diff --git a/registrations/serializers.py b/registrations/serializers.py index 068febd01..3af4d9fa4 100644 --- a/registrations/serializers.py +++ b/registrations/serializers.py @@ -1,31 +1,24 @@ from datetime import timedelta -from django.contrib.auth.password_validation import validate_password -from django.conf import settings -from rest_framework import serializers +from django.conf import settings from django.contrib.auth.models import User +from django.contrib.auth.password_validation import validate_password +from django.db import transaction from django.utils import timezone from django.utils.crypto import get_random_string -from django.db import transaction +from rest_framework import serializers -from .utils import ( - is_valid_domain, - jwt_encode_handler -) -from .models import ( - DomainWhitelist, - Recovery, - UserExternalToken, - Pending, -) -from registrations.tasks import send_notification_create from api.models import Country +from registrations.tasks import send_notification_create + +from .models import DomainWhitelist, Pending, Recovery, UserExternalToken +from .utils import is_valid_domain, jwt_encode_handler class DomainWhitelistSerializer(serializers.ModelSerializer): class Meta: model = DomainWhitelist - fields = '__all__' + fields = "__all__" class ChangeRecoverPasswordSerializer(serializers.Serializer): @@ -38,9 +31,9 @@ def validate_new_password(self, new_password): return new_password def validate(self, data): - username = data['username'] - token = data['token'] - data['user'] = user = User.objects.filter(username__iexact=username).first() + username = data["username"] + token = data["token"] + data["user"] = user = User.objects.filter(username__iexact=username).first() recovery = Recovery.objects.filter(user=user).first() if recovery is None: @@ -53,8 +46,8 @@ def validate(self, data): def save(self): self.is_valid(raise_exception=True) - user = self.validated_data['user'] - user.set_password(self.validated_data['new_password']) + user = self.validated_data["user"] + user.set_password(self.validated_data["new_password"]) user.save() @@ -63,9 +56,9 @@ class ChangePasswordSerializer(serializers.Serializer): new_password = serializers.CharField() def validate_old_password(self, password): - user = self.context['request'].user + user = self.context["request"].user if not user.check_password(password): - raise serializers.ValidationError('Invalid Old Password') + raise serializers.ValidationError("Invalid Old Password") return password def validate_new_password(self, password): @@ -74,8 +67,8 @@ def validate_new_password(self, password): def save(self): self.is_valid(raise_exception=True) - user = self.context['request'].user - user.set_password(self.validated_data['new_password']) + user = self.context["request"].user + user.set_password(self.validated_data["new_password"]) user.save() @@ -98,40 +91,35 @@ class RegistrationSerializer(serializers.Serializer): def validate_email(self, email) -> str: if User.objects.filter(username__iexact=email).exists(): - raise serializers.ValidationError('A user with that email address already exists.') + raise serializers.ValidationError("A user with that email address already exists.") return email def save(self): # using email as username for user registration - username = self.validated_data['email'] - first_name = self.validated_data['first_name'] - last_name = self.validated_data['last_name'] - email = self.validated_data['email'] - password = self.validated_data['password'] - country = self.validated_data['country'] - organization = self.validated_data['organization'] - organization_type = self.validated_data['organization_type'] - city = self.validated_data['city'] - - justification = self.validated_data.get('justification') - department = self.validated_data.get('department') - position = self.validated_data.get('position') - phone_number = self.validated_data.get('phone_number') + username = self.validated_data["email"] + first_name = self.validated_data["first_name"] + last_name = self.validated_data["last_name"] + email = self.validated_data["email"] + password = self.validated_data["password"] + country = self.validated_data["country"] + organization = self.validated_data["organization"] + organization_type = self.validated_data["organization_type"] + city = self.validated_data["city"] + + justification = self.validated_data.get("justification") + department = self.validated_data.get("department") + position = self.validated_data.get("position") + phone_number = self.validated_data.get("phone_number") is_staff = is_valid_domain(email) # Create the User object try: user = User.objects.create_user( - username=username, - first_name=first_name, - last_name=last_name, - email=email, - password=password, - is_active=False + username=username, first_name=first_name, last_name=last_name, email=email, password=password, is_active=False ) except Exception: - raise serializers.ValidationError('Could not create user.') + raise serializers.ValidationError("Could not create user.") try: user.profile.country = country @@ -143,26 +131,15 @@ def save(self): user.profile.phone_number = phone_number user.profile.save() except Exception: - raise serializers.ValidationError('Could not create user profile.') + raise serializers.ValidationError("Could not create user profile.") - pending = Pending( - user=user, - justification=justification, - token=get_random_string(length=32) - ) + pending = Pending(user=user, justification=justification, token=get_random_string(length=32)) if not is_staff: pending.admin_token_1 = get_random_string(length=32) pending.save() # send notification - transaction.on_commit( - lambda: send_notification_create.delay( - pending.token, - username, - is_staff, - email - ) - ) + transaction.on_commit(lambda: send_notification_create.delay(pending.token, username, is_staff, email)) class UserExternalTokenSerializer(serializers.ModelSerializer): @@ -171,31 +148,31 @@ class UserExternalTokenSerializer(serializers.ModelSerializer): class Meta: model = UserExternalToken - fields = ['title', 'token', 'expire_timestamp', 'created_at'] + fields = ["title", "token", "expire_timestamp", "created_at"] def validate_expire_timestamp(self, date): now = timezone.now() if date < now: - raise serializers.ValidationError('Expire timestamp must be in the future.') + raise serializers.ValidationError("Expire timestamp must be in the future.") elif date > now + timedelta(days=settings.JWT_EXPIRE_TIMESTAMP_DAYS): - raise serializers.ValidationError(f'Expire timestamp must be less than {settings.JWT_EXPIRE_TIMESTAMP_DAYS} days.') + raise serializers.ValidationError(f"Expire timestamp must be less than {settings.JWT_EXPIRE_TIMESTAMP_DAYS} days.") return date def create(self, validated_data): - validated_data['user'] = self.context['request'].user + validated_data["user"] = self.context["request"].user # @Note: Not in use for now # if not user.profile.accepted_montandon_license_terms: # raise serializers.ValidationError('User must accept Montandon license terms.') - if not validated_data.get('expire_timestamp'): - validated_data['expire_timestamp'] = timezone.now() + timedelta(days=settings.JWT_EXPIRE_TIMESTAMP_DAYS) + if not validated_data.get("expire_timestamp"): + validated_data["expire_timestamp"] = timezone.now() + timedelta(days=settings.JWT_EXPIRE_TIMESTAMP_DAYS) # Check if private and public key exists if not (settings.JWT_PRIVATE_KEY and settings.JWT_PUBLIC_KEY): - raise serializers.ValidationError('Please contact system adminstrators to configurate private and public key.') + raise serializers.ValidationError("Please contact system adminstrators to configurate private and public key.") instance = super().create(validated_data) - validated_data['created_at'] = instance.created_at + validated_data["created_at"] = instance.created_at validated_data["token"] = jwt_encode_handler(instance.get_payload()) return validated_data diff --git a/registrations/tasks.py b/registrations/tasks.py index dcdc035b6..c4ba9b945 100644 --- a/registrations/tasks.py +++ b/registrations/tasks.py @@ -1,13 +1,15 @@ +from celery import shared_task from django.conf import settings from django.template.loader import render_to_string -from celery import shared_task + from notifications.notification import send_notification @shared_task def send_notification_create(token, username, is_staff, email): email_context = { - 'confirmation_link': 'https://%s/verify_email/?token=%s&user=%s' % ( + "confirmation_link": "https://%s/verify_email/?token=%s&user=%s" + % ( settings.BASE_URL, # on PROD it should point to goadmin... token, username, @@ -16,13 +18,10 @@ def send_notification_create(token, username, is_staff, email): # if validated email accounts get a different message if is_staff: - template = 'email/registration/verify-staff-email.html' + template = "email/registration/verify-staff-email.html" else: - template = 'email/registration/verify-outside-email.html' + template = "email/registration/verify-outside-email.html" send_notification( - 'Validate your account', - [email], - render_to_string(template, email_context), - 'Validate account - ' + username + "Validate your account", [email], render_to_string(template, email_context), "Validate account - " + username ) diff --git a/registrations/test_views.py b/registrations/test_views.py index ba28042cb..155ca0a8b 100644 --- a/registrations/test_views.py +++ b/registrations/test_views.py @@ -11,25 +11,25 @@ from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import ec - from django.contrib.auth.models import User from django.test import override_settings from rest_framework.test import APITestCase +from api.models import Country, Profile from main.test_case import APITestCase as GoAPITestCase + from .models import Pending -from api.models import Country, Profile class TwoGatekeepersTest(APITestCase): def setUp(self): - user1 = User.objects.create(username='jo', email='jo@arcs.org.af') - user1.set_password('12345678') + user1 = User.objects.create(username="jo", email="jo@arcs.org.af") + user1.set_password("12345678") user1.save() - user2 = User.objects.create(username='ke', email='ke@arcs.org.af') - user2.set_password('12345678') + user2 = User.objects.create(username="ke", email="ke@arcs.org.af") + user2.set_password("12345678") user2.save() - Country.objects.create(name='country') + Country.objects.create(name="country") # def test_two_gatekeepers(self): # # 1. Created two users to function as gatekeepers (with checkable email) @@ -100,23 +100,23 @@ def setUp(self): def test_official_email(self): # 2b. Making a request to views.NewRegistration with new user request - country = Country.objects.get(name='country') + country = Country.objects.get(name="country") # We started to use the email as the username for new registrations - newusr = 'pet@voroskereszt.hu' + newusr = "pet@voroskereszt.hu" body = { - 'email': newusr, - 'username': newusr, - 'password': '87654321', - 'country': country.pk, - 'organization_type': 'OTHR', - 'organization': 'Zoo', - 'first_name': 'Peter', - 'last_name': 'Falk', - 'justification': 'aaaa', - 'city': 'kathmandu' + "email": newusr, + "username": newusr, + "password": "87654321", + "country": country.pk, + "organization_type": "OTHR", + "organization": "Zoo", + "first_name": "Peter", + "last_name": "Falk", + "justification": "aaaa", + "city": "kathmandu", } - headers = {'CONTENT_TYPE': 'application/json'} - resp = self.client.post('/register', data=body, format='json') + headers = {"CONTENT_TYPE": "application/json"} + resp = self.client.post("/register", data=body, format="json") # json.loads(resp.content): 'status': 'ok' self.assertEqual(resp.status_code, 200) @@ -125,10 +125,10 @@ def test_official_email(self): # 4b. Using the user token and user username to query views.VerifyEmail body1 = { - 'user': newusr, - 'token': pending_user.token, + "user": newusr, + "token": pending_user.token, } - resp = self.client.get('/verify_email', body1, format='json', headers=headers) + resp = self.client.get("/verify_email", body1, format="json", headers=headers) # resp.content: ...validated your email address and your IFRC Go account is now approved self.assertEqual(resp.status_code, 200) @@ -136,36 +136,36 @@ def test_official_email(self): boarded_user = User.objects.get(username=newusr) self.assertTrue(boarded_user.is_active) - @mock.patch('registrations.serializers.send_notification_create') + @mock.patch("registrations.serializers.send_notification_create") def test_user_registration(self, send_notification_create): - country = Country.objects.get(name='country') - User.objects.create(username='testuser@gmail.com') + country = Country.objects.get(name="country") + User.objects.create(username="testuser@gmail.com") old_user_count = User.objects.filter(is_active=False).count() - newusr = 'testuser@gmail.com' + newusr = "testuser@gmail.com" data = { - 'email': newusr, - 'username': "tetsts", - 'password': '87654321', - 'country': country.pk, - 'organization_type': 'OTHR', - 'organization': 'Zoo', - 'first_name': 'Peter', - 'last_name': 'Falk', - 'justification': 'aaaa', - 'city': 'kathmandu' + "email": newusr, + "username": "tetsts", + "password": "87654321", + "country": country.pk, + "organization_type": "OTHR", + "organization": "Zoo", + "first_name": "Peter", + "last_name": "Falk", + "justification": "aaaa", + "city": "kathmandu", } - resp = self.client.post('/register', json=data) + resp = self.client.post("/register", json=data) self.assertEqual(resp.status_code, 400) self.assertEqual(User.objects.filter(is_active=False).count(), old_user_count) # No new user to be created # update the email now should create user - data['email'] = "test@gmail.com" - resp = self.client.post('/register', data=data) + data["email"] = "test@gmail.com" + resp = self.client.post("/register", data=data) self.assertEqual(resp.status_code, 200) self.assertEqual(User.objects.filter(is_active=False).count(), old_user_count + 1) # check profile is created for the user - self.assertEqual(Profile.objects.filter(user__email=data['email']).exists(), True) + self.assertEqual(Profile.objects.filter(user__email=data["email"]).exists(), True) # check if the notification is called self.assertTrue(send_notification_create.is_called()) @@ -180,17 +180,16 @@ def setUp(self): private_key_pem = private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, - encryption_algorithm=serialization.NoEncryption() + encryption_algorithm=serialization.NoEncryption(), ) # Serialize public key public_key_pem = public_key.public_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PublicFormat.SubjectPublicKeyInfo + encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo ) - self.JWT_PRIVATE_KEY = private_key_pem.decode('utf-8') - self.JWT_PUBLIC_KEY = public_key_pem.decode('utf-8') + self.JWT_PRIVATE_KEY = private_key_pem.decode("utf-8") + self.JWT_PUBLIC_KEY = public_key_pem.decode("utf-8") def test_external_token_with_key(self): self.client.force_authenticate(self.user) @@ -203,18 +202,16 @@ def test_external_token_with_key(self): self.user.refresh_from_db() self.assertEqual(self.user.profile.accepted_montandon_license_terms, True) - data = { - "title": "ok" - } + data = {"title": "ok"} with override_settings( JWT_PRIVATE_KEY=self.JWT_PRIVATE_KEY, JWT_PUBLIC_KEY=self.JWT_PUBLIC_KEY, ): - response = self.client.post('/api/v2/external-token/', data, format='json') + response = self.client.post("/api/v2/external-token/", data, format="json") self.assertEqual(response.status_code, 201) def test_external_token_with_no_keys(self): self.client.force_authenticate(self.user) - response = self.client.post('/api/v2/external-token/') + response = self.client.post("/api/v2/external-token/") self.assertEqual(response.status_code, 400) diff --git a/registrations/utils.py b/registrations/utils.py index 061609478..9fb246ec2 100644 --- a/registrations/utils.py +++ b/registrations/utils.py @@ -4,23 +4,21 @@ from django.db.models.functions import Lower from api.models import Country, Profile, UserRegion + from .models import DomainWhitelist def is_valid_domain(email): # TODO: Rename function name - domain = email.lower().split('@')[1] + domain = email.lower().split("@")[1] is_allowed = ( - DomainWhitelist.objects.filter( - is_active=True - ).annotate( - domain_name_lower=Lower('domain_name') - ).filter( - domain_name_lower=domain - ).exists() + DomainWhitelist.objects.filter(is_active=True) + .annotate(domain_name_lower=Lower("domain_name")) + .filter(domain_name_lower=domain) + .exists() ) - if is_allowed or domain in ['ifrc.org', 'arcs.org.af', 'voroskereszt.hu']: + if is_allowed or domain in ["ifrc.org", "arcs.org.af", "voroskereszt.hu"]: return True return False @@ -29,7 +27,7 @@ def get_valid_admins(contacts): if not type(contacts) is list: return False # Get the emails into an array, don't include None - emails = [admin.get('email', None) for admin in contacts if admin.get('email', None)] + emails = [admin.get("email", None) for admin in contacts if admin.get("email", None)] # Currently we enforce 2 admins to validate if len(emails) < 2: return False @@ -44,7 +42,7 @@ def getRegionalAdmins(userId): countryId = Profile.objects.get(user_id=userId).country_id regionId = Country.objects.get(id=countryId).region_id - admins = UserRegion.objects.filter(region_id=regionId).values_list('user__email', flat=True) + admins = UserRegion.objects.filter(region_id=regionId).values_list("user__email", flat=True) return admins @@ -52,7 +50,7 @@ def jwt_encode_handler(payload): return jwt.encode( payload, settings.JWT_PRIVATE_KEY, - algorithm='ES256', + algorithm="ES256", ) @@ -60,5 +58,5 @@ def jwt_decode_handler(token): return jwt.decode( token, settings.JWT_PUBLIC_KEY, - algorithms=['ES256'], + algorithms=["ES256"], ) diff --git a/registrations/views.py b/registrations/views.py index 2f8570924..751aff0e0 100644 --- a/registrations/views.py +++ b/registrations/views.py @@ -1,65 +1,66 @@ from datetime import timedelta -from django.db.models import Q -from django.utils import timezone -from django.core.exceptions import ObjectDoesNotExist from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Q from django.http import HttpResponse from django.template.loader import render_to_string - +from django.utils import timezone +from rest_framework import permissions, viewsets from rest_framework.views import APIView -from rest_framework import viewsets, permissions -from api.views import ( - bad_http_request, - bad_request, -) +from api.views import bad_http_request, bad_request from notifications.notification import send_notification from registrations.serializers import UserExternalTokenSerializer + from .models import Pending, UserExternalToken -from .utils import ( - is_valid_domain, - getRegionalAdmins -) +from .utils import getRegionalAdmins, is_valid_domain class VerifyEmail(APIView): def get(self, request): - token = request.GET.get('token', None) - user = request.GET.get('user', None) + token = request.GET.get("token", None) + user = request.GET.get("user", None) if not token or not user: - return bad_http_request('Credentials not found', - 'The URL must include a token and user. \ + return bad_http_request( + "Credentials not found", + "The URL must include a token and user. \ Please check your verification email and try again. \ - If this problem persists, contact a system administrator.') + If this problem persists, contact a system administrator.", + ) try: pending_user = Pending.objects.get(token=token, user__username=user) except ObjectDoesNotExist: - return bad_http_request('User not found, or token incorrect', - 'We could not find a user and token that matched those supplied. \ - Please contact your system administrator.') + return bad_http_request( + "User not found, or token incorrect", + "We could not find a user and token that matched those supplied. \ + Please contact your system administrator.", + ) if pending_user.user.is_active: - return bad_http_request('%s is active' % user, - 'The user is already active. If you need to reset your password, \ - contact your system administrator.') + return bad_http_request( + "%s is active" % user, + "The user is already active. If you need to reset your password, \ + contact your system administrator.", + ) if pending_user.email_verified: - return bad_http_request('You have already verified your email', - 'A validation email has been sent to the administrators you listed.') + return bad_http_request( + "You have already verified your email", "A validation email has been sent to the administrators you listed." + ) if pending_user.created_at < timezone.now() - timedelta(days=30): - return bad_http_request('This link is expired', - 'You must verify your email within 30 days. \ - Please contact your system administrator.') + return bad_http_request( + "This link is expired", + "You must verify your email within 30 days. \ + Please contact your system administrator.", + ) if is_valid_domain(pending_user.user.email): pending_user.user.is_active = True pending_user.user.save() pending_user.delete() - email_context = { - 'frontend_url': settings.FRONTEND_URL - } - return HttpResponse(render_to_string('registration/success.html', email_context)) + email_context = {"frontend_url": settings.FRONTEND_URL} + return HttpResponse(render_to_string("registration/success.html", email_context)) else: admins = getRegionalAdmins(pending_user.user_id) @@ -67,77 +68,81 @@ def get(self, request): for admin in admins: token = pending_user.admin_token_1 email_context = { - 'validation_link': 'https://%s/validate_user/?token=%s&user=%s' % ( + "validation_link": "https://%s/validate_user/?token=%s&user=%s" + % ( settings.BASE_URL, # on PROD it should point to goadmin... token, user, ), - 'first_name': pending_user.user.first_name, - 'last_name': pending_user.user.last_name, - 'username': pending_user.user.username, - 'email': pending_user.user.email, - 'region': pending_user.user.profile.country.region, - 'country': pending_user.user.profile.country, - 'organization': pending_user.user.profile.org, - 'city': pending_user.user.profile.city, - 'department': pending_user.user.profile.department, - 'position': pending_user.user.profile.position, - 'phone': pending_user.user.profile.phone_number, - 'justification': pending_user.justification, + "first_name": pending_user.user.first_name, + "last_name": pending_user.user.last_name, + "username": pending_user.user.username, + "email": pending_user.user.email, + "region": pending_user.user.profile.country.region, + "country": pending_user.user.profile.country, + "organization": pending_user.user.profile.org, + "city": pending_user.user.profile.city, + "department": pending_user.user.profile.department, + "position": pending_user.user.profile.position, + "phone": pending_user.user.profile.phone_number, + "justification": pending_user.justification, } - send_notification('Reference to approve an account', - [admin], - render_to_string('email/registration/validate.html', email_context), - 'Approve an account - ' + pending_user.user.username) + send_notification( + "Reference to approve an account", + [admin], + render_to_string("email/registration/validate.html", email_context), + "Approve an account - " + pending_user.user.username, + ) pending_user.email_verified = True pending_user.save() - return HttpResponse(render_to_string('registration/validation-sent.html')) + return HttpResponse(render_to_string("registration/validation-sent.html")) class ValidateUser(APIView): def get(self, request): - token = request.GET.get('token', None) - user = request.GET.get('user', None) + token = request.GET.get("token", None) + user = request.GET.get("user", None) if not token or not user: - return bad_http_request('Credentials not found', - 'The URL must include a token and user. Please check your email and try again.') + return bad_http_request( + "Credentials not found", "The URL must include a token and user. Please check your email and try again." + ) try: pending_user = Pending.objects.get(Q(admin_token_1=token) | Q(admin_token_2=token), user__username=user) except ObjectDoesNotExist: - return bad_http_request('User not found, or token incorrect', - 'We could not find a user and token that matched those supplied.') + return bad_http_request( + "User not found, or token incorrect", "We could not find a user and token that matched those supplied." + ) if pending_user.user.is_active: - return bad_http_request('%s is active' % user, - 'The user is already active. \ - You can modify user accounts any time using the admin interface.') + return bad_http_request( + "%s is active" % user, + "The user is already active. \ + You can modify user accounts any time using the admin interface.", + ) - did_validate = getattr(pending_user, 'admin_1_validated') + did_validate = getattr(pending_user, "admin_1_validated") if did_validate: - return bad_http_request('Already confirmed', - 'You have already confirmed this user.') + return bad_http_request("Already confirmed", "You have already confirmed this user.") - setattr(pending_user, 'admin_1_validated', True) - setattr(pending_user, 'admin_1_validated_date', timezone.now()) + setattr(pending_user, "admin_1_validated", True) + setattr(pending_user, "admin_1_validated_date", timezone.now()) pending_user.save() if pending_user.admin_1_validated: # and pending_user.admin_2_validated: pending_user.user.is_active = True pending_user.user.save() - email_context = { - 'frontend_url': settings.FRONTEND_URL - } + email_context = {"frontend_url": settings.FRONTEND_URL} send_notification( - 'Your account has been approved', + "Your account has been approved", [pending_user.user.email], - render_to_string('email/registration/outside-email-success.html', email_context), - f'Approved account successfully - {pending_user.user.username}' + render_to_string("email/registration/outside-email-success.html", email_context), + f"Approved account successfully - {pending_user.user.username}", ) pending_user.delete() - return HttpResponse(render_to_string('registration/validation-success.html')) + return HttpResponse(render_to_string("registration/validation-success.html")) class UserExternalTokenViewset(viewsets.ModelViewSet): @@ -148,4 +153,4 @@ def get_queryset(self): return UserExternalToken.objects.filter(user=self.request.user) def destroy(self, request, *args, **kwargs): - return bad_request('Delete method not allowed') \ No newline at end of file + return bad_request("Delete method not allowed") diff --git a/utils/elasticsearch.py b/utils/elasticsearch.py index 0ae7f4936..4b37135bc 100644 --- a/utils/elasticsearch.py +++ b/utils/elasticsearch.py @@ -1,66 +1,65 @@ -from api.logger import logger -from api.indexes import ES_PAGE_NAME -from api.esconnection import ES_CLIENT from elasticsearch.helpers import bulk +from api.esconnection import ES_CLIENT +from api.indexes import ES_PAGE_NAME +from api.logger import logger + def log_errors(errors): if len(errors): - logger.error('Produced the following errors:') - logger.error('[%s]' % ', '.join(map(str, errors))) + logger.error("Produced the following errors:") + logger.error("[%s]" % ", ".join(map(str, errors))) def delete_es_index(instance): - ''' instance needs an es_id() ''' + """instance needs an es_id()""" if ES_CLIENT and ES_PAGE_NAME: # To make sure it doesn't run for tests - if hasattr(instance, 'es_id'): + if hasattr(instance, "es_id"): try: - deleted, errors = bulk(client=ES_CLIENT, actions=[{ - '_op_type': 'delete', - '_index': ES_PAGE_NAME, - '_type': 'page', - '_id': instance.es_id() - }]) - logger.info(f'Deleted {deleted} records') + deleted, errors = bulk( + client=ES_CLIENT, + actions=[{"_op_type": "delete", "_index": ES_PAGE_NAME, "_type": "page", "_id": instance.es_id()}], + ) + logger.info(f"Deleted {deleted} records") log_errors(errors) except Exception: - logger.error('Could not reach Elasticsearch server or index was already missing.') + logger.error("Could not reach Elasticsearch server or index was already missing.") else: - logger.warning('instance does not have an es_id() method') + logger.warning("instance does not have an es_id() method") def construct_es_data(instance, is_create=False): data = instance.indexing() metadata = { - '_op_type': 'create' if is_create else 'update', - '_index': ES_PAGE_NAME, - '_type': 'page', - '_id': instance.es_id(), + "_op_type": "create" if is_create else "update", + "_index": ES_PAGE_NAME, + "_type": "page", + "_id": instance.es_id(), } - if (is_create): + if is_create: metadata.update(**data) else: - metadata['doc'] = data + metadata["doc"] = data return metadata def create_es_index(instance): - ''' Creates an Elasticsearch index from the record instance ''' + """Creates an Elasticsearch index from the record instance""" if ES_CLIENT and ES_PAGE_NAME: # To make sure it doesn't run for tests created, errors = bulk(client=ES_CLIENT, actions=[construct_es_data(instance, True)]) - logger.info(f'Created {created} records') + logger.info(f"Created {created} records") log_errors(errors) def update_es_index(instance): - ''' Updates the Elasticsearch index from the record instance ''' + """Updates the Elasticsearch index from the record instance""" if ES_CLIENT and ES_PAGE_NAME: # To make sure it doesn't run for tests updated, errors = bulk(client=ES_CLIENT, actions=[construct_es_data(instance)]) - logger.info(f'Updated {updated} records') + logger.info(f"Updated {updated} records") log_errors(errors) diff --git a/utils/erp.py b/utils/erp.py index 1f0b65dd1..f4dc17090 100644 --- a/utils/erp.py +++ b/utils/erp.py @@ -1,34 +1,33 @@ -import requests -import pytz -from itertools import chain from datetime import datetime -from api.models import RequestChoices, ERPGUID -from api.logger import logger +from itertools import chain + +import pytz +import requests from django.conf import settings +from api.logger import logger +from api.models import ERPGUID, RequestChoices ERP_API_ENDPOINT = settings.ERP_API_ENDPOINT ERP_API_SUBSCRIPTION_KEY = settings.ERP_API_SUBSCRIPTION_KEY def push_fr_data(data, retired=False): - if ERP_API_ENDPOINT == 'x': + if ERP_API_ENDPOINT == "x": return # Contacts c_ifrc_names = ",".join( - data.contacts.filter(ctype__iexact='Federation').values_list('name', flat=True) + data.contacts.filter(ctype__iexact="Federation").values_list("name", flat=True) ) # normally there is only 1 c_ns_names = ",".join( - data.contacts.filter(ctype__iexact='NationalSociety').values_list('name', flat=True) + data.contacts.filter(ctype__iexact="NationalSociety").values_list("name", flat=True) ) # normally there is only 1 - requestTitle = data.event.name if data.event else '-' # Emergency name + requestTitle = data.event.name if data.event else "-" # Emergency name try: countryNamesSet = set( - country.iso for country in chain( - data.event.countries.all() if data.event else [], - data.countries.all()) + country.iso for country in chain(data.event.countries.all() if data.event else [], data.countries.all()) ) # Country ISO2 codes in emergency countryNames = list(countryNamesSet) except AttributeError: @@ -47,13 +46,13 @@ def push_fr_data(data, retired=False): else pytz.timezone("UTC").localize(datetime(1900, 1, 1, 1, 1, 1, 1)).strftime("%Y-%m-%d, %H:%M:%S") ) - ''' + """ InitialRequestType: If “Appeal” <> “No”, then “EA”. Else if “DREF” <> “No”, then “DREF” Else “Empty” (if both DREF and Appeal, then the type must be EA) - ''' + """ if data.appeal != RequestChoices.NO: InitialRequestType, InitialRequestValue = "EA", data.appeal_amount @@ -71,7 +70,8 @@ def push_fr_data(data, retired=False): data.other_num_affected, data.num_potentially_affected, data.gov_num_potentially_affected, - data.other_num_potentially_affected][index] + data.other_num_potentially_affected, + ][index] # index == 0 means undefined. So we estimate it: MaxNumberOfPeopleAffected = max( @@ -80,7 +80,8 @@ def push_fr_data(data, retired=False): data.other_num_affected or 0, data.num_potentially_affected or 0, data.gov_num_potentially_affected or 0, - data.other_num_potentially_affected or 0) + data.other_num_potentially_affected or 0, + ) if index == 0 and 0 < MaxNumberOfPeopleAffected: NumberOfPeopleAffected = MaxNumberOfPeopleAffected @@ -107,31 +108,30 @@ def push_fr_data(data, retired=False): "CurrencyCode": "CHF", }, # Value: Field Report Appeal amount OR Field Report DREF amount (so not from Appeal table) # ^ CurrencyCode can be different? - } + }, } } - headers = {'Content-Type': 'application/json', 'Ocp-Apim-Trace': 'true', 'Ocp-Apim-Subscription-Key': ERP_API_SUBSCRIPTION_KEY} + headers = { + "Content-Type": "application/json", + "Ocp-Apim-Trace": "true", + "Ocp-Apim-Subscription-Key": ERP_API_SUBSCRIPTION_KEY, + } # The response contains the GUID (res.text) res = requests.post(ERP_API_ENDPOINT, json=payload, headers=headers) if res.status_code == 200: - res_text = res.text.replace('"', '') - logger.info('Successfully posted to ERP') - logger.info('GUID: {}'.format(res_text)) + res_text = res.text.replace('"', "") + logger.info("Successfully posted to ERP") + logger.info("GUID: {}".format(res_text)) # Saving GUID into a table so that the API can be queried with it to get info about # if the actual sending has failed or not. - ERPGUID.objects.create( - api_guid=res_text, - field_report=data - ) + ERPGUID.objects.create(api_guid=res_text, field_report=data) - logger.info('E-mails were sent successfully.') + logger.info("E-mails were sent successfully.") elif res.status_code == 401 or res.status_code == 403: logger.error( - f'Authorization/authentication failed with status code ({res.status_code}) to the ERP API. Field Report ID: {data.id}' + f"Authorization/authentication failed with status code ({res.status_code}) to the ERP API. Field Report ID: {data.id}" ) else: - logger.error( - f'Failed to post to the ERP API with status code ({res.status_code}). Field Report ID: {data.id}' - ) + logger.error(f"Failed to post to the ERP API with status code ({res.status_code}). Field Report ID: {data.id}") diff --git a/utils/test_utils.py b/utils/test_utils.py index 8bd609436..afbbaa3ea 100644 --- a/utils/test_utils.py +++ b/utils/test_utils.py @@ -1,58 +1,49 @@ -import erp import json from collections import Counter -from django.test import TestCase +from unittest.mock import patch +import erp import reversion +from django.contrib.contenttypes.models import ContentType +from django.test import TestCase from reversion.errors import RevertError from reversion.models import Version -from django.contrib.contenttypes.models import ContentType -from api.models import Event, FieldReport, Region, Country, DisasterType, ERPGUID -from main.mock import erp_request_side_effect_mock -from main.utils import DjangoReversionDataFixHelper -from unittest.mock import patch - -from per.models import Overview as PerOverview -from per.factories import OverviewFactory as PerOverviewFactory -from api.factories import disaster_type as dtFactory from api.factories import country as countryFactory +from api.factories import disaster_type as dtFactory from api.factories import event as eventFactory from api.factories import field_report as fieldReportFactory +from api.models import ERPGUID, Country, DisasterType, Event, FieldReport, Region +from main.mock import erp_request_side_effect_mock +from main.utils import DjangoReversionDataFixHelper +from per.factories import OverviewFactory as PerOverviewFactory +from per.models import Overview as PerOverview class ERPTest(TestCase): - @patch('requests.post', side_effect=erp_request_side_effect_mock) + @patch("requests.post", side_effect=erp_request_side_effect_mock) def test_not_successful(self, erp_request_side_effect_mock): dtype = dtFactory.DisasterTypeFactory() - event = eventFactory.EventFactory(name='disaster1', summary='test disaster', dtype=dtype) - report = fieldReportFactory.FieldReportFactory.create( - rid='test', - dtype=dtype, - event=event - ) + event = eventFactory.EventFactory(name="disaster1", summary="test disaster", dtype=dtype) + report = fieldReportFactory.FieldReportFactory.create(rid="test", dtype=dtype, event=event) event.countries.set([]) report.countries.set([]) result = erp.push_fr_data(report) # self.assertEqual(erp_request_side_effect_mock.called, False) # this should work, but CircleCI calls this mock - @patch('requests.post', side_effect=erp_request_side_effect_mock) + @patch("requests.post", side_effect=erp_request_side_effect_mock) def test_successful(self, erp_request_side_effect_mock): dtype = dtFactory.DisasterTypeFactory() country1 = countryFactory.CountryFactory() country2 = countryFactory.CountryFactory() - event = eventFactory.EventFactory(name='disaster1', summary='test disaster', dtype=dtype) - report = fieldReportFactory.FieldReportFactory.create( - rid='test', - dtype=dtype, - event=event - ) + event = eventFactory.EventFactory(name="disaster1", summary="test disaster", dtype=dtype) + report = fieldReportFactory.FieldReportFactory.create(rid="test", dtype=dtype, event=event) report.countries.add(country1) report.countries.add(country2) result = erp.push_fr_data(report) - ERP = ERPGUID.objects.get(api_guid='FindThisGUID') - self.assertEqual(ERP.api_guid, 'FindThisGUID') + ERP = ERPGUID.objects.get(api_guid="FindThisGUID") + self.assertEqual(ERP.api_guid, "FindThisGUID") self.assertEqual(ERP.field_report_id, report.id) self.assertEqual(erp_request_side_effect_mock.called, True) @@ -63,19 +54,21 @@ def get_version_qs(self): def update_serialized_data(self, raw_data, new_value): new_data = json.loads(raw_data) - new_data[0]['fields'][self.field_name] = new_value + new_data[0]["fields"][self.field_name] = new_value return json.dumps(new_data) def get_version_data_snapshot(self, field_name): # Version data snapshot excluding self.field_name version_data_snapshot = [] - for _id, data_raw in self.get_version_qs().values_list('id', 'serialized_data').order_by('id'): + for _id, data_raw in self.get_version_qs().values_list("id", "serialized_data").order_by("id"): data = json.loads(data_raw) - data[0]['fields'].pop(field_name) - version_data_snapshot.append({ - 'id': _id, - 'data': data, - }) + data[0]["fields"].pop(field_name) + version_data_snapshot.append( + { + "id": _id, + "data": data, + } + ) return version_data_snapshot def assert_values(self, values: dict): @@ -84,10 +77,17 @@ def assert_values(self, values: dict): # Check count assert self.get_version_qs().count() == sum(values.values()) # Check count by value - assert dict(Counter([ - json.loads(data)[0]['fields'][self.field_name] - for data in self.get_version_qs().values_list('serialized_data', flat=True) - ])) == values + assert ( + dict( + Counter( + [ + json.loads(data)[0]["fields"][self.field_name] + for data in self.get_version_qs().values_list("serialized_data", flat=True) + ] + ) + ) + == values + ) def confirm_version_data_serialization(self): for version in self.get_version_qs().all(): @@ -95,46 +95,36 @@ def confirm_version_data_serialization(self): def setUp(self): super().setUp() - self.field_name = 'date_of_assessment' + self.field_name = "date_of_assessment" for _ in range(95): reversion.create_revision()(PerOverviewFactory.create)() versions = self.get_version_qs().all() # Create dataset with different formats for index, version in enumerate(versions): - new_value = '2022-01-01' + new_value = "2022-01-01" if (index % 2) == 0: - new_value = '2022-01-01T00:00:00' + new_value = "2022-01-01T00:00:00" elif index == 1: new_value = None version.serialized_data = self.update_serialized_data( version.serialized_data, new_value, ) - Version.objects.bulk_update(versions, fields=('serialized_data',)) + Version.objects.bulk_update(versions, fields=("serialized_data",)) # Version data snapshot excluding self.field_name self.version_data_snapshot = self.get_version_data_snapshot(self.field_name) - self.assert_values({'2022-01-01': 46, '2022-01-01T00:00:00': 48, None: 1}) + self.assert_values({"2022-01-01": 46, "2022-01-01T00:00:00": 48, None: 1}) def test_date_fields_to_datetime(self): - self.assert_values({'2022-01-01': 46, '2022-01-01T00:00:00': 48, None: 1}) - DjangoReversionDataFixHelper.date_fields_to_datetime( - ContentType, - Version, - PerOverview, - [self.field_name] - ) - self.assert_values({'2022-01-01T00:00:00': 94, None: 1}) + self.assert_values({"2022-01-01": 46, "2022-01-01T00:00:00": 48, None: 1}) + DjangoReversionDataFixHelper.date_fields_to_datetime(ContentType, Version, PerOverview, [self.field_name]) + self.assert_values({"2022-01-01T00:00:00": 94, None: 1}) def test_datetime_fields_to_date(self): with self.assertRaises(RevertError): self.confirm_version_data_serialization() - self.assert_values({'2022-01-01': 46, '2022-01-01T00:00:00': 48, None: 1}) - DjangoReversionDataFixHelper.datetime_fields_to_date( - ContentType, - Version, - PerOverview, - [self.field_name] - ) - self.assert_values({'2022-01-01': 94, None: 1}) + self.assert_values({"2022-01-01": 46, "2022-01-01T00:00:00": 48, None: 1}) + DjangoReversionDataFixHelper.datetime_fields_to_date(ContentType, Version, PerOverview, [self.field_name]) + self.assert_values({"2022-01-01": 94, None: 1}) self.confirm_version_data_serialization()