o
    QDi$                     @  s   d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZ ddlmZmZ erfd dl m!Z! G dd deZ"dddZ#dS )    )annotationsN)Path)TYPE_CHECKINGAnyDictListUnioncast   )CatalogDataset)FrictionlessException)Package)platform)Resource)AdapterPublishResult   )ZenodoControl)ZenodoCreatorZenodoMetadata)Recordc                   @  s8   e Zd ZdZdddZddd	ZdddZdddZdS )ZenodoAdapterz"Read and write data from/to Zenodocontrolr   c                 C  s
   || _ d S N)r   )selfr    r   \/var/www/Datamplify/venv/lib/python3.10/site-packages/frictionless/portals/zenodo/adapter.py__init__   s   
zZenodoAdapter.__init__returnr   c              
   C  s   t jj| jjd}| jjsd}t|| jjsJ t }z|	| jj}|r9| jj
p0|jd d }t||| jj}W n tyP } z
dt| }t|d }~ww t|tr[|jr[|S d}t|)Napi_keyzRecord is required.metadatatitleZenodo API errorPackage/s not found)r   	pyzenodo3Zenodor   apikeyrecordr   formatsr   
get_recordnamedataget_package	Exceptionrepr
isinstance	resources)r   clientnotepackagedatasetr,   	exceptionr   r   r   read_package   s*   zZenodoAdapter.read_packager5   c              
   C  s  t j}| jj|_| jjstdz&| jj}|s&tt	|j
| jj| jjd}| jjrTtt| jj }|di }|dttj  |dd tdi |}nT| jjp\|jp\d}d}|jrk|jd	 d
|}t| jjpt|jptd||ttj d}| jjr|jt| jj| jjd |jD ]}	|jt|	dd|	dd qt !d(}
t"|j#ddd}tj$||
dd |
%  |j&| jj|
j'|d W d    n1 sw   Y  t ( "}t|d }|)t| |j*| jj||| jjd W d    n	1 sw   Y  |j+D ]}|j,r)|j-s)|j*| jjt|j,|| jjd qt.d| t"|ddW S  t/yN } z
dt0| }t|d }~ww )Nz)Api key is required for zenodo publishing)tokenbase_urlr"   publication_dateaccess_rightopenAboutz	CC-BY-4.0r   r,   Title)r#   descriptionlicenser;   )r,   affiliationr#   organizationwtT)exclude_none)r"      )indent)r9   metafndepiddatapackage.json)r9   datafnrI   r:   zhttps://zenodo.org/deposit/)deposition_id)urlcontextr$   r   )1r   pyzenodo3_uploadr   r:   BASE_URLr(   r   rL   r	   intcreaterH   jsonloadsr   	read_textget
setdefaultstrdatetimedatetodayr   r@   licensesr#   authorcreatorsappendr   companycontributorstempfileNamedTemporaryFiledict
model_dumpdumpflushupload_metar,   TemporaryDirectoryto_jsonupload_datar2   normpathremoter   r/   r0   )r   r5   r3   rL   
descriptormetar"   r@   rA   contributorfiler-   dirpathresourcer7   r4   r   r   r   write_package4   s   
	



zZenodoAdapter.write_packager   c              
   C  s  g }i }| j jr||   tdd |D dS | j jsJ tjj| j j	d}| j j
r]|| j j
}| j jp=|jd d }t||| j j}t|trS|jrS|| tdd |D dS | j jrm| j jdd	}||d
< | j j|d< | j j|d< | j j|d< | j j|d< | j j|d< | j j|d< | j j|d< | j j|d< | j j|d< | j j|d< dd | D }z,||}|D ]"}| j jp|jd d }t||| j j}t|tr|jr|| qW n t y }	 z
dt!|	 }
t"|
d }	~	ww |rtdd |D dS d}
t"|
)Nc                 S     g | ]	}t |j|d qS )r,   r5   r   r,   .0r5   r   r   r   
<listcomp>       z.ZenodoAdapter.read_catalog.<locals>.<listcomp>)datasetsr    r"   r#   c                 S  rv   rw   rx   ry   r   r   r   r{      r|   / qstatussortpagesizeall_versionscommunitiestypesubtypeboundscustomc                 S  s   i | ]	\}}|r||qS r   r   )rz   keyvaluer   r   r   
<dictcomp>   s    z.ZenodoAdapter.read_catalog.<locals>.<dictcomp>r$   c                 S  rv   rw   rx   ry   r   r   r   r{      r|   r%   )#r   r)   r_   r8   r   r*   r   r&   r'   r(   doifind_record_by_doir,   r-   r.   r1   r   r2   searchreplacer   r   r   r   r   r   rtyper   r   rcustomitems_get_recordsr/   r0   r   )r   packagesoptionsr3   r6   r,   r5   r   recordsr7   r4   r   r   r   read_catalog   sx   


zZenodoAdapter.read_catalogN)r   r   )r   r   )r5   r   )r   r   )__name__
__module____qualname____doc__r   r8   ru   r   r   r   r   r   r      s    


ar   r)   r   r#   rX   r*   	List[str]r   r   c                   s   t |d}||_| jd D ]e}|d d  t fdd|D } dr.t j |d  S  dr\|s\zt  }||_|W   S  ty[ } zd	t|vrQ|W Y d }~nd }~ww |rrd
|d  |_t	|d d}|
| q|S )N)r#   fileslinksr   c                 3  s    | ]}  |V  qd S r   )endswith)rz   extrs   r   r   	<genexpr>   s    zget_package.<locals>.<genexpr>rJ   zipz#[Errno 2] No such file or directoryzhttps://zenodo.org/api/files/bucketr   r   )r   r#   r-   anyr   from_descriptorr   rX   basepathr   add_resource)r)   r#   r*   r5   rq   is_resource_filer7   rt   r   r   r   r.      s0   



r.   )r)   r   r#   rX   r*   r   r   r   )$
__future__r   rY   rS   rb   pathlibr   typingr   r   r   r   r   r	   catalogr   r   r7   r   r5   r   r   rt   r   systemr   r   r   r   modelsr   r   r&   r   r   r.   r   r   r   r   <module>   s&      D