[Rt-commit] rt 01/03: Support HasUnreadMessages and HasNoUnreadMessages criteria for ticket search
sunnavy
sunnavy at bestpractical.com
Mon Aug 9 19:18:01 UTC 2021
This is an automated email from the git hooks/post-receive script.
sunnavy pushed a commit to branch 4.4/ticket-search-unread-messages
in repository rt.
commit e095d322cec6210feae0ce68ee34640df40ddc65
Author: sunnavy <sunnavy at bestpractical.com>
AuthorDate: Wed Jul 28 01:55:47 2021 +0800
Support HasUnreadMessages and HasNoUnreadMessages criteria for ticket search
---
lib/RT/Tickets.pm | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 141 insertions(+)
diff --git a/lib/RT/Tickets.pm b/lib/RT/Tickets.pm
index 348f66ea9a..6c46e15f5a 100644
--- a/lib/RT/Tickets.pm
+++ b/lib/RT/Tickets.pm
@@ -167,6 +167,8 @@ our %FIELD_METADATA = (
WatcherGroup => [ 'MEMBERSHIPFIELD', ], #loc_left_pair
HasAttribute => [ 'HASATTRIBUTE', 1 ],
HasNoAttribute => [ 'HASATTRIBUTE', 0 ],
+ HasUnreadMessages => [ 'HASUNREADMESSAGES', 1 ],
+ HasNoUnreadMessages => [ 'HASUNREADMESSAGES', 0 ],
);
# Lower Case version of FIELDS, for case insensitivity
@@ -197,6 +199,7 @@ our %dispatch = (
CUSTOMFIELD => \&_CustomFieldLimit,
HASATTRIBUTE => \&_HasAttributeLimit,
LIFECYCLE => \&_LifecycleLimit,
+ HASUNREADMESSAGES => \&_HasUnreadMessagesLimit,
);
# Default EntryAggregator per type
@@ -1432,6 +1435,144 @@ sub _HasAttributeLimit {
);
}
+sub _HasUnreadMessagesLimit {
+ my ( $orig_self, $field, $op, $value, %rest ) = @_;
+
+ my $self;
+ if ( $FIELD_METADATA{$field}->[1] ) {
+ $self = $orig_self;
+ }
+ else {
+ $self = $orig_self->Clone;
+ }
+
+ my $alias = $self->Join(
+ TYPE => 'LEFT',
+ ALIAS1 => 'main',
+ FIELD1 => 'id',
+ TABLE2 => 'Attributes',
+ FIELD2 => 'ObjectId',
+ );
+ $self->Limit(
+ LEFTJOIN => $alias,
+ FIELD => 'ObjectType',
+ VALUE => 'RT::Ticket',
+ ENTRYAGGREGATOR => 'AND',
+ );
+
+ my $db_type = RT->Config->Get('DatabaseType');
+ my $quote_value;
+ my $attr_name;
+ if ( $value =~ /\D/ ) {
+ if ( $value =~ /^(?:main\.)?Owner$/i ) {
+ if ( $db_type =~ /Oracle|SQLite/ ) {
+ $attr_name = "'User-' || main.Owner || '-SeenUpTo'";
+ }
+ else {
+ $attr_name = "CONCAT('User-', main.Owner, '-SeenUpTo')";
+ }
+ $value = 'main.Owner';
+ $quote_value = 0;
+ }
+ else {
+ my $user = RT::User->new( $self->CurrentUser );
+ $user->Load($value);
+ $value = $user->Id || 0;
+ }
+ }
+
+ if ( $value =~ /^\d+$/ ) {
+ $attr_name = "User-$value-SeenUpTo";
+ $quote_value = 1;
+ }
+
+ $self->Limit(
+ LEFTJOIN => $alias,
+ FIELD => 'Name',
+ OPERATOR => $op,
+ VALUE => $attr_name,
+ QUOTEVALUE => $quote_value,
+ ENTRYAGGREGATOR => 'AND',
+ );
+
+ my $ticket_alias = $self->Join(
+ ALIAS1 => 'main',
+ FIELD1 => 'id',
+ TABLE2 => 'Tickets',
+ FIELD2 => 'EffectiveId',
+ );
+ my $txn_alias = $self->Join(
+ ALIAS1 => $ticket_alias,
+ FIELD1 => 'id',
+ TABLE2 => 'Transactions',
+ FIELD2 => 'ObjectId',
+ );
+ $self->Limit(
+ LEFTJOIN => $txn_alias,
+ FIELD => 'ObjectType',
+ VALUE => 'RT::Ticket',
+ ENTRYAGGREGATOR => 'AND',
+ );
+ $self->Limit(
+ LEFTJOIN => $txn_alias,
+ FIELD => 'Type',
+ VALUE => [ 'Create', 'Correspond', 'Comment' ],
+ OPERATOR => 'IN',
+ ENTRYAGGREGATOR => 'AND',
+ );
+ $self->Limit(
+ LEFTJOIN => $txn_alias,
+ FIELD => 'Creator',
+ VALUE => $value,
+ OPERATOR => '!=',
+ QUOTEVALUE => $quote_value,
+ );
+
+ my $function;
+ if ( $db_type eq 'Pg' ) {
+ $function = "CAST($txn_alias.Created AS TEXT)";
+ }
+ elsif ( $db_type eq 'Oracle' ) {
+ $function = "TO_CHAR($txn_alias.Created, 'YYYY-MM-DD HH24:MI:SS')";
+ }
+
+ $self->_OpenParen();
+
+ # Has no SeenUpTo attribute and has contents created by other people ever
+ $self->Limit(
+ %rest,
+ ALIAS => $alias,
+ FIELD => 'id',
+ OPERATOR => 'IS',
+ VALUE => 'NULL',
+ QUOTEVALUE => 0,
+ );
+
+ # Has SeenUpTo attribute and contents created by other people after that
+ $self->Limit(
+ ALIAS => $txn_alias,
+ FIELD => 'Created',
+ OPERATOR => '>',
+ VALUE => $db_type eq 'Oracle' ? "DBMS_LOB.substr($alias.Content, 19)" : "$alias.Content",
+ QUOTEVALUE => 0,
+ ENTRYAGGREGATOR => 'OR',
+ $function ? ( FUNCTION => $function ) : (),
+ );
+ $self->_CloseParen();
+
+ # HasNoUnreadMessages is the reverse of HasUnreadMessages
+ if ( !$FIELD_METADATA{$field}->[1] ) {
+ $self->Columns('id');
+ $orig_self->Limit(
+ %rest,
+ FIELD => 'id',
+ OPERATOR => 'NOT IN',
+ VALUE => '(' . $self->BuildSelectQuery . ')',
+ QUOTEVALUE => 0,
+ );
+ }
+}
+
sub _LifecycleLimit {
my ( $self, $field, $op, $value, %rest ) = @_;
--
To stop receiving notification emails like this one, please contact
sysadmin at bestpractical.com.
More information about the rt-commit
mailing list