urgent multi-draft fixes from amalfi
[stet:stet.git] / rtNoAuth / summarydecision.html
1 %# Copyright (C) 2005, 2006   Software Freedom Law Center, Inc.
2 %# Author: Orion Montoya <orion@mdcclv.com>
3 %#
4 %# This software gives you freedom; it is licensed to you under version
5 %# 3 of the GNU Affero General Public License, along with the
6 %# additional permission in the following paragraph.
7 %#
8 %# This notice constitutes a grant of such permission as is necessary
9 %# to combine or link this software, or a modified version of it, with
10 %# Request Tracker (RT), published by Jesse Vincent and Best Practical
11 %# Solutions, LLC, or a derivative work of RT, and to copy, modify, and
12 %# distribute the resulting work.  RT is licensed under version 2 of
13 %# the GNU General Public License.
14 %# 
15 %# This software is distributed WITHOUT ANY WARRANTY, without even the
16 %# implied warranties of MERCHANTABILITY and FITNESS FOR A PARTICULAR
17 %# PURPOSE.  See the GNU Affero General Public License for further
18 %# details.
19 %#  
20 %# You should have received a copy of the GNU Affero General Public
21 %# License, version 3, and the GNU General Public License, version 2,
22 %# along with this software.  If not, see <http://www.gnu.org/licenses/>.
23 %
24 % sub displayTicket($$$);
25 %
26 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
27 <html>
28 <head>
29 <title>read GPLv3 comments: <% humanQuery($ARGS{'Query'}) || $ARGS{'id'} %></title>
30 <link rel="stylesheet" type="text/css" href="/comments/stet.css" />
31 <script type="text/javascript" src="/comments/prototype.js"></script>
32 <script type="text/javascript">
33 function hideall(class) {
34 var sc = document.getElementsByClassName(class);
35 sc.length.times(function(n) {
36 Element.hide(sc[n]);
37 });
38
39 }
40 function showall(class) {
41 var sc = document.getElementsByClassName(class);
42 sc.length.times(function(n) {
43 Element.show(sc[n]);
44 });
45 }
46 function togExp(el) {
47 if (el.innerHTML.indexOf('collapse') != -1) {
48 el.innerHTML = "expand children";
49 el.setAttribute('onclick',"showall('child'); togExp(this); return false;");
50 }
51 else {
52 el.innerHTML = "collapse children";
53 el.setAttribute('onclick',"hideall('child'); togExp(this); return false;");
54 }
55 }
56 </script>
57 </head>
58 <body>
59 <div id="topbar" class="topbar">
60 <span id="statustext" class="statustext">
61 % if ($Tickets) {
62 Showing comments <% humanQuery($ARGS{'Query'}) |n %> <a class="rsslink" href="<% $rsslink %>">[rss]</a> <a href="/comments/<% stripCrap($Tickets->First->FirstCustomFieldValue('NoteUrl')) %>?Query=<% $ARGS{'Query'} %>">[see on license]</a> <br/> 
63 ( found <% $Tickets->CountAll()%>, showing newest <% $StartAt %>-<% (($StartAt + $Rows) > $Tickets->CountAll()) ? $Tickets->CountAll() : ($StartAt + $Rows - 1) %>:
64 %   if ($Tickets->CountAll() > $Rows) {
65 %       if ($StartAt > 1 ) {
66       <a href="/comments/rt/summarydecision.html?filename=<% $filename %>&Query=<% $ARGS{'Query'} |n %>&amp;Rows=<%$Rows%>&amp;StartAt=<% (($StartAt - $Rows) < 0) ? 1 : ($StartAt - $Rows) |n%>">prev <% $Rows %></a>
67 %       }
68 %   if (($Tickets->CountAll() > $Rows) && ($Tickets->CountAll() < $StartAt + $Rows)) {
69 |
70 %   }
71 %   if ($Tickets->CountAll() > $StartAt + $Rows) {
72          <a href="/comments/rt/summarydecision.html?filename=<% $filename %>&Query=<% $ARGS{'Query'} |n %>&amp;Rows=<%$Rows%>&amp;StartAt=<% $StartAt + $Rows %>">next <% $Rows %></a>
73 %   }
74 %}
75 )
76 <a href="/comments/rt/changeshown.html?came_from=rt/summarydecision.html&filename=<% $filename %>">search</a> 
77 <%perl> 
78     $Tickets->GotoFirstItem;
79     if ($StartAt > 1) {
80         for (my $i = 0; $i < $StartAt; $i++) {
81             $Tickets->Next;
82         }
83     }
84 </%perl>
85 % } elsif ($Ticket) {
86 Showing comment <a href="/comments/rt/summarydecision.html?filename=<% $filename %>&id=<% $ARGS{'id'} %>"><% $ARGS{'id'} %></a> <a class="rsslink" href="<% $rsslink %>">[rss]</a> <a href="/comments/<% stripCrap($Ticket->FirstCustomFieldValue('NoteUrl')) %>?id=<% $ARGS{'id'} %>#<% $ARGS{'id'} %>">[see on license]</a> <a href="/comments/rt/changeshown.html?came_from=<% stripCrap($Ticket->FirstCustomFieldValue('NoteUrl')) %>">search</a>
87 % }
88 % if ($name) {
89 </span><span id="login" class="login">you are <% $name %>: <a href="http://gplv3.fsf.org/logout">logout</a></span></div>
90 % } else {
91 </span><span id="login" class="login">you could <a href="http://gplv3.fsf.org/login_form?came_from=/comments/rt/summarydecision.html?filename=<% $filename %>&<% $Tickets ? 'Query='.$ARGS{'Query'} : 'id='.$ARGS{'id'} %>&filename=<% $filename %>">login</a></span></div>
92 % }
93 <& header.html, name => $name &>
94 <div id="readsaymain">
95 <span id="listactions">
96 <& Elements/ListActions, actions => \@results &>
97 </span>
98 %
99 % while (my $item = $Tickets ? $Tickets->Next : $Ticket) {
100 % my $showactions = $Tickets ? 0 : 1;
101 <% displayTicket(\$item,$showactions,0) %>
102 % $Ticket = '';
103 % $rc++;
104 % if ($rc == (($StartAt + $Rows) - 1)) {
105 %    $Tickets = '';
106 % } 
107 % }
108 <!-- <div id="bottombar"><a href="stet-latest.tar.gz">get the latest source code for this comment system</a></div> -->
109 %
110 % sub displayTicket($$$) {
111 % my $itemref = shift;
112 % my $item = $$itemref;
113 % my $showactions = shift;
114 % my $deletelink = shift;
115 % if (!$deletelink) {
116 %  if ($resp == 1) {
117     <form action="summarydecision.html" method="POST" name="TicketUpdate" enctype="multipart/form-data">
118 <input type="hidden" name="filename" value="<% $filename %>">
119        <input type="hidden" name="id" value="<% $item->id %>">
120 %  }
121 % }
122
123 % if ($item->QueueObj->CurrentUserHasRight('SeeQueue')) {
124  <div class="onecomment<% ($item->QueueObj->Name =~ /Drafter/) && " Drafter" %><% $deletelink && " child\" id=\"child".$item->id |n %>">
125   <h4><% ($item->QueueObj->Name =~ /Drafter/) && " Drafter's " %><% thingType(\$item) %> <a href="summarydecision.html?filename=<% $filename %>&id=<% $item->id %>"><% $item->id %>: <% $item->Subject %></a>
126 %  if ($item->Queue == $fsfqueue) {
127 <div class="admin">This issue has been escalated to the Drafters <!-- by fixme --> </div>
128 %  }
129 %      if (($HasIssueRights) && ($showactions) && ($deletelink)) {
130             <span class="TktInput">[dissociate: <INPUT TYPE=CHECKBOX NAME="<% $deletelink %>" value="1">]</span>
131 %      }
132 </h4>
133
134 %  if (($item->QueueObj->Name =~ /Resolution/) && (($HasIssueRights) && ($showactions) && (!$deletelink))) {
135 <br/>
136   <span class="TktLabel">This Ticket Resolves:</span><br/>
137         <span class="TktInput indent">add new: <INPUT NAME="MemberOf-<% $item->id %>"> <span class="inputcaption">[comment id numbers, space separated]</span></span>
138 %  }
139     <span class="TktLabel">This <% thingType(\$item) %> is resolved by:</span><br/>
140 %   while (my $link = $item->MemberOf->Next) {
141 #<& Elements/ShowLink, URI => $link->TargetURI, StetId => $link->id  &>
142 % if ($HasIssueRights) {
143            <span class="TktInput">[dissociate from parent: <INPUT TYPE=CHECKBOX NAME="DeleteLink--<% $link->Type %>-<% $link->Target %>" value="1">]</span>
144 % }
145 <br/>
146 %    }
147 <br/>
148 % if (($showactions) & (!$deletelink)){
149 <br/>
150 %  if ($HasIssueRights) {
151        <span class="TktInput indent">add new resolvers: <% pickResolvs(\$item) |n%> <span class="inputcaption">[comment id numbers, space separated]</span></span>
152 %  }
153     <br/>
154 %    }
155
156 % if (!$deletelink) {
157 %#   while (my $link = $item->DependsOn->Next) {
158 %#    <span class="formHelpIsh">This <% thingType(\$item) %> is part of the discussion  on:<br/> #<& Elements/ShowLink, URI => $link->TargetURI, StetId => $link->id  &></span><span class="TktInput">
159 %#   while (my $link = $item->DependsOn->Next) {
160     <span class="formHelpIsh">This <% thingType(\$item) %> is part of the discussion  on:<br/> <% listAncestry(\$item,0) |n%></span><span class="TktInput">
161 %
162 %#     if ($HasIssueRights == 1) {
163 %#         <span class="TktInput">[dissociate from parent: <INPUT TYPE=CHECKBOX NAME="DeleteLink--<% $link->Type %>-<% $link->Target %>" value="1">]</span>
164 % #     }
165 %#       <br/>
166 %# }
167
168 %   }
169 <br/>
170   <span class="formHelpIsh">Regarding the text:</span> <span class="ontextText"><q><% $scrubber->scrub($item->FirstCustomFieldValue('NoteSelection')) %></q></span><br/>
171     <span class="formHelpIsh">In section: <span class="nodeLink"><a href="/comments/rt/summarydecision.html?filename=<% $filename %>&Query=%20'CF.NoteStartNodeId'%20LIKE%20'<% $scrubber->scrub($item->FirstCustomFieldValue('NoteStartNodeId')) %>'%20AND%20'CF.NoteUrl'%20LIKE%20'<%stripCrap($item->FirstCustomFieldValue('NoteUrl'))%>'%20"><% $scrubber->scrub($item->FirstCustomFieldValue('NoteStartNodeId')) %></a></span></span><br/>
172 %#    In section: <span class="nodeLink"><a href="/comments/<%stripCrap($item->FirstCustomFieldValue('NoteUrl'))%>?Query=%20'CF.NoteStartNodeId'%20LIKE%20'<% $scrubber->scrub($item->FirstCustomFieldValue('NoteStartNodeId')) %>'%20AND%20'CF.NoteUrl'%20LIKE%20'<%stripCrap($item->FirstCustomFieldValue('NoteUrl'))%>'%20"><% $scrubber->scrub($item->FirstCustomFieldValue('NoteStartNodeId')) %></a></span><br/>
173   <span class="formHelpIsh">Submitted by: <% userlink(\$item, \$item) |n%> <span class="date">on <% doDate(\$item) %></span></span><br/>
174 <% listAgree(\$item) %>
175 %# my ($agrees,$agr_count) = showAgree(\$item);
176 %# print STDERR "agree is $agree\n";
177 %#  <% $agree |n %><br/>
178 %#  <span class="agreecount"><% $agr_count %> agree</span></span><br/>
179 %#  comments:<br/> 
180 <br/>
181 <% getThread(\$item) |n %>
182 <br/><strong><a href="#" onclick="hideall('child'); togExp(this); return false;">collapse children</a></strong><br> 
183
184 %   if ($item->DependedOnBy->GotoFirstItem) {
185         <em>this <% thingType(\$item) %> does not have any children </em><br/>
186 %   }
187 <br/>
188 %   while (my $link = $item->DependedOnBy->Next) {
189     <span class="TktLabel">Child comment of <% $item->id %>: <a href="#" onclick="javascript:Element.toggle(document.getElementById('child<% $link->BaseURI->Object->id %>'));return false;"><% $link->BaseURI->Object->id %>: <% $link->BaseURI->Object->Subject %> &plusmn;</a></span><br/>
190 %    my $child = RT::Ticket->new($CurrentUser);
191 %    $child->Load($link->BaseURI->Object->id);
192 % my $deletelink = "DeleteLink-". $link->Base ."-". $link->Type."-";
193 <% displayTicket(\$child,$showactions,$deletelink) %>
194 %   }
195 <br/>
196 %  if (($HasIssueRights) && ($showactions) && (!$deletelink)) {
197 <br/>
198   <span class="TktLabel">Children:</span><br/>
199         <span class="TktInput indent">add new: <INPUT NAME="DependsOn-<% $item->id %>"> <span class="inputcaption">[comment id numbers, space separated]</span></span>
200 %  }
201 % if (($showactions) & (!$deletelink)){
202 <br/>
203 %  if ($HasIssueRights) {
204     <span class="TktLabel">Parents:</span><br/>
205        <span class="TktInput indent">add new: <INPUT NAME="<% $item->id %>-DependsOn"> <span class="inputcaption">[comment id numbers, space separated]</span></span>
206 %  }
207     <br/>
208     <span class="TktLabel">Links:</span>
209 %   if ($item->RefersTo->GotoFirstItem) {
210         <em>this <% thingType(\$item) %> does not link to any external resources</em>
211 %   }
212  <br/>
213 %   while (my $link = $item->RefersTo->Next) {
214         <A HREF="<% $link->Target %>"><% $link->Target %></A>
215 %       if ($HasIssueRights) {
216             <span class="TktInput">[delete: <INPUT TYPE=CHECKBOX NAME="DeleteLink--<% $link->Base %>-<% $link->Type %>" value="1">]</span>
217 %           }
218  <br/>
219 %   }
220 %
221 %  if ($HasIssueRights) {
222         <span class="TktInput indent">link to external item(s): <INPUT NAME="<% $item->id %>-RefersTo"> <span class="inputcaption">[URIs with protocol://, space separated]</span></span><br/>
223 %  }
224
225 %     my $DiscussGrpObj = RT::CustomField->new($CurrentUser);
226 %     $DiscussGrpObj->Load(8);
227 %     our $Values  = $item->CustomFieldValues($DiscussGrpObj->id);
228 %     our $GroupNames = $DiscussGrpObj->Values();
229  <br>
230     <span class="TktLabel">Current Committees:</span>
231 % while (my $Committee = $GroupNames->Next) {
232     <% $Values->HasEntry($Committee->Name) && $Committee->Name %>
233 %    }
234  <br>
235 %####  customfield picker doesn't show which groups are related
236 %  if ($HasIssueRights) {
237 %  my $groupRows = 7;
238  <span class="groupselect"><span class="TktLabel select">Change Committees:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
239  <br>
240       <input type="hidden" name="Ticket-<% $item->id %>-CustomField-<%$DiscussGrpObj->Id%>-Values-Magic" value="1">
241       <span class="TktInput indent"><select name="Ticket-<% $item->id %>-CustomField-<%$DiscussGrpObj->Id%>-Values"
242         size="<%$groupRows%>"
243         <%$DiscussGrpObj->Type eq 'SelectMultiple' && 'MULTIPLE'%>>
244 %       my $CustomFieldValues = $DiscussGrpObj->Values();
245 %       my $selected;
246 %       while (my $value = $CustomFieldValues->Next) {
247         <option value="<%$value->Name%>"
248 %       if ($item) {
249             <% $Values->HasEntry($value->Name) && ($selected = 1) && 'SELECTED' %>
250 %       } 
251             ><% $value->Name%></option>
252 %           }
253         <option value="" <% !$selected && 'SELECTED' %>><&|/l&>(no value)</&></option>
254       </select><br/></span>
255 %
256 %  if (($HasIssueRights) && ($item->Queue != ($issuequeue || $fsfqueue ))) {
257        <input type="checkbox" value="1" name="MakeIssue"/><span class="TktLabel"> Upgrade this Comment to an Issue</span><br/>
258
259 %  }
260 %  if (($HasIssueRights) && ($item->Queue == ($issuequeue || $fsfqueue))) {
261 <div class="admin box">
262        <input type="radio" value="Escalated" name="ChangeQueue"/><span class="TktLabel"> Escalate this for FSF review (intentionally hard to undo)</span><br/>
263     <input type="radio" value="Inbox" name="ChangeQueue"/><span class="TktLabel"> Downgrade this Issue to a Comment</span></div>
264 %  }
265 % if ($item->OwnerObj->Name =~ "Nobody") {
266  <input type="checkbox" name="Take" value="Take"> <span class="TktLabel">Take personal ownership of this ticket</span><br/>
267 % }
268 % } 
269 % if ($item->OwnerObj->Name !~ "Nobody") {
270     <span class="TktLabel">This ticket is owned by</span> <% $item->OwnerObj->Name eq $name ? "<em>you</em>" : $item->OwnerObj->Name |n %>
271 %# of Committee <% $item->OwnerObj->Organization %>
272 % if (($HasIssueRights) && ($item->OwnerObj->Name != $name)) {
273             <input type="checkbox" name="Steal" value="Steal"> steal
274 % } 
275 % elsif (($HasIssueRights) && ($item->OwnerObj->Name =~ $name)) {
276         <input type="checkbox" name="Untake" value="Untake"> disown
277 % }
278 % }
279  <br>
280 %  if ($resp == 1) {
281         <input type=hidden name="UpdateType" value="public">
282         <span class="TktLabel">Add comments:</span> <br/>
283         <textarea class="messagebox" COLS=72 ROWS=15 WRAP=HARD NAME="UpdateContent" onfocus="if(this.value=='Enter additional comments here') {this.value='';}" onblur="if(this.value==''){this.value='Enter additional comments here';}"></textarea><br/>
284 %      if ($HasIssueRights) {
285              <INPUT TYPE=SUBMIT NAME="SubmitTicket" VALUE="Make changes"></form>
286 %      } else {
287            <INPUT TYPE=SUBMIT NAME="SubmitTicket" VALUE="Add comment"></form>
288 %      }
289 %  } # should close "if $resp == 1" after picker
290 % }
291  </div>
292 % }
293 % else {
294 <div class="onecomment formHelpIsh">You do not have permission to view comment number <% $item->id %><br/> <br/></div>
295
296 % }
297 % return '';
298 % }
299 </body>
300 </html>
301 <%INIT>
302 use CGI qw/:standard/;
303 use HTML::Scrubber;
304 our $scrubber = HTML::Scrubber->new( allow => [ qw[ a b i u br ] ] );
305 require "/var/www/stet/stetsubs.pl";
306 our $issuequeue = 5; 
307 our $fsfqueue = 6;
308 my $rc = 0;
309 our ($name, $resp, $CurrentUser, $HasIssueRights);
310 my ($pass, $agr_vals, $thing);
311 ($CurrentUser, $resp, $name) = getUser("foo");
312 $CurrentUser = $session{'CurrentUser'};
313
314 my $rsslink = "/comments/rt/rssresults.rdf?id=".$ARGS{'id'}."&Query=".$ARGS{'Query'};
315
316 my ($Tickets, $Ticket, @results, @msgresults, @linkresults, @cfresults);
317
318
319 if ($ARGS{'Query'}) {
320     $Tickets = RT::Tickets->new($CurrentUser);
321     $Tickets->FromSQL($ARGS{'Query'});
322     $Tickets->OrderBy( FIELD => 'id', ORDER => $ARGS{'Order'});
323 }
324 elsif ($ARGS{'id'}) {
325     $Ticket = RT::Ticket->new($CurrentUser);
326     $Ticket = LoadTicket($ARGS{'id'});
327     if ($ARGS{'SubmitTicket'}) {
328         ProcessUpdateMessage(TicketObj => $Ticket, ARGSRef=>\%ARGS, Actions=>\@msgresults);
329         @linkresults = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS);
330         @cfresults = ProcessTicketCustomFieldUpdates(TicketObj => $Ticket, ARGSRef => \%ARGS);
331         $ARGS{'Take'} && ($Ticket->Take()); # && print STDERR $CurrentUser->Name." taking ticket ".$Ticket->id."\n");
332         $ARGS{'Steal'} && ($Ticket->Steal()); # && print STDERR $CurrentUser->Name." stealing ticket ".$Ticket->id."\n");
333         $ARGS{'Untake'} && ($Ticket->Untake()); # && print STDERR $CurrentUser->Name." untaking ticket ".$Ticket->id."\n");
334    }
335     if ($ARGS{'MakeIssue'}) {
336         $Ticket->SetQueue($issuequeue);
337     }
338     if ($ARGS{'ChangeQueue'}) {
339         $Ticket->SetQueue($ARGS{'ChangeQueue'});
340     }
341
342     foreach my $result (@msgresults,@linkresults,@cfresults) {
343         push @results,$result;
344     }
345 }
346
347 my $NewQueueObj = RT::Queue->new( $CurrentUser );
348 $NewQueueObj->Load($issuequeue); 
349
350 if (
351     (
352         $CurrentUser->HasRight(
353             Right    => 'CreateTicket',
354             Object => $NewQueueObj
355         )
356       )
357 )
358     {
359         $HasIssueRights = 1;
360     }
361 else {$HasIssueRights = '';}
362
363 sub thingType($) {
364     my $itemref = shift;
365     my $item = $$itemref;
366 if ($item->Queue == 5) {
367     return "Issue";
368 }
369 elsif ($item->Queue == 6) {
370     return "Escalated Issue";
371 }
372 else {
373     return "Comment";
374 }
375 }
376
377
378
379 sub getThread($) {
380
381     my $itemref = shift;
382     my $item = $$itemref;
383     my $Transactions = $item->Transactions;
384     my $allcomments = '';
385     my $scrubber = HTML::Scrubber->new( allow => [ qw[ a b i u br ] ] );
386     while (my $Transaction = $Transactions->Next) {
387         
388         if ($Transaction->Type =~ /^(Create|Correspond|Comment$)/) {
389             
390             my $attachments = $Transaction->Attachments;
391 #    my $CustomFields = $item->QueueObj->TicketCustomFields();
392             my $CustomFields = $item->QueueObj->CustomFields();
393             $attachments->GotoFirstItem;
394             while (my $message = $attachments->Next) {
395 #                        $allcomments .= $Transaction->Content;
396                 my ($subj, $cont) = ('');
397                 if ($message->Subject != '') {
398                     $subj = $scrubber->scrub($message->Subject);
399                 }
400                 #$cont = sprintf("%s",$message->Content);
401                 #        if ($message->Content != '') {
402                 $cont = $scrubber->scrub($message->Content);
403                 if ($cont =~ s/(\S)\n\n(\S)/$1<\/p><p>\n$2/gs) {
404                 $cont = "<p>$cont</p>";
405             }
406                 $cont =~ s/&(?!amp;)/&amp;/g;
407                 #        }
408 #                        if ($cont = $message->Content) {
409 #                            $cont = $scrubber->scrub($cont);
410 #                        }
411                 
412                 $allcomments .= "<span class=\"formHelpIsh\">noted by ". userlink(\$item,\$message) ." <span class=\"date\">on ".doDate(\$message).":</span></span></span>\n";          
413                 $allcomments .= "<blockquote><h4>$subj</h4>\n".$cont."</blockquote>\n";
414
415 #           $allcomments .= "</blockquote>";
416             }
417         }
418             else {
419                 unless (($Transaction->CreatorObj->Name =~ "RT_System") || ($Transaction->BriefDescription =~ "NoteText|NoteSelection|NodeId|Agreeer")) {
420                
421                     $allcomments .= "<div class=\"formHelpIsh\">".$Transaction->BriefDescription." by ".userlink(\$item,\$Transaction)." <span class=\"date\">on ".doDate(\$Transaction)."</span></div>\n";
422                 }
423             }
424
425         }
426       
427             return $allcomments;
428         
429     }
430
431 sub userlink($$) {
432     my $itemref = shift;
433     my $item = $$itemref;
434     my $msgref = shift;
435     my $message = $$msgref;
436     return "<span class=\"userlink\"><a href=\"/comments/".$item->FirstCustomFieldValue('NoteUrl')."?Query=%20Requestor.Name%20LIKE%20'".$message->CreatorObj->Name."'%20AND%20'CF.NoteUrl'%20LIKE%20'".$item->FirstCustomFieldValue('NoteUrl')."'%20\">".$message->CreatorObj->Name."</a>". longOrg($message->CreatorObj)."</span>";
437 }
438
439 sub doDate($) {
440     my $itemref = shift;
441     my $item = $$itemref;
442     $item->Created =~ m/(\d\d\d\d-\d\d-\d\d) (\d\d:\d\d):\d\d/;
443     return  "$1 at $2 ". getTZ($item->Created);
444 }
445
446 sub getTZ($) {  # RT doesn't store dates with timezones.  
447 # this implementation is somehow wrong, though...
448 my $date = shift;
449 $date =~ s/\d\d\d\d-(\d\d)-\d\d.*/$1/;
450 my $eastern = "EST";
451 if ($date > 3) {  # after the end of March...
452     $eastern = "EDT";
453 }
454 if ($date > 10) {  # after the end of October...
455     $eastern = "EST";
456 }
457
458 return $eastern;
459 }
460
461 sub listAgree($) {
462     my $item = shift;
463     my $agr_vals;
464     my $showagree = ''; 
465     $agr_vals = $$item->CustomFieldValues(7);
466     while (my $value = $agr_vals->Next) {
467         $showagree .= $value->Content.", ";
468     }
469     $showagree =~ s/\n,/,/g;
470     $showagree =~ s/, $//g;
471     return $agr_vals->Count. " agree: ".$showagree;
472 }
473
474 sub listAncestry($$) {
475 my $itemref = shift;
476 my $item = $$itemref;
477 my $depth = shift;
478     my $returnlist = '';
479     while (my $parent = $item->DependsOn->Next) {
480         if ($parent->TargetURI->IsLocal) {
481             my $ptkt = RT::Ticket->new($CurrentUser);
482             $ptkt->Load($parent->TargetObj->id);
483             $depth++;
484             my $fn = stripCrap($item->FirstCustomFieldValue('NoteUrl'));
485             $returnlist = ("&nbsp;" x $depth ). thingType(\$ptkt). "#<a href=\"/comments/rt/summarydecision.html?filename=<% $fn %>&id=".$ptkt->id."\">".$ptkt->id."  ".$ptkt->Subject."</a><br/>\n";
486
487             $returnlist = listAncestry(\$ptkt,$depth) . $returnlist;
488         }
489         $depth--;
490     }
491
492 return $returnlist;
493 }
494
495 sub pickResolvs($) {
496     my $itemref = shift;
497     my $item = $$itemref;
498
499     my $Tickets = RT::Tickets->new($CurrentUser);
500     $Tickets->FromSQL("Queue = 'Resolution' ");
501     $Tickets->OrderBy( FIELD => 'id', ORDER => 'DESC');
502     my $returnme .= "<select name=\"".$item->id."-MemberOf\">";
503     $returnme .= "<option value=\"\">Pick resolving tickets</option>";
504     while (my $Ticket = $Tickets->Next) {
505         $returnme .= "<option value=\"".$Ticket->id."\">#".$Ticket->id.": ".$Ticket->Subject."</option>";
506     }
507     $returnme .="</select>
508 ";
509     return $returnme;
510 }
511
512 </%INIT>
513 <%ARGS>
514 $Rows => 30
515 $StartAt => 1
516 $Order => 'DESC'
517 $Query => "'CF.NoteUrl' LIKE 'gplv3-draft-1'"
518 $filename => 'gplv3-draft-1'
519 $Take => undef
520 $Steal => undef
521 $Untake => undef
522 </%ARGS>