o
    U/ia                     @   s  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 d dlmZ d dlmZm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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, d dl-m.Z. d dl/m0Z0 d dl1Z1d dl2Z2d dl3Z3d dl4Z4d dl5Z5d dl6Z6d dl7m8Z8 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l1Z1d dl5Z5d dl9Z9d dl:Z:d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dl4mAZA d dl5Z5d dlBZBd dl1Z1d dlCmDZD d dlmZ d dl
mZ d dlEmEZE d dl-m.Z. d dlmZmFZF d
dlmGZG d dlHmIZI d dlJmKZKmLZLmMZMmNZNmOZOmPZP d d lQmRZR dcd!d"ZSd#d$ ZTddd&d'ZUeed(gd)d*d+ed,d-id.ed(gd/d0d+eid.ed(gd1d2ed3ed4d
d5d6d7d8d9i d:d;gg d<d<d=d,d>id?ed(gd@dAed+eid?ed(gdBdCdDedEdFdGid,d>id.ed(gdHdIdDedJdFdKid,d>id.ed(gdLdMdNdOdPdQdRdSdTdUidVid3eid?ed(gdWdXdDedYdFdZid,d>id.ed(gd[d\dDed]dFdZid,d>id.ed(gd^d_d+eid.d`
G dadb dbejVZWdS )e    HttpResponse)	Paginator)get_object_or_404)viewsetsstatusfiltersResponse)action)MultiPartParser
FormParser)IsAuthenticated)extend_schemaextend_schema_viewOpenApiExample   )FilemanPagination)ContentSerializerContentCreateSerializerPdfToDocxSerializer)mainupload)Contents
CategoriesAttachmentsContentVersionContentVersionAttachment
ContentTagTag)master)	Converterconvert_from_path)convertN)
connectionr   Documentcanvas)A4)BytesIO)settings)slugify)r   OpenApiResponse)DocxToImageSerializer)safe_docx2pdf)QValueF	CharField	TextFieldIntegerField)embed_modelc                 C   s.   | d u r|S t | tr| ||S t| ||S N)
isinstancedictgetgetattr)objfielddefault rA   ;/var/www/html/mfile_papteng_new/webapp/api/fileman/views.pyget_valY   s
   
rC   c                 C   s|   | sdS t | trt| S zt|  | W S  tjy=   t| dd}z
t| |W  Y S  tjy<   Y Y dS w w )N{}'")r:   r;   jsondumpsloadsJSONDecodeErrorstrreplace)attr_raw
attr_fixedrA   rA   rB   fix_json_attributes`   s    




rO   d   c           
      C   s   | sg S |d u rg d}t j| gddd }dddd | D  d	 }d
}|| ||g}t }||| | }W d    n1 sGw   Y  dd |D }	t|	S )Napplication/pdf
image/jpeg	image/pngGapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentT)convert_to_numpyr   [,c                 s   s    | ]}t |V  qd S r9   )rK   ).0xrA   rA   rB   	<genexpr>~   s    z.semantic_search_content_ids.<locals>.<genexpr>]a9  
        SELECT DISTINCT ON (ac.pk_attachment)
            ac.pk_attachment,
            atch.pk_contents,
            (
                0.6 * (ae.embedding <-> %s::vector)
                +
                0.4 * (1.0 - COALESCE(ts_rank_cd(ac.tsv, plainto_tsquery(%s)), 0))
            ) AS hybrid_score
        FROM attachments_chunks ac
        JOIN attachments_embeddings ae ON ae.pk_chunk = ac.pk
        JOIN attachments atch ON atch.pk = ac.pk_attachment
        WHERE atch.type = ANY(%s)
        ORDER BY ac.pk_attachment, hybrid_score ASC
        LIMIT %s;
    c                 S   s   h | ]}|d  qS )r   rA   )rY   rrA   rA   rB   	<setcomp>   s    z.semantic_search_content_ids.<locals>.<setcomp>)	r8   encodejointolistr%   cursorexecutefetchalllist)

