1+ import re
12from copy import deepcopy
23
34from binary_database_files .models import File
@@ -330,6 +331,7 @@ class LivelihoodStrategyAdmin(admin.ModelAdmin):
330331 * translation_fields ("livelihood_zone_baseline__livelihood_zone__name__icontains" ),
331332 * translation_fields ("product__common_name__icontains" ),
332333 * translation_fields ("season__name__icontains" ),
334+ "livelihood_zone_baseline__livelihood_zone__country__iso_en_ro_name" ,
333335 )
334336
335337 list_filter = (
@@ -338,6 +340,22 @@ class LivelihoodStrategyAdmin(admin.ModelAdmin):
338340 ("livelihood_zone_baseline__livelihood_zone__country" , admin .RelatedOnlyFieldListFilter ),
339341 )
340342
343+ def get_search_results (self , request , queryset , search_term ):
344+ # Allow natural key format "BF01: 2011-10-31" by stripping the colon separator.
345+ normalized = search_term .replace (":" , "" )
346+ date_match = re .search (r"\b(\d{4}-\d{2}-\d{2})\b" , normalized )
347+ year_match = re .search (r"\b(\d{4})\b" , normalized )
348+ # Remove date/year from the term so text fields are searched without them.
349+ text_term = re .sub (r"\b\d{4}(?:-\d{2}-\d{2})?\b" , "" , normalized ).strip ()
350+ queryset , use_distinct = super ().get_search_results (request , queryset , text_term )
351+ if date_match :
352+ queryset = queryset .filter (livelihood_zone_baseline__reference_year_end_date = date_match .group (1 ))
353+ elif year_match :
354+ queryset = queryset .filter (
355+ livelihood_zone_baseline__reference_year_end_date__year = int (year_match .group (1 ))
356+ )
357+ return queryset , use_distinct
358+
341359 def get_queryset (self , request ):
342360 return (
343361 super ()
@@ -504,6 +522,8 @@ class LivelihoodActivityAdmin(admin.ModelAdmin):
504522 list_filter = (
505523 "strategy_type" ,
506524 "scenario" ,
525+ ("livelihood_zone_baseline" , admin .RelatedOnlyFieldListFilter ),
526+ ("wealth_group__wealth_group_category" , admin .RelatedOnlyFieldListFilter ),
507527 ("livelihood_strategy__product" , admin .RelatedOnlyFieldListFilter ),
508528 ("livelihood_strategy__season" , admin .RelatedOnlyFieldListFilter ),
509529 ("livelihood_zone_baseline__livelihood_zone__country" , admin .RelatedOnlyFieldListFilter ),
@@ -517,15 +537,32 @@ class LivelihoodActivityAdmin(admin.ModelAdmin):
517537 "livelihood_strategy__additional_identifier__icontains" ,
518538 "livelihood_zone_baseline__livelihood_zone__code" ,
519539 "livelihood_zone_baseline__livelihood_zone__alternate_code" ,
540+ * translation_fields ("livelihood_zone_baseline__livelihood_zone__name" ),
520541 "livelihood_strategy__product__cpc__iexact" ,
521542 "livelihood_strategy__product__aliases__icontains" ,
522543 "livelihood_strategy__season__aliases__icontains" ,
523544 "livelihood_strategy__additional_identifier" ,
524545 * translation_fields ("livelihood_strategy__product__common_name__icontains" ),
525546 * translation_fields ("livelihood_strategy__product__description__icontains" ),
526547 * translation_fields ("livelihood_strategy__season__name__icontains" ),
548+ "livelihood_zone_baseline__livelihood_zone__country__iso_en_ro_name" ,
527549 )
528550
551+ def get_search_results (self , request , queryset , search_term ):
552+ # Allow natural key format "BF01: 2011-10-31" by stripping the colon separator.
553+ normalized = search_term .replace (":" , "" )
554+ date_match = re .search (r"\b(\d{4}-\d{2}-\d{2})\b" , normalized )
555+ year_match = re .search (r"\b(\d{4})\b" , normalized )
556+ text_term = re .sub (r"\b\d{4}(?:-\d{2}-\d{2})?\b" , "" , normalized ).strip ()
557+ queryset , use_distinct = super ().get_search_results (request , queryset , text_term )
558+ if date_match :
559+ queryset = queryset .filter (livelihood_zone_baseline__reference_year_end_date = date_match .group (1 ))
560+ elif year_match :
561+ queryset = queryset .filter (
562+ livelihood_zone_baseline__reference_year_end_date__year = int (year_match .group (1 ))
563+ )
564+ return queryset , use_distinct
565+
529566 def get_object (self , request , object_id , from_field = None ):
530567 obj = super ().get_object (request , object_id , from_field )
531568 if obj is None :
@@ -600,6 +637,7 @@ def get_country_name(self, obj):
600637 None ,
601638 {
602639 "fields" : [
640+ "wealth_group" ,
603641 "livelihood_strategy" ,
604642 "scenario" ,
605643 "extra" ,
@@ -1065,19 +1103,39 @@ class SeasonalActivityAdmin(admin.ModelAdmin):
10651103 "is_key" ,
10661104 )
10671105 search_fields = (
1068- "seasonal_activity_type" ,
1069- "season" ,
1070- "product" ,
1071- "additional_identifier" ,
1106+ "livelihood_zone_baseline__livelihood_zone__code" ,
1107+ "livelihood_zone_baseline__livelihood_zone__alternate_code" ,
1108+ "seasonal_activity_type__code__icontains" ,
1109+ * translation_fields ("seasonal_activity_type__name__icontains" ),
1110+ * translation_fields ("season__name__icontains" ),
1111+ "season__aliases__icontains" ,
1112+ * translation_fields ("product__common_name__icontains" ),
1113+ "product__cpc__iexact" ,
1114+ "additional_identifier__icontains" ,
10721115 )
10731116 list_filter = (
10741117 "livelihood_zone_baseline__livelihood_zone" ,
10751118 "seasonal_activity_type" ,
1076- "season" ,
1077- "product" ,
1119+ ( "season" , admin . RelatedOnlyFieldListFilter ) ,
1120+ ( "product" , admin . RelatedOnlyFieldListFilter ) ,
10781121 "is_key" ,
10791122 )
10801123
1124+ def get_search_results (self , request , queryset , search_term ):
1125+ # Allow natural key format "BF01: 2011-10-31" by stripping the colon separator.
1126+ normalized = search_term .replace (":" , "" )
1127+ date_match = re .search (r"\b(\d{4}-\d{2}-\d{2})\b" , normalized )
1128+ year_match = re .search (r"\b(\d{4})\b" , normalized )
1129+ text_term = re .sub (r"\b\d{4}(?:-\d{2}-\d{2})?\b" , "" , normalized ).strip ()
1130+ queryset , use_distinct = super ().get_search_results (request , queryset , text_term )
1131+ if date_match :
1132+ queryset = queryset .filter (livelihood_zone_baseline__reference_year_end_date = date_match .group (1 ))
1133+ elif year_match :
1134+ queryset = queryset .filter (
1135+ livelihood_zone_baseline__reference_year_end_date__year = int (year_match .group (1 ))
1136+ )
1137+ return queryset , use_distinct
1138+
10811139
10821140class SeasonalActivityOccurrenceAdmin (admin .ModelAdmin ):
10831141 list_display = (
@@ -1088,10 +1146,15 @@ class SeasonalActivityOccurrenceAdmin(admin.ModelAdmin):
10881146 "end_month" ,
10891147 )
10901148 search_fields = (
1091- "seasonal_activity__seasonal_activity_type" ,
1092- "seasonal_activity__season" ,
1093- "seasonal_activity__product" ,
1094- "seasonal_activity__additional_identifier" ,
1149+ "seasonal_activity__livelihood_zone_baseline__livelihood_zone__code" ,
1150+ "seasonal_activity__livelihood_zone_baseline__livelihood_zone__alternate_code" ,
1151+ "seasonal_activity__seasonal_activity_type__code__icontains" ,
1152+ * translation_fields ("seasonal_activity__seasonal_activity_type__name__icontains" ),
1153+ * translation_fields ("seasonal_activity__season__name__icontains" ),
1154+ "seasonal_activity__season__aliases__icontains" ,
1155+ * translation_fields ("seasonal_activity__product__common_name__icontains" ),
1156+ "seasonal_activity__product__cpc__iexact" ,
1157+ "seasonal_activity__additional_identifier__icontains" ,
10951158 )
10961159 list_filter = (
10971160 "seasonal_activity__seasonal_activity_type" ,
@@ -1100,6 +1163,23 @@ class SeasonalActivityOccurrenceAdmin(admin.ModelAdmin):
11001163 )
11011164 ordering = ["start" ]
11021165
1166+ def get_search_results (self , request , queryset , search_term ):
1167+ # Allow natural key format "BF01: 2011-10-31" by stripping the colon separator.
1168+ normalized = search_term .replace (":" , "" )
1169+ date_match = re .search (r"\b(\d{4}-\d{2}-\d{2})\b" , normalized )
1170+ year_match = re .search (r"\b(\d{4})\b" , normalized )
1171+ text_term = re .sub (r"\b\d{4}(?:-\d{2}-\d{2})?\b" , "" , normalized ).strip ()
1172+ queryset , use_distinct = super ().get_search_results (request , queryset , text_term )
1173+ if date_match :
1174+ queryset = queryset .filter (
1175+ seasonal_activity__livelihood_zone_baseline__reference_year_end_date = date_match .group (1 )
1176+ )
1177+ elif year_match :
1178+ queryset = queryset .filter (
1179+ seasonal_activity__livelihood_zone_baseline__reference_year_end_date__year = int (year_match .group (1 ))
1180+ )
1181+ return queryset , use_distinct
1182+
11031183 @admin .display (boolean = True , description = "Key seasonal activity" )
11041184 def seasonal_activity_is_key (self , obj ):
11051185 return obj .seasonal_activity .is_key
0 commit comments