[MKDoc-commit] Added file from Sam that should have been part of last commit.

chris at mkdoc.demon.co.uk chris at mkdoc.demon.co.uk
Mon May 16 10:36:26 BST 2005


Log Message:
-----------
Added file from Sam that should have been part of last commit.

Tags:
----
mkdoc-1-6

Added Files:
-----------
    mkd/flo/plugin/Admin:
        Group.pm

-------------- next part --------------
--- /dev/null
+++ flo/plugin/Admin/Group.pm
@@ -0,0 +1,209 @@
+package flo::plugin::Admin::Group;
+use strict;
+use warnings;
+
+=head1 NAME
+
+flo::plugin::Admin::Group - administrative interface for groups
+
+=head1 SYNOPSIS
+
+Link to this plugin like so:
+
+  <a href=".admin.group">Groups</a>
+
+=head1 DESCRIPTION
+
+This plugin provides an administrative interface for groups.
+
+=head1 AUTHOR
+
+Sam Tregar <sam at tregar.com>
+
+=head1 COPYRIGHT
+
+Copyright MKDoc Holdings Ltd, 2005
+
+=head1 LICENSE
+
+MKDoc is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your
+option) any later version.
+
+MKDoc is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with MKDoc; if not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+=cut
+
+use flo::Standard;
+use base qw /flo::Plugin/;
+
+# only admin can access this plugin
+sub activate {
+    my $self = shift;
+    $self->SUPER::activate(@_) || return;
+    $self->user()->id() == 1   || return;
+    return 1;
+}
+
+# setup the template for this runmode
+sub template_path { 
+    my $self = shift;
+    my $rm   = $self->runmode;
+    return 'admin/group_list' if $rm eq 'list';
+    return 'admin/group_edit' if $rm eq 'edit';
+    return 'admin/group_add'  if $rm eq 'add';
+    return 'admin/group_confirm_delete'  if $rm eq 'confirm_delete';
+    die "Couldn't find a template for runmode $rm!";
+}
+
+# HTTP form handlers
+sub http_get  { 
+    my $self = shift;
+    my $rm   = $self->runmode;
+    if ($rm eq 'list') {
+        return $self->output();
+    } elsif ($rm eq 'edit') {
+        return $self->output();
+    } elsif ($rm eq 'add') {
+        return $self->output();
+    } elsif ($rm eq 'save') {
+        return $self->save();
+    } elsif ($rm eq 'confirm_delete') {
+        return $self->output();
+    } elsif ($rm eq 'delete') {
+        return $self->delete_group();
+    } else {
+        die "Unknown runmode $rm.";
+    }
+}
+sub http_post { goto &http_get; }
+
+# render the template for this runmode
+sub output {
+    my $self = shift;
+
+    # render the template
+    $self->render_http(
+                       self       => $self,
+                       object     => $self->parent,
+                       __input__  => 'XML',
+                       __output__ => 'XHTML',
+                      );
+    return 'TERMINATE';
+}
+
+# delete a group
+sub delete_group {
+    my $self = shift;
+    my $dbh = lib::sql::DBH->get();
+    my $cgi = flo::Standard::cgi();
+    my $id  = $cgi->param('id');
+
+    # wipe out the group
+    $dbh->do('DELETE FROM Editor_Grp WHERE Grp_ID = ?',   undef, $id);
+    $dbh->do('DELETE FROM Document_Grp WHERE Grp_ID = ?', undef, $id);
+    $dbh->do('DELETE FROM Grp WHERE ID = ?',              undef, $id);
+
+    # send the user back to list view
+    $self->runmode('list');
+    return $self->output();
+}
+
+# save data from edit or add forms
+sub save {
+    my $self = shift;
+    my $dbh = lib::sql::DBH->get();
+    my $cgi = flo::Standard::cgi();
+    my $id          = $cgi->param('id');
+    my $name        = $cgi->param('name');
+    my $description = $cgi->param('description');
+
+    # make sure name isn't empty
+    unless (defined $name and length $name) {
+        new MKDoc::Ouch 'admin/group/missing_name';
+    }
+
+    # make sure the name isn't taken
+    if ($id) {
+        if ($dbh->selectrow_array('SELECT 1 FROM Grp 
+                                   WHERE Name = ? AND ID != ?', 
+                                  undef, $name, $id)) {
+            new MKDoc::Ouch 'admin/group/name_conflict';
+        }
+    } else {
+        if ($dbh->selectrow_array('SELECT 1 FROM Grp WHERE Name = ?',
+                                  undef, $name)) {
+            new MKDoc::Ouch 'admin/group/name_conflict';
+        }
+    }
+
+    # send the user back to edit/add if there are problems
+    if ($self->has_errors) {
+        $self->runmode($id ? 'edit' : 'add');
+        return $self->output();
+    }
+    
+    # do the update/insert
+    if ($id) {
+        $dbh->do('UPDATE Grp SET Name = ?, Description = ? WHERE ID = ?',
+                 undef, $name, $description, $id);
+    } else {
+        $dbh->do('INSERT INTO Grp (Name, Description) VALUES (?,?)',
+                 undef, $name, $description);
+    }
+
+    # send the user back to list
+    $self->runmode('list');
+    return $self->output();
+}
+
+sub groups {
+    my $dbh = lib::sql::DBH->get();
+    my $results = $dbh->selectall_arrayref(
+      'SELECT ID, Name, Description FROM Grp ORDER BY name');
+    return [ map { { id          => $_->[0],
+                     name        => $_->[1],
+                     description => $_->[2] } } @$results ];
+}
+
+# return group data for the current group if ID is set.  If ID is
+# unset it just echos back the query data.
+sub group {
+    my $self = shift;
+    my $cgi = flo::Standard::cgi();
+    my $group_id = $cgi->param('id');
+
+    my ($name, $description) = 
+      ($cgi->param('name'), $cgi->param('description'));
+
+    if ($group_id) {
+        my $dbh = lib::sql::DBH->get();
+        my $results = $dbh->selectrow_arrayref(
+                        'SELECT Name, Description FROM Grp WHERE ID = ?', 
+                        undef, $group_id);
+        $name        = defined $name        ? $name        : $results->[0];
+        $description = defined $description ? $description : $results->[1];
+    }
+
+    return { id          => $group_id,
+             name        => $name,
+             description => $description };
+}
+
+# gets and sets the current runmode;
+sub runmode {
+    my $self = shift;
+    my $cgi = flo::Standard::cgi();
+    $cgi->param(rm => shift) if @_;
+    return $cgi->param('rm') || 'list';
+}
+
+1;


More information about the MKDoc-commit mailing list