o k`1B@s ddlZddlZddlmZmZddlmZmZddlTddlm Z ddl m Z ddl m Z mZmZmZmZmZmZmZmZmZmZmZddlmZdd lmZdd lmZdd lm Z m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-dd l.m/Z/ddl0m1Z1m2Z2Gddde3Z4dS)N)datetime timedelta) IntOption BoolOption)*)IPermissionRequestor)ITimelineEventProvider) datetime_now format_dateformat_datetime format_timelocaltz parse_datepretty_timedelta to_datetime to_utimestamptruncate_datetime user_timeutc)tag) to_unicode)_)IRequestHandlerIRequestFilter) ChromeINavigationContributorITemplateProvider accesskeyadd_linkadd_stylesheet add_warning auth_linkcomponent_guard prevnext_nav web_context)IWikiSyntaxProvider)concat_path_query_fragment"split_url_into_path_query_fragmentc@seZdZeeeeeee e e Z e ddddZe ddddZeddd d Zed Zd d ZddZddZddZddZddZddZddZddZddZd d!Z # "d(d$d%Z d&d'Z!d"S))TimelineModuletimelinedefault_daysbackzCDefault number of days displayed in the Timeline, in days. max_daysbackZzWMaximum number of days (-1 for unlimited) displayable in the Timeline. abbreviated_messagesTzWhether wiki-formatted event messages should be truncated or not. This only affects the default rendering, and can be overriden by specific event providers, see their own documentation. z'(-)?(?:"([^"]*)"|\'([^\']*)\'|([^\s]+))cCsdS)Nr)selfreqr/r/6/usr/lib/python3/dist-packages/trac/timeline/web_ui.pyget_active_navigation_itemIz)TimelineModule.get_active_navigation_itemccs@d|dvrddtjtd|jt|ddfVdSdS)N TIMELINE_VIEWr)mainnavTimeline)hrefr)permrarr:r)rr0r/r/r3get_navigation_itemsLs z#TimelineModule.get_navigation_itemscCsdgS)Nr6r/r1r/r/r3get_permission_actionsTsz%TimelineModule.get_permission_actionscCs |jdkS)Nz /timeline) path_infor0r/r/r3 match_requestYs zTimelineModule.match_requestc' sbddjd}jd|dkrdnd}jdd}tfd d d D}|r6jd |}tj }t |}t |j dd t ddj }d} } djvrjd} | rztt| } Wnty} z t| WYd} ~ n d} ~ ww| j }jdd} | drt dd} n| drt dd} n | drt dd} nd} t t|j|j|jddddj }jd|j} |dkrdn| }jjd|d|jd}jd }|dur|dkrjd!}|pd}|||||| | gg|jd" }g}|jD]%}t|j|||pg7}Wdn 1s)wYq fd#d$|D}|sJ|dkrJfd%d$|D}|sTd&d$|D}d'jvr|D]"}d(|d}|djvrsd)j|<q\|jvr}j|=q\|}t |j dd t |ddj }t }t }|j!"|D](}|#d*p|#d+p|#d,$}|#dr|%|q|%|qg}|jD]K}t|j|8|&|||pgD]$}|d*pd$} |r| |vr| |vr|'|(|||qWdn 1swYqt)|d-d.d/d0}|r*|d|}||d1<|dkrKt*d/d2}!|!j+d3d4d5|!|d6<d7|d8d9ifSj d||jj d!|d|rw|swt,|dd:}"t-||"jd<|jd <t*}#|#j+d;|jd5|#|d6<t.d<j/j0d=d$|Ddd|dd>}$t1d?t2|$t3d@d9dt4|j5|D]}|dA'|d|d|d|vdBq|j dd t |dd}%t6|%dCj dD}%t1dEj/j0|%||dFt3dG||t ddkr#|j dd t |dd}&t6t |&j dCj dD}&t1dHj/j0|&||dFt3dIt7t3dGt3dIdJ|fS)KNr)r6formatmaxrss2rztimeline.lastvisitc3s|]}|jvVqdSNargs).0r<r2r/r3 dsz1TimelineModule.process_request..)updatefromdaysbackauthorztimeline.nextlastvisittzinfo)daysrM precisionsecond)secondsminute)minuteshour)hours;i?Bztimeline.daysbackr-rN)minrCauthorsztimeline.authors) fromdaterNr_today yesterday precisedaterTeventsfiltersr.cs"g|] }|djvr|dqS)rrGrIfrJr/r3 s"z2TimelineModule.process_request..cs(g|]}jd|dr|dqS)ztimeline.filter.r)sessionas_intrfrJr/r3rhscSs(g|]}t|dks|dr|dqS)r9r)lenrfr/r/r3rhs(rLztimeline.filter.%s1r9cSs|dS)Nrr/)er/r/r3sz0TimelineModule.process_request..T)keyreverserd)absurlshtmlF) wiki_flavor shorten_linescontextz timeline.rss content_typezapplication/rss+xmlronelinerzcommon/css/timeline.csscSsg|]}|dfqS)onr/rfr/r/r3rhs)rNrCr_rB alternatezRSS Feedre)namelabelenablediso8601)rBrQprev)from_r_rNzPrevious Periodnextz Next Periodz timeline.html)8r;requirerHgetgetintrirjanyr tzrrreplacerstriprr TracErrorr astimezone startswithryearmonthdayr*r,r.event_providersr"envget_timeline_filtersset_authors_patternfinditergrouploweraddget_timeline_eventsappend _event_datasortedr$ set_hintsrrCrr:r)rr!rr add_jquery_uir r#)'r1r2rBmaxrows lastvisitrevisitr`rarbrcrT reqfromdateroprefdefaultrNr_dataavailable_filtersevent_providerrefilter_rqstopstartincludeexcludematchr|rdprovidereventrO rss_context lastviewed html_contextrss_hrefprevious_start next_startr/rJr3process_request\sR                       &                  zTimelineModule.process_requestcCgSrFr/r>r/r/r3get_htdocs_dirsr5zTimelineModule.get_htdocs_dirscCstddgS)Nz trac.timeline templates) pkg_resourcesresource_filenamer>r/r/r3get_templates_dirs z!TimelineModule.get_templates_dirscCs|SrFr/)r1r2handlerr/r/r3pre_process_requestr5z"TimelineModule.pre_process_requestcs:|rdfdd fdd}|d<||d<|||fS) NFcs`|sdS|dkrtt|}ntt|}tt}t||}|s+jdtj j }|dkrd||krS|s;t d|dn|}t dtt|tt |d}t j||d S|s[t d |dn|}t d |d }nB|ri|}n&jd krut d|d}n|dkrt d|d}nt dtt|tt |d}||krt d|d}t j||d St d|d}j||d|dS)NrUdatedateinforelativezin %(relative)s)rzon %(date)s at %(time)s)rtime)titlez%(relative)s ago See timeline at %(absolutetime)s absolutetimerzat %(iso8601)s)rz on %(date)srz!See timeline %(relativetime)s ago) relativetimerV)rTr)rr r r r rrirrrdefault_dateinfo_formatrr rspanlc_timeget_timeline_link)rrBdateonlyabsolutenowrr}r)r2r1r/r3pretty_dateinfos`          z.pretty_dateinfocs|dddS)NrT)rBrr/r)rr/r3r?rz5TimelineModule.post_process_request..dateinforr)NFr/)r1r2templatermetadatarr/)rr2r1r3post_process_requests  + z#TimelineModule.post_process_requestcCrrFr/r>r/r/r3get_wiki_syntaxGr5zTimelineModule.get_wiki_syntaxc#sfdd}d|fVdS)Nc st|\}}}d}|dd}t|dkr8|ddd}t|dkr'd}nt|dkr0d}nt|d kr8d }zt|td d d } |j| ||||WStyh} ztj |t | d dWYd} ~ Sd} ~ ww)NTrRZrrWrnrYr9r[r)localehintztimeline missing)rclass_) r'splitrkrrrr2rrr<r) formatternstargetr}pathqueryfragmentrTrdtror>r/r3 link_resolverKs,       z8TimelineModule.get_link_resolvers..link_resolverr)r/)r1rr/r>r3get_link_resolversJs z!TimelineModule.get_link_resolversNr[c CsHt|d|j}|jj||d} tj|p|d|ptd|dt| ||dS)Nr)rrTr)rr)rrr:)r rr:r)rr<rr&) r1r2rr}rTrrriso_dater:r/r/r3rbs  z TimelineModule.get_timeline_linkc svtdkr\}}}}n\}}}}fdd} t||jd} t| } t| } ||| | | | |o5|| k|d S)zZCompose the timeline event date from the event tuple and prepared provider methodscs||SrF)render_timeline_event)fieldrwrrr/r3rptrz,TimelineModule._event_data..rP) kindrOrr datetime_uidrenderunreadrrr)rkrrrr) r1r2rrrrrrOrrlocalized_datetimelocalized_daterr/rr3rms   zTimelineModule._event_data)Nr[NNN)"__name__ __module__ __qualname__ implementsrrrrrr%ExtensionPointrrrr*r,rr.recompilerr4r=r?rArrrrrrrrrr/r/r/r3r(-s@ ,5 r()5rrrr trac.configrr trac.core trac.permrtrac.timeline.apirtrac.util.datefmtr r r r r rrrrrrrtrac.util.htmlrtrac.util.textrtrac.util.translationrtrac.webrrtrac.web.chromerrrrrrr r!r"r#r$ trac.wiki.apir%trac.wiki.formatterr&r' Componentr(r/r/r/r3s   8   4