o
    QDi,                     @   s  d dl Z d dlZd dlmZ d dlmZmZ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 dd
lmZ ddlmZ ddlmZmZmZ ddlmZ G dd deZdedeeef fddZdddddededeeeef  dee dedeeef fddZdS )    N)PurePosixPath)AnyDictOptional)urljoin   )helpers)CatalogDataset)FrictionlessException)Package)platform)Resource)AdapterPublishResultsystem   )CkanControlc                   @   sZ   e Zd ZdZdefddZdefddZdefd	d
Zde	de
fddZdefddZdS )CkanAdapterz Read and write data from/to Ckancontrolc                 C   s   || _ tjtjd| _d S )N)ckan_to_fricfric_to_ckan)r   r   -frictionless_ckan_mapper_ckan_to_frictionless-frictionless_ckan_mapper_frictionless_to_ckanmapper)selfr    r   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/frictionless/portals/ckan/adapter.py__init__   s   zCkanAdapter.__init__returnc              
   C   s~  | j j}| j j}|sJ |sJ d|i}i }| j jr | j j|d< | j j d}t|fi |d|i}| jd |d }|dd  |dd  |d	g D ]}|d
d  d|v rc|d  |d< qOzt	
|}	W n. ty }
 z"| j jr|d	 D ]}|d |d< |d= q{t	
|}	n|
W Y d }
~
nd }
~
ww |	jD ]}|dr| j jst	
|  S q|	jD ]	}t|j|_q|	S )Nidapikeyz/api/3/action/package_showparamsr   resulttypesources	resourcesfieldsformatschemaoriginal_schemaz/datapackage.json)r   baseurldatasetr!   make_ckan_requestr   popgetlowerr   from_descriptorr   ignore_schemaresource_pathsendswithr&   r   slugifyname)r   r+   r,   r"   argsendpointresponse
descriptorrespackageepathresourcer   r   r   read_package   sJ   
	
zCkanAdapter.read_packager<   c                 C   s  | j j}| d}t| }| }| jd |}| j j|d< d|vr3| j js-d}t|| j j|d< | j j	r<| d}d|v rC|d= zt
jjd||d	|d
}|jdkrt|j}	|	d d }
|	d d }|jd	d}t|jD ]+\}}|jrtj|j\}}|j d|dd  }||d | d< | |
| qqdd|
d}| d}t|d||ddtj|ddddfid tt| j jpdttd|t |
dd W S |j!}t| t"y } z
d!t#| }t|d }~ww )"Nz/api/action/package_creater   	owner_orgr6   zCYour package has no name. CKAN requires a name to publish a packagez/api/action/package_updater&   POSTT)methodurlheadersallow_redirectsjson   r#   r    )validate.r   r>   datapackagerG   )r6   r$   
package_id/api/action/resource_createuploadzdatapackage.json   )indentzutf-8application/octet-stream)rC   rE   datafiles r,   )
dataset_id)rD   contextCKAN API error:)$r   r+   set_headersto_descriptorr   r<   organization_namer,   r   allow_updater   http_sessionrequeststatus_coderG   loadscontent	enumerater&   r>   ossplitr6   write_resourcer-   dumpsencoder   r   strr   joinpathdicttext	Exceptionrepr)r   r<   r+   r8   rE   package_descriptorpackage_datanoter9   response_dictrU   dataset_nameindexr?   _resource_filenamepackage_resource_data	exceptionr   r   r   write_packageH   s   




zCkanAdapter.write_packagerU   r?   c              
   C   s   | j j}| d}t| }| }| jd |}||d< tj|d \}}	| j j	|d< |d= z"t
jjd||d|d|	| d	fid
}
|
jdkrP|
j}t|W d S  tyh } z
dt| }t|d }~ww )NrM   r   rL   rD   rA   rB   TrN   rQ   )rC   rD   rE   rF   rR   rS   rH   rW   )r   r+   rX   rY   r   r?   rb   r>   rc   rZ   r   r\   r]   
read_bytesr^   rj   r   rk   rl   )r   rU   r?   r+   r8   rE   resource_descriptorresource_datars   rt   r9   ro   rv   r   r   r   rd      s@   

zCkanAdapter.write_resourcec                 C   s  t  }i }d}i }i }t| }| jjsJ | jjr'd| jji}| jj d}n0| jjr<dd| jj i}| jj d}n| jjrL| jj}| jj d}nddi}| jj d}| jjrp| jjsht| jj|d< nt| jj|d	< | jj	r|t| jj	|d
< t
|||d}| jjs|d d }n|d }|D ]h}zB| jd |}|dd  |dd  |dg D ]}	|	dd  d|	v r|	d  |	d< qt|}
t|
j|
d}|| W q ty } z| jjrtd|d  d|  W Y d }~q|d }~ww |S )NrT   r    z /api/3/action/group_package_showqzorganization:z/api/3/action/package_searchz*:*rowslimitstart)rE   r"   r#   resultsr   r$   r%   r&   r'   r(   )r6   r<   zError in CKAN dataset z: )r	   rX   r   r+   group_idrZ   searchnum_packagesrg   results_offsetr-   r   r,   r.   r/   r0   r   r1   r
   r6   add_datasetr   ignore_package_errorsprint)r   catalogr"   r8   r9   r:   rE   r   r,   r;   r<   r=   r   r   r   read_catalog   sb   
zCkanAdapter.read_catalogN)__name__
__module____qualname____doc__r   r   r   r@   rw   rg   r   rd   r	   r   r   r   r   r   r      s    	+W%r   adapterr   c                 C   sN   i }| j jr%| j jdrtj| j jdd  }n| j j}|d|i |S )Nenv:   Authorization)r   r!   
startswithrb   environr/   update)r   rE   r!   r   r   r   rX     s   rX   GET)rC   rE   r!   r8   rC   rE   r!   optionsc          	      K   s   i }|d u ri }|r | drtj|dd  }|d|i tjjd	|| |dd|}|d ur6| }zd }|dsF|d rF|d }W n t	yR   |}Y nw |r`dt
| }t||S )
Nr   r   r   T)rC   rD   rE   rF   successerrorzCKAN returned an error: r   )r   rb   r   r/   r   r   r\   r]   rG   	TypeErrorre   r   )	r8   rC   rE   r!   r   response_jsonr9   
ckan_errorro   r   r   r   r-     s4   
r-   )rG   rb   pathlibr   typingr   r   r   urllib.parser   rT   r   r   r	   r
   rv   r   r<   r   r   r?   r   r   r   r   r   r   r   rg   rX   r-   r   r   r   r   <module>   s@     r
