# MTFogger - A plugin for Movable Type. # Copyright (c) 2007 Six Apart. package MT::Plugin::MTFogger; use strict; use base qw( MT::Plugin ); use WebService::FogBugz; use Data::Dumper; use XML::Liberal; use XML::LibXML; use XML::Simple; our $VERSION = '0.1'; our $SCHEMA_VERSION = '1.000'; my $plugin = MT::Plugin::MTFogger->new({ key => 'mtfogger', id => 'mtfogger', name => "MTFogger", version => $VERSION, schema_version => $SCHEMA_VERSION, description => "", author_name => "Chris Ernest Hall", author_link => "http://djchall.vox.com/", plugin_link => "http://djchall.com/plugins/", doc_link => "", system_config_template => 'fogger_config.tmpl', settings => new MT::PluginSettings([ ['FbzLogin', { Default => '' }], ['FbzPassword', { Default => '' }], ['FbzBaseurl', { Default => '' }] ]) }); MT->add_plugin($plugin); sub init_registry { my $plugin = shift; $plugin->registry({ tags => { function => { 'FbzCaseNumber' => \&_hdlr_GetCaseNumber, 'FbzCaseCategory' => \&_hdlr_GetCaseCategory, 'FbzCaseTitle' => \&_hdlr_GetCaseTitle, 'FbzCaseStatus' => \&_hdlr_GetCaseStatus, 'FbzCasePriority' => \&_hdlr_GetCasePriority, }, block => { 'FbzCases' => \&_hdlr_ListCases, }, }, }); } sub init_app { my $plugin = shift; $plugin->SUPER::init_app(@_); my ($app) = @_; return unless $app->isa('MT::App::CMS'); } sub instance { $plugin } sub _hdlr_ListCases { #for now, just get the active cases in a hard-coded branch my ($ctx, $args, $cond) = @_; my $out = ""; my $builder = $ctx->stash('builder'); my $tokens = $ctx->stash('tokens'); my $project = $args->{project}; my $fixfor = $args->{fixfor}; my $status = $args->{status}; my $orderby = $args->{orderby}; my $max = $args->{max}; #get list of active cases my $Cases = getCases($project, $fixfor, $status, $orderby, $max); if (ref($Cases) eq 'ARRAY') { #loop through cases, and populate stash with them, I think foreach my $case (@$Cases) { my @case_numbers = @{ $case->{ixBug} }; my $case_number = $case_numbers[0]; my $category = $case->{'sCategory'}; my $title = $case->{'sTitle'}; my $status = $case->{'sStatus'}; my $priority = $case->{'sPriority'}; $ctx->stash("current_case_number",$case_number); $ctx->stash("current_case_category",$category); $ctx->stash("current_case_title",$title); $ctx->stash("current_case_status",$status); $ctx->stash("current_case_priority",$priority); $out .= $builder->build($ctx,$tokens,$cond); } } else { $out = ""; } return $out; } sub _hdlr_GetCaseNumber { my ($ctx, $args, $cond) = @_; my $CaseNumber = $ctx->stash('current_case_number'); return $CaseNumber; } sub _hdlr_GetCaseCategory { my ($ctx, $args, $cond) = @_; my $CaseCategory = $ctx->stash('current_case_category'); return $CaseCategory; } sub _hdlr_GetCaseTitle { my ($ctx, $args, $cond) = @_; my $CaseTitle = $ctx->stash('current_case_title'); return $CaseTitle; } sub _hdlr_GetCaseStatus { my ($ctx, $args, $cond) = @_; my $CaseStatus = $ctx->stash('current_case_status'); return $CaseStatus; } sub _hdlr_GetCasePriority { my ($ctx, $args, $cond) = @_; my $CasePriority = $ctx->stash('current_case_priority'); return $CasePriority; } sub getCases() { my $project = shift; my $fixfor = shift; my $status = shift; my $orderby = shift; my $max = shift; $max = int($max); if (!$status) { $status = "Active"; } if (!$orderby) { $orderby = "Case"; } my $fogbugz = logonFogbugz(); my %Cases = $fogbugz->request_method('search', { q => "project:\"$project\" fixfor:\"$fixfor\" status:\"$status\" orderby:\"$orderby\" ", cols => 'ixBug,sCategory,sTitle,sStatus,sPriority', max => $max, }); my ($content) = %Cases; #let's try parsing it my $parsed_content = XMLin($content); my $Cases = $parsed_content->{cases}->{case}; return $Cases; } sub getFixfors() { #to do -- function that gets all releases from fbz for a given project } sub logonFogbugz() { my $plugin = MT::Plugin::MTFogger->instance; my $config = $plugin->get_config_hash(); #get parameters from settings my $FbzLogin = $config->{FbzLogin}; my $FbzPassword = $config->{FbzPassword}; my $FbzBaseurl = $config->{FbzBaseurl}; my $fogbugz = WebService::FogBugz->new({ email => $FbzLogin, password => $FbzPassword, base_url => $FbzBaseurl }); my $result = $fogbugz->logon; return $fogbugz; }