Revision: 4577 Author: btongminh Date: 2007-11-21 09:39:07 +0000 (Wed, 21 Nov 2007)
Log Message: ----------- Updated version that works with checkboxes
Modified Paths: -------------- trunk/pywikipedia/maintenance/preferences.py
Modified: trunk/pywikipedia/maintenance/preferences.py =================================================================== --- trunk/pywikipedia/maintenance/preferences.py 2007-11-20 12:18:01 UTC (rev 4576) +++ trunk/pywikipedia/maintenance/preferences.py 2007-11-21 09:39:07 UTC (rev 4577) @@ -1,202 +1,208 @@ -""" This module contains a read-write class that represents the user preferences. """ -from HTMLParser import HTMLParser -from htmlentitydefs import name2codepoint - -class Checkbox(object): - def __init__(self, value, state): - self.value = value - self.state = state - def set(self): - self.state = True - def unset(self): - self.state = False - def __bool__(self): - return self.state - def __str__(self): - return str(self.state) - -class Select(list): - def __init__(self): - list.__init__(self, ()) - self.value = u'' - def set(self, value): - self.value = value - def __bool__(self): - return bool(self.value) - def __str__(self): - return str(self.value) - def __unicode__(self): - return unicode(self.value) - -class Preferences(HTMLParser, dict): - def __init__(self, site = None): - HTMLParser.__init__(self) - dict.__init__(self, ()) - self.in_form = False - self.select = None - - if site: self.load(site) - - def handle_entityref(self, name): - if name in name2codepoint: - self.handle_data(unichr(name2codepoint[name])) - else: - self.handle_data(u'&%s;' % name) - def handle_charref(self, name): - try: - self.handle_data(unichr(int(name))) - except ValueError: - self.handle_data(u'&#$s;' % name) - def handle_starttag(self, tag, attrs): - if tag == 'form': - self.in_form = ('method', 'post') in attrs - - attrs = dict(attrs) - if tag == 'input' and self.in_form: - if attrs.get('type', 'text') in ('hidden', 'text'): - if 'value' in attrs and 'name' in attrs: - self[attrs['name']] = attrs['value'] - elif attrs.get('type') == 'checkbox': - self[attrs['name']] = Checkbox(attrs['value'], - 'checked' in attrs) - elif attrs.get('type') == 'radio': - if attrs['name'] not in self: - self[attrs['name']] = Select() - self[attrs['name']].append(attrs['value']) - if 'checked' in attrs: - self[attrs['name']].set(attrs['value']) - if tag == 'select' and self.in_form: - self.select = Select() - self[attrs['name']] = self.select - if tag == 'option' and self.in_form: - if self.select: - self.select.append(attrs['value']) - if 'selected' in attrs: - self.select.set(attrs['value']) - - def handle_endtag(self, tag): - if self.in_form and tag == 'form': - self.in_form = False - if self.select and tag == 'select': - self.select = None - - - def load(self, site): - site.forceLogin() - data = site.getUrl(site.path() + '?title=Special:Preferences') - self.feed(data) - self.close() - self.site = site - - def save(self): - predata = {'wpSaveprefs': '1', 'title': 'Special:Preferences'} - for key, value in self.iteritems(): - if value: - if type(value) in (Checkbox, Select): - predata[key] = value.value - else: - predata[key] = value - self.site.postForm(self.site.path(), predata) - def set(self, key, value): - if key in self: - if type(self[key]) is Select: - return self.key.set(value) - elif type(self[key]) is Checkbox: - if value: - return self[key].set() - else: - return self[key].unset() - self[key] = value - - -def table_cell(value, length): - s = u'| ' + unicode(value) - tabs = length - (len(s) / 8) - if tabs < 0: tabs = 0 - s = s + '\t' * tabs - return s - -def set_all(keys, values, verbose = False): - import wikipedia, config, time - - log = open('preferences.txt', 'w') - log.write('PREFERENCES\t%s\n' % time.gmtime()) - log.write('KEYS\t%s\n' % keys) - log.write('VALUES\t%s\n' % values) - - for family in config.usernames: - for lang in config.usernames[family]: - try: - if verbose: wikipedia.output(u"Setting '%s' on %s from '%s' to '%s'." % \ - (key, site, prev, value)) - set_for(lang, family) - except Exception, e: - output(u'Warning! An exception occured! %s: %s' % (e.__class__.__name__, str(e))) - log.write('FAILED\t%s\t%s\n' % (family, lang)) - else: - log.write('SUCCESS\t%s\t%s\n' % (family, lang)) - log.close() - -def set_for(lang, family): - site = wikipedia.getSite(lang, family, persistent_http = True) - prefs = Preferences(site) - for key, value in zip(keys, values): - prev = unicode(prefs.get(key, '')) - prefs.set(key, value) - prefs.save() - site.conn.close() - - -def main(): - import wikipedia, config - - wikipedia.output(u'Warning! This script will set preferences on all configured accounts!') - wikipedia.output(u'You have %s accounts configured.' % \ - sum(map(len, filter(lambda key: bool(config.usernames[key]), config.usernames.iterkeys())))) - - if wikipedia.inputChoice(u'Do you wish to continue?', ['no', 'yes'], ['n', 'y'], 'n') == 'n': return - - if wikipedia.inputChoice(u'Do you already know which preference you wish to set?', - ['no', 'yes'], ['n', 'y'], 'y') == 'n': - site = wikipedia.getSite() - wikipedia.output(u'Getting list of available preferences from %s.' % site) - prefs = Preferences(site) - - wikipedia.output(u'-------------------------------------------------------------------------') - wikipedia.output(u'| Name | Value |') - wikipedia.output(u'-------------------------------------------------------------------------') - pref_data = prefs.items() - pref_data.sort() - for key, value in pref_data: - wikipedia.output(table_cell(key, 4) + table_cell(value, 5) + '|') - wikipedia.output(u'-------------------------------------------------------------------------') - wikipedia.output(u'') - wikipedia.output(u'(For checkboxes: An empty string evaluates to False; all others to True)') - wikipedia.output(u'') - - while True: - keys, values = [], [] - while True: - try: - keys.append(wikipedia.input(u'Which preference do you wish to set?')) - except KeyboardInterrupt: - return - values.append(wikipedia.input(u"To what value do you wish to set '%s'?" % keys[-1])) - if wikipedia.inputChoice(u"Set more preferences?", - ['no', 'yes'], ['n', 'y'], 'n') == 'n': break - - if wikipedia.inputChoice(u"Set %s?" % u', '.join((u'%s:%s' % (key, value) - for key, value in zip(keys, values))), - ['yes', 'no'], ['y', 'n'], 'n') == 'y': - set_all(keys, values, verbose = True) - wikipedia.output(u"Preferences have been set on all wikis.") - -if __name__ == '__main__': - import sys - sys.path.append('..') - import wikipedia - try: - wikipedia.handleArgs() - main() - finally: - wikipedia.stopme() \ No newline at end of file +""" This module contains a read-write class that represents the user preferences. """ +from HTMLParser import HTMLParser +from htmlentitydefs import name2codepoint + +class Checkbox(object): + def __init__(self, value, state): + self.value = value + self.state = state + def set(self): + self.state = True + def unset(self): + self.state = False + def __bool__(self): + return self.state + def __str__(self): + return str(self.state) + +class Select(list): + def __init__(self): + list.__init__(self, ()) + self.value = u'' + def set(self, value): + self.value = value + def __bool__(self): + return bool(self.value) + def __str__(self): + return str(self.value) + def __unicode__(self): + return unicode(self.value) + +class Preferences(HTMLParser, dict): + def __init__(self, site = None): + HTMLParser.__init__(self) + dict.__init__(self, ()) + self.in_form = False + self.select = None + + if site: self.load(site) + + def handle_entityref(self, name): + if name in name2codepoint: + self.handle_data(unichr(name2codepoint[name])) + else: + self.handle_data(u'&%s;' % name) + def handle_charref(self, name): + try: + self.handle_data(unichr(int(name))) + except ValueError: + self.handle_data(u'&#$s;' % name) + def handle_starttag(self, tag, attrs): + if tag == 'form': + self.in_form = ('method', 'post') in attrs + + attrs = dict(attrs) + if tag == 'input' and self.in_form: + if attrs.get('type', 'text') in ('hidden', 'text'): + if 'value' in attrs and 'name' in attrs: + self[attrs['name']] = attrs['value'] + elif attrs.get('type') == 'checkbox': + self[attrs['name']] = Checkbox(attrs['value'], + 'checked' in attrs) + elif attrs.get('type') == 'radio': + if attrs['name'] not in self: + self[attrs['name']] = Select() + self[attrs['name']].append(attrs['value']) + if 'checked' in attrs: + self[attrs['name']].set(attrs['value']) + if tag == 'select' and self.in_form: + self.select = Select() + self[attrs['name']] = self.select + if tag == 'option' and self.in_form: + if self.select: + self.select.append(attrs['value']) + if 'selected' in attrs: + self.select.set(attrs['value']) + + def handle_endtag(self, tag): + if self.in_form and tag == 'form': + self.in_form = False + if self.select and tag == 'select': + self.select = None + + + def load(self, site): + site.forceLogin() + data = site.getUrl(site.path() + '?title=Special:Preferences') + self.feed(data) + self.close() + self.site = site + + def save(self): + predata = {'wpSaveprefs': '1', 'title': 'Special:Preferences'} + for key, value in self.iteritems(): + if value: + if type(value) is Select: + predata[key] = value.value + elif type(value) is Checkbox: + if value.state: + predata[key] = value.value + else: + predata[key] = value + self.site.postForm(self.site.path(), predata) + def set(self, key, value): + if key in self: + if type(self[key]) is Select: + return self.key.set(value) + elif type(self[key]) is Checkbox: + if value: + return self[key].set() + else: + return self[key].unset() + self[key] = value + + +def table_cell(value, length): + s = u'| ' + unicode(value) + tabs = length - (len(s) / 8) + if tabs < 0: tabs = 0 + s = s + '\t' * tabs + return s + +def set_all(keys, values, verbose = False): + import wikipedia, config, time + + log = open('preferences.txt', 'a') + log.write('PREFERENCES\t%s\n' % time.gmtime()) + log.write('KEYS\t%s\n' % keys) + log.write('VALUES\t%s\n' % values) + + for family in config.usernames: + for lang in config.usernames[family]: + try: + set_for(lang, family, keys, values, verbose) + except (SystemExit, KeyboardInterrupt): + return + except Exception, e: + wikipedia.output(u'Warning! An exception occured! %s: %s' % (e.__class__.__name__, str(e))) + log.write('FAILED\t%s\t%s\n' % (family, lang)) + else: + log.write('SUCCESS\t%s\t%s\n' % (family, lang)) + log.close() + +def set_for(lang, family, keys, values, verbose = False): + import wikipedia + site = wikipedia.getSite(lang, family, persistent_http = True) + prefs = Preferences(site) + for key, value in zip(keys, values): + prev = unicode(prefs.get(key, '')) + if verbose: wikipedia.output(u"Setting '%s' on %s from '%s' to '%s'." % \ + (key, site, prev, value)) + prefs.set(key, value) + prefs.save() + site.conn.close() + + +def main(): + import wikipedia, config + + wikipedia.output(u'Warning! This script will set preferences on all configured accounts!') + wikipedia.output(u'You have %s accounts configured.' % \ + sum([len(family) for family in config.usernames.itervalues()])) + + if wikipedia.inputChoice(u'Do you wish to continue?', ['no', 'yes'], ['n', 'y'], 'n') == 'n': return + + if wikipedia.inputChoice(u'Do you already know which preference you wish to set?', + ['no', 'yes'], ['n', 'y'], 'y') == 'n': + site = wikipedia.getSite() + wikipedia.output(u'Getting list of available preferences from %s.' % site) + prefs = Preferences(site) + + wikipedia.output(u'-------------------------------------------------------------------------') + wikipedia.output(u'| Name | Value |') + wikipedia.output(u'-------------------------------------------------------------------------') + pref_data = prefs.items() + pref_data.sort() + for key, value in pref_data: + wikipedia.output(table_cell(key, 4) + table_cell(value, 5) + '|') + wikipedia.output(u'-------------------------------------------------------------------------') + wikipedia.output(u'') + wikipedia.output(u'(For checkboxes: An empty string evaluates to False; all others to True)') + wikipedia.output(u'') + + while True: + keys, values = [], [] + while True: + try: + keys.append(wikipedia.input(u'Which preference do you wish to set?')) + except KeyboardInterrupt: + return + values.append(wikipedia.input(u"To what value do you wish to set '%s'?" % keys[-1])) + if wikipedia.inputChoice(u"Set more preferences?", + ['no', 'yes'], ['n', 'y'], 'n') == 'n': break + + if wikipedia.inputChoice(u"Set %s?" % u', '.join((u'%s:%s' % (key, value) + for key, value in zip(keys, values))), + ['yes', 'no'], ['y', 'n'], 'n') == 'y': + set_all(keys, values, verbose = True) + wikipedia.output(u"Preferences have been set on all wikis.") + +if __name__ == '__main__': + import sys + sys.path.append('..') + import wikipedia + try: + wikipedia.handleArgs() + main() + finally: + wikipedia.stopme()