[rt-commit] [svn] r499 - in rt/branches: . autrijus-3.1/html/Admin/Groups autrijus-3.1/html/Admin/Users autrijus-3.1/html/Download/Tabular autrijus-3.1/html/Elements autrijus-3.1/html/Search autrijus-3.1/html/Search/Elements autrijus-3.1/lib/RT autrijus-3.1/spec

autrijus at fsck.com autrijus at fsck.com
Mon Mar 8 14:32:23 EST 2004


Author: autrijus
Date: Mon Mar  8 14:32:22 2004
New Revision: 499

Added:
   rt/branches/autrijus-3.1/html/Search/Elements/SelectGroup
   rt/branches/autrijus-3.1/html/Search/Results.rdf
Modified:
   rt/branches/   (props changed)
   rt/branches/autrijus-3.1/html/Admin/Groups/index.html
   rt/branches/autrijus-3.1/html/Admin/Users/index.html
   rt/branches/autrijus-3.1/html/Download/Tabular/dhandler
   rt/branches/autrijus-3.1/html/Elements/EditCustomField
   rt/branches/autrijus-3.1/html/Elements/EditCustomFieldImage
   rt/branches/autrijus-3.1/html/Elements/EditCustomFieldText
   rt/branches/autrijus-3.1/html/Search/Edit.html
   rt/branches/autrijus-3.1/html/Search/Elements/BuildFormatString
   rt/branches/autrijus-3.1/html/Search/Elements/PickBasics
   rt/branches/autrijus-3.1/html/Search/Elements/SelectPersonType
   rt/branches/autrijus-3.1/html/Search/Results.html
   rt/branches/autrijus-3.1/lib/RT/CustomField_Overlay.pm
   rt/branches/autrijus-3.1/lib/RT/Record.pm
   rt/branches/autrijus-3.1/lib/RT/Tickets_Overlay.pm
   rt/branches/autrijus-3.1/spec/spec.txt
Log:
* Finished iterative editing of Binary/image/textarea CFs
* MultiValue TextArea CF is outlawed until we're sure what it means.
* s/txt/tsv/ to agree with /Search/.
* Merge /Search/ from trunk to work on ReqMembership search.
* Requestor-is-of-group ticket search finished.
* Generalised to cover all watcher types.
* Implemented new _WatcherMembershipLimit in Tickets_Overlay.pm to
  handle queries like "RequestGroup = 22".


Modified: rt/branches/autrijus-3.1/html/Admin/Groups/index.html
==============================================================================
--- rt/branches/autrijus-3.1/html/Admin/Groups/index.html	(original)
+++ rt/branches/autrijus-3.1/html/Admin/Groups/index.html	Mon Mar  8 14:32:22 2004
@@ -39,7 +39,7 @@
 %}
 </UL>
 %if (my $ids = join(',', @ids)) {
-<em>(<a href="/Download/Tabular/Group/<% $ids %>/groups.txt"><&|/l&>Download as a tab-delimited file</&></a>)</em><br>
+<em>(<a href="/Download/Tabular/Group/<% $ids %>/Groups.tsv"><&|/l&>Download as a tab-delimited file</&></a>)</em><br>
 %}
 
 <br><br>

Modified: rt/branches/autrijus-3.1/html/Admin/Users/index.html
==============================================================================
--- rt/branches/autrijus-3.1/html/Admin/Users/index.html	(original)
+++ rt/branches/autrijus-3.1/html/Admin/Users/index.html	Mon Mar  8 14:32:22 2004
@@ -41,7 +41,7 @@
 %}
 </UL>
 %if (my $ids = join(',', @ids)) {
-<em>(<a href="/Download/Tabular/User/<% $ids %>/users.txt"><&|/l&>Download as a tab-delimited file</&></a>)</em><br>
+<em>(<a href="/Download/Tabular/User/<% $ids %>/Users.tsv"><&|/l&>Download as a tab-delimited file</&></a>)</em><br>
 %}
 
 <br><br>

