# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*- =head1 COPYRIGHT # ***** 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 ***** =cut package Litmus::FormWidget; use strict; #use Encode qw( encode_utf8 decode_utf8 ); use utf8; use diagnostics; BEGIN { use Exporter (); use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); $VERSION = 0.01; @ISA = qw (Exporter); #Give a hoot don't pollute, do not export more than needed by default @EXPORT = qw (); @EXPORT_OK = qw (); %EXPORT_TAGS = (); } use DBI; use Litmus::DBI; use Litmus::DB::TestDay; our $_dbh = Litmus::DBI->db_Main(); ######################################################################### =head1 NAME Litmus::FormWidget - Create value lists to be used in HTML forms =head1 SYNOPSIS use Litmus::FormWidget =head1 DESCRIPTION Litmus::FormWidget creates value lists to be used in HTML forms. =head1 USAGE =head1 BUGS =head1 SUPPORT =head1 AUTHOR Chris Cooper CPAN ID: CCOOPER Mozilla Corporation ccooper@deadsquid.com http://litmus.mozilla.org/ =head1 SEE ALSO perl(1). =cut ######################################################################### sub getProducts() { my ($self, $enabled) = @_; my $sql = "SELECT name, product_id FROM products"; if ($enabled) { $sql .= " WHERE enabled=1"; } $sql .= " ORDER BY name ASC"; return _getValues($sql); } ######################################################################### sub getUniquePlatforms() { my $sql = "SELECT DISTINCT(name), platform_id FROM platforms ORDER BY name"; return _getValues($sql); } ######################################################################### sub getPlatforms() { my $sql = "SELECT platform_id, name from platforms ORDER BY name ASC"; return _getValues($sql); } ######################################################################### sub getBranches() { my ($self, $enabled) = @_; my $sql = "SELECT b.name, b.branch_id, b.product_id, p.name AS product_name FROM branches b, products p WHERE b.product_id=p.product_id"; if ($enabled) { $sql .= " AND b.enabled=1"; } $sql .= " ORDER BY b.name ASC"; return _getValues($sql); } ######################################################################### sub getUniqueBranches() { my ($self, $enabled) = @_; my $sql = "SELECT DISTINCT(name) FROM branches"; if ($enabled) { $sql .= " WHERE enabled=1"; } $sql .= " ORDER BY name ASC"; return _getValues($sql); } ######################################################################### sub getOpsyses() { my $sql = "SELECT o.name, o.opsys_id, o.platform_id, pl.name AS platform_name FROM opsyses o, platforms pl WHERE o.platform_id=pl.platform_id ORDER BY o.name ASC"; return _getValues($sql); } ######################################################################### sub getUniqueOpsyses() { my $sql = "SELECT DISTINCT(name), opsys_id, platform_id FROM opsyses ORDER BY name ASC"; return _getValues($sql); } ######################################################################### sub getLogTypes() { my $sql = "SELECT DISTINCT(name) FROM log_type_lookup ORDER BY name"; return _getValues($sql); } ######################################################################### sub getTestStatuses() { my @TestStatuses = ({name => 'Enabled'}, {name => 'Disabled'}); return \@TestStatuses; } ######################################################################### sub getResultStatuses() { my $sql = "SELECT result_status_id,name,class_name FROM test_result_status_lookup ORDER BY result_status_id"; return _getValues($sql); } ######################################################################### sub getTestcaseIDs() { my ($self, $enabled, $community_enabled) = @_; my $sql = "SELECT testcase_id,summary FROM testcases"; if ($enabled) { $sql .= " WHERE enabled=1"; } if ($community_enabled) { if ($sql =~ /WHERE/) { $sql .= " AND community_enabled=1"; } else { $sql .= " WHERE community_enabled=1"; } } $sql .= " ORDER BY testcase_id"; return _getValues($sql); } ######################################################################### sub getTestcases() { my ($self, $enabled, $sort_by) = @_; my $sql = "SELECT testcase_id, summary, product_id, branch_id FROM testcases"; if ($enabled) { $sql .= " WHERE enabled=1"; } if (!$sort_by) { $sort_by='id'; } if ($sort_by eq 'name') { $sql .= " ORDER BY summary ASC, testcase_id ASC"; } elsif ($sort_by eq 'id') { $sql .= " ORDER BY testcase_id ASC"; } else { Litmus::Error::logError("Unknown sort_by type: $sort_by", caller(0)); } return _getValues($sql); } ######################################################################### sub getDistinctSubgroups() { my ($self, $enabled) = @_; my $sql = "SELECT DISTINCT(sg.subgroup_id), sg.name, sg.product_id, sg.branch_id, sgtg.testgroup_id FROM subgroups sg LEFT JOIN subgroup_testgroups sgtg ON (sg.subgroup_id=sgtg.subgroup_id)"; if ($enabled) { $sql .= " AND sg.enabled=1"; } $sql .= " ORDER BY sgtg.sort_order ASC, sg.name ASC, sg.subgroup_id ASC"; return _getValues($sql); } ######################################################################### sub getSubgroups() { my ($self, $enabled, $sort_by) = @_; my $sql = "SELECT sg.subgroup_id, sg.name, sg.product_id, sg.branch_id, sgtg.testgroup_id FROM subgroups sg LEFT JOIN subgroup_testgroups sgtg ON (sg.subgroup_id=sgtg.subgroup_id)"; if ($enabled) { $sql .= " AND sg.enabled=1"; } if (!$sort_by) { $sort_by='id'; } if ($sort_by eq 'name') { $sql .= " ORDER BY sg.name ASC, sg.subgroup_id ASC"; } elsif ($sort_by eq 'id') { $sql .= " ORDER BY sg.subgroup_id ASC"; } elsif ($sort_by eq 'sort_order') { $sql .= " ORDER BY sgtg.sort_order ASC, sg.name ASC, sg.subgroup_id ASC"; } else { Litmus::Error::logError("Unknown sort_by type: $sort_by", caller(0)); } return _getValues($sql); } ######################################################################### sub getTestgroups() { my ($self, $enabled) = @_; my $sql = "SELECT tg.testgroup_id, tg.name, tg.product_id, tg.branch_id FROM testgroups tg"; if ($enabled) { $sql .= " WHERE tg.enabled=1"; } $sql .= " ORDER BY tg.name, tg.testgroup_id"; return _getValues($sql); } ######################################################################### sub getLocales() { my @locales = Litmus::DB::Locale->retrieve_all(); # Append an extra copy of 'en-US' at the start of the list. foreach my $locale (@locales) { if ($locale->locale_abbrev eq 'en-US') { unshift @locales, $locale; last; } } return \@locales; } ######################################################################### sub getUsers() { my @users = Litmus::DB::User->retrieve_all(); return \@users; } ######################################################################### sub getTestdays() { my @testdays = Litmus::DB::TestDay->retrieve_all_sorted_by("finish_timestamp DESC, product_id ASC, branch_id ASC, testday_id ASC" ); return \@testdays; } ######################################################################### sub getAuthors() { my $sql = "SELECT users.user_id, users.email FROM users, user_group_map, security_groups WHERE users.user_id=user_group_map.user_id AND user_group_map.group_id=security_groups.group_id AND (security_groups.grouptype=1 OR security_groups.grouptype=2 OR security_groups.grouptype=3) ORDER BY users.email"; return _getValues($sql); } ######################################################################### sub getTestRuns() { my ($self, $enabled) = @_; my $sql = "SELECT test_run_id, name, product_id, start_timestamp, finish_timestamp FROM test_runs"; if ($enabled) { $sql .= " WHERE enabled=1"; } $sql .= " ORDER BY finish_timestamp DESC, name DESC"; return _getValues($sql); } ######################################################################### sub getFields() { my @fields = ( { name => 'build_id', display_string => "Build ID", }, { name => 'comment', display_string => "Comments", }, { name => 'locale', display_string => "Locale", }, { name => 'opsys', display_string => "Operating System", }, { name => 'platform', display_string => "Platform", }, { name => 'product', display_string => "Product", }, { name => 'result_status', display_string => "Result Status", }, { name => 'subgroup', display_string => "Subgroup", }, { name => 'email', display_string => "Submitted By", }, { name => 'summary', display_string => "Summary", }, { name => 'testgroup', display_string => "Testgroup", }, { name => 'user_agent', display_string => "User Agent", }, ); return \@fields; } ######################################################################### sub getMatchCriteria() { my @match_criteria = ( { name => "contains_all", display_string => "contains all of the words/strings" }, { name => "contains_any", display_string => "contains any of the words/strings" }, { name => "contains", display_string => "contains the word/string" }, { name => "contains_case", display_string => "contains the word/string (exact case)" }, { name => "not_contain", display_string => "does not contain the word/string" }, { name => "not_contain_any", display_string => "does not contain any of the words/strings" }, { name => "regexp", display_string => "matches the regexp" }, { name => "not_regexp", display_string => "does not match the regexp" }, ); return \@match_criteria; } ######################################################################### sub getSortFields() { my @sort_fields = ( { name => "branch", display_string => "Branch"}, { name => "created", display_string => "Date"}, { name => "locale", display_string => "Locale"}, { name => "platform", display_string => "Platform"}, { name => "product", display_string => "Product"}, { name => "email", display_string => "Submitted By"}, { name => "summary", display_string => "Summary"}, { name => "result_status", display_string => "Status"}, { name => "testcase_id", display_string => "Testcase ID#"}, { name => "testgroup", display_string => "Testgroup"}, { name => "vetted_date", display_string => "Vetted Date"}, ); return \@sort_fields; } ######################################################################### sub _getValues($) { my ($sql) = @_; my $sth = $_dbh->prepare($sql); $sth->execute(); my @rows; while (my $data = $sth->fetchrow_hashref) { foreach my $key (keys %$data) { Encode::_utf8_on($data->{$key}); utf8::decode($data->{$key}); } push @rows, $data; } $sth->finish(); return \@rows; } 1;