#!/usr/bin/perl -w # -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*- # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is Litmus. # # The Initial Developer of the Original Code is # the Mozilla Corporation. # Portions created by the Initial Developer are Copyright (C) 2006 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Chris Cooper # Zach Lipton # # ***** END LICENSE BLOCK ***** use strict; use Litmus; use Litmus::Auth; use Litmus::Error; use Litmus::DB::Testresult; use Litmus::FormWidget; use CGI; use Time::Piece::MySQL; Litmus->init(); my $c = Litmus->cgi(); print $c->header(); # Hash refs for maintaining state in the search form. my $defaults = undef; my $order_bys = undef; my $MAX_SORT_FIELDS = 10; my $MAX_SEARCH_FIELDS = 10; my $criteria = "Custom
"; my $results; my @where; my @order_by; my $limit; my $where_criteria = ""; my $order_by_criteria = ""; my $limit_criteria = ""; if ($c->param) { foreach my $param ($c->param) { next if ($c->param($param) eq ''); if ($param =~ /sort_field(\d+)/) { # We slot sort fields into the @order_by array based on their # field_num. Empty array slots will be ignored when the SQL # is built. We set an upper limit on the number of sort fields # we can handle to prevent abuse. my $field_num = $1; next if ($field_num > $MAX_SORT_FIELDS); my $sort_field = $c->param($param); my $sort_order = 'ASC'; if ($c->param("sort_order$field_num")) { $sort_order = $c->param("sort_order$field_num"); } $order_by[$field_num] = { field => $sort_field, direction => $sort_order}; } elsif ($param =~ /search_field(\d+)/) { # We set an upper limit on the number of search fields # we can handle to prevent abuse. my $field_num = $1; next if ($field_num > $MAX_SEARCH_FIELDS); my $search_field = $c->param($param); my $match_criteria = $c->param("match_criteria$field_num"); my $value = $c->param("search_value$field_num"); push @where, { 'field' => 'search_field', 'search_field' => $search_field, 'match_criteria' => $match_criteria, 'value' => $value}; $where_criteria .= "$search_field $match_criteria '$value'
"; } elsif ($param eq 'start_date') { my $start_date = $c->param($param); $start_date =~ s/[^0-9A-Za-z ]/ /g; my $end_date; # Use 'now' as the default end date. if ($c->param('end_date') and $c->param('end_date') ne '') { $end_date = $c->param('end_date'); $end_date =~ s/[^0-9A-Za-z ]/ /g; } else { $end_date = 'Now'; } push @where, { field => 'start_date', value => $start_date}; push @where, { field => 'end_date', value => $end_date}; $where_criteria .= "Date between '$start_date' and '$end_date'
"; } elsif ($param eq 'trusted_only') { push @where, {field => 'trusted_only', value => 1}; $limit_criteria .= "Display trusted results only
"; } elsif ($param eq "limit") { $limit = $c->param($param); next if ($limit == $Litmus::DB::Testresult::_num_results_default); $limit_criteria .= "Limit to $limit results
"; } elsif ($param eq 'branch') { my $value = $c->param($param); push @where, {field => $param, value => $value}; $where_criteria .= "Branch is \'".$c->param($param)."\'
"; $defaults->{branch} = $c->param($param); } elsif ($param eq 'locale') { my $value = $c->param($param); push @where, {field => 'locale', value => $value}; $where_criteria .= "Locale is \'".$c->param($param)."\'
"; $defaults->{locale} = $c->param($param); } elsif ($param eq 'email') { my $value = $c->param($param); push @where, {field => 'email', value => $value}; $where_criteria .= "Submitted By is \'".$c->param($param)."\'
"; $defaults->{locale} = $c->param($param); } elsif ($param eq 'product') { my $value = $c->param($param); push @where, {field => $param, value => $value}; $where_criteria .= "Product is \'".$c->param($param)."\'
"; $defaults->{product} = $c->param($param); } elsif ($param eq 'platform') { my $value = $c->param($param); push @where, {field => $param, value => $value}; $where_criteria .= "Platform is \'".$c->param($param)."\'
"; $defaults->{platform} = $c->param($param); } elsif ($param eq 'test_group') { my $value = $c->param($param); push @where, {field => $param, value => $value}; $where_criteria .= "Test group is \'".$c->param($param)."\'
"; $defaults->{test_group} = $c->param($param); } elsif ($param eq 'test_id') { my $value = $c->param($param); push @where, {field => $param, value => $value}; $where_criteria .= "Testcase ID# is \'".$c->param($param)."\'
"; $defaults->{test_id} = $c->param($param); } elsif ($param eq 'summary') { my $value = $c->param($param); push @where, {field => $param, value => $value}; $where_criteria .= "Summary like \'".$c->param($param)."\'
"; $defaults->{summary} = $c->param($param); } elsif ($param eq 'result_status') { my $value = $c->param($param); push @where, {field => $param, value => $value}; $where_criteria .= "Status is \'".$c->param($param)."\'
"; $defaults->{result_status} = $c->param($param); } else { # Skip unknown field } } if ($where_criteria eq '' and scalar(@order_by) == 0 and $limit_criteria eq '') { ($criteria,$results) = Litmus::DB::Testresult->getDefaultTestResults; } else { foreach my $order_by_field (@order_by) { next if (!$order_by_field); $order_by_criteria .= "Order by $order_by_field->{field} $order_by_field->{direction}
"; } $criteria .= $where_criteria . $order_by_criteria . $limit_criteria; $criteria =~ s/_/ /g; $results = Litmus::DB::Testresult->getTestResults(\@where, \@order_by, $limit); } } else { ($criteria,$results) = Litmus::DB::Testresult->getDefaultTestResults; } # Populate each of our form widgets for select/input. # Set a default value as appropriate. my $products = Litmus::FormWidget->getProducts; my $platforms = Litmus::FormWidget->getUniquePlatforms; my $test_groups = Litmus::FormWidget->getTestgroups; my $testcases = Litmus::FormWidget->getTestcaseIDs; my $result_statuses = Litmus::FormWidget->getResultStatuses; my $branches = Litmus::FormWidget->getBranches; my $locales = Litmus::FormWidget->getLocales; my $users = Litmus::FormWidget->getUsers; my $fields = Litmus::FormWidget->getFields; my $match_criteria = Litmus::FormWidget->getMatchCriteria; my $sort_fields = Litmus::FormWidget->getSortFields; my $title = 'Advanced Search'; my $vars = { title => $title, criteria => $criteria, products => $products, platforms => $platforms, test_groups => $test_groups, testcases => $testcases, result_statuses => $result_statuses, branches => $branches, locales => $locales, users => $users, fields => $fields, match_criteria => $match_criteria, sort_fields => $sort_fields, }; # Only include results if we have them. if ($results and scalar @$results > 0) { $vars->{results} = $results; } my $cookie = Litmus::Auth::getCookie(); $vars->{"defaultemail"} = $cookie; $vars->{"show_admin"} = Litmus::Auth::istrusted($cookie); Litmus->template()->process("reporting/advanced_search.tmpl", $vars) || internalError(Litmus->template()->error()); exit 0;