Modified: rt/branches/autrijus-3.1/html/Download/Tabular/dhandler
==============================================================================
--- rt/branches/autrijus-3.1/html/Download/Tabular/dhandler	(original)
+++ rt/branches/autrijus-3.1/html/Download/Tabular/dhandler	Mon Mar  8 14:32:22 2004
@@ -26,7 +26,7 @@
 my $arg = $m->dhandler_arg;                # get rest of path
 if ($arg =~ /^(\w+)\/([,\d]+)(?:\/([^\/]+))?/) {
     $class = "RT::$1";
-    $filename = $3 || lc("$1s.txt");
+    $filename = $3 || "$1s.tsv";
     @ids = sort split(/,+/, $2);
 }
 else {

Modified: rt/branches/autrijus-3.1/html/Elements/EditCustomField
==============================================================================
--- rt/branches/autrijus-3.1/html/Elements/EditCustomField	(original)
+++ rt/branches/autrijus-3.1/html/Elements/EditCustomField	Mon Mar  8 14:32:22 2004
@@ -70,7 +70,8 @@
 my $Type = $CustomField->Type;
 my $MaxValues = $CustomField->MaxValues;
 if ($MaxValues == 1 and $Object and $Values) {
-    $Default = ($Values->Count ? $Values->First->Content : '');
+    $Default = ($Values->First ? $Values->First->Content : '');
+    $Values->GotoFirstItem;
 }
 return $m->comp(
     "EditCustomField$Type",

Modified: rt/branches/autrijus-3.1/html/Elements/EditCustomFieldImage
==============================================================================
--- rt/branches/autrijus-3.1/html/Elements/EditCustomFieldImage	(original)
+++ rt/branches/autrijus-3.1/html/Elements/EditCustomFieldImage	Mon Mar  8 14:32:22 2004
@@ -21,9 +21,11 @@
 %# 
 %# 
 %# END LICENSE BLOCK
-% while (my $value = $Values->Next ) {
-%# XXX - let user download the file(s) here?
-<input type="checkbox" name="<%$NamePrefix%><%$CustomField->Id%>-DeleteValueIds" value="<% $value->Id %>"><a href="/Download/CustomFieldValue/<% $value->Id %>/<% $value->Content %>"><% $value->Content %></a><br>
+% while (my $value = $Values->Next) {
+%    my $url = "/Download/CustomFieldValue/".$value->Id.'/'.$value->Content;
+<input type="checkbox" name="<%$NamePrefix%><%$CustomField->Id%>-DeleteValueIds" value="<% $value->Id %>"><a href="<% $url %>"><% $value->Content %></a>
+<img type="<% $value->ContentType %>" height=64 src="<% $url %>" align="middle">
+<br>
 % }
 % if (!$MaxValues or $Values->Count < $MaxValues) {
 <input type="file" name="<%$NamePrefix%><%$CustomField->Id%>-Upload">

Modified: rt/branches/autrijus-3.1/html/Elements/EditCustomFieldText
==============================================================================
--- rt/branches/autrijus-3.1/html/Elements/EditCustomFieldText	(original)
+++ rt/branches/autrijus-3.1/html/Elements/EditCustomFieldText	Mon Mar  8 14:32:22 2004
@@ -28,6 +28,10 @@
 <input type="hidden" name="<%$NamePrefix%><%$CustomField->Id%>-Values-Magic" value="1">
 <textarea cols=<%$Cols%> rows=<%$Rows%> name="<%$NamePrefix%><%$CustomField->Id%>-Values"></textarea>
 % }
+<%INIT>
+# XXX - MultiValue textarea is for now outlawed.
+$MaxValues = 1;
+</%INIT>
 <%ARGS>
 $Object => undef
 $CustomField => undef

Modified: rt/branches/autrijus-3.1/html/Search/Edit.html
==============================================================================
--- rt/branches/autrijus-3.1/html/Search/Edit.html	(original)
+++ rt/branches/autrijus-3.1/html/Search/Edit.html	Mon Mar  8 14:32:22 2004
@@ -33,9 +33,10 @@
 
 <form method="post" action="Build.html">
 <input type="hidden" name="SearchId" value="<%$SearchId%>">
-<& /Elements/MessageBox, Name => "Query", Default => $Query, Width => '100%' &>
-
-<& /Elements/MessageBox, Name => "Format", Default => $Format, Width => '100%' &>
+<textarea name="Query" rows="8" cols="72"><%$Query%></textarea>
+<br>
+<textarea name="Format" rows="8" cols="72"><%$Format%></textarea>
+<br>
 <& /Elements/Submit, Label => loc("Apply"), Reset => 1, Caption => "Apply your changes"&>
 </form>
 

Modified: rt/branches/autrijus-3.1/html/Search/Elements/BuildFormatString
==============================================================================
--- rt/branches/autrijus-3.1/html/Search/Elements/BuildFormatString	(original)
+++ rt/branches/autrijus-3.1/html/Search/Elements/BuildFormatString	Mon Mar  8 14:32:22 2004
@@ -29,8 +29,8 @@
     "Starts",              "Started",
     "Created",             "LastUpdated",
     "Told",                "Due",
-    "Resolved",            "NEWLINE",
-    "-",
+    "Resolved",            "RequestorGroup",
+    "NEWLINE",             "-",
 );
 
 my ( @seen);

Modified: rt/branches/autrijus-3.1/html/Search/Elements/PickBasics
==============================================================================
--- rt/branches/autrijus-3.1/html/Search/Elements/PickBasics	(original)
+++ rt/branches/autrijus-3.1/html/Search/Elements/PickBasics	Mon Mar  8 14:32:22 2004
@@ -128,15 +128,26 @@
 <& /Elements/SelectMatch, Name => "WatcherOp" &>
 </td><td>
 <Input Name="ValueOfWatcher" Size=20>
+% } elsif ($field eq 'WatcherGroup') {
+<& SelectPersonType, Name => 'WatcherGroupField', Default => 'RequestorGroup', Suffix => 'Group' &>
+</td><td>
+<& /Elements/SelectBoolean, Name => "WatcherGroupOp", 
+					  True=> 'belongs to', 
+					  False=> 'does not belong to', 
+					  TrueVal=> '=', 
+					  FalseVal => '!='
+&>
+</td><td>
+<& SelectGroup, Name => 'ValueOfWatcherGroup' &>
 % } else {
-<&|/l&><%$field%></&>
+<% loc($field) %>
 <& /Elements/SelectMatch, Name => "$field" . "Op" &>
 <INPUT Name="<%"ValueOf" . $field%>" value=""SIZE=20>
 % }
 </td></tr>
 % }
 % } else {
-<&|/l&><%$field%></&>
+<% loc($field) %>
 </td><td>
 <& /Elements/SelectMatch, Name => "$field" . "Op" &>
 </td><td>
@@ -160,5 +171,6 @@
 
 my @people = ('Actor',
 	      'Watcher',
+	      'WatcherGroup',
 	      );
 </%INIT>

Added: rt/branches/autrijus-3.1/html/Search/Elements/SelectGroup
==============================================================================
--- (empty file)
+++ rt/branches/autrijus-3.1/html/Search/Elements/SelectGroup	Mon Mar  8 14:32:22 2004
@@ -0,0 +1,43 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse at bestpractical.com>
+%# 
+%# (Except where explictly superceded by other copyright notices)
+%# 
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%# 
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%# 
+%# Unless otherwise specified, all modifications, corrections or
+%# extensions to this work which alter its source code become the
+%# property of Best Practical Solutions, LLC when submitted for
+%# inclusion in the work.
+%# 
+%# 
+%# END LICENSE BLOCK
+<SELECT NAME="<%$Name%>">
+% if ($AllowNull) {
+<OPTION VALUE="">-</OPTION>
+% }
+%while (my $group = $groups->Next) {
+<OPTION VALUE="<%$group->id%>" <%$group->id eq $Default && "SELECTED"%>><%$group->Name%></OPTION>
+%}
+</SELECT>
+
+<%INIT>
+my $groups = new RT::Groups($session{'CurrentUser'});
+$groups->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => $Domain);
+
+</%INIT>
+<%ARGS>
+$AllowNull => 1
+$Default=>undef
+$Name => 'Group'
+$Domain => 'UserDefined';
+</%ARGS>

