@@ -1457,6 +1457,117 @@ def display_data_export(sites: List[Dict], organizations: List[Dict]):
14571457 mime = "application/json" ,
14581458 help = "Download sites and organizations together in one JSON file"
14591459 )
1460+
1461+ # Priority Export - lowest quality records for volunteer work
1462+ st .markdown ("---" )
1463+ st .markdown ("### 🎯 Priority Export (Lowest Quality Records)" )
1464+ st .info ("Export records with the lowest quality scores - these need the most volunteer attention!" )
1465+
1466+ from tackle_hunger .data_quality import calculate_organization_quality_score , calculate_site_quality_score
1467+
1468+ col1 , col2 = st .columns (2 )
1469+
1470+ with col1 :
1471+ if organizations :
1472+ # Calculate quality scores for all organizations
1473+ org_scores = []
1474+ for org in organizations :
1475+ quality = calculate_organization_quality_score (org )
1476+ org_with_score = org .copy ()
1477+ org_with_score ['quality_score' ] = quality ['overall_score' ]
1478+ org_with_score ['quality_grade' ] = quality ['grade' ]
1479+ org_with_score ['recommendations' ] = '; ' .join (quality ['recommendations' ])
1480+ org_scores .append (org_with_score )
1481+
1482+ # Sort by quality score (lowest first)
1483+ org_scores .sort (key = lambda x : x ['quality_score' ])
1484+
1485+ # Filter to F-grade only
1486+ f_grade_orgs = [o for o in org_scores if o ['quality_grade' ] == 'F' ]
1487+
1488+ st .metric ("F-Grade Organizations" , f"{ len (f_grade_orgs ):,} " )
1489+
1490+ # Number selector for export
1491+ num_to_export = st .slider (
1492+ "Number of lowest-scoring orgs to export:" ,
1493+ min_value = 10 ,
1494+ max_value = min (1000 , len (f_grade_orgs )) if f_grade_orgs else 10 ,
1495+ value = 100 ,
1496+ step = 10 ,
1497+ key = "priority_org_count"
1498+ )
1499+
1500+ if f_grade_orgs :
1501+ priority_orgs = f_grade_orgs [:num_to_export ]
1502+
1503+ # CSV export
1504+ csv_data = export_to_csv (priority_orgs , "priority_organizations" )
1505+ st .download_button (
1506+ label = f"⬇️ Download Top { num_to_export } Priority Orgs (CSV)" ,
1507+ data = csv_data ,
1508+ file_name = f"priority_orgs_F_grade_{ datetime .now ().strftime ('%Y%m%d_%H%M%S' )} .csv" ,
1509+ mime = "text/csv" ,
1510+ help = f"Download { num_to_export } organizations with lowest quality scores (F grade)"
1511+ )
1512+
1513+ # Show preview
1514+ with st .expander ("Preview Priority Organizations" ):
1515+ preview_df = pd .DataFrame (priority_orgs [:10 ])
1516+ display_cols = ['name' , 'quality_score' , 'quality_grade' , 'recommendations' ]
1517+ available_cols = [col for col in display_cols if col in preview_df .columns ]
1518+ st .dataframe (preview_df [available_cols ], use_container_width = True )
1519+ else :
1520+ st .info ("No organizations to prioritize" )
1521+
1522+ with col2 :
1523+ if sites :
1524+ # Calculate quality scores for all sites
1525+ site_scores = []
1526+ for site in sites :
1527+ quality = calculate_site_quality_score (site )
1528+ site_with_score = site .copy ()
1529+ site_with_score ['quality_score' ] = quality ['overall_score' ]
1530+ site_with_score ['quality_grade' ] = quality ['grade' ]
1531+ site_with_score ['recommendations' ] = '; ' .join (quality ['recommendations' ])
1532+ site_scores .append (site_with_score )
1533+
1534+ # Sort by quality score (lowest first)
1535+ site_scores .sort (key = lambda x : x ['quality_score' ])
1536+
1537+ # Filter to F-grade only
1538+ f_grade_sites = [s for s in site_scores if s ['quality_grade' ] == 'F' ]
1539+
1540+ st .metric ("F-Grade Sites" , f"{ len (f_grade_sites ):,} " )
1541+
1542+ # Number selector for export
1543+ num_to_export = st .slider (
1544+ "Number of lowest-scoring sites to export:" ,
1545+ min_value = 10 ,
1546+ max_value = min (500 , len (f_grade_sites )) if f_grade_sites else 10 ,
1547+ value = 50 ,
1548+ step = 10 ,
1549+ key = "priority_site_count"
1550+ )
1551+
1552+ if f_grade_sites :
1553+ priority_sites = f_grade_sites [:num_to_export ]
1554+
1555+ # CSV export
1556+ csv_data = export_to_csv (priority_sites , "priority_sites" )
1557+ st .download_button (
1558+ label = f"⬇️ Download Top { num_to_export } Priority Sites (CSV)" ,
1559+ data = csv_data ,
1560+ file_name = f"priority_sites_F_grade_{ datetime .now ().strftime ('%Y%m%d_%H%M%S' )} .csv" ,
1561+ mime = "text/csv" ,
1562+ help = f"Download { num_to_export } sites with lowest quality scores (F grade)"
1563+ )
1564+
1565+ # Show preview
1566+ with st .expander ("Preview Priority Sites" ):
1567+ preview_df = pd .DataFrame (priority_sites [:10 ])
1568+ display_cols = ['name' , 'city' , 'state' , 'quality_score' , 'quality_grade' , 'recommendations' ]
1569+ available_cols = [col for col in display_cols if col in preview_df .columns ]
1570+ st .dataframe (preview_df [available_cols ], use_container_width = True )
14601571
14611572
14621573def main ():
0 commit comments