ouhenio's picture
Update app.py
65deab8 verified
raw
history blame
5.29 kB
import gradio as gr
import random
import json
import fastapi
from fastapi import FastAPI
import os
import argilla as rg
# Initialize Argilla client
client = rg.Argilla(
api_url=os.getenv("ARGILLA_API_URL", ""),
api_key=os.getenv("ARGILLA_API_KEY", "")
)
# List of countries to check
countries = {
"Argentina": {
"iso": "ARG",
"emoji": "🇦🇷"
},
"Bolivia": {
"iso": "BOL",
"emoji": "🇧🇴"
},
"Chile": {
"iso": "CHL",
"emoji": "🇨🇱"
},
"Colombia": {
"iso": "COL",
"emoji": "🇨🇴"
},
"Costa Rica": {
"iso": "CRI",
"emoji": "🇨🇷"
},
"Cuba": {
"iso": "CUB",
"emoji": "🇨🇺"
},
"Ecuador": {
"iso": "ECU",
"emoji": "🇪🇨"
},
"El Salvador": {
"iso": "SLV",
"emoji": "🇸🇻"
},
"España": {
"iso": "ESP",
"emoji": "🇪🇸"
},
"Guatemala": {
"iso": "GTM",
"emoji": "🇬🇹"
},
"Honduras": {
"iso": "HND",
"emoji": "🇭🇳"
},
"México": {
"iso": "MEX",
"emoji": "🇲🇽"
},
"Nicaragua": {
"iso": "NIC",
"emoji": "🇳🇮"
},
"Panamá": {
"iso": "PAN",
"emoji": "🇵🇦"
},
"Paraguay": {
"iso": "PRY",
"emoji": "🇵🇾"
},
"Perú": {
"iso": "PER",
"emoji": "🇵🇪"
},
"Puerto Rico": {
"iso": "PRI",
"emoji": "🇵🇷"
},
"República Dominicana": {
"iso": "DOM",
"emoji": "🇩🇴"
},
"Uruguay": {
"iso": "URY",
"emoji": "🇺🇾"
},
"Venezuela": {
"iso": "VEN",
"emoji": "🇻🇪"
}
}
def count_answers_per_space(country: str):
"""
Count the number of answers for a specific country's answering space.
Args:
country: Country code (e.g., "CHL")
Returns:
Dictionary with statistics about answers in the space
"""
iso = countries[country]["iso"]
emoji = countries[country]["emoji"]
dataset_name = f"{emoji} {country} - {iso} - Responder"
try:
dataset = client.datasets(dataset_name)
# Get all records with their responses
records = dataset.records(with_responses=True)
# Count total questions
total_questions = len(list(records))
# Count answered questions
answered_questions = 0
total_answers = 0
answers_per_user = {}
for record in records:
responses = record.responses.get("text", [])
if responses:
answered_questions += 1
total_answers += len(responses)
# Count per user
for response in responses:
user_id = str(response.user_id)
if user_id in answers_per_user:
answers_per_user[user_id] += 1
else:
answers_per_user[user_id] = 1
percentage_complete = (answered_questions / total_questions * 100) if total_questions > 0 else 0
return {
"name": country,
"total_questions": total_questions,
"answered_questions": answered_questions,
"total_answers": total_answers,
"percent": round(percentage_complete, 2),
"documents": total_answers * 10 # Approximation of document count
}
except Exception as e:
# If space doesn't exist, return zero values
print(f"No dataset found for {dataset_name}: {e}")
return {
"name": country,
"total_questions": 0,
"answered_questions": 0,
"total_answers": 0,
"percent": 0,
"documents": 0
}
# Create a FastAPI app
app = FastAPI()
# Route to serve the map visualization
@app.get("/d3-map")
async def serve_map():
# Generate data for each country by querying Argilla
country_data = {}
for country in countries.keys():
country_data[country] = count_answers_per_space(country)
# Convert to JSON for JavaScript
country_data_json = json.dumps(country_data)
# Replace the placeholder with actual data
with open('template.txt', 'r') as f:
html_template = f.read()
html_content = html_template.replace("COUNTRY_DATA_PLACEHOLDER", country_data_json)
return fastapi.responses.HTMLResponse(content=html_content)
# Create a simple Gradio interface with an iframe
def create_iframe():
# Add a random parameter to force reload
random_param = random.randint(1, 10000)
return '<iframe src="/d3-map?t={}" style="width:100%; height:650px; border:none;"></iframe>'.format(random_param)
# Create the Gradio blocks
with gr.Blocks(theme=gr.themes.Soft(primary_hue="pink", secondary_hue="purple")) as demo:
gr.Markdown("# Mapa anotación")
iframe_output = gr.HTML(create_iframe())
# Refresh button to generate new random data
def refresh():
return create_iframe()
gr.Button("Actualizar Datos").click(fn=refresh, outputs=iframe_output)
# Mount the Gradio app to the FastAPI app
gr.mount_gradio_app(app, demo, path="/")
# Start the server
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860)