[Bps-public-commit] rtx-calendar branch multiple-days-events created. 1.05-19-ge1a9336
BPS Git Server
git at git.bestpractical.com
Thu Sep 7 21:26:21 UTC 2023
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "rtx-calendar".
The branch, multiple-days-events has been created
at e1a9336a2add434a1297daa36f1a0efb483588b8 (commit)
- Log -----------------------------------------------------------------
commit e1a9336a2add434a1297daa36f1a0efb483588b8
Author: Ronaldo Richieri <ronaldo at bestpractical.com>
Date: Thu Sep 7 18:26:10 2023 -0300
Add Multiple Days Events to Calendar
Add Multiple Days Events to Calendar where an event can span multiple
based on customizable start and end time fields.
diff --git a/lib/RTx/Calendar.pm b/lib/RTx/Calendar.pm
index 8120ece..4371ab6 100644
--- a/lib/RTx/Calendar.pm
+++ b/lib/RTx/Calendar.pm
@@ -58,6 +58,15 @@ sub DatesClauses {
sub FindTickets {
my ( $CurrentUser, $Query, $Dates, $begin, $end ) = @_;
+ my $multiple_days_events = RT->Config->Get('CalendarMultipleDaysEvents');
+ my @multiple_days_fields;
+ for my $event ( keys %$multiple_days_events ) {
+ for my $type ( keys %{ $multiple_days_events->{$event} } ) {
+ push @multiple_days_fields,
+ $multiple_days_events->{$event}{$type};
+ }
+ }
+
$Query .= DatesClauses( $Dates, $begin, $end )
if $begin and $end;
@@ -68,38 +77,14 @@ sub FindTickets {
my %AlreadySeen;
while ( my $Ticket = $Tickets->Next() ) {
-
# How to find the LastContacted date ?
+ # Find single day events fields
for my $Date (@$Dates) {
-
+ next if grep { $Date eq $_ } @multiple_days_fields;
# $dateindex is the date to use as key in the Tickets Hash
# in the YYYY-MM-DD format
# Tickets are then groupd by date in the %Tickets hash
- my $dateindex;
- if ($Date =~ /^CF\./){
- my $cf = $Date;
- $cf =~ s/^CF\.\{(.*)\}/$1/;
-
- my $CFDateValue = $Ticket->FirstCustomFieldValue($cf);
- next unless $CFDateValue;
- my $CustomFieldObj = RT::CustomField->new($CurrentUser);
- $CustomFieldObj->LoadByName( Name => $cf );
- my $CustomFieldObjType = $CustomFieldObj->Type;
- my $DateObj = RT::Date->new($CurrentUser);
- if ( $CustomFieldObjType eq 'Date' ) {
- $DateObj->Set(
- Format => 'unknown',
- Value => $CFDateValue,
- Timezone => 'utc'
- );
- } else {
- $DateObj->Set( Format => 'ISO', Value => $CFDateValue );
- }
- $dateindex = LocalDate( $DateObj->Unix );
- } else {
- my $DateObj = $Date . "Obj";
- $dateindex = LocalDate( $Ticket->$DateObj->Unix );
- }
+ my $dateindex = _GetDate( $Date, $Ticket, $CurrentUser );
push @{ $Tickets{$dateindex } },
$Ticket
@@ -110,10 +95,51 @@ sub FindTickets {
or $AlreadySeen{ $dateindex }
{$Ticket}++;
}
+
+ # Find multiple days events fields
+ for my $event (sort keys %$multiple_days_events) {
+ my $starts_field = $multiple_days_events->{$event}{'Starts'};
+ my $ends_field = $multiple_days_events->{$event}{'Ends'};
+ my $starts_date = _GetDate( $starts_field, $Ticket, $CurrentUser );
+ my $ends_date = _GetDate( $ends_field, $Ticket, $CurrentUser );
+
+ print STDERR "Starts: $starts_date, Ends: $ends_date\n";
+ }
}
return %Tickets;
}
+sub _GetDate {
+ my $date_field = shift;
+ my $Ticket = shift;
+ my $CurrentUser = shift;
+
+ if ($date_field =~ /^CF\./){
+ my $cf = $date_field;
+ $cf =~ s/^CF\.\{(.*)\}/$1/;
+
+ my $CFDateValue = $Ticket->FirstCustomFieldValue($cf);
+ next unless $CFDateValue;
+ my $CustomFieldObj = RT::CustomField->new($CurrentUser);
+ $CustomFieldObj->LoadByName( Name => $cf );
+ my $CustomFieldObjType = $CustomFieldObj->Type;
+ my $DateObj = RT::Date->new($CurrentUser);
+ if ( $CustomFieldObjType eq 'Date' ) {
+ $DateObj->Set(
+ Format => 'unknown',
+ Value => $CFDateValue,
+ Timezone => 'utc'
+ );
+ } else {
+ $DateObj->Set( Format => 'ISO', Value => $CFDateValue );
+ }
+ return LocalDate( $DateObj->Unix );
+ } else {
+ my $DateObj = $date_field . "Obj";
+ return LocalDate( $Ticket->$DateObj->Unix );
+ }
+}
+
#
# Take a user object and return the search with Description "calendar" if it exists
#
@@ -355,6 +381,19 @@ C<$CalendarIcons> setting to your F<etc/RT_SiteConfig.pm>:
The images should be placed on F<local/static/images>.
+=head3 Multiple days events
+
+You can define multiple days events by adding the C<%CalendarMultipleDaysEvents>
+setting to your F<etc/RT_SiteConfig.pm>:
+
+ Set( %CalendarMultipleDaysEvents, (
+ 'Maintenance' => {
+ 'Starts' => 'Starts',
+ 'Ends' => 'Due',
+ },
+ )
+ );
+
=head1 USAGE
A small help section is available in /Search/Calendar.html
-----------------------------------------------------------------------
hooks/post-receive
--
rtx-calendar
More information about the Bps-public-commit
mailing list