query_textallowed_typestop_kq_embq_vecsqlparamscurrowscontent_idsrA   rA   rB   semantic_search_content_idsp   s    

rp   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   SP2Dtag1tag2z2025-09-11T00:00:00Z)idjudul	deskripsistatus_kontenpk_categoriescategory
attributesrs   attachmentscreatedupdated)valueresponse_onlyrs   rt   ru   requestrv   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.multipart/form-dataobjectr   arraystringbinarytypeformatr   items)r   
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.)
re   retrievecreateupdatedestroypermanent_deleter   soft_delete_attachmenthard_delete_attachmentrollbackc                   @   s  e Zd Zej ZeZe	gZ
eegZeZejejgZg dZg dZdd ZdSddZdd	 ZdSd
dZdSddZeddgdddSddZeddgddSddZeddgdddTddZeddgdddTddZeddgdddTdd Z e!d!gd"d#d$d%d&d'd(d)id&gd*id+d,id-ed.dgd/dd0d1 Z"e!d!gd2d3d$d%d&d'd(d)id&gd*id+d4id-ed.dgd5dd6d7 Z#e!d!gd8d9d$d%d:d;d'd<d)d=id:gd*id+d>id-ed.dgd?dd@dA Z$e!d!gdBdCd$d%d:d;d'd<d)d=id:gd*id+d,id-ed.dgdDddEdF Z%e!d!gdGdHd$d%dId'd<d)idIgd*id+d>id-ed.dgdJddKdL Z&e!d!gdMdNd$d%dOd'd<d)idOgd*id+d4id-ed.dgdPddQdR Z'dS )UContentViewSet)r~   r   contenttag__tag__name)r   r   tahunc                 O   sn  t |}|jd}|r| r|jt|d}|jd}|r-| r-|jt|d}|jd}|rA| rA|jt|d}| |}|jdd}|d	krUd
g}	n|dkr^ddg}	ng d}	|jd}
|jd}|
dkr|rtd| t	||	d}td| |r|j|d}n|
 }| |}|d urt|dd|id}| |jS t|dd|id}t|jS )Nkategori)r   skpd)
pk_skpd_dgr   )r   r   allpdfrR   imagerS   rT   rQ   
searchMode
searchTermsemanticz	SEMANTIC:)rg   zDEBUG content_ids:)pk__inTr   )rr   context)r   _get_querysetGETr<   isdigitfilterintfilter_querysetprintrp   nonepaginate_querysetr   get_paginated_responsedatar
   )selfr   argskwargsquerysetr   r   r   	file_typerg   search_modesearch_textro   page
serializerrA   rA   rB   re     s@   






zContentViewSet.listNc                 C   s&   t t|d}t|d|id}t|jS )Npkr   r   )r   r   r   r
   r   )r   r   r   contentr   rA   rA   rB   r   L  s   
