U
    h[L                     @   sD  d dl 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Zd d	lmZmZmZ d d
lmZmZ d dlmZmZmZmZmZmZmZ d dl m!Z" ddl#m$Z$m%Z% dNddZ&dd Z'eedgddde$ddidedgddde$idedgdde%deddd d!d"d#d$i d%d&gg d'd'd(dd)id*edgd+d,e%de$id*edgd-d.d/ed0d1d2idd)idedgd3d4d/ed5d1d6idd)idedgd7d8d9d:d;d<d=d>d?d@idAide$id*edgdBdCd/edDd1dEidd)idedgdFdGd/edHd1dEidd)idedgdIdJde$iddK
G dLdM dMej(Z)dS )O    )viewsetsstatus)Response)action)MultiPartParser
FormParser)IsAuthenticated)	Paginator)get_object_or_404N)extend_schemaextend_schema_viewOpenApiExample)mainupload)Contents
CategoriesAttachmentsContentVersionContentVersionAttachment
ContentTagTag)master   )ContentSerializerContentCreateSerializerc                 C   s.   | d kr|S t | tr"| ||S t| ||S )N)
isinstancedictgetgetattr)objfielddefault r"   =D:\Project\agus\mfile_papteng_new\webapp\api\fileman\views.pyget_val   s
    
r$   c                 C   s   | sdS t | trt| S zt|  | W S  tjk
r   t| dd}zt| |W  Y S  tjk
r|   Y Y dS X Y nX d S )N{}'")r   r   jsondumpsloadsJSONDecodeErrorstrreplace)attr_raw
attr_fixedr"   r"   r#   fix_json_attributes   s    




r0   zContent ManagementzDaftar kontenzNAmbil daftar konten dengan pagination, bisa filter kategori, tahun, SKPD, tag.   T)many)tagssummarydescription	responseszDetail kontenz:Ambil detail konten termasuk tags, attachments, dan versi.zBuat konten baruz<Buat konten lengkap dengan tags, attachments, versi pertama.   zContoh sukseszJudul DokumenzDeskripsi dokumenpublic   ZSP2DZtag1Ztag2z2025-09-11T00:00:00Z)idjudul	deskripsistatus_kontenpk_categoriescategory
attributesr3   attachmentscreatedupdated)valueresponse_only)r3   r4   r5   requestr6   zUpdate kontenzAUpdate konten + generate versi baru, termasuk tags dan file baru.zSoft delete kontenzOBackup versi aktif, soft delete attachments, tandai konten sebagai '[DELETED]'.   zSoft delete suksesdetailzKonten berhasil dihapus.zHard delete kontenz>Hapus permanen konten beserta semua attachment dari disk & DB.zHard delete suksesz'Konten dan attachment berhasil dihapus.zUpload attachmentz&Upload satu atau lebih file ke konten.zmultipart/form-dataobjectrA   arraystringbinary)typeformat)rM   items)rM   
propertieszSoft delete attachmentz&Soft delete attachment berdasarkan ID.zSoft delete attachment sukseszAttachment berhasil dihapus.zHard delete attachmentz)Hapus attachment permanen dari disk & DB.zHard delete attachment sukseszRollback ke versi lamaz?Kembalikan konten ke versi sebelumnya, backup versi aktif dulu.)
listretrievecreateupdatedestroypermanent_deleterA   soft_delete_attachmenthard_delete_attachmentrollbackc                   @   s   e Zd Zej ZeegZ	e
ZegZdd ZdddZdd Zd dd	Zd!d
dZeddgddd"ddZeddgdd#ddZeddgddd$ddZeddgddd%ddZeddgddd&ddZdS )'ContentViewSetc           
      C   s   t |}t|jdd}t|jdd}t||}||}t|dd|id}| rd|	 nd }|
 rx| nd }	t|j||r|d | nd |	r|d |	 nd ||jd	S )
Npager   	page_size   TrF   )r2   contextz?page=)countr[   nextpreviousr\   results)r   _get_querysetintGETr   r	   get_pager   has_nextnext_page_numberhas_previousprevious_page_numberr   r_   build_absolute_uridata)
selfrF   queryr[   r\   	paginatorpaging
serializerZ	next_pageZ	prev_pager"   r"   r#   rQ      s     


zContentViewSet.listNc                 C   s&   t t|d}t|d|id}t|jS )NpkrF   r^   )r
   r   r   r   rl   )rm   rF   rs   contentrq   r"   r"   r#   rR      s    zContentViewSet.retrievec                 C   sp  t |jd}|jdd |j}z|jd}tjjd|d d|d< t	jd|d d	|d< tj
