my $arg_count = scalar(@_);
+ # There are three ways of creating Series objects. Two (CGI and Parameters)
+ # are for use when creating a new series. One (Database) is for retrieving
+ # information on existing series.
if ($arg_count == 1) {
if (ref($_[0])) {
# We've been given a CGI object to create a new Series from.
+ # This series may already exist - external code needs to check
+ # before it calls writeToDatabase().
$self->initFromCGI($_[0]);
}
else {
}
elsif ($arg_count >= 6 && $arg_count <= 8) {
# We've been given a load of parameters to create a new Series from.
+ # Currently, undef is always passed as the first parameter; this allows
+ # you to call writeToDatabase() unconditionally.
$self->initFromParameters(@_);
}
else {
sub writeToDatabase {
my $self = shift;
- # Lock some tables
my $dbh = Bugzilla->dbh;
$dbh->do("LOCK TABLES series_categories WRITE, series WRITE, " .
"user_series_map WRITE");
my $category_id = getCategoryID($self->{'category'});
my $subcategory_id = getCategoryID($self->{'subcategory'});
+ my $exists;
+ if ($self->{'series_id'}) {
+ $exists =
+ $dbh->selectrow_array("SELECT series_id FROM series
+ WHERE series_id = $self->{'series_id'}");
+ }
+
# Is this already in the database?
- if ($self->existsInDatabase()) {
+ if ($exists) {
# Update existing series
my $dbh = Bugzilla->dbh;
$dbh->do("UPDATE series SET " .
}
# Check whether a series with this name, category and subcategory exists in
-# the DB and, if so, sets series_id to its series_id.
+# the DB and, if so, returns its series_id.
sub existsInDatabase {
my $self = shift;
my $dbh = Bugzilla->dbh;
my $subcategory_id = getCategoryID($self->{'subcategory'});
trick_taint($self->{'name'});
- $self->{'series_id'} = $dbh->selectrow_array("SELECT series_id " .
+ my $series_id = $dbh->selectrow_array("SELECT series_id " .
"FROM series WHERE category = $category_id " .
"AND subcategory = $subcategory_id AND name = " .
$dbh->quote($self->{'name'}));
- return(defined($self->{'series_id'}));
+ return($series_id);
}
# Get a category or subcategory IDs, creating the category if it doesn't exist.
if ($::FORM{'remaction'} eq "run") {
$::buffer = LookupNamedQuery($::FORM{"namedcmd"});
$vars->{'searchname'} = $::FORM{'namedcmd'};
+ $vars->{'searchtype'} = "saved";
$params = new Bugzilla::CGI($::buffer);
$order = $params->param('order') || $order;
}
elsif ($::FORM{'remaction'} eq "runseries") {
$::buffer = LookupSeries($::FORM{"series_id"});
$vars->{'searchname'} = $::FORM{'namedcmd'};
+ $vars->{'searchtype'} = "series";
$params = new Bugzilla::CGI($::buffer);
$order = $params->param('order') || $order;
}
# Contributor(s): Gervase Markham <gerv@gerv.net>
# Glossary:
-# series: An individual, defined set of data plotted over time.
-# line: A set of one or more series, to be summed and drawn as a single
-# line when the series is plotted.
-# chart: A set of lines
+# series: An individual, defined set of data plotted over time.
+# data set: What a series is called in the UI.
+# line: A set of one or more series, to be summed and drawn as a single
+# line when the series is plotted.
+# chart: A set of lines
+#
# So when you select rows in the UI, you are selecting one or more lines, not
# series.
# Broken image on error or no data - need to do much better.
# Centralise permission checking, so UserInGroup('editbugs') not scattered
# everywhere.
-# Better protection on collectstats.pl for second run in a day
# User documentation :-)
#
# Bonus:
confirm_login();
+# Only admins may create public queries
+UserInGroup('admin') || $cgi->delete('public');
+
# All these actions relate to chart construction.
if ($action =~ /^(assemble|add|remove|sum|subscribe|unsubscribe)$/) {
# These two need to be done before the creation of the Chart object, so
}
elsif ($action eq "create") {
assertCanCreate($cgi);
+
my $series = new Bugzilla::Series($cgi);
if (!$series->existsInDatabase()) {
$vars->{'message'} = "series_created";
}
else {
- $vars->{'message'} = "series_already_exists";
+ ThrowUserError("series_already_exists", {'series' => $series});
}
$vars->{'series'} = $series;
assertCanEdit($series_id);
my $series = new Bugzilla::Series($cgi);
+
+ # We need to check if there is _another_ series in the database with
+ # our (potentially new) name. So we call existsInDatabase() to see if
+ # the return value is us or some other series we need to avoid stomping
+ # on.
+ my $id_of_series_in_db = $series->existsInDatabase();
+ if (defined($id_of_series_in_db) &&
+ $id_of_series_in_db != $series->{'series_id'})
+ {
+ ThrowUserError("series_already_exists", {'series' => $series});
+ }
+
$series->writeToDatabase();
+ $vars->{'changes_saved'} = 1;
edit($series);
}
UserInGroup("editbugs") || ThrowUserError("illegal_series_creation");
- # Only admins may create public queries
- UserInGroup('admin') || $cgi->delete('public');
-
# Check permission for frequency
my $min_freq = 7;
if ($cgi->param('frequency') < $min_freq && !UserInGroup("admin")) {
$vars->{'category'} = Bugzilla::Chart::getVisibleSeries();
$vars->{'creator'} = new Bugzilla::User($series->{'creator'});
-
- # If we've got any parameters, use those in preference to the values
- # read from the database. This is a bit ugly, but I can't see a better
- # way to make this work in the no-JS situation.
- if ($cgi->param('category'))
- {
- $vars->{'default'} = new Bugzilla::Series($series->{'series_id'},
- $cgi->param('category') || $series->{'category'},
- $cgi->param('subcategory') || $series->{'subcategory'},
- $cgi->param('name') || $series->{'name'},
- $series->{'creator'},
- $cgi->param('frequency') || $series->{'frequency'});
-
- $vars->{'default'}{'public'}
- = $cgi->param('public') || $series->{'public'};
- }
- else {
- $vars->{'default'} = $series;
- }
+ $vars->{'default'} = $series;
print "Content-Type: text/html\n\n";
$template->process("reports/edit-series.html.tmpl", $vars)
<a href="editflagtypes.cgi">Back to flag types.</a>
</p>
- [% ELSIF message_tag == "series_already_exists" %]
- [% title = "Series Already Exists" %]
- A series <em>[% series.category FILTER html %] /
- [%+ series.subcategory FILTER html %] /
- [%+ series.name FILTER html %]</em>
- already exists. If you want to create this series, you will need to give
- it a different name.
- <br><br>
- Go back or
- <a href="query.cgi?format=create-series">create another series</a>.
-
[% ELSIF message_tag == "series_created" %]
[% title = "Series Created" %]
The series <em>[% series.category FILTER html %] /
[% title = "Access Denied" %]
You do not have the permissions necessary to run a sanity check.
+ [% ELSIF error == "series_already_exists" %]
+ [% title = "Series Already Exists" %]
+ A series named <em>[% series.category FILTER html %] /
+ [%+ series.subcategory FILTER html %] /
+ [%+ series.name FILTER html %]</em>
+ already exists.
+
[% ELSIF error == "sidebar_supports_mozilla_only" %]
Sorry - sidebar.cgi currently only supports Mozilla based web browsers.
<a href="http://www.mozilla.org">Upgrade today</a>. :-)
# Contributor(s): Myk Melez <myk@mozilla.org>
#%]
+[%# INTERFACE:
+ # searchtype: string. Type of search - either "series", "saved" or undef.
+ # ...
+ #%]
+
[%############################################################################%]
[%# Template Initialization #%]
[%############################################################################%]
<a href="query.cgi?[% urlquerypart FILTER html %]">Edit Search</a>
</td>
- [% IF searchname %]
+ [% IF searchtype == "saved" %]
<td valign="middle" nowrap="nowrap">
|
<a href="buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=
</td>
<td align="center">
- [% IF series.creator != 0 %]
+ [% IF NOT series.public %]
[% IF series.isSubscribed(user.id) %]
<input type="submit" value="Unsubscribe" style="width: 12ex;"
name="action-unsubscribe[% series.series_id %]">
[% PROCESS global/header.html.tmpl %]
+[% IF changes_saved %]
+ <p>
+ <font color="red">
+ Series updated.
+ </font>
+ </p>
+[% END %]
+
<form method="get" action="chart.cgi" name="chartform">
- [% button_name = "Change" %]
-
- [% PROCESS reports/series.html.tmpl %]
- <input type="hidden" name="action-alter" value="1">
+ [% PROCESS reports/series.html.tmpl
+ button_name = "Change Data Set" %]
+ <input type="hidden" name="action" value="alter">
[% IF default.series_id %]
<input type="hidden" name="series_id" value="[% default.series_id %]">
[% END %]
</p>
+<p>Note: it is not yet possible to edit the search associated with this data
+set.
+</p>
+
<p>
- <a href="query.cgi?[% default.query FILTER html%]">View
+ <a href="query.cgi?[% default.query FILTER html %]">View
series search parameters</a> |
<a href="buglist.cgi?cmdtype=dorem&namedcmd=
[% default.category FILTER url_quote %]-
</td>
<td></td>
<td>
- <input type="submit" name="action-create" value="Create Data Set">
+ <input type="submit" name="submit-button"
+ value="[% button_name FILTER html %]">
</td>
</tr>
</tbody>
</table>
-
-<script language="JavaScript" type="text/javascript">
- document.chartform.category[0].selected = true;
- catSelected();
- checkNewState();
-</script>
<p style="color: red">
Note: there is currently a restriction that data sets will only count public
- [% terms.bugs %] (those not in any group).
+ [%+ terms.bugs %] (those not in any group).
</p>
<form method="get" action="chart.cgi" name="chartform">
<p>
<input type="submit" name="action-search" value="Run Search">
- to see which [% terms.bugs %] would be included in this series.
+ to see which [% terms.bugs %] would be included in this data set.
</p>
<h3>Data Set Parameters</h3>
-[% INCLUDE reports/series.html.tmpl %]
+[% PROCESS reports/series.html.tmpl
+ button_name = "Create Data Set" %]
+ <input type="hidden" name="action" value="create">
+
+<script language="JavaScript" type="text/javascript">
+ document.chartform.category[0].selected = true;
+ catSelected();
+ checkNewState();
+</script>
<hr>