zContentViewSet.retrievec                 C   s`  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 pF|jd|d< |dpOd|d< t|dd|d< tjd'i |}|j}|ddpnd}dd |dD }|D ]}	tjj|	d\}
}tjj||
d q{|rt||| ntjj|dddddd tjj|dd}dd |D pg }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$pdd" qt%|d#|id$}t&|jt'j(d%W S  t)y/ } zt&d&t*|it'j+d%W  Y d }~S d }~ww )(Nr   Traise_exceptionr   r   r   asisr   r   r   r   r   r   
user_inputr   rx   r   rD   rs    c                 S       g | ]}|  r|   qS rA   striplowerrY   trA   rA   rB   
<listcomp>c       z)ContentViewSet.create.<locals>.<listcomp>rX   name)r   tagr   Fpk_contentsr   path_typesize
is_deleted
content_idr   c                 S      g | ]
}|j jr|j jqS rA   r   r   r   rA   rA   rB   r   n      r~   r   
r   r~   r   r   r   r   r   r   r   rs   r   r   
pk_versionr   r   content_typer   r   r   r&   errorrA   ),r   r   is_validvalidated_dataFILESgetlistm_masterTa	_read_oner   Skpddgr=   usersessionr<   rO   r   _creater   splitr   objectsget_or_creater   r   deployr   r   r   select_relatedr   r   r   r   r   r   r   r   r
   r   HTTP_201_CREATED	ExceptionrK   HTTP_400_BAD_REQUEST)r   r   r   valuesfilescontentsr   tags_rawrs   tag_namer   _tag_objs	tag_namesversionattachments_qsaoutputerA   rA   rB   r   R  sd   "zContentViewSet.createc                 C   s  z7|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 pP|jd|d
}tjj|d}	|	D ]}
t
|
dds|tjj	|t|
dt|
dt|
dt|
dd q]|j ddpd}t|dD ]}|  rtjjt|djdd qd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$}|r!t"#||| tjj|d}t$|d%|id&}t%|j t&j'd'W S  t(yV } zt%d(t|it&j)d'W  Y d }~S d }~ww ))Nrs   r   c                 S   r   rA   r   r   rA   rA   rB   r     r   z)ContentViewSet.update.<locals>.<listcomp>rX   r   r   rD   r~   r   r   r   r   r   r   r   r   r   Fr   r   r   r   r   pending_delete_idsTr   c                 S   s   i | ]\}}|d vr||qS ))csrfmiddlewaretokenr  rs   rA   )rY   kvrA   rA   rB   
<dictcomp>  s    z)ContentViewSet.update.<locals>.<dictcomp>r   r   r   r   r   r   r   r   r   r   r&   r   )*r   r<   r   copyr   r   rO   r   r   r   r=   r   r   r   r   r   rC   rK   r   r   r   r   r   r   r   r   r   _updater   deleter   r   r   r   r   r   r   r
   r   HTTP_200_OKr   r   )r   r   r   r   rs   r  oldold_attr_fixedr  	old_filesr  pending_idsatt_idr   r  r   r  attachments_filesr   r   r	  rA   rA   rB   r     sn   "zContentViewSet.updatec                 C   sr  zt 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
pEt|jd
d |d
}tjj|dd}	|	D ]}
tjj	||
j|
j|
j|
jd qStjj|ddjdd d|j
 |_
d|_|jddgd ttjdW S  t jy   tdditjd Y S  ty } ztdt|itj dW  Y d }~S d }~ww )Nr   rD   r   r   c                 S   r   rA   r   r   rA   rA   rB   r     r   z*ContentViewSet.destroy.<locals>.<listcomp>r   r   r   r   r   Fr   r   Tr  z
[DELETED] z[Content deleted]r~   r   )update_fieldsr&   r   zContent not found)!r   r   r<   r   rO   r   r   r   r   r   r~   r   rC   r   r   r=   r   r   r   r   r   r   r   r   saver
   r   HTTP_204_NO_CONTENTDoesNotExistHTTP_404_NOT_FOUNDr   rK   r   )r   r   r   r   raw_attrattributes_fixedtag_qsr  backup_versionactive_filesr  r	  rA   rA   rB   r     sL   
"zContentViewSet.destroyTr  	permanent)r   methodsurl_pathc              
   C   s   z#t t|d}tjj|d}|D ]}t|j q|  t	t
jdW S  ty@ } zt	dt|it
jdW  Y d }~S d }~ww )Nr   r
  r&   r   )r   r   r   r   r   r   destroy_one_permanentr   r  r
   r   r  r   rK   r   )r   r   r   r   r   attr	  rA   rA   rB   r     s   "zContentViewSet.permanent_deletepost)r   r'  c              
   C   s  zr|j d}|stddiddW S t|||}|d }|j}ddlm} ||jp,d}dd	lm	}	m
}
 |	|}d }|rMtjj|d
 }|rK|jnd }|
|pRg }||d d |||dd}ddlm} || t|tjdW S  ty } ztdt|iddW  Y d }~S d }~ww )Nr   r   zTidak ada file.  r&   r   )quick_extract_textr   )predict_categorysuggest_tagsr   i  z:Upload berhasil. Quick extract dan AI prediction tersedia.)attachment_idquick_extractpredicted_category_idpredicted_category_namesuggested_tagsmessage)process_attachment_fulltext)r   r   r
   r   r   r   webapp.ml_loader_svcr-  r   r.  r/  r   r   r   firsttextwebapp.tasksr6  delayr   r  r   rK   )r   r   r   r   uploadedr8  r0  r-  extracted_textr.  r/  category_idcategory_namecatr4  response_datar6  r	  rA   rA   rB   r     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r   r   Tr  r&   )r   r   r   r   r   r
   r   r  )r   r   r   r  rA   rA   rB   r   6  s   z%ContentViewSet.soft_delete_attachmentz(attachments/(?P<att_id>[^/.]+)/permanentc              
   C   sZ   zt jt|d ttjdW S  ty, } ztdt|itjdW  Y d }~S d }~ww )Nr   r&   r   )	r   r)  r   r
   r   r  r   rK   r   )r   r   r   r  r	  rA   rA   rB   r   ;  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pSt|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pt|jdd d}t|d|i tjj|d  |jpg D ]}tjj|d\}}tjj||d qt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)y } zt%d t*|it'j+dW  Y d }~S d }~ww )!NrB  r   r   rD   r   r   c                 S   r   rA   r   r   rA   rA   rB   r   M  r   z+ContentViewSet.rollback.<locals>.<listcomp>r~   r   r   r   r   r   r   r   Fr   Tr  r   r   r   )r~   r   r   r   r   r   r   r   r   r  )r   r   r   r   r&   r   ),r   r   r<   r   r   rO   r   r   r   r   r   r=   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r  r  rs   r   r   r   r   r   r   r   r   r
   r   r   r  r   rK   r   )r   r   r   
version_idr  currentr!  r"  r#  r  r$  r   r  r   r  old_attachmentsvar   r   r	  rA   rA   rB   r   D  sf   
	"zContentViewSet.rollbackzFile ConversionzKonversi PDF ke DOCXz4Kirim URL PDF dan dapatkan file DOCX hasil konversi.r   r   urlr   urir   )r   r   requiredrq   zFile DOCX sebagai downloadr   Fzconvert/pdf-to-docxc              
   C   s  t |jd}|jdd |j}zt }|dr[|d }t|}|jdkr8t	ddidd	W  d    W S t
j|d
}t|d}||j W d    n1 sUw   Y  n-|d }	t
j||	j}t|d}|	 D ]}
||
 qqW d    n1 sw   Y  |dd}t|}|| |  t|d&}t| dd}dt
j| d|d< |W  d    W  d    W S 1 sw   Y  W d    W d S 1 sw   Y  W d S  ty } zt	dt|idd	W  Y d }~S d }~ww )Nr   Tr   rG  rq   r   Gagal mengunduh PDF dari URLr,  r&   zDokumen Baru.pdfwbfile.pdf.docxrbrU   r   attachment; filename="rF   Content-Disposition  )r   r   r   r   tempfileTemporaryDirectoryr<   requestsstatus_coder
   osr   r`   openwriter   r   chunksrL   r!   r$   closer   readbasenamer   rK   )r   r   r   r   tmpdirpdf_urlr]   pdf_pathfrL  chunk	docx_pathcvr  responser	  rA   rA   rB   convert_pdf_to_docx  sV   



	
