Open Monograph Press  3.3.0
MergeUsersTool.inc.php
1 <?php
2 
16 import('lib.pkp.classes.cliTool.CliTool');
17 
19 
21  var $targetSpecifier;
22 
25 
30  function __construct($argv = array()) {
31  parent::__construct($argv);
32 
33  if (!isset($this->argv[0]) || !isset($this->argv[1]) ) {
34  $this->usage();
35  exit(1);
36  }
37 
38  $this->targetSpecifier = $this->argv[0];
39  $this->mergeSpecifiers = array_slice($this->argv, 1);
40  }
41 
45  function usage() {
46  echo "Merge users tool\n"
47  . "Use this tool to merge two or more user accounts.\n\n"
48  . "Usage: {$this->scriptName} targetUsername mergeUsername1 [mergeUsername2] [...]\n"
49  . "targetUsername: The target username for assets to be transferred to.\n"
50  . "mergeUsername1: The username for the account to be merged. All assets (e.g.\n"
51  . " submissions) associated with this user account will be\n"
52  . " transferred to the user account that corresponds to\n"
53  . " targetUsernameusername1. The user account that corresponds\n"
54  . " to username2 will be deleted.\n\n"
55  . "Multiple users to merge can be specified in the same command, e.g.:\n\n"
56  . "{$this->scriptName} myUsername spamUser1 spamUser2 spamUser3\n\n"
57  . "This will merge users with username \"spamUser1\", \"spamUser2\", and\n"
58  . "\"spamUser3\" into the account with username \"myUsername\".\n\n"
59  . "Users can be specified by ID by entering usernames of the form \"id=x\"\n"
60  . "with the username in place of \"x\", e.g.:\n\n"
61  . "{$this->scriptName} myUsername id=234 id=456\n\n"
62  . "Usernames and IDs may be mixed as desired.\n";
63  }
64 
68  function execute() {
69 
70  $targetUser = $this->_getUserBySpecifier($this->targetSpecifier);
71  if (!$targetUser) {
72  echo "Error: \"$this->targetSpecifier\" does not specify a valid user.\n";
73  exit(1);
74  }
75 
76  // Build a list of usernames and IDs, checking for missing users before doing anything.
77  $mergeArray = array();
78  foreach ($this->mergeSpecifiers as $specifier) {
79  $mergeUser = $this->_getUserBySpecifier($specifier);
80  if (!$mergeUser) {
81  echo "Error: \"$specifier\" does not specify a valid user.\n";
82  exit(2);
83  }
84  if ($mergeUser->getId() == $targetUser->getId()) {
85  echo "Error: Cannot merge an account into itself.\n";
86  exit(3);
87  }
88  $mergeArray[$mergeUser->getId()] = $mergeUser->getUsername();
89  }
90 
91  // Merge the accounts.
92  import('classes.user.UserAction');
93  $userAction = new UserAction();
94  foreach ($mergeArray as $userId => $username) {
95  $userAction->mergeUsers($userId, $targetUser->getId());
96  }
97 
98  if (count($mergeArray) == 1) {
99  echo "Merge completed: \"$username\" merged into \"" . $targetUser->getUsername() . "\".\n";
100  } else {
101  echo 'Merge completed: ' . count($mergeArray) . " users merged into \"" . $targetUser->getUsername() . "\".\n";
102  }
103  }
104 
110  protected function _getUserBySpecifier($specifier) {
111  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
112  if (substr($specifier, 0, 3) == 'id=') {
113  return $userDao->getById(substr($specifier, 3));
114  }
115  return $userDao->getByUsername($specifier);
116  }
117 }
118 
CommandLineTool
Initialization code for command-line scripts.
Definition: CliTool.inc.php:44
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
MergeUsersTool\execute
execute()
Definition: MergeUsersTool.inc.php:74
MergeUsersTool\__construct
__construct($argv=array())
Definition: MergeUsersTool.inc.php:36
MergeUsersTool\$targetSpecifier
$targetSpecifier
Definition: MergeUsersTool.inc.php:24
MergeUsersTool\usage
usage()
Definition: MergeUsersTool.inc.php:51
MergeUsersTool
Definition: MergeUsersTool.inc.php:18
MergeUsersTool\_getUserBySpecifier
_getUserBySpecifier($specifier)
Definition: MergeUsersTool.inc.php:116
MergeUsersTool\$mergeSpecifiers
$mergeSpecifiers
Definition: MergeUsersTool.inc.php:30
UserAction
UserAction class.
Definition: UserAction.inc.php:19
CommandLineTool\$argv
$argv
Definition: CliTool.inc.php:53