drvikasgaur commited on
Commit
bf857f3
Β·
verified Β·
1 Parent(s): a06d697

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -67
app.py CHANGED
@@ -1,15 +1,15 @@
1
  import gradio as gr
2
  import requests
3
  import pandas as pd
4
- import io
5
- from docx import Document
6
  import tempfile
 
7
 
8
  API_BASE_URL = "https://pubmed-api-jwfq.onrender.com/search_pubmed"
 
9
 
10
- global_df = None # Global variable to store search results for export
11
 
12
- def fetch_pubmed_articles(query, max_results=10, page=1, sort_by="Year", filter_journal="All", min_year=None, max_year=None):
 
13
  """
14
  Fetches PubMed articles and applies sorting and filtering.
15
  """
@@ -21,7 +21,6 @@ def fetch_pubmed_articles(query, max_results=10, page=1, sort_by="Year", filter_
21
  return f"⚠️ API Error: {response.status_code} - {response.text}", None
22
 
23
  articles = response.json()
24
-
25
  if not articles:
26
  return "No articles found for this query.", None
27
 
@@ -31,17 +30,17 @@ def fetch_pubmed_articles(query, max_results=10, page=1, sort_by="Year", filter_
31
  except:
32
  article["Year"] = 0
33
 
34
- # Apply journal filtering
35
  if filter_journal and filter_journal != "All":
36
  articles = [a for a in articles if filter_journal.lower() in a['Journal'].lower()]
37
 
38
- # Apply year filtering
39
  if min_year:
40
  articles = [a for a in articles if a["Year"] >= int(min_year)]
41
  if max_year:
42
  articles = [a for a in articles if a["Year"] <= int(max_year)]
43
 
44
- # Apply sorting
45
  if sort_by == "Year":
46
  articles.sort(key=lambda x: x["Year"], reverse=True)
47
  elif sort_by == "Title":
@@ -49,7 +48,7 @@ def fetch_pubmed_articles(query, max_results=10, page=1, sort_by="Year", filter_
49
  elif sort_by == "Journal":
50
  articles.sort(key=lambda x: x["Journal"])
51
 
52
- # Format results
53
  formatted_results = []
54
  for article in articles:
55
  formatted_results.append(
@@ -68,65 +67,85 @@ def fetch_pubmed_articles(query, max_results=10, page=1, sort_by="Year", filter_
68
  return f"⚠️ Error fetching data: {str(e)}", None
69
 
70
 
71
-
72
  def export_results(df, format_type):
73
  """
74
- Exports search results as a CSV or DOCX file.
75
- - Returns the file path instead of BytesIO to avoid TypeError in Gradio.
76
  """
 
 
77
  if df is None or df.empty:
 
78
  return None
79
 
80
- temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=f".{format_type.lower()}")
81
- temp_file_path = temp_file.name # Store the temporary file path
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
83
- if format_type == "CSV":
84
- df.to_csv(temp_file_path, index=False)
85
- elif format_type == "DOCX":
86
- doc = Document()
87
- doc.add_heading("PubMed Search Results", level=1)
88
- for _, row in df.iterrows():
89
- doc.add_heading(row["Title"], level=2)
90
- doc.add_paragraph(f"πŸ“– Journal: {row['Journal']} ({row['Year']})")
91
- doc.add_paragraph(f"πŸ‘¨β€πŸ”¬ Authors: {row['Authors']}")
92
- doc.add_paragraph(f"πŸ”— Link: {row['PubMed_URL']}")
93
- doc.add_paragraph(f"πŸ“„ Abstract: {row['Abstract']}")
94
- doc.add_paragraph("---")
95
- doc.save(temp_file_path)
96
 
97
- temp_file.close() # Close the file before returning the path
98
- return temp_file_path # Return file path instead of BytesIO
 
 
 
 
 
 
 
 
 
 
 
 
99
 
100
 
101
  with gr.Blocks() as app:
102
  gr.Markdown("""
103
- # πŸ” **PubMed Search Tool with Advanced Features**
104
-
105
- ## πŸ“– **How to Use This App**
106
- 1️⃣ **Enter a Search Query** *(e.g., "Deep Learning in Psychiatry")*
107
- 2️⃣ **Set the Number of Results & Page Number** *(Default: 10 results per page)*
108
- 3️⃣ **Choose Sorting Option** *(Year, Title, or Journal - Default: Year)*
109
- 4️⃣ **(Optional) Filter by Journal Name** *(e.g., "Nature", "JAMA")*
110
- 5️⃣ **(Optional) Filter by Year Range** *(Set min & max year, e.g., 2015 - 2023)*
111
- 6️⃣ **Click "πŸ” Search" to fetch results**
112
- 7️⃣ **Click "πŸ“‚ Export as CSV" or "πŸ“„ Export as Word DOCX" to save articles**
113
- 8️⃣ **Click "πŸ“„ Show Abstract" under each result to expand full abstract**
114
-
115
- ## ⚠️ **Important Notes**
116
- - **Sorting & Filtering can be combined** *(e.g., show only "Nature" articles from 2020-2024, sorted by Title)*
117
-
118
  """)
119
 
120
  with gr.Row():
121
- query_input = gr.Textbox(label="πŸ”Ž Search Query", placeholder="Enter topic (e.g., 'Neural Networks in Psychiatry')", lines=1)
122
-
123
  with gr.Row():
124
- max_results_input = gr.Slider(1, 50, value=10, step=1, label="πŸ“„ Number of Results per Page")
125
- page_input = gr.Slider(1, 200, value=1, step=1, label="πŸ“„ Page Number")
126
 
127
  with gr.Row():
128
- sort_input = gr.Dropdown(choices=["Year", "Title", "Journal"], value="Year", label="πŸ”„ Sort By")
129
- journal_filter_input = gr.Textbox(label="🎯 Filter by Journal (Optional)", placeholder="Enter journal name or leave blank")
130
 
131
  with gr.Row():
132
  min_year_input = gr.Number(label="πŸ“… Min Year", value=None)
@@ -139,29 +158,18 @@ with gr.Blocks() as app:
139
 
140
  results_output = gr.HTML()
141
  export_csv_output = gr.File(label="Download CSV")
142
- export_docx_output = gr.File(label="Download Word DOCX")
143
-
144
- def search_and_display(query, max_results, page, sort_by, journal_filter, min_year, max_year):
145
- global global_df
146
- result_text, df = fetch_pubmed_articles(query, max_results, page, sort_by, journal_filter, min_year, max_year)
147
- global_df = df
148
- return result_text
149
-
150
- def export_csv():
151
- if global_df is not None:
152
- return export_results(global_df, "CSV")
153
-
154
- def export_docx():
155
- if global_df is not None:
156
- return export_results(global_df, "DOCX")
157
 
158
  search_button.click(search_and_display,
159
- inputs=[query_input, max_results_input, page_input, sort_input, journal_filter_input, min_year_input, max_year_input],
 
160
  outputs=results_output)
161
 
162
  export_csv_button.click(export_csv, outputs=export_csv_output)
163
  export_docx_button.click(export_docx, outputs=export_docx_output)
164
 
 
165
  if __name__ == "__main__":
166
- app.launch(inbrowser=True)
 
167
 
 
1
  import gradio as gr
2
  import requests
3
  import pandas as pd
 
 
4
  import tempfile
5
+ from docx import Document
6
 
7
  API_BASE_URL = "https://pubmed-api-jwfq.onrender.com/search_pubmed"
8
+ global_df = None # Global variable to store search results
9
 
 
10
 
11
+ def fetch_pubmed_articles(query, max_results=10, page=1, sort_by="Year",
12
+ filter_journal="All", min_year=None, max_year=None):
13
  """
14
  Fetches PubMed articles and applies sorting and filtering.
15
  """
 
21
  return f"⚠️ API Error: {response.status_code} - {response.text}", None
22
 
23
  articles = response.json()
 
24
  if not articles:
25
  return "No articles found for this query.", None
26
 
 
30
  except:
31
  article["Year"] = 0
32
 
33
+ # Filter by journal
34
  if filter_journal and filter_journal != "All":
35
  articles = [a for a in articles if filter_journal.lower() in a['Journal'].lower()]
36
 
37
+ # Filter by year
38
  if min_year:
39
  articles = [a for a in articles if a["Year"] >= int(min_year)]
40
  if max_year:
41
  articles = [a for a in articles if a["Year"] <= int(max_year)]
42
 
43
+ # Sorting
44
  if sort_by == "Year":
45
  articles.sort(key=lambda x: x["Year"], reverse=True)
46
  elif sort_by == "Title":
 
48
  elif sort_by == "Journal":
49
  articles.sort(key=lambda x: x["Journal"])
50
 
51
+ # Format markdown results
52
  formatted_results = []
53
  for article in articles:
54
  formatted_results.append(
 
67
  return f"⚠️ Error fetching data: {str(e)}", None
68
 
69
 
 
70
  def export_results(df, format_type):
71
  """
72
+ Safely exports the given DataFrame to a temporary file (CSV or DOCX).
 
73
  """
74
+ import traceback
75
+
76
  if df is None or df.empty:
77
+ print("⚠️ Warning: DataFrame is empty or None. Nothing to export.")
78
  return None
79
 
80
+ try:
81
+ suffix = f".{format_type.lower()}"
82
+ temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=suffix)
83
+ temp_file_path = temp_file.name
84
+
85
+ if format_type == "CSV":
86
+ df.to_csv(temp_file_path, index=False)
87
+
88
+ elif format_type == "DOCX":
89
+ doc = Document()
90
+ doc.add_heading("PubMed Search Results", level=1)
91
+ for _, row in df.iterrows():
92
+ doc.add_heading(row.get("Title", "Untitled"), level=2)
93
+ doc.add_paragraph(f"πŸ“– Journal: {row.get('Journal', 'Unknown')} ({row.get('Year', '')})")
94
+ doc.add_paragraph(f"πŸ‘¨β€πŸ”¬ Authors: {row.get('Authors', 'N/A')}")
95
+ doc.add_paragraph(f"πŸ”— Link: {row.get('PubMed_URL', 'N/A')}")
96
+ doc.add_paragraph(f"πŸ“„ Abstract: {row.get('Abstract', '')}")
97
+ doc.add_paragraph("---")
98
+ doc.save(temp_file_path)
99
+
100
+ temp_file.close()
101
+ return temp_file_path
102
+
103
+ except Exception as e:
104
+ print("❌ Export failed:", str(e))
105
+ traceback.print_exc()
106
+ return None
107
+
108
+
109
+ def export_csv():
110
+ if global_df is not None:
111
+ file_path = export_results(global_df, "CSV")
112
+ if isinstance(file_path, str):
113
+ return file_path
114
+ return None
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
+ def export_docx():
118
+ if global_df is not None:
119
+ file_path = export_results(global_df, "DOCX")
120
+ if isinstance(file_path, str):
121
+ return file_path
122
+ return None
123
+
124
+
125
+ def search_and_display(query, max_results, page, sort_by, journal_filter, min_year, max_year):
126
+ global global_df
127
+ result_text, df = fetch_pubmed_articles(query, max_results, page, sort_by, journal_filter, min_year, max_year)
128
+ global_df = df
129
+ print("πŸ” Search completed. DataFrame loaded with", len(df) if df is not None else 0, "articles.")
130
+ return result_text
131
 
132
 
133
  with gr.Blocks() as app:
134
  gr.Markdown("""
135
+ # πŸ” **PubMed Search Tool with Export Options**
136
+ ### Search biomedical literature and export results as CSV or Word DOCX.
 
 
 
 
 
 
 
 
 
 
 
 
 
137
  """)
138
 
139
  with gr.Row():
140
+ query_input = gr.Textbox(label="πŸ”Ž Search Query", placeholder="e.g., 'Deep Learning in Psychiatry'")
141
+
142
  with gr.Row():
143
+ max_results_input = gr.Slider(1, 50, value=10, step=1, label="πŸ“„ Results per Page")
144
+ page_input = gr.Slider(1, 100, value=1, step=1, label="πŸ“„ Page Number")
145
 
146
  with gr.Row():
147
+ sort_input = gr.Dropdown(["Year", "Title", "Journal"], value="Year", label="πŸ”„ Sort By")
148
+ journal_filter_input = gr.Textbox(label="🎯 Filter by Journal (optional)", placeholder="e.g., Nature")
149
 
150
  with gr.Row():
151
  min_year_input = gr.Number(label="πŸ“… Min Year", value=None)
 
158
 
159
  results_output = gr.HTML()
160
  export_csv_output = gr.File(label="Download CSV")
161
+ export_docx_output = gr.File(label="Download DOCX")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
 
163
  search_button.click(search_and_display,
164
+ inputs=[query_input, max_results_input, page_input,
165
+ sort_input, journal_filter_input, min_year_input, max_year_input],
166
  outputs=results_output)
167
 
168
  export_csv_button.click(export_csv, outputs=export_csv_output)
169
  export_docx_button.click(export_docx, outputs=export_docx_output)
170
 
171
+
172
  if __name__ == "__main__":
173
+ app.launch()
174
+
175