Modified: rt/branches/autrijus-3.1/html/Search/Elements/SelectPersonType
==============================================================================
--- rt/branches/autrijus-3.1/html/Search/Elements/SelectPersonType	(original)
+++ rt/branches/autrijus-3.1/html/Search/Elements/SelectPersonType	Mon Mar  8 14:32:22 2004
@@ -26,7 +26,7 @@
 <OPTION VALUE="">-</OPTION>
 % }
 %for my $option (@types) {
-<OPTION VALUE="<%$option%>" <%$option eq $Default && "SELECTED"%>><%loc($option)%></OPTION>
+<OPTION VALUE="<%"$option$Suffix"%>" <%"$option$Suffix" eq $Default && "SELECTED"%>><%loc($option)%></OPTION>
 %}
 </SELECT>
 
@@ -43,5 +43,6 @@
 $AllowNull => 1
 $Default=>undef
 $Scope => 'ticket'
+$Suffix => ''
 $Name => 'WatcherType'
 </%ARGS>

Modified: rt/branches/autrijus-3.1/html/Search/Results.html
==============================================================================
--- rt/branches/autrijus-3.1/html/Search/Results.html	(original)
+++ rt/branches/autrijus-3.1/html/Search/Results.html	Mon Mar  8 14:32:22 2004
@@ -43,7 +43,7 @@
 <div align=right>
 <a href="Bulk.html<%$QueryString%>"><&|/l&>Update all these tickets at once</&></a><br>
 <a href="Results.tsv<%$QueryString%>"><&|/l&>spreadsheet</&></a><br>
