From 78dc6d4f6edded4e3d91432c36a8369c901f8d7a Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Wed, 4 Mar 2015 13:34:40 +0300 Subject: [PATCH] Add separate parameters for "Period Worktime" column, remove usage of global variables --- Bugzilla/Search.pm | 47 +++++++++++-------- buglist.cgi | 8 ++-- colchange.cgi | 12 ++++- js/change-columns.js | 3 ++ .../en/default/list/change-columns.html.tmpl | 16 ++++++- .../en/default/worktime/supertime.html.tmpl | 22 +++++++-- 6 files changed, 79 insertions(+), 29 deletions(-) diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 08af3e458..f565e8646 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -1287,15 +1287,35 @@ sub init } } - $Bugzilla::Search::interval_from = undef; - $Bugzilla::Search::interval_to = undef; - $Bugzilla::Search::interval_who = undef; + # Setup interval_time column + if ($self->{user}->is_timetracker) + { + my $override = $H->{period_from} || $H->{period_to} || $H->{period_who}; + $self->{interval_from} = $override ? $H->{period_from} : $H->{chfieldfrom}; + $self->{interval_to} = $override ? $H->{period_to} : $H->{chfieldto}; + $self->{interval_who} = $override ? $H->{period_who} : $H->{chfieldwho}; + for ($self->{interval_from}, $self->{interval_to}) + { + $_ = $_ && $_ ne 'now' ? SqlifyDate($_) : undef; + } + for ($self->{interval_who}) + { + $_ = $_ ? ($_ eq '%user%' ? $self->{user} : Bugzilla::User::match_name($_, 1)->[0]) : undef; + } + COLUMNS->{interval_time}->{name} = + "(SELECT COALESCE(SUM(ldtime.work_time),0) FROM longdescs ldtime". + " WHERE ldtime.bug_id=bugs.bug_id". + ($self->{interval_from} ? " AND ldtime.bug_when >= ".$dbh->quote($self->{interval_from}) : ''). + ($self->{interval_to} ? " AND ldtime.bug_when <= ".$dbh->quote($self->{interval_to}) : ''). + ($self->{interval_who} ? " AND ldtime.who = ".$self->{interval_who}->id : ''). + ")"; + } + # Add "only bugs changed between..." my $chfieldfrom = trim(lc($H->{chfieldfrom} || '')); my $chfieldto = trim(lc($H->{chfieldto} || '')); $chfieldfrom = '' if $chfieldfrom eq 'now'; $chfieldto = '' if $chfieldto eq 'now'; - if ($chfieldfrom ne '' || $chfieldto ne '') { my @chfield = map { COLUMN_ALIASES->{$_} || $_ } list $H->{chfield}; @@ -2058,7 +2078,6 @@ sub changed $who = $who eq '%user%' ? $self->{user} : Bugzilla::User::match_name($who, 1)->[0]; if ($who) { - $Bugzilla::Search::interval_who = $who; $v->{who} = $who->login; $v->{who} =~ s/\@.*$//so if !Bugzilla->user->id; $who = $who->id; @@ -2075,17 +2094,7 @@ sub changed # on the time interval and user specified in "changes" search area my $c; my %f = map { $_ => 1 } @{$v->{fields}}; - if ($self->{user}->is_timetracker) - { - $Bugzilla::Search::interval_from = SqlifyDate($v->{after}); - $Bugzilla::Search::interval_to = SqlifyDate($v->{before}); - $c = $cond; - $c =~ s/ \./ldtime./gs; - COLUMNS->{interval_time}->{name} = - "(SELECT COALESCE(SUM(ldtime.work_time),0) FROM longdescs ldtime". - " WHERE ldtime.bug_id=bugs.bug_id AND $c)"; - } - else + if (!$self->{user}->is_timetracker) { # Non-timetrackers can't search on time tracking fields delete $f{$_} for keys %{TIMETRACKING_FIELDS()}; @@ -2532,9 +2541,9 @@ sub _work_time_equals_0 my $w = "$table.work_time != 0"; if ($self->{field} eq 'interval_time') { - $w .= " AND $table.bug_when >= ".$dbh->quote($Bugzilla::Search::interval_from) if $Bugzilla::Search::interval_from; - $w .= " AND $table.bug_when <= ".$dbh->quote($Bugzilla::Search::interval_to) if $Bugzilla::Search::interval_to; - $w .= " AND $table.who = ".$Bugzilla::Search::interval_who->id if $Bugzilla::Search::interval_who; + $w .= " AND $table.bug_when >= ".$dbh->quote($self->{interval_from}) if $self->{interval_from}; + $w .= " AND $table.bug_when <= ".$dbh->quote($self->{interval_to}) if $self->{interval_to}; + $w .= " AND $table.who = ".$self->{interval_who}->id if $self->{interval_who}; } $w .= " AND $table.isprivate = 0" if $self->{user}->is_insider; $self->{term} = { diff --git a/buglist.cgi b/buglist.cgi index f77904d65..640d2f0e1 100755 --- a/buglist.cgi +++ b/buglist.cgi @@ -811,7 +811,7 @@ if ($superworktime) # Must come after Bugzilla::Search::getSQL if (Bugzilla->user->in_group('worktimeadmin')) { - my $d = $Bugzilla::Search::interval_to; + my $d = $search->{interval_to}; if ($d) { # Use DateTime instead of SQL functions to be more DBMS-independent @@ -824,7 +824,7 @@ if ($superworktime) { $d = POSIX::strftime("%Y-%m-%d", localtime); } - $vars->{worktime_user} = $ARGS->{worktime_user} || ($Bugzilla::Search::interval_who ? $Bugzilla::Search::interval_who->login : undef); + $vars->{worktime_user} = $ARGS->{worktime_user} || ($search->{interval_who} ? $search->{interval_who}->login : undef); $vars->{worktime_date} = $ARGS->{worktime_date} || $d; } else @@ -1078,8 +1078,8 @@ $vars->{caneditbugs} = 1; $vars->{time_info} = $time_info; $vars->{query_params} = { %$params }; # now used only in superworktime -$vars->{query_params}->{chfieldfrom} = $Bugzilla::Search::interval_from; -$vars->{query_params}->{chfieldto} = $Bugzilla::Search::interval_to; +$vars->{query_params}->{chfieldfrom} = $search->{interval_from}; +$vars->{query_params}->{chfieldto} = $search->{interval_to}; if (!Bugzilla->user->in_group('editbugs')) { diff --git a/colchange.cgi b/colchange.cgi index 0ac910220..c2fa1ed07 100755 --- a/colchange.cgi +++ b/colchange.cgi @@ -116,12 +116,14 @@ if ($ARGS->{rememberedquery}) { my $params = http_decode_query($search->query); $params->{columnlist} = join(",", @collist); + $params->{$_} = $ARGS->{$_} for qw(period_from period_to period_who); $search->set_query(http_build_query($params)); $search->update(); } my $params = http_decode_query($ARGS->{rememberedquery}); $params->{columnlist} = join(",", @collist); + $params->{$_} = $ARGS->{$_} for qw(period_from period_to period_who); $vars->{redirect_url} = "buglist.cgi?".http_build_query($params); # If we're running on Microsoft IIS, $cgi->redirect discards @@ -138,7 +140,7 @@ if ($ARGS->{rememberedquery}) } else { - print Bugzilla->cgi->redirect($vars->{'redirect_url'}); + print Bugzilla->cgi->redirect($vars->{redirect_url}); exit; } @@ -170,6 +172,14 @@ $vars->{collist} = \@collist; $vars->{splitheader} = Bugzilla->cookies->{SPLITHEADER} ? 1 : 0; $vars->{buffer} = http_build_query($ARGS); +$vars->{$_} = $ARGS->{$_} for qw(period_from period_to period_who); +if (!$vars->{period_from} && !$vars->{period_to} && !$vars->{period_who}) +{ + $vars->{period_from} = $ARGS->{chfieldfrom}; + $vars->{period_to} = $ARGS->{chfieldto}; + $vars->{period_who} = $ARGS->{chfieldwho}; +} + my $search; if (defined $ARGS->{query_based_on}) { diff --git a/js/change-columns.js b/js/change-columns.js index 0c9362649..751cae590 100644 --- a/js/change-columns.js +++ b/js/change-columns.js @@ -27,6 +27,9 @@ function initChangeColumns() switch_options(sel_select, av_select, false); sel_select.selectedIndex = -1; updateView(); + Calendar.set('period_from'); + Calendar.set('period_to'); + new SimpleAutocomplete("period_who", userAutocomplete, { emptyText: 'No users found' }); } function switch_options(from_box, to_box, selected) diff --git a/template/en/default/list/change-columns.html.tmpl b/template/en/default/list/change-columns.html.tmpl index c7dbebd54..01dd99dca 100644 --- a/template/en/default/list/change-columns.html.tmpl +++ b/template/en/default/list/change-columns.html.tmpl @@ -21,7 +21,8 @@ [% PROCESS global/header.html.tmpl title = "Change Columns" - javascript_urls = "js/change-columns.js" + javascript_urls = [ "js/calendar.js", "js/change-columns.js" ] + style_urls = [ "skins/standard/calendar.css" ] onload = "initChangeColumns()" %] @@ -106,11 +107,22 @@ value="[% saved_search.id FILTER html%]" /> -