Hi,
I have had to bulk update user options in the past as well and wrote a short python script that iterates over all the users and sets the options. It's not generalized yet (this was a one-off), so you would need to change the code slightly to connect to the db and set specific options, but its simple enough that this isn't too cumbersome.
I guess its goofy to have rewritten the de/coding in another language, but the user option blob was simple enough and I just needed to do this once.
hope that helps, /Jonah
#!/usr/bin/python
""" simple script to deal w/ bulk modifications of mediawiki user options, which are blobs
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
"""
import sys import re import MySQLdb
DB_USER="xxxxxxxxx" DB_PASSWD="xxxxxxxxx"
def getConnection(): conn = MySQLdb.connect(host="localhost", user=DB_USER, passwd=DB_PASSWD, db="susdev_wiki") return conn
class UserOptions: def __init__(self, conn, name): self.name = name self.optionsDict = {} self.loadOptions(conn)
def loadOptions(self, conn): c = conn.cursor() c.execute("SELECT user_options FROM user WHERE user_name = '%s'" % self.name) optionsBlob = c.fetchone()[0] # print optionsBlob self._decodeOptions(optionsBlob) c.close() # return self.optionsDict
def setOption(self, name, value): print "Changing %s's %s->%s\n" % (self.name, name, value) self.optionsDict[name] = value
def saveOptions(self, conn): optionsBlob = self._encodeOptions() c = conn.cursor() c.execute("update user SET user_options = '%s' WHERE user_name = '%s'" % (optionsBlob, self.name)) c.close()
def _encodeOptions(self): blobList = ["%s=%s" % (i,k) for i,k in self.optionsDict.items()] return "\n".join(blobList)
def _decodeOptions(self, optionsBlob): """ ripped from the User.php functions that do this in teh mediwiki """ pattern = re.compile("^(.[^=]*)=(.*)$") optionPairs = optionsBlob.split("\n") # import pdb; pdb.set_trace() for pair in optionPairs: m = pattern.match(pair) if m: name, value = (m.group(1), m.group(2)) self.optionsDict[name] = value
def main (argv=None): conn = getConnection()
cur = conn.cursor() cur.execute("SELECT user_name from user") usernames = [row[0] for row in cur.fetchall()] cur.close() for user in usernames: print "Processing %s" % user u = UserOptions(conn, user) u.setOption("skin", "<NEW VALUE>") u.saveOptions(conn)
conn.close() print "Done\n"
if __name__ == "__main__": sys.exit(main())