[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 @@
 &nbsp;
 [/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