U
    ZhV                     @   sR   d Z ddlmZ ddlZddlmZmZ ddlmZ ee	Z
G dd deZdS )zN
Fixed Developer Discovery that includes developers from the developers table
    )DeveloperDiscoveryN)datetimetimezone)textc                       s8   e Zd ZdZdd Zd	eeeeed fddZ  ZS )
FixedDeveloperDiscoveryzAExtended DeveloperDiscovery that also checks the developers tablec           
      C   s  | j s
g S z@td}| j |}g }|D ]}d}d}z8td}| j |d|ji }|rn|jpfd}|j}W n: tk
r }	 zt	d|j
 d|	  W 5 d}	~	X Y nX ||jpd|j |j
d	d
|j
|jpd|j d| d|r| n|jr|j nd|dd|j|jr"|j ndddd q*tdt| d |W S  tk
r }	 ztd|	  g  W Y S d}	~	X Y nX dS )z(Get developers from the developers tableaQ  
                SELECT 
                    id,
                    developer_id,
                    name,
                    email,
                    active,
                    api_token,
                    created_at,
                    last_sync
                FROM developers
                WHERE active = true
            r   Na  
                        SELECT 
                            COUNT(*) as count,
                            MAX(timestamp) as last_activity
                        FROM activity_records 
                        WHERE developer_id = :dev_id
                    Zdev_idzError counting activities for z: Zdev_unknowni  zRegistered developer (z activities)Zdevelopers_tableZ
registeredzN/A)idnameZhostZportZhostnameZ	device_iddescriptionZ	last_seenactivity_countsourcestatusemail
created_atversionZbucket_countzFound z developers in developers tablez)Error discovering from developers table: )Z
db_sessionr   ZexecuteZdeveloper_idZfetchonecountlast_activity	ExceptionloggerZwarningr	   appendr   Z	isoformatr   r   infolenerror)
selfZqueryresultZ
developersrowr   r   Zcount_queryZcount_resulte r   ./fixed_developer_discovery.pydiscover_from_developers_table   sT    
 


*
 
z6FixedDeveloperDiscovery.discover_from_developers_tableFT)scan_network
scan_localscan_databaseinclude_developers_tablereturnc                    s   t  |||}|rtd |  }dd |D }|D ]~}|d |krT|| q8t|D ]X\}	}
|
d |d kr\|
ds|d|
d< |dd|
ddkr|d |
d<  q8q\q8tdt|  |S )	z1Extended discovery that includes developers tablez/Discovering developers from developers table...c                 S   s   h | ]}|d  qS )r   r   ).0devr   r   r   	<setcomp>c   s     zBFixedDeveloperDiscovery.discover_all_developers.<locals>.<setcomp>r   r   r   r   z3Total developers after including developers table: )	superdiscover_all_developersr   r   r   r   	enumerategetr   )r   r    r!   r"   r#   Zall_developersZ
table_devsZexisting_idsr&   iexisting	__class__r   r   r)   W   s"    

z/FixedDeveloperDiscovery.discover_all_developers)FTTT)	__name__
__module____qualname____doc__r   boollistr)   __classcell__r   r   r.   r   r      s   G      r   )r3   Zdeveloper_discoveryr   Zloggingr   r   Z
sqlalchemyr   Z	getLoggerr0   r   r   r   r   r   r   <module>   s   
