Skip to content

Commit 4bb46ff

Browse files
committed
Add Priority Export feature for lowest-quality records
Feature: Export F-grade records for volunteer prioritization - Added 'Priority Export' section to Data Export page - Allows volunteers to download lowest-scoring organizations and sites - Configurable export count with sliders (10-1000 orgs, 10-500 sites) - Includes quality scores and recommendations in exported CSV - Preview of top 10 priority records before download - Helps volunteers focus on records needing most improvement Perfect for identifying which records to work on first!
1 parent 08d83f9 commit 4bb46ff

1 file changed

Lines changed: 111 additions & 0 deletions

File tree

data_explorer.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

14621573
def main():

0 commit comments

Comments
 (0)