
    qiu                          S r SSKJr  SSKJr  SSKrSSKJr  Sr\R                  " \
5      r " S S5      rS	 r\
S
:X  a  \" 5         gg)a#  
Implements a property manager based on CouchDB.


http://wiki.apache.org/couchdb/Reference
http://packages.python.org/CouchDB/views.html


Usage: add this lines to wsgidav.conf::

    from wsgidav.prop_man.couch_property_manager import CouchPropertyManager
    prop_man_opts = {}
    property_manager = CouchPropertyManager(prop_man_opts)

Valid options are (sample shows defaults)::

    opts = {"url": "http://localhost:5984/",  # CouchDB server
            "dbName": "wsgidav-props",        # Name of DB to store the properties
            }

    )quote)uuid4N)utilreStructuredTextc                       \ rS rSrSrS rS rS rS rS r	S r
SS	 jrSS jrS rS rSS jrSS jr SS jrSS jrSS jrSS jrSS jrSrg
)CouchPropertyManager(   z/Implements a property manager based on CouchDB.c                 0    Xl         U R                  5         g N)options_connect)selfr   s     \/home/kali/flask_env/lib/python3.13/site-packages/wsgidav/prop_man/couch_property_manager.py__init__CouchPropertyManager.__init__+   s        c                 $    U R                  5         g r   )_disconnectr   s    r   __del__CouchPropertyManager.__del__/   s    r   c                    U R                   nUR                  S5      (       a+  [        R                  " UR                  S5      5      U l        O[        R                  " 5       U l        UR                  SS5      nX R                  ;   aT  U R                  U   U l        [        R                  SU R
                  < SU R                  R                  5       < 35        O_U R                  R                  U5      U l        [        R                  SU R
                  < SU R                  R                  5       < 35        SU R
                  ;  a+  SnSS	S
S0S
U0S.S.nU R
                  R                  U5        g g )NurldbNamewsgidav_propsz"CouchPropertyManager connected to z vz$CouchPropertyManager created new db z_design/propertiesz
            function(doc) {
                if(doc.type == 'properties') {
                    emit(doc.url, { 'id': doc._id, 'url': doc.url });
                }
            }
            
javascriptmapzDfunction(doc) { emit(null, { 'id': doc._id, 'title': doc.title }); })titlesby_url)_idlanguageviews)r   getcouchdbServercouchdb_loggerinfoversioncreatesave)r   optsr   r   	designDocs        r   r   CouchPropertyManager._connect2   s&   ||88E?? 8DJ )DJ(O4ZZjj(DGLL77DJJ..02
 jj''/DGLL77DJJ..02  tww.C ,( 7  %cl		I GGLL#/ /r   c                     g r    r   s    r   r    CouchPropertyManager._disconnectc       r   c                      SU R                   -  $ )NzCouchPropertyManager(%s))r'   r   s    r   __repr__CouchPropertyManager.__repr__f   s    )DGG33r   c                     g r   r1   r   s    r   _syncCouchPropertyManager._synci   r3   r   c                     g r   r1   )r   msgs     r   _checkCouchPropertyManager._checkl   r3   r   Nc                     g r   r1   )r   r;   outs      r   _dumpCouchPropertyManager._dumpo   r3   r   c                    U R                   R                  SUSS9n[        R                  SU< S[	        U5       35        [	        U5      S::  d
   SU-  5       eU H"  nUR
                  (       d   eUR
                  s  $    g)	z$Return properties document for path.zproperties/by_urlT)keyinclude_docszfind(z) returned    zFound multiple matches for %rN)r'   viewr(   debuglendoc)r   r   vrrows       r   _findCouchPropertyManager._findr   sx     WW\\-3T\JcWKBy9:2w!|B<sBB|C77N777N  r   c              #   ~   #    SUS-   -  nU R                   R                  USS9nU H  nUR                  v   M     g7f)z4Return properties document for url and all children.zfunction(doc) {
                var url = doc.url + "/";
                if(doc.type === 'properties' && url.indexOf('%s') === 0) {
                    emit(doc.url, { 'id': doc._id, 'url': doc.url });
                }
            }/T)rD   N)r'   queryrI   )r   r   map_funrJ   rK   s        r   _find_descendents&CouchPropertyManager._find_descendents}   sH      #I
 WW]]7]6C''M s   ;=c                     [         R                  SU-  5        U R                  U5      n/ nU(       a+  US   R                  5        H  nUR	                  U5        M     U$ )Nzget_properties(%s)
properties)r(   rG   rL   keysappend)r   norm_urlenvironrI   	propNamesnames         r   get_properties#CouchPropertyManager.get_properties   sV    *X56jj"	L)..0  & 1r   c                     [         R                  SU SU S35        U R                  U5      nU(       d  g US   R                  U5      nU$ )Nzget_property(, )rU   )r(   rG   rL   r#   )r   rX   r[   rY   rI   props         r   get_property!CouchPropertyManager.get_property   sK    hZr$q9:jj"< $$T*r   c           
      v   U(       a  UR                  S5      (       d   eU(       d   eUc   e[        R                  SU< SU< SU< SU< 35        U(       a  g U R                  U5      nU(       a  X6S   U'   O$[	        5       R
                  U[        U5      SX#0S.nU R                  R                  U5        g )NrO   zwrite_property(r_   
, dry_run=z):
	rU   r    r   titletyperU   )	
startswithr(   rG   rL   r   hexr   r'   r,   )r   rX   r[   property_valuedry_runrY   rI   s          r   write_property#CouchPropertyManager.write_property   s     H//4444t)))w8	
 jj"&4d# w{{x$#4C 	Sr   c           	          [         R                  SU SU SU S35        U(       a  g U R                  U5      nU(       a  US   R                  U5      c  g US   U	 U R                  R                  U5        g )Nzremove_property(r_   re   r`   rU   )r(   rG   rL   r#   r'   r,   )r   rX   r[   rl   rY   rI   s         r   remove_property$CouchPropertyManager.remove_property   sp    (
"TF*WIQOPjj"c,'++D19d#Sr   c                     [         R                  SU-  5        U R                  U5      nU(       a  U R                  R	                  U5        g )Nzremove_properties(%s))r(   rG   rL   r'   delete)r   rX   rY   rI   s       r   remove_properties&CouchPropertyManager.remove_properties   s8    -89jj"GGNN3r   c                 X   U R                  U5      nU(       d  [        R                  SU SU S35        g [        R                  SU SU S35        U R                  U5      (       a   e[        5       R                  U[        U5      SUS   S.nU R                  R                  U5        g )Nzcopy_properties(r_   z): src has no propertiesr`   rU   rf   )rL   r(   rG   r   rj   r   r'   r,   )r   srcUrldestUrlrY   rI   doc2s         r   copy_properties$CouchPropertyManager.copy_properties   s    jj MM"6("WI5MN (7)1=>::g&&&&7;;7^ l+
 	Tr   c           	         [         R                  SU SU SU S35        U(       av  U R                  U5      nU H^  nUS   R                  X5      n[         R                  SR	                  US   U5      5        XvS'   U R
                  R                  U5        M`     g U R                  U5      nU(       aG  [         R                  SR	                  US   U5      5        X&S'   U R
                  R                  U5        g )Nzmove_properties(r_   r`   r   zmove property {} -> {})r(   rG   rR   replaceformatr'   r,   rL   )r   rw   rx   with_childrenrY   docListrI   newDests           r   move_properties$CouchPropertyManager.move_properties   s    (7)2m_ANO,,V4Ge*,,V=6==c%j'RS$E
S!	  	 **V$C6==c%j'RS$E
S!r   )r&   r'   r   ) )r   Nr   )FN)__name__
__module____qualname____firstlineno____doc__r   r   r   r   r5   r8   r<   r@   rL   rR   r\   rb   rm   rp   rt   rz   r   __static_attributes__r1   r   r   r   r   (   sb    9-$b4	  FJ6
$r   r   c                      g r   r1   r1   r   r   testr      s    r   __main__)r   urllib.parser   uuidr   r$   wsgidavr   __docformat__get_module_loggerr   r(   r   r   r1   r   r   <module>r      sS   *    "

 
 
*H H`	 zF r   