Ë
    "ïàj_   ã                   ó�   — d Z ddlmZ ddlmZ ddlZddlmZ dZ ej                  e
«      Z G d„ d«      Zd	„ Ze
d
k(  r e«        yy)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                   óŠ   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dd„Z
dd
„Zd„ Zd„ Zdd„Zdd„Z	 dd„Zdd„Zdd„Zdd„Zdd„Zy	)ÚCouchPropertyManagerz/Implements a property manager based on CouchDB.c                 ó2   — || _         | j                  «        y ©N)ÚoptionsÚ_connect)Úselfr   s     úV/srv/dav/.venv/lib/python3.12/site-packages/wsgidav/prop_man/couch_property_manager.pyÚ__init__zCouchPropertyManager.__init__,   s   € ØˆŒØ�‰�ó    c                 ó$   — | j                  «        y r
   )Ú_disconnect©r   s    r   Ú__del__zCouchPropertyManager.__del__0   s   € Ø×ÑÕr   c                 óÔ  — | j                   }|j                  d«      r*t        j                  |j                  d«      «      | _        nt        j                  «       | _        |j                  dd«      }|| j                  v rR| j                  |   | _        t        j                  d| j
                  ›d| j                  j                  «       ›�«       n]| j                  j                  |«      | _        t        j                  d| j
                  ›d| j                  j                  «       ›�«       d| j
                  vr+d}dd	d
did
|idœdœ}| j
                  j                  |«       y y )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   zCouchPropertyManager._connect3   s&  € Ø�|‰|ˆØ�8‰8�EŒ?Ü Ÿ™¨¯©°«Ó8ˆD�Jä Ÿ™Ó)ˆDŒJà—‘˜( OÓ4ˆØ�T—Z‘ZÑØ—j‘j Ñ(ˆDŒGÜ�LŠLà—7“7˜DŸJ™J×.Ñ.Ô0ð2õð
 —j‘j×'Ñ'¨Ó/ˆDŒGÜ�LŠLà—7“7˜DŸJ™J×.Ñ.Ô0ð2ôð   t§w¡wÑ.ðˆCð ,à(ð ð7ðð  % c˜lñ	ñ	ˆIð �G‰G�L‰L˜Õ#ð/ /r   c                  ó   — y r
   © r   s    r   r   z CouchPropertyManager._disconnectd   ó   € Ør   c                 ó    — d| j                   z  S )NzCouchPropertyManager(%s))r$   r   s    r   Ú__repr__zCouchPropertyManager.__repr__g   s   € Ø)¨D¯G©GÑ3Ð3r   c                  ó   — y r
   r-   r   s    r   Ú_synczCouchPropertyManager._syncj   r.   r   c                  ó   — y r
   r-   )r   Úmsgs     r   Ú_checkzCouchPropertyManager._checkm   r.   r   Nc                  ó   — y r
   r-   )r   r4   Úouts      r   Ú_dumpzCouchPropertyManager._dumpp   r.   r   c                 óü   — | j                   j                  d|d¬«      }t        j                  d|›dt	        |«      › �«       t	        |«      dk  s
J d|z  «       ‚|D ]  }|j
                  sJ ‚|j
                  c S  y)	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   Ú_findzCouchPropertyManager._finds   s}   € ð �W‰W�\‰\Ð-°3ÀTˆ\ÓJˆÜ�‰˜˜c˜W K´°B³¨yÐ9Ô:Ü�2‹w˜!Š|ÐBÐ<¸sÑBÓBˆ|Øò 	ˆCØ—7’7ˆN�7Ø—7‘7ŠNð	ð r   c              #   ó€   K  — d|dz   z  }| j                   j                  |d¬«      }|D ]  }|j                  –— Œ y­w)z4Return properties document for url and all children.zéfunction(doc) {
                var url = doc.url + "/";
                if(doc.type === 'properties' && url.indexOf('%s') === 0) {
                    emit(doc.url, { 'id': doc._id, 'url': doc.url });
                }
            }ú/T)r;   N)r$   Úqueryr@   )r   r   Úmap_funrA   rB   s        r   Ú_find_descendentsz&CouchPropertyManager._find_descendents~   sN   è ø€ ðð
 ˜#‘Iñˆð �W‰W�]‰]˜7°ˆ]Ó6ˆØò 	ˆCØ—'‘'‹Mð	àùs   ‚<>c                 ó²   — t         j                  d|z  «       | j                  |«      }g }|r)|d   j                  «       D ]  }|j	                  |«       Œ |S )Nzget_properties(%s)Ú
properties)r%   r>   rC   ÚkeysÚappend)r   Únorm_urlÚenvironr@   Ú	propNamesÚnames         r   Úget_propertiesz#CouchPropertyManager.get_propertiesŒ   s[   € Ü�‰Ð*¨XÑ5Ô6Ø�j‰j˜Ó"ˆØˆ	ÙØ˜LÑ)×.Ñ.Ó0ò '�Ø× Ñ  Õ&ð'àÐr   c                 óŽ   — t         j                  d|› d|› d�«       | j                  |«      }|sy |d   j                  |«      }|S )Nzget_property(ú, ú)rJ   )r%   r>   rC   r    )r   rM   rP   rN   r@   Úprops         r   Úget_propertyz!CouchPropertyManager.get_property•   sK   € Ü�‰˜ h Z¨r°$°°qÐ9Ô:Ø�j‰j˜Ó"ˆÙØØ�<Ñ ×$Ñ$ TÓ*ˆØˆr   c           
      ó>  — |r|j                  d«      sJ ‚|sJ ‚|€J ‚t        j                  d|›d|›d|›d|›�«       |ry | j                  |«      }|r	||d   |<   n%t	        «       j
                  |t        |«      d||idœ}| j                  j                  |«       y )NrE   zwrite_property(rS   ú
, dry_run=z):
	rJ   ©r   r   ÚtitleÚtyperJ   )	Ú