-<a href="Results.tsv<%$QueryString%>"><&|/l&>RSS</&></a><br>
+<a href="Results.rdf<%$QueryString%>"><&|/l&>RSS</&></a><br>
 </div>
 <%INIT>
 my ($title, $ticketcount);
@@ -63,7 +63,7 @@
 $tabformat =~ s/#/%23/g;
 $tabformat =~ s/&/%26/g;
 my $QueryString =
-"?Query=$Query&Format=$tabformat&Rows=$ARGS{'Rows'}&Page=<%$ARGS{'Page'}%>";
+"?Query=$Query&Format=$tabformat&Rows=".$ARGS{'Rows'}."&Page=".$ARGS{'Page'};
 
 </%INIT>
 <%CLEANUP>

Added: rt/branches/autrijus-3.1/html/Search/Results.rdf
==============================================================================
--- (empty file)
+++ rt/branches/autrijus-3.1/html/Search/Results.rdf	Mon Mar  8 14:32:22 2004
@@ -0,0 +1,40 @@
+<%INIT>
+
+my $Tickets = RT::Tickets->new($session{'CurrentUser'});
+$Tickets->FromSQL($ARGS{'Query'});
+    $r->content_type('xml/rss');
+
+
+
+        # create an RSS 1.0 file (http://purl.org/rss/1.0/)
+        use XML::RSS;
+        my $rss = new XML::RSS (version => '1.0');
+        $rss->channel(
+          title        => "$RT::rtname: Syndicated Search",
+          link         => $RT::WebURL,
+          description  => "",
+          dc => {
+          },
+          syn => {
+            updatePeriod     => "hourly",
+            updateFrequency  => "1",
+            updateBase       => "1901-01-01T00:00+00:00",
+          },
+        );
+
+
+    while ( my $Ticket = $Tickets->Next()) {
+       my $row;
+        $rss->add_item(
+          title       =>  $Ticket->Subject,
+          link        => $RT::WebURL."/Ticket/Display.html?id=".$Ticket->id,
+          description => $Ticket->Transactions->First->Content,
+          dc => {
+            subject  => $Ticket->Subject,
+            creator  => $Ticket->CreatorObj->RealName . "<".$Ticket->CreatorObj->EmailAddress.">",
+          },
+        );
+    }
+$m->out($rss->as_string);
+$m->abort();
+</%INIT>

