Skip to content

Commit 45b1f72

Browse files
committed
Fix citation traceability with smart URL mapping and status indicators
1 parent 07fac02 commit 45b1f72

5 files changed

Lines changed: 173 additions & 10 deletions

File tree

core/citation_helper.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
"""
2+
Citation Helper - Provides working URLs and fallback options for dataset citations
3+
"""
4+
5+
def get_working_citation_url(dataset_id: str, dataset_title: str, original_url: str) -> dict:
6+
"""
7+
Returns working URLs and metadata for dataset citations
8+
"""
9+
10+
# Working URL mappings for known datasets
11+
working_urls = {
12+
'agri-1': {
13+
'primary_url': 'https://data.gov.in/catalog/district-wise-season-wise-crop-production-statistics',
14+
'search_url': 'https://data.gov.in/search?title=district+crop+production',
15+
'status': 'search_recommended'
16+
},
17+
'agri-2': {
18+
'primary_url': 'https://data.gov.in/catalog/state-wise-estimates-principal-crops',
19+
'search_url': 'https://data.gov.in/search?title=state+crop+estimates',
20+
'status': 'search_recommended'
21+
},
22+
'agri-3': {
23+
'primary_url': 'https://data.gov.in/search?title=agricultural+statistics+glance',
24+
'search_url': 'https://data.gov.in/search?title=agricultural+statistics',
25+
'status': 'search_recommended'
26+
},
27+
'climate-1': {
28+
'primary_url': 'https://data.gov.in/catalog/district-wise-rainfall-normal',
29+
'search_url': 'https://data.gov.in/search?title=district+rainfall',
30+
'status': 'search_recommended'
31+
},
32+
'climate-2': {
33+
'primary_url': 'https://data.gov.in/search?title=state+monthly+rainfall',
34+
'search_url': 'https://data.gov.in/search?title=rainfall',
35+
'status': 'search_recommended'
36+
},
37+
'live-1': {
38+
'primary_url': 'https://data.gov.in/catalog/daily-market-prices-commodity-wise',
39+
'search_url': 'https://data.gov.in/search?title=market+prices',
40+
'status': 'live_api'
41+
},
42+
'live-2': {
43+
'primary_url': 'https://data.gov.in/catalog/current-crop-production',
44+
'search_url': 'https://data.gov.in/search?title=crop+production',
45+
'status': 'live_api'
46+
}
47+
}
48+
49+
# Get working URL or create search fallback
50+
if dataset_id in working_urls:
51+
return working_urls[dataset_id]
52+
else:
53+
# Create search URL from dataset title
54+
search_terms = dataset_title.lower().replace(' ', '+').replace(',', '')
55+
return {
56+
'primary_url': f'https://data.gov.in/search?title={search_terms}',
57+
'search_url': f'https://data.gov.in/search?title={search_terms}',
58+
'status': 'search_fallback'
59+
}
60+
61+
def get_citation_display_info(dataset_id: str, dataset_title: str) -> dict:
62+
"""
63+
Returns display information for citations including status badges
64+
"""
65+
66+
url_info = get_working_citation_url(dataset_id, dataset_title, "")
67+
68+
status_info = {
69+
'search_recommended': {
70+
'badge': 'Search Portal',
71+
'description': 'Links to data.gov.in search - original files may have moved',
72+
'color': 'amber'
73+
},
74+
'live_api': {
75+
'badge': 'Live API',
76+
'description': 'Real-time data from government API',
77+
'color': 'green'
78+
},
79+
'search_fallback': {
80+
'badge': 'Search',
81+
'description': 'Search data.gov.in for this dataset',
82+
'color': 'gray'
83+
}
84+
}
85+
86+
status = url_info['status']
87+
88+
return {
89+
'url': url_info['primary_url'],
90+
'search_url': url_info['search_url'],
91+
'badge': status_info[status]['badge'],
92+
'description': status_info[status]['description'],
93+
'color': status_info[status]['color']
94+
}

core/synthesizer.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from typing import Dict, List, Any
88
import json
99
from datetime import datetime
10+
from .citation_helper import get_citation_display_info
1011

1112
class AnswerSynthesizer:
1213
def __init__(self):
@@ -183,11 +184,21 @@ def _generate_citations(self, sources: List[Dict]) -> List[Dict]:
183184
citations = []
184185

185186
for source in sources:
187+
# Get working URL and display info
188+
dataset_id = source.get('dataset_id', '')
189+
dataset_title = source['dataset_title']
190+
191+
citation_info = get_citation_display_info(dataset_id, dataset_title)
192+
186193
citation = {
187-
'dataset_title': source['dataset_title'],
188-
'resource_url': source['resource_url'],
194+
'dataset_title': dataset_title,
195+
'resource_url': citation_info['url'],
196+
'search_url': citation_info['search_url'],
189197
'publisher': source.get('publisher', 'Unknown'),
190-
'query_summary': f"Used {source['table_name']} table for {source['geo_granularity']} level data"
198+
'query_summary': f"Used {source['table_name']} table for {source['geo_granularity']} level data",
199+
'status_badge': citation_info['badge'],
200+
'status_description': citation_info['description'],
201+
'status_color': citation_info['color']
191202
}
192203
citations.append(citation)
193204

