a

����á·´g„&��ã�������������������@���s˜���d�dl�Z�d�dlZd�dlmZ�d�dlmZ�d�dlmZ�d�dlm	Z	�d�dl
mZ�d�dlm
Z
�d�dlZd�dlZd�dlZd�dlmZ�d	d
„�ZG�dd„�deƒZdS�)
é����N)ÚConfig)Úget_pennseive_download_metrics)Úcreate_html_template)ÚEmailSender)ÚMonthlyStatsTable)Ú
itemgetter)Ú
relativedeltac�����������������C���s<���dd„�|�D�ƒ}t�|ƒ}dd„�|D�ƒ}t|tddƒdd}|S�)Nc�����������������S���s���g�|�]}t� |¡‘qS�©�)ÚjsonÚdumps©Ú.0Údr	���r	���ú@/home/cmiss/Jenkins/workspace/SPARC-API/scripts/monthly_stats.pyÚ
<listcomp>���ó����z%remove_duplicates.<locals>.<listcomp>c�����������������S���s���g�|�]}t� |¡‘qS�r	���)r
���Úloadsr���r	���r	���r���r������r���Ú	datasetIdÚversionT)ÚkeyÚreverse)ÚsetÚsortedr���)Zd_arrayZ	json_listZjson_setZunique_listr	���r	���r���Úremove_duplicates���s
����r���c�������������������@���s€���e�Zd�Zd!dd„Zd"dd„Zd	d
„�Zdd„�Zd
d„�Zdd„�Zdd„�Z	dd„�Z
dd„�Zdd„�Zdd„�Z
dd„�Zdd„�Zdd „�ZdS�)#ÚMonthlyStatsFÚ�c�����������������C���s†���t�ƒ�|�_i�|�_tj|�_d|�_tj ¡�|�_	d|�_
||�_||�_|rF||�_
ntj|�_
tjd�ur‚zttjƒ|�_W�n�ty€���d�|�_Y�n0�d�S�)Nr���é���)r���Ú	send_gridÚ
user_statsr���ÚPENNSIEVE_ORGANIZATIONÚorganizationÚ_pennsieve_temp_api_keyÚdatetimeÚnowÚ
created_atZrun_dayÚdebug_emailÚ
debug_modeÚlogging_addressÚMETRICS_EMAIL_ADDRESSÚDATABASE_URLr���ÚmonthlytableÚAttributeError)Úselfr&���r%���r	���r	���r���Ú__init__���s ����
zMonthlyStats.__init__NTc�����������������C���sJ���|d�u�rt�j� ¡� ¡�}|�jrF|�j |¡rF|� ¡�}|�j ||�j|¡�|S�g�S�©N)r"���r#���Údater*���ZsendingRequiredÚrunÚ	pushStater���)r,���ZtimeNowÚcommitÚsendgrid_responsesr	���r	���r���Úmonthly_stats_required_check+���s����z)MonthlyStats.monthly_stats_required_checkc��������������
������sŒ���g�}zˆ� �¡��ˆ� ˆ�j¡}W�nD�ty`�}�z,t d|›�¡�ˆ� d|›�¡�W�Y�d�}~n0d�}~0�0�ˆ� d‡�fdd„ˆ�jD�ƒ›�d|›�¡�|S�)Nz'Hit error while running monthly stats. z*Monthly stats sent successfully 
Sent to: c��������������������s,���g�|�]$}d�ˆ�j�|� ¡�v�rˆ�j�|�d��‘qS�)Úemail)r���Úkeys)r
���Úorcid_id©r,���r	���r���r���A���r���z$MonthlyStats.run.<locals>.<listcomp>z 
Send grid Responses: )Ú	get_statsÚ
send_statsr���Ú
BaseExceptionÚloggingÚ	exceptionÚsend_logging_email)r,���r3���Úerrorr	���r8���r���r0���7���s����&ÿþzMonthlyStats.runc�����������������C���sB���|� �¡�|�_|� ¡�}|� |¡}|� ||¡|�_|� ¡�|�_|� ¡��|�jS�r.���)	Úpennsieve_loginr!���Úget_download_metrics_one_monthÚ"get_dataset_details_from_pennsieveÚcreate_user_download_objectr���Ú&get_emails_orcid_id_map_from_pennsieveÚpennsieve_user_detailsÚ!user_stats_object_post_processing)r,���ÚmetricsZ'dataset_details_for_downloaded_datasetsr	���r	���r���r9���E���s����


zMonthlyStats.get_statsc�����������������C���sx���g�}d}d}|D�]P}d||� �¡�v�r||�d�}tt||�d�ƒƒ}|�js|� ||¡}| |¡�q|�jrt|� |¡g}|S�)Nr���r5���Údatasets)r6���r���r���r&���Ú
send_emailÚappendr>���)r,���r���Ú	responsesÚ
email_addressÚ
email_bodyr7���Úrr	���r	���r���r:���N���s����zMonthlyStats.send_statsc�����������������C���s���t�tddƒS�)Nr���)Úmonths)r���r���r8���r	���r	���r���rA���^���s����z+MonthlyStats.get_download_metrics_one_monthc�����������������C���sr���t� tj›�d¡}| ¡��| ¡�d�d�}| ¡�d�}tjd|ddd}|jdtj	tj
d	œ|d
}|d�d�}|S�)
Nz/authentication/cognito-configZ	tokenPoolZappClientIdÚregionzcognito-idpr���)Úregion_nameÚaws_access_key_idÚaws_secret_access_keyZUSER_PASSWORD_AUTH)ÚUSERNAMEZPASSWORD)ZAuthFlowZAuthParametersZClientIdZAuthenticationResultZAccessToken)ÚrequestsÚgetr���ÚPENNSIEVE_API_HOSTÚraise_for_statusr
���Úboto3ÚclientZ
initiate_authÚPENNSIEVE_API_TOKENÚPENNSIEVE_API_SECRET)r,���rN���Zcognito_app_client_idZcognito_regionZcognito_idp_clientZlogin_responseÚapi_keyr	���r	���r���r@���b���s"����üýzMonthlyStats.pennsieve_loginc�����������������C���s:���t�jtj›�d|�j›�ddd|�j›�id}| ¡��| ¡�S�)Nz/organizations/z/membersÚ
AuthorizationzBearer )Úheaders)rU���rV���r���rW���r ���r!���rX���r
���)r,���rN���r	���r	���r���rD���z���s
����ÿz3MonthlyStats.get_emails_orcid_id_map_from_pennsievec�����������������C���s`���|�j�D�]T}d| ¡�v�r|d�d�}||�j ¡�v�r|d�|�j|�d<�|�j|�d�|�j|�d<�qd�S�)NÚorcidr5���rH���)rE���r6���r���)r,���Úuserr7���r	���r	���r���rF���‚���s����
z.MonthlyStats.user_stats_object_post_processingc�����������������C���s@���t�dd„�|D�ƒƒ}t tj›�dd|dœ¡}| ¡��| ¡�d�S�)Nc�����������������S���s���g�|�]}|d��‘qS�)r���r	���r���r	���r	���r���r������r���zCMonthlyStats.get_dataset_details_from_pennsieve.<locals>.<listcomp>z/discover/datasetsiè��)ÚlimitÚidsrH���)r���rU���rV���r���rW���rX���r
���)r,���rG���Z	uniqueIdsrN���r	���r	���r���rB���‹���s����þz/MonthlyStats.get_dataset_details_from_pennsievec��������������������sŠ���i�}|D�]|‰�‡�fdd„|D�ƒ}|� �ˆ�|¡}ˆ�d�D�]P}|d�}|d�ur2|| ¡�vrhi�||<�|||�d<�q2| |¡d�|�||�d<�q2q|S�)Nc��������������������s ���g�|�]}ˆ�d��|d�kr|‘qS�)Úidr���r	���r���©Údatasetr	���r���r���›���r���z<MonthlyStats.create_user_download_object.<locals>.<listcomp>Zcontributorsr`���rH���)Ú!add_dataset_name_to_download_infor6���rV���)r,���Zdataset_details_objectZdownload_statsÚusersÚdownloadInfoZcontributorr7���r	���re���r���rC���–���s����z(MonthlyStats.create_user_download_objectc�����������������C���s(���t�dt|ƒƒD�]}|d�||�d<�q|S�)Nr���Úname)ÚrangeÚlen)r,���rf���ri���Úir	���r	���r���rg���¬���s����z.MonthlyStats.add_dataset_name_to_download_infoc�����������������C���sF���|�j�r |�j}|�j tj|d|¡S�tjdkrB|}|�j tj|d|¡S�d�S�)Nú&SPARC monthly dataset download summaryÚTRUE)r&���r%���r���Ú%sendgrid_email_with_unsubscribe_groupr���r(���ÚSEND_MONTHLY_STATS)r,���rL���rM���Zemail_destinationr	���r	���r���rI���²���s����
ý

ýzMonthlyStats.send_emailc��������������
���C���s¬���zx|�j� tj|�jd|¡}|jdkr8t d|�j›�d¡�n>|jdkrNt d¡�n(|jdkrdt d¡�nt d	|j›�¡�W�n.�t	y¦�}�zt |¡�W�Y�d�}~n
d�}~0�0�|S�)
Nrn���éÊ���z#Logging email sent successfully to z (202)i“��z=Could not send sendgrid email because rate limit is hit (403)i‘��zGCould not send sendgrid email. Sendgrid keys are likely incorrect (401)zUnknown error. Status code: )
r���rp���r���r(���r'���Ústatus_coder<���Úinfor?���r;���)r,���ÚmessageÚresponseÚerrr	���r	���r���r>���À���s ����
ý


 zMonthlyStats.send_logging_email)Fr���)NT)Ú__name__Ú
__module__Ú__qualname__r-���r4���r0���r9���r:���rA���r@���rD���rF���rB���rC���rg���rI���r>���r	���r	���r	���r���r������s���

		r���)r<���rY���Ú
app.configr���Úapp.metrics.pennsiever���Z'scripts.monthly_downloads_html_templater���Úscripts.email_senderr���Zscripts.monthly_dbr���Úoperatorr���rU���r"���r
���Údateutil.relativedeltar���r���Úobjectr���r	���r	���r	���r���Ú<module>���s���