jd|d
 d	|d
< t|jdd p|jd|d< |dpd|d< t|dd|d< tjf |}|j}|ddpd}dd |dD }|D ]&}	tjj|	d\}
}tjj||
d q|r0t||| ntjj|dddddd tjj|dd}dd |D png }tjj||d|d|d |d j|d j|d
 j|d |d |d 
}tjj|dd!}|D ]<}t jj||j!pd|j"pd|j#pd|j$pdd" qt%|d#|id$}t&|jt'j(d%W S  t)k
rj } zt&d&t*|it'j+d% W Y S d }~X Y nX d S )'N)rl   T)raise_exceptionrA   r   tahunasisrw   r>   ry   rs   
pk_skpd_dgrs   
user_inputr=   r8   r@   r%   r3    c                 S   s    g | ]}|  r|   qS r"   striplower.0tr"   r"   r#   
<listcomp>   s      z)ContentViewSet.create.<locals>.<listcomp>,name)ru   tagr   Fpk_contentsr   path_typesize
is_deleted
content_idr   c                 S   s   g | ]}|j jr|j jqS r"   r   r   r   r"   r"   r#   r      s      r;   r<   
r   r;   r<   r@   rw   r>   r{   r=   r|   r3   r   r   
pk_versionr   r   content_typer   rF   rt   r   error),r   rl   is_validvalidated_dataFILESgetlistm_masterTa	_read_oner   Skpddgr   usersessionr   r0   r   _creaters   splitr   objectsget_or_creater   r   deployr   rS   filterselect_relatedr   rw   r   r   r   r   r   r   r   r   HTTP_201_CREATED	Exceptionr,   HTTP_400_BAD_REQUEST)rm   rF   rq   valuesfilescontentsrs   tags_rawr3   tag_namer   _tag_objs	tag_namesversionattachments_qsaoutputer"   r"   r#   rS      s`    




zContentViewSet.createc                 C   s  zx|j ddpd}dd |dD }| }tj|d}t|dd}tjj	||d	|d
||d|d|d|dt
|jdd p|jd|d
}tjj|d}	|	D ]>}
t
|
ddstjj	|t|
dt|
dt|
dt|
dd q|j ddpd}t|dD ].}|  rtjjt|djdd qdd |j  D }tjjd|dd|d< tjd|dd |d< tjjd|dd |d< |j dp|d|d< t|dd|d< t|d|i tjj|d!  |D ](}tjj|d"\}}tjj||d# q|j !d$}|rLt"#||| tjj|d}t$|d%|id&}t%|j t&j'd'W S  t(k
r } zt%d(t|it&j)d' W Y S d }~X Y nX d S ))Nr3   r}   c                 S   s    g | ]}|  r|   qS r"   r~   r   r"   r"   r#   r      s      z)ContentViewSet.update.<locals>.<listcomp>r   rr   r@   r%   r;   r<   rw   r>   r{   r=   rs   r   r   r   Fr   r   r   r   r   pending_delete_idsTr   c                 S   s   i | ]\}}|d kr||qS ))csrfmiddlewaretokenr   r3   r"   )r   kvr"   r"   r#   
<dictcomp>  s       z)ContentViewSet.update.<locals>.<dictcomp>r   rx   rz   r   r   r   r   rA   rF   rt   r   r   )*rl   r   r   copyr   r   r0   r   r   rS   r   r   r   r   r   r   r$   r,   r   isdigitrd   rT   rO   r   r   r   r   _updater   deleter   r   r   r   r   r   r   r   r   HTTP_200_OKr   r   )rm   rF   rs   r   r3   r   oldold_attr_fixedr   	old_filesr   pending_idsatt_idr   r   r   r   Zattachments_filesru   rq   r   r"   r"   r#   rT      sf    zContentViewSet.updatec                 C   s  zt jj|d}|jpd}t|}tjj|dd}dd |D }tjj	||j
|j|t|dt|dt|d	|j|jd
pt|jd
d |d
}tjj|dd}	|	D ]"}
tjj	||
j|
j|
j|
jd qtjj|ddjdd d|j
 |_