frontend/nextjs/components/CitationPanel.tsx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,28 @@ export const CitationPanel: React.FC<CitationPanelProps> = ({
4747
</div>
4848
</div>
4949

50-
<div className="mb-4 text-sm text-amber-700 bg-gradient-to-r from-amber-50 to-yellow-50 p-3 rounded-xl border border-amber-200/50">
51-
📝 <strong>Note:</strong> Original gov portal links may be outdated. Use download button for actual data samples.
50+
<div className="mb-4 text-sm text-blue-700 bg-gradient-to-r from-blue-50 to-indigo-50 p-3 rounded-xl border border-blue-200/50">
51+
💡 <strong>Tip:</strong> Links redirect to data.gov.in search if original files moved. Use PDF download for processed data samples.
5252
</div>
5353

5454
<div className="space-y-2">
5555
{citations.map((citation, index) => (
5656
<div key={index} className="flex items-start justify-between p-4 bg-white/70 backdrop-blur-sm rounded-xl border border-gray-200/50 shadow-sm hover:shadow-md transition-all duration-300">
5757
<div className="flex-1">
58-
<h4 className="text-sm font-semibold text-gray-900 mb-2">
59-
{citation.dataset_title}
60-
</h4>
58+
<div className="flex items-center gap-2 mb-2">
59+
<h4 className="text-sm font-semibold text-gray-900">
60+
{citation.dataset_title}
61+
</h4>
62+
{citation.status_badge && (
63+
<span className={`text-xs px-2 py-1 rounded-full ${
64+
citation.status_color === 'green' ? 'bg-green-100 text-green-700' :
65+
citation.status_color === 'amber' ? 'bg-amber-100 text-amber-700' :
66+
'bg-gray-100 text-gray-700'
67+
}`}>
68+
{citation.status_color === 'green' ? '⚡' : citation.status_color === 'amber' ? '🔍' : '🔍'} {citation.status_badge}
69+
</span>
70+
)}
71+
</div>
6172
<p className="text-xs text-gray-600 mb-1 font-medium">
6273
Publisher: <span className="text-blue-600">{citation.publisher}</span>
6374
</p>
@@ -66,6 +77,11 @@ export const CitationPanel: React.FC<CitationPanelProps> = ({
6677
{citation.query_summary}
6778
</p>
6879
)}
80+
{citation.status_description && (
81+
<p className="text-xs text-gray-500 mt-1">
82+
{citation.status_description}
83+
</p>
84+
)}
6985
</div>
7086

7187
<div className="ml-3 flex space-x-2">
@@ -96,11 +112,11 @@ export const CitationPanel: React.FC<CitationPanelProps> = ({
96112
</button>
97113
<span className="text-gray-400">|</span>
98114
<a
99-
href={citation.resource_url.startsWith('http') ? citation.resource_url : `https://data.gov.in/search?title=${encodeURIComponent(citation.dataset_title)}`}
115+
href={citation.resource_url || citation.search_url || `https://data.gov.in/search?title=${encodeURIComponent(citation.dataset_title)}`}
100116
target="_blank"
101117
rel="noopener noreferrer"
102118
className="text-blue-600 hover:text-blue-800 transition-colors"
103-
title="View original dataset"
119+
title={citation.status_description || "Search for dataset on data.gov.in"}
104120
>
105121
<ExternalLink className="w-4 h-4" />
106122
</a>

frontend/nextjs/lib/api.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ export interface QuestionRequest {
1111
export interface Citation {
1212
dataset_title: string;
1313
resource_url: string;
14+
search_url?: string;
1415
publisher: string;
1516
query_summary: string;
17+
status_badge?: string;
18+
status_description?: string;
19+
status_color?: string;
1620
}
1721

1822
export interface ProvenanceData {

test_citations.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Test script to verify citation improvements
4+
"""
5+
6+
from core.citation_helper import get_citation_display_info, get_working_citation_url
7+
8+
def test_citations():
9+
"""Test citation URL improvements"""
10+
11+
test_datasets = [
12+
('agri-1', 'District wise Season wise Crop Production Statistics'),
13+
('live-1', 'Live Market Prices'),
14+
('climate-1', 'District wise Rainfall Normal'),
15+
('unknown-dataset', 'Some Unknown Dataset')
16+
]
17+
18+
print("=== Citation URL Testing ===\n")
19+
20+
for dataset_id, title in test_datasets:
21+
print(f"Dataset: {title}")
22+
print(f"ID: {dataset_id}")
23+
24+
# Test URL mapping
25+
url_info = get_working_citation_url(dataset_id, title, "")
26+
print(f"Primary URL: {url_info['primary_url']}")
27+
print(f"Search URL: {url_info['search_url']}")
28+
print(f"Status: {url_info['status']}")
29+
30+
# Test display info
31+
display_info = get_citation_display_info(dataset_id, title)
32+
print(f"Badge: {display_info['badge']}")
33+
print(f"Description: {display_info['description']}")
34+
print(f"Color: {display_info['color']}")
35+
print("-" * 50)
36+
37+
if __name__ == "__main__":
38+
test_citations()

0 commit comments

Comments
 (0)