startswithr%   r>   rC   r   Úhexr   r$   r)   )r   rM   rP   Úproperty_valueÚdry_runrN   r@   s          r   Úwrite_propertyz#CouchPropertyManager.write_property�   s¨   € ñ ˜H×/Ñ/°Ô4Ð4Ð4ÙˆˆtØÐ)Ð)Ð)ä�Šâššw©ð8ô	
ñ Øà�j‰j˜Ó"ˆÙØ&4ˆC�Ñ˜dÒ#ô “w—{‘{ØÜ˜x›Ø$Ø# ^Ð4ñˆCð 	�‰�‰�SÕr   c           	      óÚ   — t         j                  d|› d|› d|› d�«       |ry | j                  |«      }|r|d   j                  |«      €y |d   |= | j                  j                  |«       y )Nzremove_property(rS   rX   rT   rJ   )r%   r>   rC   r    r$   r)   )r   rM   rP   r_   rN   r@   s         r   Úremove_propertyz$CouchPropertyManager.remove_property¸   sp   € Ü�‰Ð(¨¨
°"°T°F¸*ÀWÀIÈQÐOÔPÙàØ�j‰j˜Ó"ˆá�c˜,Ñ'×+Ñ+¨DÓ1Ð9ØØ�Ñ˜dÐ#Ø�‰�‰�SÕr   c                 ó�   — t         j                  d|z  «       | j                  |«      }|r| j                  j	                  |«       y )Nzremove_properties(%s))r%   r>   rC   r$   Údelete)r   rM   rN   r@   s       r   Úremove_propertiesz&CouchPropertyManager.remove_propertiesÄ   s8   € Ü�‰Ð-°Ñ8Ô9Ø�j‰j˜Ó"ˆÙØ�G‰G�N‰N˜3ÔØr   c                 óD  — | j                  |«      }|st        j                  d|› d|› d�«       y t        j                  d|› d|› d�«       | j                  |«      rJ ‚t        «       j                  |t        |«      d|d   dœ}| j                  j                  |«       y )Nzcopy_properties(rS   z): src has no propertiesrT   rJ   rY   )rC   r%   r>   r   r]   r   r$   r)   )r   ÚsrcUrlÚdestUrlrN   r@   Údoc2s         r   Úcopy_propertiesz$CouchPropertyManager.copy_propertiesË   sœ   € Ø�j‰j˜Ó ˆÙÜ�M‰MØ" 6 (¨"¨W¨IÐ5MÐNôð Ü�‰Ð(¨¨°°7°)¸1Ð=Ô>Ø—:‘:˜gÔ&Ð&Ð&ä“7—;‘;ØÜ˜7“^Ø Ø˜lÑ+ñ
ˆð 	�‰�‰�TÕr   c           	      óè  — t         j                  d|› d|› d|› d�«       |rv| j                  |«      }|D ]_  }|d   j                  ||«      }t         j                  dj	                  |d   |«      «       ||d<   | j
                  j                  |«       Œa y | j                  |«      }|rHt         j                  dj	                  |d   |«      «       ||d<   | j
                  j                  |«       y )Nzmove_properties(rS   rT   r   zmove property {} -> {})r%   r>   rH   ÚreplaceÚformatr$   r)   rC   )r   rg   rh   Úwith_childrenrN   ÚdocListr@   ÚnewDests           r   Úmove_propertiesz$CouchPropertyManager.move_propertiesÝ   så   € Ü�‰Ð(¨¨°°7°)¸2¸m¸_ÈAÐNÔOÙà×,Ñ,¨VÓ4ˆGØò "�Ø˜e™*×,Ñ,¨V°WÓ=�Ü—‘Ð6×=Ñ=¸cÀ%¹jÈ'ÓRÔSØ$��E‘
Ø—‘—‘˜SÕ!ð	"ð 	ð —*‘*˜VÓ$ˆCÙÜ—‘Ð6×=Ñ=¸cÀ%¹jÈ'ÓRÔSØ$��E‘
Ø—‘—‘˜SÔ!Ør   )Ú )rr   Nr
   )FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r0   r2   r5   r8   rC   rH   rQ   rV   r`   rb   re   rj   rq   r-   r   r   r   r   )   sb   „ Ù9òòò-$òbò4òóóò	òóóð FJóó6
óóô$r   r   c                   ó   — y r
   r-   r-   r   r   Útestrx   ÷   s   € Ør   Ú__main__)rv   Úurllib.parser   Úuuidr   r!   Úwsgidavr   Ú__docformat__Úget_module_loggerrs   r%   r   rx   r-   r   r   ú<module>r      sU   ðñõ, Ý ã å à"€à
 ˆ$×
 Ñ
  Ó
*€÷Fñ Fò\	ð ˆzÒÙ…Fð r   