o k`(@s\ddlTddlmZddlmZmZmZmZddlm Z ddl m Z m Z Gddde ZdS) )*)Resource) datetime_nowfrom_utimestamp to_utimestamputc)_) WikiSystemvalidate_page_namec@sveZdZdZejZeddZdddZdddZ d d Z ed d Z dd dZ dddZ ddZddZddZdS)WikiPagez)Represents a wiki page (new or existing).cCst|j|j|jSN)rrealmname_resource_versionselfr1/usr/lib/python3/dist-packages/trac/wiki/model.pyresourceszWikiPage.resourceNcCs||_|rzt|}Wn tyd}Ynwt|tr=|}|j}|dur=|jdur=zt|j}Wn ty<d}Ynw||_||_|rL| ||nd|_d|_ |_ |_ d|_ d|_|j |_|j|_dS)a;Create a new page object or retrieves an existing page. :param env: an `Environment` object. :param name: the page name or a `Resource` object. :param version: the page version. The value takes precedence over the `Resource` version when both are specified. Nr)envint ValueError isinstanceridversionrr_fetchtextcommentauthortimereadonlyold_text old_readonly)rrrrrrrr__init__#s4     zWikiPage.__init__c Cs|dur d}|t|f}nd}|f}|j||D]&\}}}}}} t||_||_t||_||_||_| r:t| nd|_ dSd|_d|_|_|_d|_d|_ dS)NzqSELECT version, time, author, text, comment, readonly FROM wiki WHERE name=%s AND version=%szSELECT version, time, author, text, comment, readonly FROM wiki WHERE name=%s ORDER BY version DESC LIMIT 1rr) rrdb_queryrrrr rrr!) rrrsqlargsr rrrr!rrrrMs$    zWikiPage._fetchcCs2|jdur |j}nd|j|jf}d|jj|fS)Nz%s@%sz<%s %r>)rr __class____name__)rrrrr__repr__es zWikiPage.__repr__cCs |jdkS)Nr)rrrrrls zWikiPage.cCs(|js ttd|jjW}|dur#|d|jf|jjd|jn|d|j|f|jjd||j|dus>||jkrE| |jd|js]t |j` ddl m }||j|j|jWdn1sgwY|jst |jjD]}||qudSt |jjD] }t|d r||qdS) z.Delete one or all versions of a page. zCannot delete non-existent pageNzDELETE FROM wiki WHERE name=%szDeleted page %sz-DELETE FROM wiki WHERE name=%s and version=%szDeleted version %d of page %sr Attachmentwiki_page_version_deleted)exists TracErrorrrdb_transactionrloginforrr pagestrac.attachmentr- delete_allr change_listenerswiki_page_deletedhasattrr.)rrdbr-listenerrrrdeletens:        zWikiPage.deleteFc Cst|jsttd|jd|j|jk}|s"|j|jkr"ttd|p'tt }|j j J}|r\|rB|j dkrB|d|j|j|j fn#|j d7_ |d|j|j t |||j||jfn |d|j|jf|j dkrot|j `Wd n1sywY||_||_||_t|j jD]-}|j ||j dkr||n |||j |||Wd n1swYq|j|_|j|_d S) zSave a new version of a page.!Invalid Wiki page name '%(name)s'rzPage not modifiedrzf UPDATE wiki SET text=%s WHERE name=%s AND version=%s zINSERT INTO wiki (name,version,time,author,text,comment,readonly) VALUES (%s,%s,%s,%s,%s,%s,%s) z)UPDATE wiki SET readonly=%s WHERE name=%sN)r rr0rrr"r!r#rrrr1rrr r4rrr r7component_guardwiki_page_addedwiki_page_changed)rrrtreplacenew_textr:r;rrrsavesT            z WikiPage.savecCs |js ttd|sttd|j|krttdt|s(ttd|d|j}|jj7}t|j|}|jrAttd|d|d||ft|j` dd l m }| |j|j ||j |Wd n1siwY||_|jjd ||t|jjD] }t|d r|||qd S) zRename wiki page in-place, keeping the history intact. Renaming a page this way will eventually leave dangling references to the old page - which literally doesn't exist anymore. zCannot rename non-existent pagez%A new name is mandatory for a rename.zPage name is unchanged.r=r>z#The page '%(name)s' already exists.z%UPDATE wiki SET name=%s WHERE name=%srr,NzRenamed page %s to %swiki_page_renamed)r/r0rrr rr1r r r4r5r- reparent_allr r2r3r7r9rG)rnew_nameold_namer:new_pager-r;rrrrenames>          zWikiPage.renamecCs|js ttd|j}|jj}|d||j|jfWdn1s%wY||_|jj d|j|j|t |jj D] }t |drL| ||q?dS)z+Edit comment of wiki page version in-place.z(Cannot edit comment of non-existent pagez7UPDATE wiki SET comment=%s WHERE name=%s AND version=%sNz+Changed comment on page %s version %s to %swiki_page_comment_modified)r/r0rrrr1rrr2r3r r7r9rM)r new_comment old_commentr:r;rrr edit_comments"       zWikiPage.edit_commentccs<|jd|j|jfD]\}}}}|t|||fVq dS)zRetrieve the edit history of a wiki page. :return: a tuple containing the `version`, `datetime`, `author` and `comment`. z SELECT version, time, author, comment FROM wiki WHERE name=%s AND version<=%s ORDER BY version DESC N)rr%rrr)rrtsrrrrr get_historys  zWikiPage.get_history)NNr )NF)r) __module__ __qualname____doc__r r propertyrr$rr*r/r<rFrLrPrRrrrrr s   *   %.( r N) trac.core trac.resourcertrac.util.datefmtrrrrtrac.util.translationr trac.wiki.apir r objectr rrrrs