&& z"ContentViewSet.convert_pdf_to_docxzKonversi PDF ke ImagezOKirim URL PDF dan dapatkan semua halaman PDF sebagai gambar JPG dalam satu ZIP.zZIP berisi JPGzconvert/pdf-to-imagec              
   C   s
  ddl m} dd l}dd l}dd l}dd l}dd l}ddlm} |j	
d}	|	s0|ddiddS z| }
|
|	}|jd	krP|dd
iddW  d    W S |j|
d}t|d}||j W d    n1 smw   Y  ||d	d}g }t|ddD ]\}}|j|
d| d}||d || q| }||d}|D ]}|||j| qW d    n1 sw   Y  |d t|dd}d|d< |W  d    W S 1 sw   Y  W d S  ty } z|dt|iddW  Y d }~S d }~ww )Nr   r	   r"   rG  r   zHarus mengirim URL PDFr,  r&   rq   rJ  zDokumen_Baru.pdfrK  dpir   startpage_.jpgJPEGwapplication/ziprP  z%attachment; filename="PDF_images.zip"rR  rS  )rest_framework.responser
   rV  rT  rX  iozipfile	pdf2imager#   r   r<   rU  rW  r   r`   rY  rZ  r   	enumerater  appendr,   ZipFiler^  seekr   r   rK   )r   r   r
   rV  rT  rX  rr  rs  r#   rG  r_  r]   ra  rb  pagesimage_filesir   img_path