d|_|jddgd ttjdW S  t jk
r>   tdditjd Y S  tk
rz } ztdt|itj d W Y S d }~X Y nX d S )Nrr   r%   r   r   c                 S   s   g | ]}|j jr|j jqS r"   r   r   r"   r"   r#   r   7  s      z*ContentViewSet.destroy.<locals>.<listcomp>rw   r>   r{   rs   r   Fr   r   Tr   z
[DELETED] z[Content deleted]r;   r<   )update_fieldsr   r   zContent not found)!r   r   r   r@   r0   r   r   r   r   rS   r;   r<   r$   r=   r   r   r   r   r   r   r   r   r   rT   saver   r   HTTP_204_NO_CONTENTDoesNotExistHTTP_404_NOT_FOUNDr   r,   r   )rm   rF   rs   ru   raw_attrattributes_fixedtag_qsr   backup_versionactive_filesr   r   r"   r"   r#   rU   0  sH    
zContentViewSet.destroyTr   	permanent)rH   methodsurl_pathc              
   C   s   zFt t|d}tjj|d}|D ]}t|j q |  t	t
jdW S  tk
r } zt	dt|it
jd W Y S d }~X Y nX d S )Nrr   r   r   r   )r
   r   r   r   r   r   destroy_one_permanentrs   r   r   r   r   r   r,   r   )rm   rF   rs   ru   rA   attr   r"   r"   r#   rV   [  s    zContentViewSet.permanent_deletepost)rH   r   c              
   C   s^   zt ||}t|tjdW S  tk
rX } ztdt|itjd W Y S d }~X Y nX d S )Nr   r   )r   r   r   r   r   r   r,   r   )rm   rF   rs   resultr   r"   r"   r#   rA   h  s
    zContentViewSet.attachmentszattachments/(?P<att_id>[^/.]+)c                 C   s(   t jjt||djdd ttjdS )Nrs   r   Tr   r   )r   r   r   rd   rT   r   r   r   )rm   rF   rs   r   r"   r"   r#   rW   p  s    z%ContentViewSet.soft_delete_attachmentz(attachments/(?P<att_id>[^/.]+)/permanentc              
   C   s`   zt jt|d ttjdW S  tk
rZ } ztdt|itjd W Y S d }~X Y nX d S )Nrr   r   r   )	r   r   rd   r   r   r   r   r,   r   )rm   rF   rs   r   r   r"   r"   r#   rX   u  s
    z%ContentViewSet.hard_delete_attachmentzrollback/(?P<version_id>[^/.]+)c                 C   s.  zt jj||d}tj|d}|dd}t|}tjj|dd}dd |D }	t jj	||d	|d
||d|d|d|d|j
dpt|jdd |	d
}
tjj|ddjdd |j|jt|jtjjd|jdtjd|jdtjjd|jd|j|j
dp$t|jdd d}t|d|i tjj|d  |jpVg D ](}tjj|d\}}tjj||d qXtjj|d}|D ]&}tjj	||j |j!|j"|j#dd qtjj|d}t$|d|id}t%|j&t'j(dW S  t)k
r( } zt%d t*|it'j+d W Y S d }~X Y nX d S )!Nr   rr   r@   r%   r   r   c                 S   s   g | ]}|j jr|j jqS r"   r   r   r"   r"   r#   r     s      z+ContentViewSet.rollback.<locals>.<listcomp>r;   r<   rw   r>   r{   r=   rs   r   Fr   Tr   r   rx   rz   )r;   r<   r@   rw   r>   r{   r=   r|   r   r   )r   r   rF   rt   r   r   ),r   r   r   r   r   r0   r   r   r   rS   r   r   r   r   rT   r;   r<   r@   r   r   rw   r   r>   r   r{   r=   r   r   r3   r   r   r   r   r   r   r   r   r   rl   r   r   r   r,   r   )rm   rF   rs   
version_idr   currentr   r   r   r   r   r   r   r   r   Zold_attachmentsvaru   rq   r   r"   r"   r#   rY   ~  sb    

	zContentViewSet.rollback)N)N)N)N)N)NN)NN)NN)__name__
__module____qualname__r   r   allquerysetr   r   parser_classesr   serializer_classr   permission_classesrQ   rR   rS   rT   rU   r   rV   rA   rW   rX   rY   r"   r"   r"   r#   rZ   .   s&   b

?
A
+rZ   )N)*rest_frameworkr   r   rest_framework.responser   rest_framework.decoratorsr   Zrest_framework.parsersr   r   Zrest_framework.permissionsr   django.core.paginatorr	   django.shortcutsr
   r(   drf_spectacular.utilsr   r   r   webapp.views.filemanr   r   Zwebapp.models.koleksir   r   r   r   r   r   r   Zwebapp.modelsr   r   serializersr   r   r$   r0   ModelViewSetrZ   r"   r"   r"   r#   <module>   s   $




a