o k`@sddlmZmZddlmZddlZddlmZddlZddlZddl Z ddl m Z m Z ddl TddlmZddlmZmZdd lmZdd lmZmZdd lmZmZdd lmZdd lmZmZm Z ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/m0Z0m1Z1ddl2m3Z3m4Z4m5Z5m6Z6ddl7m8Z8m9Z9m:Z:ddl;mZ>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGddlHmIZIddlJmKZKddlLmMZMGdddeNZOGdddeNZPGdddeQZRGdd d eSZTGd!d"d"eMZUdS)#)datetime timedelta)groupbyN)ceil)Option IntOption)*)get_column_names)IContentConverterMimeview)Resource) TicketSystemtranslation_deactivated) Milestone_datetime_to_db_str)group_milestones)Rangesas_boolas_int) datetime_nowfrom_utimestampformat_date_or_datetime parse_date to_timestamp to_utimestamputc user_time)tag) Paginator)empty shorten_linequote_query_string)_ cleandoc_ngettexttag_)arg_list_to_argsparse_arg_listIRequestHandler)Href) INavigationContributorChrome add_ctxtnavadd_link add_scriptadd_script_dataadd_stylesheet add_warning auth_link web_context)IWikiSyntaxProvider) MacroError) WikiMacroBasec@seZdZdZdS)QuerySyntaxErrorzDException raised when a ticket query cannot be parsed from a string.N)__name__ __module__ __qualname____doc__r<r<3/usr/lib/python3/dist-packages/trac/ticket/query.pyr75sr7c@seZdZdZddZdS)QueryValueErrorz?Exception raised when a ticket query has bad constraint values.cCst|td||_dS)NzInvalid query constraint value) TracError__init__r"errors)selfrAr<r<r=r@;s zQueryValueError.__init__N)r8r9r:r;r@r<r<r<r=r>9s r>c@seZdZdgZedZ   d#ddZedZedZ e d d Z d d Z d dZ ddZddZd$ddZddZd%ddZ  d&ddZddZd$ddZedd Z  d$d!d"ZdS)'Query$USERz(?P\d+)_(?P.+)$NrcsT||_||_|p g}t|tr|g}||_t|j}||||_||_ ||_ ||_ | |_ d|_ t|jj|_d|_| sA|j } zt| |_|jdkrOtWnty_ttd| dw| dvrfd} | durm|j} zt| |_|jdkr{tWntyttd| dw|jdkrd|_d|_n d |_|j|jd|_| durg} | rd | vr| d t|j|_d d |jD|_d d |jDfdd|pgD|_fdd| D|_|jdkr|jvrd|_|j vrd|_ i}|jD]&}t|D]}|dks|vr| |g||q|!|qq||_"dS)NzQuery page %(page)s is invalid.page)nonerzQuery max %(max)s is invalid.)maxFT descriptioncSs h|] }|ddkr|dqS)typetimenamer<.0fr<r<r= |s z!Query.__init__..cSsh|]}|dqSrNr<rOr<r<r=rR~cs g|] }|vs |dkr|qS)idr<rPc field_namesr<r= sz"Query.__init__..cg|]}|vr|qSr<r<rVrXr<r=rZrUpriority)#envrU isinstancedict constraintsr get_field_synonymsgetorderdescgroup groupdescformat default_page QueryModuleitems_per_page num_itemsintrG ValueErrorr?r"rJhas_more_pagesoffsetappendget_ticket_fieldsfields time_fieldscolsrowssorted setdefaultpopconstraint_cols)rBr^reportrarurdrerfrgverboservrGrJrhsynonymsrzclausecolr<rXr=r@Ds~              zQuery.__init__z(?Query filter requires field and constraints separated by a "="rI~^$!z Query filter requires field namecsg|] }|ddqS)z\||replacerPvalmoder<r=rZsz%Query.from_string..rrc3|] }||VqdSNrcrPvalue)r}r<r= z$Query.from_string..r{)raru)r rb_clause_splittersplitrqrlenr7r" substitutionsrc_item_splitterrxextendrlistfilterry)clsr^stringkwkw_strskw_aryskw_bools kw_synonymsrarur{filter_fieldvaluesprocessed_valuesr<)rr}r= from_stringsb               zQuery.from_stringcCs.|js||_d|jvr|jdd|jS)NrUr)ruget_default_columnsinsertrBr<r<r= get_columnss   zQuery.get_columnscCsdd|jDS)NcSs g|] }|ddkr|dqSrLtextarearNr<rOr<r<r=rZ z+Query.get_all_textareas..rsrr<r<r=get_all_textareasszQuery.get_all_textareascsfdg}|dd|jD7}dD]}||vr||||qt|jfdd}|j|d|S)NrUcSs g|] }|ddkr|dqSrr<rOr<r<r=rZrz)Query.get_all_columns..)reporterkeywordscccs(|dkrdS|dkr dS|vrdSdS)NrUrEsummaryrr<rSconstrained_fieldsr<r= sort_columnssz+Query.get_all_columns..sort_columnskey)rsremoverqsetrzsort)rBrurrr<rr=get_all_columnss     zQuery.get_all_columnscCs|}t|jD]O}|dks||vrq |j|}|D]}t|dkr8|dr8|dddvr8||vr8||jvs:nq|||dkrXd|vrX|D]}d|vrRnqJ|dq |j|vrd||j|dd}|j|vrz|j|jkrz|j|d <|S) NrUrErz!~^$status resolutionclosedr)rrwrzrrtrrfrd)rBrurra constraintr<r<r=rs2        zQuery.get_default_columnscCs||||\}}|||S)zBGet the number of matching tickets for the present query. )get_sql_count)rBreq cached_idsauthnamesqlargsr<r<r=count s z Query.countcCs.|jd||dd}|jjd||S)NzSELECT COUNT(*) FROM (%s) AS xrzCount results in Query: %d)r^db_querylogdebug)rBrrcntr<r<r=rsz Query._countcs|dur|j}d_|||\}}||_jjkr#d_jrVj}jr0|d7}|d|jf7}jt t t jjkrVjdkrVt t djdg}jj}} | } | ||t| } fdd | D} | D]Y} i}t| | | D]I\}}}|d kr|pd }n7|d krt |}|dur|||d <n#|jvr|rtt |nd}n|r|ddkrt|}n|durd}|||<q||qv|WdS1swYdS)z/Retrieve the list of matching tickets. NrFrEz LIMIT %d OFFSET %dz8Page %(page)s is beyond the number of pages in the queryrFcsg|] }j|dqSr)rsby_name)rPcolumnrr<r=rZ3sz!Query.execute..r anonymousrUhrefrLcheckboxrI)rrlrrrJrorfrprGrmrfloatr?r"r^rcursorexecuter zipticketrtrrrq)rBrrrrrrrJresultsdbrcolumnsrsrresultrNrrr<rr=rsV         $z Query.executec sP|dur|j}|dkr|j}|j}|dur|j}|dur|j}|dur&|j}|dur-|j}|dur4|j}|}|| kr@d}||jkrGd}||jkrNd}g} t |j D]\} | dkrd| dt f| fddtDqU| d|fd|jp}dfd |jrd ndfd |fd |fd |rd ndfd|fd|jfd|fd|fg || S)a\Create a link corresponding to this query. :param href: the `Href` object used to build the URL :param id: optionally set or override the report `id` :param order: optionally override the order parameter of the query :param desc: optionally override the desc parameter :param format: optionally override the format of the query :param max: optionally override the max items per page :param page: optionally specify which page of results (defaults to the first) Note: `get_resource_url` of a 'query' resource? Nrssrrc3s|] }||fVqdSrr<rPrr~r<r=rxz!Query.get_href..r{rfrgrErJrdrerrrGrh)rhrkrirUrerdrJrGrr enumeraterarqrrrwrfrgrvquery) rBrrUrdrerhrJrGruridxr<rr=get_hrefHsP     zQuery.get_hrefcCs.|td}|ddd}d|ddS)zReturn a user readable and editable representation of the query. Note: for now, this is an "exploded" query href, but ideally should be expressed in TracQuery language. rI?rErzquery:?rz & )rr)rr)rB query_stringr<r<r= to_stringszQuery.to_stringc sdurj gfdd}| j jr% jvr%| j jr1|dg jR|dddd j|t jd d jDd d jDfd d D}t |dk  fdd dD} fdd dD}g}| dd fddDd|vr| d j j  r|fdd|D| d|fdd|Dn6|fdd|D| d|fdd|D| d| dd d d|D| d!|d"d|D|d#d|Dfd$d%  fd&d' fd(d)} ggttdt| j} | rZ| d*| d+ d,d| D|rZ| d+| d-d d.d|D| d/ j jfg} jr{ j jkr{| d0 j jf| D]\} } | |vr| d1}n| vrd2| }n r| d1}nd3| }| rd4nd5} | vrd6}n| d7ks| jvrd8}nd6}| d9||| d:| |vr| |d;| n7| dkr| vr| d?| | || fn | d@|| f| jkr*| jks*| dq}Wdn 1s7wY jd7krG| dArNtd5 |fS)Bz4Return a (sql, params) tuple for the query. Ncs |D] }|vr |qdSr)rq)rr)rur<r=add_colss  zQuery.get_sql..add_colsrrr]rM changetimecSsh|] }|dr|dqS)customrNrrOr<r<r=rRsz Query.get_sql..cSs.h|]}|ddkr|ddkr|dqS)rLtextrhrrNrrOr<r<r=rRs  cr[r<r<rPk custom_fieldsr<r=rZr\z!Query.get_sql..rEcs*g|]}|vr|djjfvr|qS)r]rdrfrrrBr<r=rZs )rr]severityrLcs(g|]}|vr|jjfvr|qSr<rrrr<r=rZs ) milestoneversionzSELECT ,c3s$|] }|vrd||fVqdS)z t.%s AS %sNr<rVrr<r=rs  z Query.get_sql..z",priority.value AS _priority_valuec3"|] }dd|iVqdS)z,%(qk)s.value AS %(qk)sqkNquoterrr<r=rz FROM ticket AS tc3s$|] }d||dVqdS)zZ LEFT OUTER JOIN ticket_custom AS %(qk)s ON (%(qk)s.ticket=t.id AND %(qk)s.name='%(k)s'))rrNrrrr<r=rs  c3r)z,c.%(qk)s AS %(qk)srNrrrr<r=rrz< FROM ticket AS t LEFT OUTER JOIN (SELECT ticket AS idc3s"|] }d||fVqdS)z3, MAX(CASE WHEN name='%s' THEN value END) AS %sNrrrr<r=rs   z FROM ticket_custom AS tcz WHERE name IN (%s)cs|]}d|VqdS)z'%s'Nr<rr<r<r=rz* GROUP BY tc.ticket) AS c ON c.id=t.idcss*|]}d||dkr dn|dVqdS)zZ LEFT OUTER JOIN enum AS %(col)s ON (%(col)s.type='%(type)s' AND %(col)s.name=t.%(col)s)rL ticket_type)rrLNr<rr<r<r=rs css|] }dd|iVqdS)z4 LEFT OUTER JOIN %(col)s ON (%(col)s.name=%(col)s)rNr<rr<r<r=rs  c sL|r$ztt|WSty#}zt|WYd}~dSd}~wwdSr)rrr?rqstr)re)rArr<r=user_parse_datesz&Query.get_sql..user_parse_datecs|v}|s d|}nr|d}nd|}|t||d}|jvr|s>d||r4dnd}dg}||fSd|vrPdd |dd D\}} n|d}} |}| } d}}|durz| durzd |rqd nd|}|| g}n&|durd |rd nd|}|g}n| durd|rd nd|}| g}ndS|rdd |D}||fSdd |D}||fSdd} |dkr|vr| |} gg} }| D],} d}| drd }| d d} | sq| d||f|d | dq| sdS|rd nddd | d|fS|dkr(d||r!dndf|ffS|s-dS |}|dkr>d|d}n|dkrH|d7}n |dkrQd|}d||rXd ndf|ffS)Nt..valuec.zCOALESCE({0},''){1}=%srrI..cSsg|]}|qSr<striprPeachr<r<r=rZrTz=Query.get_sql..get_constraint_sql..rEz{0}({1}>=%s AND {1}<%s)NOT z {0}{1}>=%sz {0}{1}<%scSsg|]}t|dqS)T)rrPargr<r<r=rZ cSg|]}t|qSr<)rrr<r<r=rZ rTcSs ddddtd|DDS)NcSsg|] }|D]}|qqSr<r )rPwlwr<r<r=rZs zRQuery.get_sql..get_constraint_sql..split_words..cssJ|] }|r|d|dkrdkrnn|ddgn|VqdS)rr"rEN)rrPxr<r<r=rs@zQQuery.get_sql..get_constraint_sql..split_words..z ("[^"]+"))rer) splittabler<r<r= split_wordss  z>Query.get_sql..get_constraint_sql..split_wordsr-zCOALESCE(%s,'') %s%s%( AND )zCOALESCE(%s,'')%s=%%srr) rrrtrhrr startswithrqlike like_escapejoin)rNrrnegis_custom_fieldrr~rstartendrwordsclauseswordcneg)rr list_fieldsrB use_joinsrr<r=get_constraint_sqls                z)Query.get_sql..get_constraint_sqlc sg}t|D]:|}durfdd|D}|dddt|dkr9|ddvr9|ddkrt}|D]!}|dd}z||WqBtyctd|d YqBwg}g}|j D]\}}||kr{|t |qk|d ||qk|r|d d ||r|d rdndd |fqst|dkr j vrvrd} n rʈ d} nd } |d| rdndd dd|Dffdd|Dq|rAfdd|D} ttd| } | sqr#|dd dd| Ddn|dd dd| Dd| D] } | dq6qd |S)Ncsg|]}|dqS)rDrr)rr<r=rZ>r\z9Query.get_sql..get_clause_sql..rrrIrrUz!Invalid ticket id list: %(value)s)rzt.id BETWEEN %s AND %sz t.id IN (%s)rz%s(%s)r OR rEr r r zCOALESCE(%s,'') %sIN (%s)css|]}dVqdS)z%sNr<rr<r<r=risz8Query.get_sql..get_clause_sql..csg|]}|dqSrr<r)r'r<r=rZjr\csg|] }|qSr<r<r)r1rrr'r<r=rZlsr r!cSg|]}|dqSrr<rPitemr<r<r=rZsrTr"cSr3r4r<r5r<r<r=rZvrT)rwr#rrr appendrange Exceptionrqr"pairsrr&rtrrrr) rar,vrangesrids id_clausesabrconstraint_sqlr6)rrrrrAr1rBr0)rrr'r=get_clause_sql9s                z%Query.get_sql..get_clause_sqlz WHERE r2csr)z(%s)Nr<rVr<r<r=rrz t.id in (%s)css|]}t|VqdSrrrPrUr<r<r=rrz ORDER BY rr r r z DESCrIz''rU0z*COALESCE(%(col)s,%(arg)s)=%(arg)s%(desc)s,)rrrermrzlCOALESCE(milestone.completed,0)=0%s,milestone.completed%s,COALESCE(milestone.due,0)=0%s,milestone.due%s,%s%srz0COALESCE(version.time,0)=0%s,version.time%s,%s%sz%s%sz,t.id)rrrurfrvrdrwrzrsrrqr&r^rrrrmaprarerrgrrtcastr>)rBrrrr cols_custom enum_columnsjoined_columnsrrBr, order_colsrNrer coalesce_argr<) rrrurrrAr1r/rrBr0rr=rs    "         UB              x z Query.get_sqlcCstdddtdddtdddtdd dtd d dtd d dgtdddtdddgtd d dtd d dgtd d dtd d dgd}|S)NcontainsrrNrzdoesn't containz!~z begins withrz ends withrisrIzis notr)rrselectrUr")modesr<r<r= get_modess$            zQuery.get_modesc sBg}jD]c}i}|D]U\} } gdd} | D]E} | d} | r'| dd} d}| dddvrC| jvrC| dd| dd}} rL| dj} | rPdnd|| d<| d| q| || <q ||q}tj  fd d |D}d d t d d ij D]k}|d}|dkr|ddkr| }tfdd |dDtdd|d<|ddddd|dkr|ds| }fdd |dD}fdd |D}t|dg|d<dd D|d<||<qfdd}t|d}ig}|D]I}|r2|r2|d r"|d |kr"d|d!<n|d"r2|d"|kr2d|d#<jrQ|j}|g||rL||vrQ||q fd$d |D}d%}|rjrt|jdkr|d&=t|d&ddkr|d&=n d}|d&dd&=t|jdjj}r|jrjjjjdd'}td(|t d)|jr͈jjjjdd'}td*|t d+nd%|_ g}|!d,}|D]}|jj|d-dt"|t d.|d/gqd0d |D|_#dd1t"|jddd2|_$|j%|||&||pd|fg||d3 S)4NrI)rrrrErrDrrc sLg|]"}||tdj|ijj||jkoj ddqS)Ticket)rdre)rNlabelrr)rcr"rsrrrrdrer)contextlabelsrBr<r=rZs   z'Query.template_data..rUrT)rLrUrNownerrLrPcs$g|]}tj||dqS)rN)r+r^ format_author)rPoptionrrBr<r=rZs optionsrrrNrrcsg|]}tj|qSr<)rr^)rPoptrr<r=rZcs g|] }d|jvr|qS)MILESTONE_VIEW)permresourcerPm)rVr<r=rZsTcSs$g|]\}}|dd|DdqS)cSsg|]}|jqSr<rSrbr<r<r=rZsz2Query.template_data...)rUr\r<)rPrU milestonesr<r<r=rZs optgroupscs d|vr|dSdS)NrUrI)lowerrSrr<r=by_labels z%Query.template_data..by_labelrM_addedr_changedcsg|]}||fqSr<r<r)groupsr<r=rZr\Fr)rJrGnextz Next Pageprevz Previous PagerFz Page %(num)d)numcSsg|] }ttgd|qS)rclassrtitle)r`r)rPpr<r<r=rZCs   currentro) rrVrrr,headersrsrYrRticketsrjlast_group_is_partial paginator)'raitemsr#rrrrqrr r^get_ticket_field_labelsr"rscopyrwoperator itemgetterrrcrrfrxrJrrrGrl has_next_pagerrr-has_previous_page show_indexget_shown_pagesr shown_pages current_pagervrS) rBrVru orig_list orig_timerr,r~rarr:rrr'rrurtrrNrdrgrY groupsequencer group_keyrvr next_href prev_hrefpagedatarrGr<)rVrsrjrWrrBr= template_datas                  "     zQuery.template_data) NNNNrNrrNNNN)NNN)NNNN)NNNNNN)r8r9r:rrcompile clause_rer@rr classmethodrrrrrrrrrrr staticmethodrSrr<r<r<r=rC@s<  M  4 ! 1 ? ) rCc@seZdZeeeeeej Z e dddddZ e dddddZ e dd d d Zd d ZddZddZddZddZddZedZedZdgfddZddZd+d!d"Zd#d$Zd%d&Zd'd(Zd)d*ZdS),rjr default_queryzstatus!=closed&owner=$USERaThe default query for authenticated users. The query is either in [TracQuery#QueryLanguage query language] syntax, or a URL query string starting with `?` as used in `query:` [TracQuery#UsingTracLinks Trac links]. )defaultdocdefault_anonymous_queryzstatus!=closed&cc~=$USERaThe default query for anonymous users. The query is either in [TracQuery#QueryLanguage query language] syntax, or a URL query string starting with `?` as used in `query:` [TracQuery#UsingTracLinks Trac links]. rkdztNumber of tickets displayed per page in ticket queries, by default. Set to `0` to specify no limit. ccsHdtdddddfVdtdddd dfVd td d dd dfVdS)NrzRSS Feedxmltrac.ticket.Queryapplication/rss+xmlcsvzComma-delimited Texttext/csvtabzTab-delimited Texttsvtext/tab-separated-valuesrQrr<r<r=get_supported_conversionsvs    z%QueryModule.get_supported_conversionscCsJ|dkr |||S|dkr|j||ddS|dkr#|j||dddSdS)Nrrr)mimetyper r) _export_rss _export_csv)rBrrrrr<r<r=convert_content~s  zQueryModule.convert_contentcCsdS)Nrur<rBrr<r<r=get_active_navigation_itemz&QueryModule.get_active_navigation_itemccsNd||jvr#d|ddvr%ddtjtd|jdfVdSdSdS) N TICKET_VIEW REPORT_VIEWr{rmainnavruz View Tickets)r)r`realmrr?r"rrrr<r<r=get_navigation_itemss z QueryModule.get_navigation_itemscCs |jdkS)Nz/query) path_inforr<r<r= match_requests zQueryModule.match_requestc Cs||jd|jd}|r|d|d||}|j}|s|jr.|j}|j}n|j d}|j d}|j }|pB|pBd}|j d||dr^t|} t| }|j| d}n4t|j|} |d | j|d | j|d | j|d | j|d | j|d| j| j}|D]+} t| D]"\} } t| D]\}}|r|d|| |<q| dr| | =nqqq|!d }|rd|vr|"dd|!d}|j d}| d }|dur|dvrd}| d}| d }| d}t|j||||t#| d |t#| d t#| d||| } d|jvr8dD] }||j vr-|j |=q!|$| %|j&t'|j(dD]#}|j)}| j%|j&|d}|dkrWt*||}t+|d||j,|j-|q@|r}|dkrndnd}t'|jj.|d| ||d|/|| S)Nrr{remailrNz$QueryModule: Using default query: %sr)arg_listrrerfrgrJrdrDrUrrrh)rrrGr|update)query_constraints query_time query_ticketsr)rhr alternater)filename)0r`rrequirerr_get_constraintsis_authenticatedrrsessionrcrrrr#r'r&rCrr^rxrurerfrgrJrdrarrxrrendswithgetlistrrredirectrrr rrr2r-rN out_mimetypesend_converted display_html)rBr report_idrarqstringuserrrNrrr~rvalsirrurvrhrJrdrfrGvar conversionformat_conversion_hrefrr<r<r=process_requests                      zQueryModule.process_requestzrm_filter_\d+_(.+)_(\d+)$z add_(\d+)$Ncst|jt|j}ddDddid<fdd|Dg}|durQi}|jD],}|j|}|ra| d}|ddkrOd } nt | d } | ||d | d<q5d} i} |jD]}|j |}|ry| d} qit j|}|sqi| d }t | d } |vrqit|j|} | r|j|drfdd| D} |ddkr|j|d}|rddt| |D} ||vr||}d|krt| krnn| |=| sqinqi|||}| | i}||g| qi| durC|jd| |jd| }|rC|vrC| t | i}t |d}|r8|ddnd||g|ddt| D|i|p[|jD]!\}}|dkrl|iq\|vr||d |g|q\ttd|}|S)NcSsi|]}|d|qSrSr<rOr<r<r= rz0QueryModule._get_constraints..rLrUc3s |] \}}||fVqdSrr<)rPrr:rr<r=rsz/QueryModule._get_constraints..rEradiorr rr~_modecsg|]}|qSr<r<rrr<r=rZrTz0QueryModule._get_constraints..rM_endcSsg|] \}}|d|qS)r r<)rPr)r*r<r<r=rZ"sr add_filter_ add_clause_rrIcss|]}|dVqdS)rENr<rr<r<r=r7rr)r r^rrrbrrxr remove_rematchrfrmr*add_rerCrrrrcrrrxrrSrqrwrr)rBrrr}r,remove_constraintsrrrindexadd_numra clause_numrendsrr~rRrr<)rsrr=rs                 zQueryModule._get_constraintsc Csd}tt}|jdd}t|t}t|j}zB||jdks*||t ddkrB| |}||jd<d dd|D|jd <nd d |jd d  D}|j ||d }|}Wnt yy}zg}|jD]} t|| qgWYd}~nd}~wwt|d} |jdd} | rt|j| || ||||} || j|jd<t||jd<d dd|D|jd <td} td|j}d||vr|j| d<t|td|jt|td|j t|jd}|dur|j!d|fD] \} }|| d<|| d<qnd| d<| "dd| "dd| | d<|#| d<| d$d|%| d<dd | d!&D}t'||| d"d#t(|d$t)|j*|t+|d%d&| fS)'NrrrrE)hours cs|] }t|dVqdSrUNrCrPtr<r<r=rQrz+QueryModule.display_html..rcSrr<)rmrDr<r<r=rZTrTz,QueryModule.display_html..rI)rrrX query_hrefcsrrrCrr<r<r=rerz Custom Queryr{r report_hrefzAvailable ReportszNew Custom Queryzc SELECT title, description FROM report WHERE id=%s report_resourcerKrq all_columnsrU all_textareascs$i|]\}|fdddDqS)csi|] }|vr||qSr<r<rPrrr<r=rs z7QueryModule.display_html...)rLrUr\reoptionalrhr<)rPrNr<rr=rs   z,QueryModule.display_html..rsrR) propertiesrRcommon/css/report.csszcommon/js/query.jsz query.html),rrrrr fromtimestamprrarcrrr&rr>rAr1r3rsrr r^eventually_restrict_ownerrrrrr"r rUr`r{r,rrrxrrrrxr/r0r+ add_jquery_uir.)rBrrrrrrrurerrorrV owner_fielddatarqrrrKrr<r<r=rDs~                     zQueryModule.display_htmlr text/plaincs fdd}|d|fS)Nc 3sttjtjddddtjdfdd}dVttj  }|fd d |DVWdn1sDwYt j}t } }td d jD}|D]a}tj|d }d |vrg}|D]F} || } || } | dvr|||| } n(| jvrj| d} | rtt| | nd} n| r| ddkr| rdnd} || qx||VqcdS)Nzutf-8 T)encodingnewline write_through) delimiterquotingcs0tt|}dd|S)Nr)writerowrFrgetvaluetruncateseek)rrv)outwriterr<r=rs   z:QueryModule._export_csv..iterate..writerowsc3rrrr)rWr<r=rrz;QueryModule._export_csv..iterate..css|] }|d|fVqdS)rNNr<rOr<r<r=rrrUr)rrXrrhrIrLr1rE)ioBytesIOrr TextIOWrapper QUOTE_MINIMALrr r^ryrr+r3rr`rsr rr`rc format_emailschildrtrrrrq) rruchromerVrrsrrrrrrrhrrrBsep)rWrrr=iteratesX         z(QueryModule._export_csv..iteratez%s;charset=utf-8r<)rBrrrrrr<rr=rs,zQueryModule._export_csvcCsjt|ddd}||j}d|jvr|jd||}|||d}t|j|d|ddd}|dfS) NrT)absurlsrK)rVrrz query.rssr) content_typeiterable) r3rrrvrqrr+r^render_template)rBrrrVrrroutputr<r<r=rs    zQueryModule._export_rsscCsgSrr<rr<r<r=get_wiki_syntaxrzQueryModule.get_wiki_syntaxccsd|jfVdS)Nr) _format_linkrr<r<r=get_link_resolversszQueryModule.get_link_resolversc Cs|drt|}tj|d|j|dSzt|j|}tj|| |j jddWSt yJ}ztj t dt|dddWYd}~Sd}~ww) Nrr)class_r)rrz[Error: %(error)s])rrr)r#r!rr?rrrCrr^rrVr7emr"r)rB formatternsrrUrr<r<r=r s"   zQueryModule._format_link)rr) r8r9r: implementsr(r*r4r r rrrrrrkrrrrrrrrrrrrrrr rr r<r<r<r=rjXs>  Y Q M/ rjc@sDeZdZdZedZedZe j Z e ddZ ddZ dd Zd S) TicketQueryMacromessagesa Wiki macro listing tickets that match certain criteria. This macro accepts a comma-separated list of keyed parameters, in the form "key=value". If the key is the name of a field, the value must use the syntax of a filter specifier as defined in TracQuery#QueryLanguage. Note that this is ''not'' the same as the simplified URL syntax used for `query:` links starting with a `?` character. Commas (`,`) can be included in field values by escaping them with a backslash (`\`). Groups of field constraints to be OR-ed together can be separated by a literal `or` argument. In addition to filters, several other named parameters can be used to control how the results are presented. All of them are optional. The `format` parameter determines how the list of tickets is presented: - '''list''' -- the default presentation is to list the ticket ID next to the summary, with each ticket on a separate line. - '''compact''' -- the tickets are presented as a comma-separated list of ticket IDs. - '''count''' -- only the count of matching tickets is displayed - '''rawcount''' -- only the count of matching tickets is displayed, not even with a link to the corresponding query (//since 1.1.1//) - '''table''' -- a view similar to the custom query view (but without the controls) - '''progress''' -- a view similar to the milestone progress bars The `max` parameter can be used to limit the number of tickets shown (defaults to '''0''', i.e. no maximum). The `order` parameter sets the field used for ordering tickets (defaults to '''id'''). The `desc` parameter indicates whether the order of the tickets should be reversed (defaults to '''false'''). The `group` parameter sets the field used for grouping tickets (defaults to not being set). The `groupdesc` parameter indicates whether the natural display order of the groups should be reversed (defaults to '''false'''). The `verbose` parameter can be set to a true value in order to get the description for the listed tickets. For '''table''' format only. ''deprecated in favor of the `rows` parameter'' The `rows` parameter can be used to specify which field(s) should be viewed as a row, e.g. `rows=description|summary` The `col` parameter can be used to specify which fields should be viewed as columns. For '''table''' format only. For compatibility with Trac 0.10, if there's a last positional parameter given to the macro, it will be used to specify the `format`. Also, using "&" as a field separator still works (except for `order`) but is deprecated. z(?..N)r&rw)rPr<rr=rQs z.TicketQueryMacro.parse_args..)r_comma_splitterrrrrr*rrqrrrryrfr&) contentr,argvkwargsrrcrrrhrr<r<r= parse_args-s>         zTicketQueryMacro.parse_argsc s\j|\}rd7dfddtD7z tjWnty;}zt||d}~ww|dvrj }t dd| ddd}|d kr]t j ||d d St j|jj|d SzWnty}zt||d}~ww|d krjjjjd}tdtjd|S|dkr'ddlm} m} m} m} tdd5fdd tj} | j| jj}j}|s| |}||jfdd|j Ddd}t j!| d|ddSfdd}| j|||}j"r|#||t$d |d!d"}t j!| d#|d$dSfd%dDs=t j t$d&d'dSfd(d)fd*d+}|d,krjrnd-d|D}t |dd.d|d/dDSfd0dD}t j |dgd1d|d/dDRSjrt !fd2d|DSt !t j%fd3dDd4dS)6Nrc3rrr<r)rr<r=r\rz0TicketQueryMacro.expand_macro..)rrawcountz$%(num)s ticket matching %(criteria)sz%%(num)s tickets matching %(criteria)s, )criteriar  query_count)rqr)rrqtablerrzquery_results.htmlprogressr) RoadmapModuleapply_ticket_permissionsget_ticket_statsgrouped_stats_datazcommon/css/roadmap.csscsdfddD}tj|}i}|jr"|||j<d|_d|_dvr2d|d<|jD]}||q5|jsF|j || j j S)NrIc3s2|]}|dvr|D] }d||fVq qdS))rfrz&%s=%sNr<)rPrr: extra_argsr<r=rs zDTicketQueryMacro.expand_macro..query_href..rrfr) r&rCrr^rfrgrcrarrqrrVr)r, group_valueqrr)rrrBr+r=rs        z1TicketQueryMacro.expand_macro..query_hrefcsg|]}|dqSqry_argsr<rPintervalrr<r=rZr^z1TicketQueryMacro.expand_macro..T)stats stats_hrefinterval_hrefslegendzprogress_bar.htmlz trac-progressrcs6||jfdd|jDd|j|jfddS)Ncsg|] }|dqSr/r<r1) group_namerr<r=rZs zOTicketQueryMacro.expand_macro..per_group_stats_data..z%d / %dF)r4r5r6percentr7)r0 intervals done_countr)gstatr8r3)r8r=per_group_stats_datas  z;TicketQueryMacro.expand_macro..per_group_stats_dataz+Ticket completion status for each %(group)srf)rj grouped_byrzprogress_bar_grouped.htmlztrac-groupprogresscs&g|]}dj|dvr|qS)rrU)r`rrr[r<r=rZsz No resultsquery_no_resultscs6tjd|d|djt|dt|ddS)N#%srUrr)rrrq)rr?rrrmr )rr%r<r= ticket_anchors  z4TicketQueryMacro.expand_macro..ticket_anchorcsg}tfddD]G\}}tj}d|_|_|j}d|_td|j|d}|j D] }||t j<q0||_| j j }||dd|D||fq |S)Ncs |jSrr>)r)rr<r=s zFTicketQueryMacro.expand_macro..ticket_groups..z7%(groupvalue)s %(groupname)s tickets matching %(query)s) groupvalue groupnamercSsg|]}|qSr<r<rr<r<r=rZszHTicketQueryMacro.expand_macro..ticket_groups..)rrCrr^rfrgrdr"rrarrrVrrq)rjr:gr.rdrqrr)rrrrBrur<r= ticket_groupss   z4TicketQueryMacro.expand_macro..ticket_groupsrc Ss@g|]\}}}}|dtjdddd|D|d|dfqS)rrAu,​csrrrCrr<r<r=rrz;TicketQueryMacro.expand_macro...rrrrq)rr?r&rPr:rFrrqr<r<r=rZs cSg|]}d|fqSr!r<)rPrFr<r<r=rZrTrEcsg|]}|qSr<r<rPrrBr<r=rZrTcSrJrKr<)rPr?r<r<r=rZrTc sTg|]&\}}}}ttdtj||d|djdtjfdd|DddfqS)z%%(groupvalue)s %(groupname)s tickets:rrH)rDrEc(g|]}t|t|dfqSrrdtddrrMr<r=rZs  z.. wiki compactr)rrrr%r?rfdlrI)rrBr<r=rZs  crNrOrPrLrMr<r=rZs  rSr)&rrr&rwrCrr^r7r5rr$rrspanr?rrVrrr>rr0r+render_fragmenttrac.ticket.roadmapr'r(r)r*stats_providerrfr0r:divrgreverser"rT)rBrrNrrhrrrqrr'r(r)r*rrXbystatr=rjrGalistr<) rrrrrrrBrBrur= expand_macroVs                    (  zTicketQueryMacro.expand_macrocCs||\}}}|dvS)N)rrr )r)rBrrrrhr<r<r= is_inlineszTicketQueryMacro.is_inlineN)r8r9r:_domainr# _descriptionrrrr rrrr^r_r<r<r<r=rs > ( )r)Vrr itertoolsrr{mathrrrr trac.configrr trac.coretrac.dbr trac.mimeview.apir r trac.resourcer trac.ticket.apir rtrac.ticket.modelrrrWr trac.utilrrrtrac.util.datefmtrrrrrrrrtrac.util.htmlrtrac.util.presentationrtrac.util.textrr r!trac.util.translationr"r#r$r%trac.webr&r'r( trac.web.hrefr)trac.web.chromer*r+r,r-r.r/r0r1r2r3 trac.wiki.apir4trac.wiki.formatterr5trac.wiki.macrosr6r?r7r>objectrC Componentrjrr<r<r<r=sR     (   0