[interchange-cvs] interchange - heins modified 4 files
interchange-cvs at icdevgroup.org
interchange-cvs at icdevgroup.org
Fri Nov 4 00:14:24 EST 2005
User: heins
Date: 2005-11-04 05:14:24 GMT
Modified: dist/lib/UI/pages/admin order.html customer.html
Modified: db_metaconfig.html
Added: code/UI_Tag user_merge.tag
Log:
* Add support to do user merge.
* Designed to take care of the case where a customer forgets their
ID and creates a new account.
* Adds radio box to select target, button to merge the users. Should
be self-explanatory, but probably should be added to UI documentation.
* Actions are logged, by default in logs/merge_users.log.
Revision Changes Path
1.1 interchange/code/UI_Tag/user_merge.tag
rev 1.1, prev_rev 1.0
Index: user_merge.tag
===================================================================
# Copyright 2005 Interchange Development Group (http://www.icdevgroup.org/)
# Licensed under the GNU GPL v2. See file LICENSE for details.
# $Id: user_merge.tag,v 1.1 2005/11/04 05:14:23 mheins Exp $
UserTag user-merge Order from to
UserTag user-merge addAttr
UserTag user-merge Description Merges users based on order number or username
UserTag user-merge Routine <<EOR
sub {
my ($from, $to, $opt) = @_;
#::logDebug("Called user merge");
use vars qw/$Tag $CGI/;
my $err = sub {
my $msg = errmsg(@_);
logError($msg);
$Tag->error({ name => 'order merge', set => $msg });
return undef;
};
unless($Vend::admin) {
return $err->("Only admin can merge records.");
}
unless($Vend::superuser) {
return $err->("Only admin can merge records.")
unless $Tag->if_mm('advanced', 'merge_users');
}
$from ||= $CGI->{item_id};
$to ||= $CGI->{item_radio};
my $table = $opt->{table} || $CGI->{mv_data_table};
if($opt->{from_user} or $opt->{from_order}) {
## We are told what to do
}
elsif($table eq 'userdb') {
$opt->{from_user} = 1;
}
elsif ($table eq 'transactions') {
$opt->{from_order} = 1;
}
else {
return $err->("Unable to determine what to do, no table or from_user...");
}
my $ufield = $opt->{user_field} || 'username';
my $ofield = $opt->{order_field} || 'order_number';
my $utab = $opt->{user_table} || $::Variable->{UI_USER_MERGE_USER_TABLE} || 'userdb';
my $ttabs = $opt->{merge_tables} || $::Variable->{UI_USER_MERGE_TABLES} || 'transactions orderline';
my @ttab = grep /\w/, split /[\s,\0]+/, $ttabs;
my %kfield;
my %sth;
my %dbh;
my %dbr;
my %query;
for(@ttab) {
my ($t, $f) = split /[=:]+/, $_, 2;
$_ = $t;
$kfield{$t} = $f || $ufield;
}
my $tdb = dbref($ttab[0])
or return $err->("No %s table.", $ttab[0]);
my $udb = dbref($utab)
or return $err->("No %s table.", $utab);
for(@ttab) {
my $db = $dbr{$_} = dbref($_)
or return $err->("Unable to open '%s' table for merge.", $_);
my $dbh = $dbh{$_} = $db->dbh();
$query{$_} = "update $_ set $kfield{$_} = ? where $kfield{$_} = ?";
$sth{$_} = $dbh->prepare($query{$_})
or return $err->("Unable to prepare statement '%s' for merge.", $query{$_});
}
my $to_user = $to;
if($opt->{from_order}) {
$to_user = $tdb->field($to, $ufield);
}
my $urec = $udb->row_hash($to_user)
or return $err->("%s does not exist, cannot merge to that user.", $to_user);
my @from;
if(ref($from) eq 'ARRAY') {
@from = @$from;
}
else {
@from = split /\0/, $from;
}
my %from_user;
if($opt->{from_order}) {
my @to;
for(@from) {
my $okey = $tdb->foreign($_, $ofield);
my $user = $tdb->field($okey, $ufield);
push @to, $user;
}
@from = @to;
}
for(@from) {
next if $_ eq $to_user;
unless($from_user{$_} or $udb->field($_, 'username')) {
$err->("User '%s' does not exist.", $_);
next;
}
$from_user{$_}++;
}
my @users = sort keys %from_user;
my @record;
@record = @users;
my $logfile = $opt->{logfile} || 'logs/merged_users.log';
my $done_one;
for my $user (@users) {
$Tag->log({ type => 'text', file => $logfile, body => $Tag->time() . "\n" } )
unless $done_one++;
for(@ttab) {
$sth{$_}->execute($to_user, $user)
or $err->("%s update failed: %s", $_, $dbh{$_}->errstr);
my $o = $query{$_};
$o =~ s/\?/$to_user/;
$o =~ s/\?/$user/;
push @record, $o;
}
my $urec = $udb->row_hash($user);
my $ustring = ::uneval($urec);
$Tag->log({ type => 'text', file => $logfile, body => "delete user $user=$ustring\n"} );
$udb->delete_record($user)
unless $opt->{no_delete};
push @record, "delete user $user" unless $opt->{no_delete};
}
push @record, '';
$Tag->log({ type => 'text', file => $logfile, body => join("\n", @record)} );
::logDebug(join("\n", @record)) if $opt->{debug};
return 1 unless $opt->{hide};
return '';
}
EOR
2.19 +13 -1 interchange/dist/lib/UI/pages/admin/order.html
rev 2.19, prev_rev 2.18
Index: order.html
===================================================================
RCS file: /var/cvs/interchange/dist/lib/UI/pages/admin/order.html,v
retrieving revision 2.18
retrieving revision 2.19
diff -u -r2.18 -r2.19
--- order.html 23 Apr 2005 18:10:07 -0000 2.18
+++ order.html 4 Nov 2005 05:14:24 -0000 2.19
@@ -321,6 +321,7 @@
order=[item-code]
']"
onClick="return confirm('Are you sure you want to delete order [item-code]?')"><IMG src="delsm.gif" ALT="DELETE [item-code]" BORDER=0></A>
+<input type="radio" name="item_radio" value="[item-code]" title="Select target for merge">
[/if]
</td>
<TD>[page href=__UI_BASE__/order_view form="order=[item-code]"][item-code]</A></td>
@@ -368,6 +369,17 @@
[/if]
+[if-mm advanced merge_users]
+[button form=batch
+ no-src="[scratch archive_img]"
+ extra="class=s3"
+ link-text-too=1
+ text="Merge orders from checked users to one user"
+ ]
+[user-merge from="[cgi order]" to="[cgi item_radio]" from-order=1]
+[/button]
+[/if-mm]
+
[button form=batch
no-src="[scratch archive_img]"
extra="class=s3"
@@ -498,4 +510,4 @@
@_UI_STD_FOOTER_@
-<!-- page: @@MV_PAGE@@ version: $Id: order.html,v 2.18 2005/04/23 18:10:07 pvinci Exp $ -->
+<!-- page: @@MV_PAGE@@ version: $Id: order.html,v 2.19 2005/11/04 05:14:24 mheins Exp $ -->
2.18 +13 -0 interchange/dist/lib/UI/pages/admin/customer.html
rev 2.18, prev_rev 2.17
Index: customer.html
===================================================================
RCS file: /var/cvs/interchange/dist/lib/UI/pages/admin/customer.html,v
retrieving revision 2.17
retrieving revision 2.18
diff -u -r2.17 -r2.18
--- customer.html 23 Apr 2005 18:10:07 -0000 2.17
+++ customer.html 4 Nov 2005 05:14:24 -0000 2.18
@@ -294,6 +294,7 @@
onClick="return confirm('Are you sure you want to delete customer [item-code]?')"
title=delete
><IMG src="delsm.gif" ALT="DELETE [item-code]" BORDER=0></A>
+<input type="radio" name="item_radio" value="[item-code]" title="Select target for merge">
[/if]
</td><td>
[page href=__UI_BASE__/customer_view
@@ -335,6 +336,18 @@
<br>
[on-match]
[output name=bottom_buttons]
+
+[if-mm advanced merge_users]
+[button form=batch
+ no-src="[scratch archive_img]"
+ extra="class=s3"
+ link-text-too=1
+ text="[L]Merge checked users to one user[/L]"
+ confirm="Are you sure you want to merge checked users to one user?"
+ ]
+[user-merge from="[cgi customer]" to="[cgi item_radio]" from-user=1]
+[/button]
+[/if-mm]
[if scratch can_delete]
[button extra="class=s3" form=batch text="[L]Delete checked customers[/L]"
confirm='[L]Are you sure you want to delete the checked customers?[/L]']deletecustomer=1
2.22 +7 -1 interchange/dist/lib/UI/pages/admin/db_metaconfig.html
rev 2.22, prev_rev 2.21
Index: db_metaconfig.html
===================================================================
RCS file: /var/cvs/interchange/dist/lib/UI/pages/admin/db_metaconfig.html,v
retrieving revision 2.21
retrieving revision 2.22
diff -u -r2.21 -r2.22
--- db_metaconfig.html 25 Apr 2005 05:30:44 -0000 2.21
+++ db_metaconfig.html 4 Nov 2005 05:14:24 -0000 2.22
@@ -77,6 +77,7 @@
extended.explicit_edit extended.number_list
extended.no_code_link extended.no_checkbox
extended.check_uncheck_all
+ extended.radio_box extended.user_merge
extended.ui_sort_field
extended.ui_sort_option
extended.ui_sort_combined
@@ -153,6 +154,8 @@
'extended.no_code_link' => "Don't link key column to editor",
'extended.no_checkbox' => "No checkbox for group ops",
'extended.check_uncheck_all' => 'Links to check/uncheck all',
+ 'extended.radio_box' => 'Generate radio box for single selection',
+ 'extended.user_merge' => 'Offer user merge option',
'extended.number_list' => "Number the entries",
'extended.display_type' => "Table cell display type",
'extended.file_upload' => 'Allow file upload for this table',
@@ -229,6 +232,7 @@
'extended.panel_height' => 'Default 500 pixels.',
'extended.panel_width' => 'Default 800 pixels.',
'extended.tab_height' => 'Default 20 pixels.',
+ 'extended.user_merge' => 'Only active for userdb and transactions table',
'extended.ui_profile' => 'Standard form profile like order check or mv_form_profile',
'extended.filter_field' => q{
Specified one per line:
@@ -273,6 +277,8 @@
'extended.no_checkbox' => 'yesno',
'extended.number_list' => 'yesno',
'extended.check_uncheck_all' => 'yesno',
+ 'extended.radio_box' => 'yesno',
+ 'extended.user_merge' => 'yesno',
'extended.file_upload' => 'yesno',
'extended.display_type' => 'select',
'extended.filter_field' => 'textarea_2_40',
@@ -401,4 +407,4 @@
]
@_UI_STD_FOOTER_@
-<!-- page: @@MV_PAGE@@ version: $Revision: 2.21 $ -->
+<!-- page: @@MV_PAGE@@ version: $Revision: 2.22 $ -->
More information about the interchange-cvs
mailing list