
    _id                     |   d Z ddlZddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZ ddlmZ  e         e
e      Z ee      j&                  dz  Zed	z  Zd
 Zd Zd&dZd Zd'dZd Zd&dZej;                  d      d        Zej;                  d      d        Zej;                  d      d        Z ej;                  d      d        Z!ej;                  d      d        Z"ej;                  d      d        Z#ej;                  d      d        Z$edk(  r% e%d         e%d!       ejM                  d"d#d$%       yy)(z9
Web frontend for viewing and analyzing trending topics.
    N)datetime	timedelta)Path)Counter)Flaskrender_templatejsonifyrequest)load_dotenvoutputztrends_history.dbc                  b    t        j                  t              } t         j                  | _        | S )zGet database connection.)sqlite3connectDB_PATHRowrow_factory)conns    -/home/sietch6/trending-topics-pipeline/web.pyget_dbr      s!    ??7#D{{DK    c                      t         dz  } | j                         r*t        |       5 }t        j                  |      cddd       S y# 1 sw Y   yxY w)z/Get trends from the most recent collection run.ztrends_weekly.jsonN)
OUTPUT_DIRexistsopenjsonload)	json_pathfs     r   get_latest_trendsr      sH    11I)_ 	 99Q<	  	 	 s   AAc                     t               }|j                         }|j                  d| f       |j                         D cg c]  }t	        |       }}|j                          |S c c}w )z!Get list of past collection runs.z
        SELECT id, run_date, total_items, sources_succeeded, sources_failed
        FROM collection_runs
        ORDER BY run_date DESC
        LIMIT ?
    r   cursorexecutefetchalldictclose)limitr   r"   rowrunss        r   get_historical_runsr*   '   s_    8D[[]F
NN	 
 "(!23#DI3D3JJLK 4s    A&c                 ^   t               }|j                         }|j                  d| f       |j                         }|s|j	                          yt        |      }|j                  d| f       |j                         D cg c]  }t        |       }}|j	                          ||dS c c}w )z+Get detailed trend data for a specific run.z*SELECT * FROM collection_runs WHERE id = ?Nz
        SELECT topic_name, source, original_rank, final_rank, region,
               final_score, source_count, boosted, url, metadata
        FROM trend_items
        WHERE run_id = ?
        ORDER BY final_rank
    )runitems)r   r"   r#   fetchoner&   r%   r$   )run_idr   r"   run_rowrun_infor(   r-   s          r   get_run_detailsr2   9   s    8D[[]F NN?&KooG

G}H NN	 
		 #)//"343T#Y4E4JJLe,, 5s   B*c                 4   t               }|j                         }t        j                         t	        |       z
  j                         }|j                  d|f       |j                         D cg c]  }t        |       }}|j                          |S c c}w )zEFind topics that have appeared in multiple runs over the past N days.daysa  
        SELECT t.topic_name, COUNT(DISTINCT r.id) as appearances,
               GROUP_CONCAT(DISTINCT t.source) as sources,
               AVG(t.final_score) as avg_score,
               MIN(r.run_date) as first_seen,
               MAX(r.run_date) as last_seen
        FROM trend_items t
        JOIN collection_runs r ON t.run_id = r.id
        WHERE r.run_date >= ?
        GROUP BY LOWER(t.topic_name)
        HAVING appearances > 1
        ORDER BY appearances DESC, avg_score DESC
        LIMIT 50
    
r   r"   r   utcnowr   	isoformatr#   r$   r%   r&   )r5   r   r"   cutoffr(   topicss         r   get_persistent_topicsr;   X   s~    8D[[]Foo)"66AACF
NN	 
	$ $*??#45Cd3i5F5JJLM 6s   /Bc                      t               } | j                         }|j                  d       |j                         D cg c]  }t	        |       }}| j                          |S c c}w )z!Get statistics about each source.z
        SELECT source, COUNT(*) as total_items,
               AVG(final_score) as avg_score,
               COUNT(DISTINCT run_id) as runs_appeared
        FROM trend_items
        GROUP BY source
    r!   )r   r"   r(   statss       r   get_source_statsr>   v   sX    8D[[]F
NN	 #)//"343T#Y4E4JJLL 5s   A$c                 >   t               }|j                         }t        j                         t	        |      z
  j                         }|j                  dd|  d|f       |j                         D cg c]  }t        |       }}|j                          |S c c}w )z)Get historical data for a specific topic.r4   z
        SELECT r.run_date, t.final_rank, t.final_score, t.source
        FROM trend_items t
        JOIN collection_runs r ON t.run_id = r.id
        WHERE LOWER(t.topic_name) LIKE LOWER(?)
        AND r.run_date >= ?
        ORDER BY r.run_date
    %r6   )
topic_namer5   r   r"   r9   r(   historys          r   get_trending_over_timerC      s    8D[[]Foo)"66AACF
NN	 ZL	F#
 %+OO$56StCy6G6JJLN 7s   4B/c                  v    t               } t        d      }t        d      }t               }t	        d| |||      S )zMain dashboard page.
      z
index.htmllatestr)   
persistentsource_stats)r   r*   r;   r>   r   rH   s       r   indexrL      sD      Fr"D&q)J#%L! r   z/api/latestc                  (    t        t                     S )zAPI endpoint for latest trends.)r	   r    r   r   
api_latestrO      s     $&''r   z	/api/runsc                  v    t         j                  j                  ddt              } t	        t        |             S )z!API endpoint for historical runs.r'      type)r
   argsgetintr	   r*   )r'   s    r   api_runsrW      s0     LLWbs3E&u-..r   z/api/run/<int:run_id>c                 P    t        |       }|rt        |      S t        ddi      dfS )z&API endpoint for specific run details.errorzRun not foundi  )r2   r	   )r/   detailss     r   api_run_detailsr[      s1     f%GwG_-.33r   z/api/persistentc                  v    t         j                  j                  ddt              } t	        t        |             S )z#API endpoint for persistent topics.r5   rG   rR   )r
   rT   rU   rV   r	   r;   r4   s    r   api_persistentr]      s0     <<FAC0D(.//r   z/api/topic/<path:topic_name>c                 x    t         j                  j                  ddt              }t	        t        | |            S )zAPI endpoint for topic history.r5   rQ   rR   )r
   rT   rU   rV   r	   rC   )rA   r5   s     r   api_topic_historyr_      s2     <<FBS1D)*d;<<r   z/api/collectc                      ddl } 	 | j                         }|rt        d|j                  d      d      S t        ddd      d	fS # t        $ r#}t        dt        |      d      d	fcY d}~S d}~ww xY w)
zTrigger a new collection run.r   Nsuccessr/   )statusr/   rY   zNo data collected)rb   messagei  )mainrun_pipeliner	   rU   	Exceptionstr)rd   resultes      r   api_collectrj      sx     D""$i6::h;OPQQ'6IJKSPP D'c!f=>CCDs"   .A A 	A1A,&A1,A1__main__z%Starting Trending Topics Dashboard...z*Open http://localhost:5000 in your browserz0.0.0.0i  T)hostportdebug)rQ   )rG   )'__doc__r   r   r   r   pathlibr   collectionsr   flaskr   r   r	   r
   dotenvr   __name__app__file__parentr   r   r   r   r*   r2   r;   r>   rC   routerL   rO   rW   r[   r]   r_   rj   printr,   rN   r   r   <module>rz      sv     (   : :  Ho(^""X-

*
*$-><(0 3   =( (
 ;/ / "#4 $4 0 0 )*= += >
D 
D z	
12	
67GGTG2 r   