discourse-legacysite-perl/site/glist/lib/GList/Profile.pm
2024-06-17 21:49:12 +10:00

394 lines
14 KiB
Perl

# ==================================================================
# Gossamer List - enhanced mailing list management system
#
# Website : http://gossamer-threads.com/
# Support : http://gossamer-threads.com/scripts/support/
# CVS Info :
# Revision : $Id: Profile.pm,v 1.39 2004/10/14 22:57:54 bao Exp $
#
# Copyright (c) 2004 Gossamer Threads Inc. All Rights Reserved.
# Redistribution in part or in whole strictly prohibited. Please
# see LICENSE file for full details.
# ==================================================================
#
package GList::Profile;
use strict;
use GList qw/:objects :user_type $DEBUG/;
use GT::AutoLoader;
sub process {
#--------------------------------------------------
# Determine what to do
#
my $do = $IN->param('do') || '';
my $action = _determine_action($do) or die "Error: Invalid Action! ($do)";
my ($tpl, $results) = GT::Plugins->dispatch($CFG->{priv_path}.'/lib/GList/Plugins', $action, \&$action);
if ($tpl) {
my $hidden = GList::hidden();
$results->{hidden_query} = $hidden->{hidden_query};
$results->{hidden_objects} = $hidden->{hidden_objects};
GList::display($tpl, $results);
}
}
$COMPILE{pro_profile} = <<'END_OF_SUB';
sub pro_profile {
#-------------------------------------------------------------------------
# print account information
#
my $msg = shift;
my $db = $DB->table('Users');
my $info = $db->get($USER->{usr_username});
my $cols = $db->cols();
my $hsh = {};
foreach (keys %$cols) {
$hsh->{"mod_$_"} = $info->{$_};
}
my $pg = ($IN->param('pro_mailing')) ? 'pro_mailing.html' : 'pro_profile.html';
return ($pg, { msg => $msg, %$hsh });
}
END_OF_SUB
$COMPILE{pro_update} = <<'END_OF_SUB';
sub pro_update {
#---------------------------------------------------------
# Update account information
#
#------------demo code-----------
my $db = $DB->table('Users');
my $cols = $db->cols();
my $cgi = $IN->get_hash();
my %restricted_field = (
usr_username => 1,
usr_password => 1,
usr_status => 1,
usr_type => 1,
usr_limit_list => 1,
usr_limit_sublist=> 1,
usr_limit_email30=> 1,
usr_validate_code=> 1
);
my $hsh;
foreach (keys %$cols) {
next if (exists $restricted_field{$_});
$hsh->{$_} = $cgi->{"mod_$_"} if (exists $cgi->{"mod_$_"});
}
$hsh->{usr_date_format} = $IN->param('date_preview') if ($IN->param('date_preview'));
$hsh->{usr_date_format}||= "%yyyy%-%mm%-%dd%";
$hsh->{usr_username} = $USER->{usr_username};
$hsh->{usr_updated} = '1';
if ($db->modify($hsh)) {
my $msg = ($cgi->{pro_mailing}) ? GList::language('USR_TPL_UPDATED') : GList::language('USR_UPDATED', $USER->{usr_username});
return pro_profile($msg);
}
else {
local $^W;
return pro_profile("<font color=red><b>$GT::SQL::error</b></font>");
}
}
END_OF_SUB
$COMPILE{pro_password} = <<'END_OF_SUB';
sub pro_password {
#---------------------------------------------------------
# Update the new password
#
return ('pro_password_form.html') if ($IN->param('form'));
#------------demo code-----------
my $old = $IN->param('old_pass');
my $new = $IN->param('new_pass');
my $con = $IN->param('con_pass');
return ('pro_password_form.html', { msg => GList::language('ADM_PWD_ERR') }) if (!$old or !$new or !$con);
return ('pro_password_form.html', { msg => GList::language('ADM_PWD_NOT_MATCH') }) if ($new ne $con);
return ('pro_password_form.html', { msg => GList::language('ADM_PWD_INVALID') }) if ($new ne $con or length $new < 4);
my $db = $DB->table('Users');
my $user = $db->get($USER->{usr_username});
return ('pro_password_form.html', { msg => GList::language('ADM_OLDPWD_ERR') }) if ($user->{usr_password} ne GList::encrypt($old, $user->{usr_password}));
my $crypted = GList::encrypt($new);
if ($db->update({ usr_password => $crypted }, { usr_username => $USER->{usr_username} })) {
if ($USER->{usr_type} == ADMINISTRATOR and exists $CFG->{admin}->{$USER->{usr_username}}) { # Update new password in Data.pm
$CFG->{admin}->{$USER->{usr_username}}->[0] = $crypted;
$CFG->save();
}
return pro_profile(GList::language('ADM_PWD_CHANGED'));
}
else {
local $^W;
return ('pro_password_form.html', { msg => "<font color=red><b>$GT::SQL::error</b></font>" });
}
}
END_OF_SUB
$COMPILE{pro_report} = <<'END_OF_SUB';
sub pro_report {
#-----------------------------------------------------------
# Build report
#
return ('pro_report_form.html') if ($IN->param('form'));
my $id = $IN->param('id');
if ($USER->{usr_type} != ADMINISTRATOR) {
return _report_details($USER->{usr_username});
}
elsif ($USER->{usr_type} == ADMINISTRATOR and $IN->param('d')) { # Show the details reports
my $info = $DB->table('Users')->get($id);
return ('pro_report.html', { msg => GList::language('RPT_NOT_FOUND', $id) }) if (!$info);
return _report_details($id);
}
my ($from, $to, $mm, $yy, $msg, $url, $toolbar_query);
my $date_format = $USER->{usr_date_format} || '%yyyy%-%mm%-%dd%';
my @items = ('date_to', 'date_from');
# Create url
foreach (@items) {
$url .= "&$_=".$IN->param($_) if ($IN->param($_));
}
if ($IN->param('date_from') or $IN->param('date_to')) {
require GT::Date;
my $date_from = $IN->param('date_from');
my $date_to = $IN->param('date_to');
my ($valid_from, $valid_to) = (1, 1);
if ($date_from) {
$toolbar_query .= "date_from=$date_from;";
$valid_from = GList::date_to_time($date_from, $date_format);
$date_from = GT::Date::date_get($valid_from, $date_format) if ($valid_from);
}
if ($date_to) {
$toolbar_query .= "date_to=$date_to;";
$valid_to = GList::date_to_time($date_to, $date_format);
$date_to = GT::Date::date_get($valid_to, $date_format) if ($valid_to);
}
if (!$valid_from or !$valid_to) {
$date_format =~ s/\%//g;
return ('pro_report_form.html', { msg => GList::language('SYS_DATE_FORMAT_INVALID', uc GList::language('SYS_DATE_FORMAT')) });
}
$from = GT::Date::timelocal(GT::Date::parse_format($date_from, $date_format));
$to = GT::Date::timelocal(GT::Date::parse_format($date_to.' 23:59:59', "$date_format %hh%:%MM%:%ss%"));
$msg = GList::language('RPT_CUS_FROM', $date_from)
. ($IN->param('date_to') ? GList::language('RPT_CUS_TO', $date_to) : '')
. '</b></font>';
}
else {
($from, $to) = _period_time();
($mm, $yy) = _period_time(1);
$toolbar_query .= "month=".$IN->param('month').";" if ($IN->param('month'));
$toolbar_query .= "year=".$IN->param('year').";" if ($IN->param('year'));
if ($IN->param('month') or $IN->param('year') or !defined $IN->param('flag')) {
$msg = GList::language('RPT_SUMARY'). (( $IN->param('flag') and !$IN->param('month') ) ? '' : "$mm/");
$msg .= ( $IN->param('flag') and !$IN->param('month') ) ? $IN->param('year') : "$yy</b>";
$url .= (( $IN->param('flag') and !$IN->param('month') ) ? '' : "&month=$mm"). "&year=$yy";
}
else {
$msg = GList::language('RPT_TITLE2');
}
}
# Load database object
require GT::SQL::Condition;
my $db = $DB->table('MailingIndex');
my $cd = new GT::SQL::Condition('mli_done', '>=', $from, 'mli_done', '<=', $to);
$db->select_options('GROUP BY mli_user_id_fk ORDER BY mli_user_id_fk');
$cd->add('mli_user_id_fk', 'like', "%$id%") if ( $id );
my $sth = $db->select($cd, ['mli_user_id_fk as email', 'count(mli_id) as sent']);
my $hsh = {};
while (my ($id, $sent) = $sth->fetchrow_array) {
$hsh->{$id} += $sent;
}
# Get user listings
my $db_usr = $DB->table('Users');
my $cd_usr = new GT::SQL::Condition();
my $sb = $IN->param('sb') || 'usr_username';
my $so = $IN->param('so') || 'ASC';
$cd_usr->add('usr_username', 'like', "%$id%") if ( $id );
my $mh = $IN->param('mh') || 25;
my $nh = $IN->param('nh') || 1;
my $ns = ($nh == 1) ? 0 : ( $nh - 1 ) * $mh;
$db_usr->select_options("ORDER BY usr_type desc, $sb $so", "LIMIT $ns, $mh");
my $users = $db_usr->select($cd_usr);
my $hits = $db_usr->hits;
return ('pro_report.html', { msg => GList::language('RPT_NO_RESULT') }) if ($hits == 0);
my @output;
while ( my $rs = $users->fetchrow_hashref ) {
$rs->{sent} = $hsh->{$rs->{usr_username}} if ($hsh->{$rs->{usr_username}});
push @output, $rs;
}
return ('pro_report.html', {
msg => $msg,
results => \@output,
hits => $hits,
mh => $mh,
nh => $nh,
url => $url,
toolbar_query => $toolbar_query,
});
}
END_OF_SUB
$COMPILE{_report_details} = __LINE__ . <<'END_OF_SUB';
sub _report_details {
#-----------------------------------------------------------
# Build report details
#
my $id = shift;
my $cgi = $IN->get_hash();
my $db = $DB->table('MailingIndex', 'EmailMailings');
my $cd = new GT::SQL::Condition(mli_user_id_fk => '=' => $id, eml_sent => '<>' => 0);
my $mh = $cgi->{mh} || 25;
my $nh = $cgi->{nh} || 1;
my $sb = $cgi->{sb} || 'mli_id';
my $so = $cgi->{so} || 'DESC';
my $ns = ( $nh == 1 ) ? 0 : ( $nh - 1 ) * $mh;
my $date_format = $USER->{usr_date_format} || '%mm%-%dd%-%yyyy%';
my $query = "id=$id;d=1;";
my ($period, $mm, $yy, $from, $to);
if ($cgi->{date_from} or $cgi->{date_to}) { # Searching by date
require GT::Date;
my ($valid_from, $valid_to) = (1, 1);
my $date_from = $cgi->{date_from};
my $date_to = $cgi->{date_to};
if ($date_from) {
$query .= "date_from=$cgi->{date_from};";
$period = " from <b>$cgi->{date_from}</b>";
$valid_from = GList::date_to_time($cgi->{date_from}, $date_format);
$date_from = GT::Date::date_get($valid_from, $date_format) if ($valid_from);
}
if ($date_to) {
$query .= "date_to=$cgi->{date_to};";
$period .= " to <b>$cgi->{date_to}";
$valid_to = GList::date_to_time($date_to, $date_format);
$date_to = GT::Date::date_get($valid_to, $date_format) if ($valid_to);
}
if (!$valid_from or !$valid_to) {
$date_format =~ s/\%//g;
return ('pro_report_form.html', { msg => GList::language('SYS_DATE_FORMAT_INVALID', uc GList::language('SYS_DATE_FORMAT')) });
}
$from = GT::Date::timelocal(GT::Date::parse_format($date_from, $date_format));
$to = GT::Date::timelocal(GT::Date::parse_format($date_to.' 23:59:59', "$date_format %hh%:%MM%:%ss%"));
}
else {
($from, $to) = _period_time();
($mm, $yy) = _period_time(1);
$period = (( $cgi->{month} ) ? "$cgi->{month}/$cgi->{year}" : $cgi->{year});
$query .= "month=$cgi->{month};" if ($cgi->{month});
$query .= "year=$cgi->{year};" if ($cgi->{year});
}
require GT::SQL::Condition;
$cd->new('mli_done', '>=', $from, 'mli_done', '<=', $to);
$db->select_options("GROUP BY mli_id, mli_subject, mli_done ORDER BY $sb $so");
$db->select($cd, ['mli_id', 'mli_subject', 'mli_done', 'count(eml_mailing_id_fk) as "sent"']);
my $hits = $db->hits;
return ('pro_report.html', { msg => GList::language('RPT_NO_RESULT') }) if ($hits == 0);
$db->select_options("GROUP BY mli_id, mli_subject, mli_done ORDER BY $sb $so", "LIMIT $ns, $mh");
my $results = $db->select($cd, ['mli_id', 'mli_subject', 'mli_done', 'count(eml_mailing_id_fk) as "sent"'])->fetchall_hashref or die $GT::SQL::error;
my ($total) = $db->select($cd, ['count(*) as total'])->fetchrow_array;
my $msg = ( $period ) ? GList::language('RPT_TITLE', $period) : GList::language('RPT_TITLE2');
return ('pro_report.html', {
msg => $msg,
results => $results,
hits => $hits,
mh => $mh,
nh => $nh,
url => "month=$mm;year=$yy;id=$id;d=1",
total_recipients => $total,
toolbar_query => $query
});
}
END_OF_SUB
$COMPILE{pro_template} = <<'END_OF_SUB';
sub pro_template {
#-------------------------------------------------------------------------
# Edit the email template
#
return ('pro_template.html');
}
END_OF_SUB
$COMPILE{_period_time} = __LINE__ . <<'END_OF_SUB';
sub _period_time {
#--------------------------------------------------------------------
# Convert a date to unix time
#
my $type = shift;
require GT::Date;
require GT::SQL::Condition;
my ($from, $to);
my $mm = $IN->param('month') || GT::Date::date_get(time, '%mm%');
my $yy = $IN->param('year') || GT::Date::date_get(time, '%yyyy%');
return ($mm, $yy) if (defined $type and $type == 1);
if (!$IN->param('month') and $IN->param('flag')) {
$type = 2;
}
if ( !$type ) {
$from = GT::Date::timelocal(GT::Date::parse_format("$yy-$mm-01", '%yyyy%-%mm%-%dd%'));
$to = GT::Date::timelocal(GT::Date::parse_format("$yy-$mm-30 00:00:00", '%yyyy%-%mm%-%dd% %hh%:%MM%:%ss%'));
}
else {
$from = GT::Date::timelocal(GT::Date::parse_format("$yy-01-01", '%yyyy%-%mm%-%dd%'));
$to = GT::Date::timelocal(GT::Date::parse_format("$yy-12-31 23:59:59", '%yyyy%-%mm%-%dd% %hh%:%MM%:%ss%'));
}
return ($from, $to);
}
END_OF_SUB
$COMPILE{_determine_action} = __LINE__ . <<'END_OF_SUB';
sub _determine_action {
#----------------------------------------------------------------------------
# Check valid action
#
my $action = shift || undef;
if ( $action =~ /pro_report/ ) {
$MN_SELECTED = 4;
}
else {
$MN_SELECTED = 5;
}
return if ( !$action );
my %valid = (
map { $_ => 1 } qw(
pro_profile
pro_update
pro_password
pro_report
pro_template
)
);
exists $valid{$action} and return $action;
return;
}
END_OF_SUB
1;