[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