#!/usr/bin/perl -w
package esmith::FormMagick::Panel::minilist ;
use strict ;
use esmith::FormMagick ;
use esmith::ConfigDB ;
use esmith::AccountsDB ;
use File::Basename ;
use Exporter ;
use Carp ;
our @ ISA = qw( esmith::FormMagick Exporter ) ;
our @ EXPORT = qw(
new
get_accounts_prop
get_members
get_html_members
get_description
show_initial
create_list
modify_list
delete_list
validate_list_name
validate_list_description
validate_list_members
) ;
our $ a = esmith::AccountsDB - > open ( ) || die "Couldn't open accounts" ;
our $ db = esmith::ConfigDB - > open || die "Couldn't open config db" ;
sub new {
shift ;
my $ self = esmith::FormMagick - > new ( ) ;
$ self - > { calling_package } = ( caller ) [ 0 ] ;
bless $ self ;
return $ self ;
}
# return the value of a prop from an account object
sub get_accounts_prop {
my $ fm = shift ;
my $ item = shift ;
my $ prop = shift ;
my $ record = $ a - > get ( $ item ) ;
if ( $ record ) {
return $ record - > prop ( $ prop ) ;
}
else {
return '' ;
}
}
# Return the members of a list
sub get_members {
my $ fm = shift ;
my $ q = $ fm - > { cgi } ;
my $ list = $ q - > param ( 'listName' ) || '' ;
my @ members = split /[;,]/ , get_accounts_prop ( $ fm , $ list , 'Members' ) ;
my $ members = join "\n" , @ members ;
return $ members ;
}
# return the members of a list
# to display in HTML
sub get_html_members {
my $ fm = shift ;
my $ q = $ fm - > { cgi } ;
my $ list = $ q - > param ( 'listName' ) || '' ;
my $ members = get_members ( $ fm , $ list ) ;
$ members =~ s/\n/<br>/g ;
return $ members ;
}
# return the description of a list
sub get_description {
my $ fm = shift ;
my $ q = $ fm - > { cgi } ;
my $ list = $ q - > param ( 'listName' ) || '' ;
return get_accounts_prop ( $ fm , $ list , 'Description' ) ;
}
# Print a table with the actual list and a button to create new ones
sub show_initial () {
my $ fm = shift ;
my $ q = $ fm - > { cgi } ;
my @ lists = $ a - > get_all_by_prop ( type = > 'minilist' ) ;
print $ q - > Tr ( $ q - > td (
"<p><a class=\"button-like\" href=\"minilist?page_stack=;page=0;&wherenext=CreateList\">"
. $ fm - > localise ( "LIST_ADD" )
. "</a></p>" ) ) ;
if ( scalar @ lists == 0 ) {
print $ q - > Tr ( $ q - > td (
'<p><b>' . $ fm - > localise ( "NO_LIST_CREATED" ) . '</p></b>' ) ) ;
}
else {
print $ q - > start_table ( { - CLASS = > "sme-border" } ) , "\n" ;
print "<tr><th class=\"sme-border\">"
. $ fm - > localise ( "LIST" )
. "</th> <th class=\"sme-border\">"
. $ fm - > localise ( 'DESCRIPTION' )
. "</th><th class=\"sme-border\" colspan=\"2\">"
. $ fm - > localise ( 'ACTION' )
. "</th></tr>" ;
foreach my $ list ( @ lists ) {
my $ name = $ list - > key ;
print "<tr>" . "<td class=\"sme-border\">"
. $ name . "</td>" . "<td class=\"sme-border\">"
. $ list - > prop ( 'Description' ) . "</td>"
. "<td class=\"sme-border\"><a href=\"minilist?page_stack=;page=0;&listName=$name&wherenext=Modify\">"
. $ fm - > localise ( "MODIFY" ) . "</a></td>"
. "<td class=\"sme-border\"><a href=\"minilist?page_stack=;page=0;&listName=$name&wherenext=Delete\">"
. $ fm - > localise ( "REMOVE" ) . "</a>" . "</td></tr>" ;
}
print $ q - > end_table , "\n" ;
}
return ;
}
# Create a new list
sub create_list {
my $ fm = shift ;
my $ q = $ fm - > { cgi } ;
my $ name = $ q - > param ( 'listName' ) || '' ;
my @ members = split /\r?\n/ , ( $ q - > param ( 'members' ) || '' ) ;
my $ members = join "," , @ members ;
my % props = (
'type' , 'minilist' , 'Description' ,
$ q - > param ( 'listDesc' ) , 'Members' , $ members
) ;
$ a - > new_record ( $ name , \ % props ) ;
( $ name ) = ( $ name =~ /^([a-z0-9][\-\_\.a-z0-9]*)$/ ) ;
return system ( "/sbin/e-smith/signal-event" , "list-create" , "$name" ) ?
$ fm - > error ( 'CREATE_ERROR' ) : $ fm - > success ( 'CREATE_SUCCESS' ) ;
}
# modify an existinbg list
sub modify_list {
my $ fm = shift ;
my $ q = $ fm - > { cgi } ;
my $ name = $ q - > param ( 'listName' ) || '' ;
my @ members = split /\r?\n/ , ( $ q - > param ( 'members' ) || '' ) ;
my $ members = join "," , @ members ;
$ a - > set_prop ( $ name , 'Description' , $ q - > param ( 'listDesc' ) ) ;
$ a - > set_prop ( $ name , 'Members' , $ members ) ;
( $ name ) = ( $ name =~ /^([a-z0-9][\-\_\.a-z0-9]*)$/ ) ;
return system ( "/sbin/e-smith/signal-event" , "list-modify" , "$name" ) ?
$ fm - > error ( 'MODIFY_ERROR' ) : $ fm - > success ( 'MODIFY_SUCCESS' ) ;
}
# delete a list (after confirmation)
sub delete_list {
my $ fm = shift ;
my $ q = $ fm - > { cgi } ;
my $ name = $ q - > param ( 'listName' ) || '' ;
return $ fm - > error ( 'DELETE_ERROR' ) unless $ a - > get ( $ name ) - > delete ;
( $ name ) = ( $ name =~ /^([a-z0-9][\-\_\.a-z0-9]*)$/ ) ;
return system ( "/sbin/e-smith/signal-event" , "list-delete" , "$name" ) ?
$ fm - > error ( 'DELETE_ERROR' ) : $ fm - > success ( 'DELETE_SUCCESS' ) ;
}
# Validate list name
sub validate_list_name {
my $ fm = shift ;
my $ name = shift ;
unless ( $ name =~ /^([a-z0-9][\_\.\-a-z0-9]*)$/ ) {
return $ fm - > localise ( 'INVALID_CHARS' , { string = > $ name } ) ;
}
if ( $ a - > get ( $ name ) ) {
return $ fm - > localise ( 'ACCOUNT_CLASH' , { string = > $ name } ) ;
}
return "OK" ;
}
# Validate list description
sub validate_list_description {
my $ fm = shift ;
my $ desc = shift ;
unless ( $ desc =~ /^([a-zA-Z0-9][\s\w\.\-]*)$/ ) {
return $ fm - > localise ( 'INVALID_CHARS' , { string = > $ desc } ) ;
}
return "OK" ;
}
# Validate memebrs of a list
sub validate_list_members {
my $ fm = shift ;
my $ members = shift ;
foreach my $ member ( split /\r?\n/ , $ members ) {
my $ acc = $ a - > get ( $ member ) ;
if ( $ acc ) {
my $ type = $ acc - > prop ( 'type' ) || 'none' ;
next if ( $ type eq 'user' ) ;
}
unless ( $ member =~ /^[a-zA-Z0-9][\w\.\-]*\@([a-zA-Z0-9\._\-]+\.[a-zA-Z0-9\._\-]+)$/ ) {
return $ fm - > localise ( 'INVALID_CHARS' , { string = > $ member } ) ;
}
}
return "OK" ;
}