zip_bufferzip_filerf  r	  rA   rA   rB   convert_pdf_to_image  sJ   (



( z#ContentViewSet.convert_pdf_to_imagezKonversi Image ke PDFz?Kirim satu atau beberapa file gambar dan gabungkan menjadi PDF.imagesr   r   r   zFile PDF sebagai downloadzconvert/images-to-pdfc              
      s  ddl m} ddlm} ddlm} ddlm  dd l}dd l	}dd l
}ddlm} ||jd}	|	jd	d
 |	jd}
zy| j}|j|d} fdd|
D }g }|D ]}|jdkrb|d}|| qV|d j|d	|dd  dd t|d}|| dd}d|d< |W  d    W  d    W S 1 sw   Y  W d    W d S 1 sw   Y  W d S  ty } ztdt|iddW  Y d }~S d }~ww )Nr   )ImagesToPdfSerializerr   r)   )letterImager   r   Tr   r  z	Hasil.pdfc                    s   g | ]}  |qS rA   )rY  )rY   imgr  rA   rB   r   .  s    z8ContentViewSet.convert_images_to_pdf.<locals>.<listcomp>RGBPDF)save_allappend_imagesr   rO  rR   rP  z attachment; filename="Hasil.pdf"rR  r   rS  r&   )serializersr  reportlab.pdfgenr*   reportlab.lib.pagesizesr  PILr  rr  rT  rX  django.httpr   r   r   r   r<   rU  r   r`   moder$   rv  r  rY  r]  r   r
   rK   )r   r   r  r*   r  rr  rT  rX  r   r   r  r_  ra  
pil_imagespil_images_rgbr  rb  rf  r	  rA   r  rB   convert_images_to_pdf
  sN   



& z$ContentViewSet.convert_images_to_pdfzKonversi Image ke DOCXzOKirim satu atau beberapa gambar lalu akan dimasukkan ke dalam sebuah file DOCX.zconvert/images-to-docxc              
   C   s  ddl m} ddlm} dd l}dd l}ddlm} ||jd}|j	dd |j
d	}z| {}	| }
|D ]4}|j|	|j}t|d
}| D ]}|| qKW d    n1 s]w   Y  |
| |
  q7|j|	d}|
| t|d}|| dd}d|d< |W  d    W  d    W S 1 sw   Y  W d    W d S 1 sw   Y  W d S  ty } ztdt|iddW  Y d }~S d }~ww )Nr   )ImagesToDocxSerializerr   r'   r   r   Tr   r  rK  zHasil_Gambar.docxrO  rU   rP  z(attachment; filename="Hasil_Gambar.docx"rR  r   rS  r&   )r  r  docxr(   rT  rX  r  r   r   r   r   r<   rU  r   r`   r   rY  r[  rZ  add_pictureadd_page_breakr  r]  r   r
   rK   )r   r   r  r(   rT  rX  r   r   r  r_  docr  r|  rb  rc  rd  rf  r	  rA   rA   rB   convert_images_to_docxN  sH   



& z%ContentViewSet.convert_images_to_docxzKonversi DOCX ke PDFz5Kirim file DOCX dan dapatkan file PDF hasil konversi.	docx_filezconvert/docx-to-pdfc              
   C   s  |j d}|stddiddS z[t|}t }tj|td}t\}}|d }|jD ]}	|	j	}