Modified: rt/branches/autrijus-3.1/lib/RT/CustomField_Overlay.pm
==============================================================================
--- rt/branches/autrijus-3.1/lib/RT/CustomField_Overlay.pm	(original)
+++ rt/branches/autrijus-3.1/lib/RT/CustomField_Overlay.pm	Mon Mar  8 14:32:22 2004
@@ -685,7 +685,7 @@
 
 sub TypeComposites {
     my $self = shift;
-    return map { ("$_-1", "$_-0") } $self->Types;
+    return grep !/Text-0/, map { ("$_-1", "$_-0") } $self->Types;
 }
 
 sub LookupTypes {

Modified: rt/branches/autrijus-3.1/lib/RT/Record.pm
==============================================================================
--- rt/branches/autrijus-3.1/lib/RT/Record.pm	(original)
+++ rt/branches/autrijus-3.1/lib/RT/Record.pm	Mon Mar  8 14:32:22 2004
@@ -793,7 +793,7 @@
             Object  => $self,
             Content => $args{'Value'},
             LargeContent => $args{'LargeContent'},
-            ContentType => $args{'ContenType'},
+            ContentType => $args{'ContentType'},
         );
 
         unless ($new_value_id) {
@@ -840,7 +840,7 @@
             Object  => $self,
             Content => $args{'Value'},
             LargeContent => $args{'LargeContent'},
-            ContentType => $args{'ContenType'},
+            ContentType => $args{'ContentType'},
         );
 
         unless ($new_value_id) {

Modified: rt/branches/autrijus-3.1/lib/RT/Tickets_Overlay.pm
==============================================================================
--- rt/branches/autrijus-3.1/lib/RT/Tickets_Overlay.pm	(original)
+++ rt/branches/autrijus-3.1/lib/RT/Tickets_Overlay.pm	Mon Mar  8 14:32:22 2004
@@ -107,6 +107,10 @@
     LinkedTo	    => ['LINKFIELD',],
     CustomFieldValue =>['CUSTOMFIELD',],
     CF              => ['CUSTOMFIELD',],
+    RequestorGroup  => ['MEMBERSHIPFIELD' => 'Requestor',],
+    CCGroup         => ['MEMBERSHIPFIELD' => 'Cc',],
+    AdminCCGroup    => ['MEMBERSHIPFIELD' => 'AdminCc',],
+    WatcherGroup    => ['MEMBERSHIPFIELD',],
   );
 
 # Mapping of Field Type to Function
@@ -119,8 +123,9 @@
     TRANSFIELD	    => \&_TransLimit,
     TRANSDATE	    => \&_TransDateLimit,
     WATCHERFIELD    => \&_WatcherLimit,
+    MEMBERSHIPFIELD => \&_WatcherMembershipLimit,
     LINKFIELD	    => \&_LinkFieldLimit,
-    CUSTOMFIELD    => \&_CustomFieldLimit,
+    CUSTOMFIELD     => \&_CustomFieldLimit,
   );
 my %can_bundle =
   ( WATCHERFIELD => "yeps",
@@ -639,6 +644,112 @@
  $self->_CloseParen;
 
 }
