feat(Explorer): Enhance metric extraction, source transparency, and UI display
- **Standardization & Formula Logic:** Fixed NameError/SyntaxError in formula parser; added support for comments and capitalized placeholders.
- **Source URL Tracking:** Extended DB schema and cascade logic to store and track specific source URLs.
- **Frontend & UI:**
- Added 'Standardized Potential' display in Inspector.
- Added clickable source link with icon.
- Fixed Settings tab layout collapse (flex-shrink-0).
- **Export Capabilities:**
- Single-company JSON export now includes full quantitative metadata.
- New global CSV export endpoint /api/companies/export.
- **System Integrity:**
- Fixed Notion sync typo ('Stanardization').
- Corrected Nginx proxy routing and FastAPI route ordering.
- Ensured DB persistence via explicit docker-compose volume mapping.
This commit is contained in:
@@ -104,6 +104,48 @@ def list_companies(
|
||||
logger.error(f"List Companies Error: {e}", exc_info=True)
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@app.get("/api/companies/export")
|
||||
def export_companies_csv(db: Session = Depends(get_db)):
|
||||
"""
|
||||
Exports a CSV of all companies with their key metrics.
|
||||
"""
|
||||
import io
|
||||
import csv
|
||||
from fastapi.responses import StreamingResponse
|
||||
|
||||
output = io.StringIO()
|
||||
writer = csv.writer(output)
|
||||
|
||||
# Header
|
||||
writer.writerow([
|
||||
"ID", "Name", "Website", "City", "Country", "AI Industry",
|
||||
"Metric Name", "Metric Value", "Metric Unit", "Standardized Value (m2)",
|
||||
"Source", "Source URL", "Confidence", "Proof Text"
|
||||
])
|
||||
|
||||
companies = db.query(Company).order_by(Company.name.asc()).all()
|
||||
|
||||
for c in companies:
|
||||
writer.writerow([
|
||||
c.id, c.name, c.website, c.city, c.country, c.industry_ai,
|
||||
c.calculated_metric_name,
|
||||
c.calculated_metric_value,
|
||||
c.calculated_metric_unit,
|
||||
c.standardized_metric_value,
|
||||
c.metric_source,
|
||||
c.metric_source_url,
|
||||
c.metric_confidence,
|
||||
c.metric_proof_text
|
||||
])
|
||||
|
||||
output.seek(0)
|
||||
|
||||
return StreamingResponse(
|
||||
output,
|
||||
media_type="text/csv",
|
||||
headers={"Content-Disposition": f"attachment; filename=company_export_{datetime.utcnow().strftime('%Y-%m-%d')}.csv"}
|
||||
)
|
||||
|
||||
@app.get("/api/companies/{company_id}")
|
||||
def get_company(company_id: int, db: Session = Depends(get_db)):
|
||||
company = db.query(Company).options(
|
||||
@@ -194,6 +236,10 @@ def list_robotics_categories(db: Session = Depends(get_db)):
|
||||
def list_industries(db: Session = Depends(get_db)):
|
||||
return db.query(Industry).all()
|
||||
|
||||
@app.get("/api/job_roles")
|
||||
def list_job_roles(db: Session = Depends(get_db)):
|
||||
return db.query(JobRoleMapping).order_by(JobRoleMapping.pattern.asc()).all()
|
||||
|
||||
@app.post("/api/enrich/discover")
|
||||
def discover_company(req: AnalysisRequest, background_tasks: BackgroundTasks, db: Session = Depends(get_db)):
|
||||
company = db.query(Company).filter(Company.id == req.company_id).first()
|
||||
@@ -296,6 +342,49 @@ def override_impressum(company_id: int, url: str, background_tasks: BackgroundTa
|
||||
db.commit()
|
||||
return {"status": "updated"}
|
||||
|
||||
@app.get("/api/companies/export")
|
||||
def export_companies_csv(db: Session = Depends(get_db)):
|
||||
"""
|
||||
Exports a CSV of all companies with their key metrics.
|
||||
"""
|
||||
import io
|
||||
import csv
|
||||
from fastapi.responses import StreamingResponse
|
||||
|
||||
output = io.StringIO()
|
||||
writer = csv.writer(output)
|
||||
|
||||
# Header
|
||||
writer.writerow([
|
||||
"ID", "Name", "Website", "City", "Country", "AI Industry",
|
||||
"Metric Name", "Metric Value", "Metric Unit", "Standardized Value (m2)",
|
||||
"Source", "Source URL", "Confidence", "Proof Text"
|
||||
])
|
||||
|
||||
companies = db.query(Company).order_by(Company.name.asc()).all()
|
||||
|
||||
for c in companies:
|
||||
writer.writerow([
|
||||
c.id, c.name, c.website, c.city, c.country, c.industry_ai,
|
||||
c.calculated_metric_name,
|
||||
c.calculated_metric_value,
|
||||
c.calculated_metric_unit,
|
||||
c.standardized_metric_value,
|
||||
c.metric_source,
|
||||
c.metric_source_url,
|
||||
c.metric_confidence,
|
||||
c.metric_proof_text
|
||||
])
|
||||
|
||||
output.seek(0)
|
||||
|
||||
return StreamingResponse(
|
||||
output,
|
||||
media_type="text/csv",
|
||||
headers={"Content-Disposition": f"attachment; filename=company_export_{datetime.utcnow().strftime('%Y-%m-%d')}.csv"}
|
||||
)
|
||||
|
||||
|
||||
def run_wikipedia_reevaluation_task(company_id: int):
|
||||
from .database import SessionLocal
|
||||
db = SessionLocal()
|
||||
|
||||
Reference in New Issue
Block a user