|
rH|
d||
 |d8 }|dk rH|  |d }q*|  |d	 t| d
d}dtj|jd	  d|d< |W S  ty } ztdt|iddW  Y d }~S d }~ww )Nr  r   zHarus mengirim file DOCXr,  r&   )pagesize2      r   rR   rP  rQ  z.pdf"rR  rS  )r   r<   r
   r(   r,   r*   Canvasr+   
paragraphsr9  
drawStringshowPager  rx  r   r]  rX  r   splitextr   r   rK   )r   r   r  r  buffercwidthheightyparar9  rf  r	  rA   rA   rB   convert_docx_to_pdf  s<   

 z"ContentViewSet.convert_docx_to_pdfzKonversi DOCX ke Imagez@Upload file DOCX dan hasilkan ZIP berisi gambar JPG per halaman.rL  zconvert/docx-to-imagec              
   C   s  t |jd}|jdd |jd }zt }ttj	|j
d }t jd d }tj|| d| d}|dd	}t|d
}	| D ]}
|	|
 qHW d    n1 sZw   Y  t|| tj|sztddiddW  d    W S t|dd}t }t|d,}t|ddD ]\}}d| d}tj||}||d ||| qW d    n1 sw   Y  |d t|dd}d| d| d|d< |W  d    W S 1 sw   Y  W d S  ty } ztdt |iddW  Y d }~S d }~ww )Nr   Tr   rL  r      -rN  rM  rK  r   zGagal membuat PDFrS  r&   rq   rh  ro  r   rj  rl  rm  rn  rp  rP  rQ  r  z_images.zip"rR  )!r0   r   r   r   rT  rU  r.   rX  r   r  r   uuiduuid4hexr`   rL   rY  r[  rZ  r1   existsr
   r#   rr  r,   rs  rw  ru  r  rx  r   r   rK   )r   r   r   r  r_  baseuniqrd  ra  rb  rc  r  r}  r~  r{  r  img_filenamer|  rf  r	  rA   rA   rB   convert_docx_to_image  sL   



(* z$ContentViewSet.convert_docx_to_imager9   )NN)(__name__
__module____qualname__r   r   r   r   r   serializer_classr   permission_classesr   r   parser_classesr   pagination_classr   SearchFilterOrderingFilterfilter_backendssearch_fieldsordering_fieldsre   r   r   r   r   r   r   r   r   r   r   r   rg  r  r  r  r  r  rA   rA   rA   rB   r      s    
c
:
<
@--@3
	/1+'
	r   r9   )NrP   )Xr  r   django.core.paginatorr   django.shortcutsr   rest_frameworkr   r   r   rq  r
   rest_framework.decoratorsr   rest_framework.parsersr   r   rest_framework.permissionsr   drf_spectacular.utilsr   r   r   
paginationr   r  r   r   r   webapp.views.filemanr   r   webapp.models.koleksir   r   r   r   r   r   r   webapp.modelsr    r   pdf2docxr!   rt  r#   docx2pdfr$   rT  rV  rs  rr  rX  rG   	django.dbr%   
subprocessplatformr  r(   r  r*   r  r+   r,   r  django.confr-   r.   r/   r0   webapp.views.fileman.mainr1   django.db.modelsr2   r3   r4   r5   r6   r7   webapp.ml.e5larger8   rC   rO   rp   ModelViewSetr   rA   rA   rA   rB   <module>   s&  	$
  

+



b