Add separate parameters for "Period Worktime" column, remove usage of global variables

3col
Vitaliy Filippov 2015-03-04 13:34:40 +03:00
parent c53339f1bf
commit 78dc6d4f6e
6 changed files with 79 additions and 29 deletions

View File

@ -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} = {

View File

@ -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'))
{

View File

@ -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})
{

View File

@ -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)

View File

@ -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%]" />
<input type="checkbox" id="save_columns_for_search" checked="checked"
name="save_columns_for_search" value="1" />
<label for="save_columns_for_search">Save this column list only
<label for="save_columns_for_search">Save this column list
for search '[% saved_search.name FILTER html %]'</label>
</p>
[% END %]
[% IF user.is_timetracker %]
<p>
In the "[% COLUMNS.interval_time.title | html %]" column, show working time for user:
<input name="period_who" id="period_who" size="30" value="[% period_who | html %]" />
between
<input name="period_from" id="period_from" size="10" value="[% period_from | html %]" />
and <input name="period_to" id="period_to" size="10" value="[% period_to | html %]" />
(YYYY-MM-DD or relative dates)
</p>
[% END %]
<p>
<input type="submit" id="change" value="Change Columns" />
</p>

View File

@ -6,7 +6,8 @@
[% title = "Массовый ввод трудозатрат" %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = [ "skins/standard/buglist.css" ]
javascript_urls = [ "js/calendar.js", "js/change-columns.js" ]
style_urls = [ "skins/standard/calendar.css", "skins/standard/buglist.css" ]
%]
<p>
@ -53,12 +54,21 @@
[% hidden_inputs(HideIndex=2) %]
Дата:
<p style="margin: 8px 0">
Баг изменён:
с <input type="text" name="chfieldfrom" id="chfieldfrom" value="[% query_params.chfieldfrom | html %]" onchange="check_who_enabled()" />
по <input type="text" name="chfieldto" id="chfieldto" value="[% query_params.chfieldto | html %]" onchange="check_who_enabled()" />
<span style="color: #aaa">(YYYY-MM-DD HH:MM:SS)</span> &nbsp; &nbsp;
Пользователь: <input type="text" name="chfieldwho" id="chfieldwho" value="[% query_params.chfieldwho | html %]" /> &nbsp;
пользователем: <input type="text" name="chfieldwho" id="chfieldwho" value="[% query_params.chfieldwho | html %]" />
</p>
<p style="margin: 0">
Period Worktime:
с <input type="text" name="period_from" id="period_from" value="[% query_params.period_from || query_params.period_to || query_params.period_who ? query_params.period_from : query_params.chfieldfrom | html %]" />
по <input type="text" name="period_to" id="period_to" value="[% query_params.period_from || query_params.period_to || query_params.period_who ? query_params.period_to : query_params.chfieldto | html %]" />
<span style="color: #aaa">(YYYY-MM-DD HH:MM:SS)</span> &nbsp; &nbsp;
пользователь: <input type="text" name="period_who" id="period_who" value="[% query_params.period_from || query_params.period_to || query_params.period_who ? query_params.period_who : query_params.chfieldwho | html %]" /> &nbsp;
<input type="submit" value=" Показать трудозатраты " />
</p>
</form>
</fieldset>
@ -303,6 +313,12 @@ function do_dry_run(frm)
}
wt_user_blur();
check_who_enabled();
Calendar.set('chfieldfrom');
Calendar.set('chfieldto');
new SimpleAutocomplete("chfieldwho", userAutocomplete, { emptyText: 'No users found' });
Calendar.set('period_from');
Calendar.set('period_to');
new SimpleAutocomplete("period_who", userAutocomplete, { emptyText: 'No users found' });
//-->
</script>