+
+=head2 _WatcherMembershipLimit
+
+Handle watcher membership limits, i.e. whether the watcher belongs to a
+specific group or not.
+
+Meta Data:
+  1: Field to query on
+
+SELECT DISTINCT main.*
+FROM
+    Tickets main,
+    Groups Groups_1,
+    CachedGroupMembers CachedGroupMembers_2,
+    Users Users_3
+WHERE (
+    (main.EffectiveId = main.id)
+) AND (
+    (main.Status != 'deleted')
+) AND (
+    (main.Type = 'ticket')
+) AND (
+    (
+	(Users_3.EmailAddress = '22')
+	    AND
+	(Groups_1.Domain = 'RT::Ticket-Role')
+	    AND
+	(Groups_1.Type = 'RequestorGroup')
+    )
+) AND
+    Groups_1.Instance = main.id
+AND
+    Groups_1.id = CachedGroupMembers_2.GroupId
+AND
+    CachedGroupMembers_2.MemberId = Users_3.id
+ORDER BY main.id ASC
+LIMIT 25
+=cut
+
+sub _WatcherMembershipLimit {
+  my ($self,$field,$op,$value, at rest) = @_;
+  my %rest = @rest;
+
+  $self->_OpenParen;
+
+  my $groups	    = $self->NewAlias('Groups');
+  my $groupmembers  = $self->NewAlias('CachedGroupMembers');
+  my $users	    = $self->NewAlias('Users');
+  my $memberships   = $self->NewAlias('CachedGroupMembers');
+
+  if (ref $field) { # gross hack
+    my @bundle = @$field;
+    $self->_OpenParen;
+    for my $chunk (@bundle) {
+      ($field,$op,$value, at rest) = @$chunk;
+      $self->_SQLLimit(ALIAS => $memberships,
+   		   FIELD => 'GroupId',
+   		   VALUE           => $value,
+   		   OPERATOR        => $op,
+   		   @rest,
+   		  );
+    }
+    $self->_CloseParen;
+  } else {
+     $self->_SQLLimit(ALIAS => $memberships,
+   		   FIELD => 'GroupId',
+   		   VALUE           => $value,
+   		   OPERATOR        => $op,
+   		   @rest,
+   		  );
+  }
+
+  # {{{ Tie to groups for tickets we care about
+  $self->_SQLLimit(ALIAS => $groups,
+		   FIELD => 'Domain',
+		   VALUE => 'RT::Ticket-Role',
+		   ENTRYAGGREGATOR => 'AND');
+
+  $self->Join(ALIAS1 => $groups, FIELD1 => 'Instance',
+	      ALIAS2 => 'main',   FIELD2 => 'id');
+  # }}}
+
+  # If we care about which sort of watcher
+  my $meta = $FIELDS{$field};
+  my $type = ( defined $meta->[1] ? $meta->[1] : undef );
+
+  if ( $type ) {
+    $self->_SQLLimit(ALIAS => $groups,
+		     FIELD => 'Type',
+		     VALUE => $type,
+		     ENTRYAGGREGATOR => 'AND');
+  }
+
+  $self->Join (ALIAS1 => $groups,  FIELD1 => 'id',
+	       ALIAS2 => $groupmembers, FIELD2 => 'GroupId');
+
+  $self->Join( ALIAS1 => $groupmembers, FIELD1 => 'MemberId',
+	       ALIAS2 => $users, FIELD2 => 'id');
+
+  $self->Join( ALIAS1 => $memberships, FIELD1 => 'MemberId',
+	       ALIAS2 => $users, FIELD2 => 'id');
+
+ $self->_CloseParen;
+
+}
+
 
 sub _LinkFieldLimit {
   my $restriction;

Modified: rt/branches/autrijus-3.1/spec/spec.txt
==============================================================================
--- rt/branches/autrijus-3.1/spec/spec.txt	(original)
+++ rt/branches/autrijus-3.1/spec/spec.txt	Mon Mar  8 14:32:22 2004
@@ -1,8 +1,9 @@
+[Remaining TODOs]
 
-Finish iterative editing of Binary/image/textarea CFs
-Finish Txn display for User and Group (referentialise OldReference etc)
-ACL for per-CF editing (UI done, needs to verify API)
-Requestor-is-of-group ticket search
+Finish Txn display for User and Group
+    UI done, needs to referentialise OldReference etc.
+ACL for per-CF editing
+    UI done, needs to verify API
 
 ===================================================================================
     AdminThis ACL for CFs controls CF data and metadata, but _not_ where it applies



More information about the Rt-commit mailing list