Revision: 7355
Author:   siebrand
Date:     2009-10-02 09:46:09 +0000 (Fri, 02 Oct 2009)

Log Message:
-----------
[ #2818283 ] script to manage statistics. Contributed by almaghi.

Added Paths:
-----------
    trunk/pywikipedia/statistics_in_wikitable.py

Added: trunk/pywikipedia/statistics_in_wikitable.py
===================================================================
--- trunk/pywikipedia/statistics_in_wikitable.py                                
(rev 0)
+++ trunk/pywikipedia/statistics_in_wikitable.py        2009-10-02 09:46:09 UTC 
(rev 7355)
@@ -0,0 +1,163 @@
+#!/usr/bin/python
+# -*- coding: utf-8  -*-
+"""
+
+
+\03{lightyellow}This bot renders statistics provided by [[Special:Statistics]] 
in a table on a wiki page.\03{default}
+Thus it creates and updates a Statistics wikitable.
+
+The following parameters are supported:
+
+\03{lightred}-screen\03{default}     If True, doesn't do any changes, but only 
shows the statistics.
+
+\03{lightgreen}-page\03{default}       On what page statistics are rendered.
+               If not existing yet, it is created.
+               If existing, it is updated.
+"""
+__version__ = '$Id$'
+import wikipedia, pagegenerators, query
+import simplejson, time
+
+# This is the title of the wikipage where to render stats.
+your_page = "Logstats"
+
+summary_update = {
+    'en':u'Updating some statistics.',
+    }
+summary_creation = {
+    'en':u'Creating statistics log page.',
+    }
+
+
+class StatisticsBot:
+       def __init__ (self, screen, your_page):
+               """
+               Constructor. Parameter:
+                   * screen    - If True, doesn't do any real changes, but 
only shows
+                                 some stats.
+               """
+               self.screen = screen
+               self.your_page = your_page
+               self.dict = self.getdata() # Try to get data.
+
+       def run(self):
+               if self.screen:
+                       wikipedia.output("Bot is running to output stats.")
+                       self.idle(1) # Run a function to idle
+                       self.outputall()
+               if not self.screen:
+                       self.outputall() # Output all datas on screen.
+                       wikipedia.output("\nBot is running. Going to treat 
\03{lightpurple}%s\03{default}..." % self.your_page )
+                       self.idle(2)
+                       self.treat()
+
+       def getdata(self): # getdata() returns a dictionnary of the query to 
api.php?action=query&meta=siteinfo&siprop=statistics
+               # This method return data in a dictionnary format.
+               # View data with: 
api.php?action=query&meta=siteinfo&siprop=statistics&format=jsonfm
+               params = {
+               'action'    :'query',
+               'meta'      :'siteinfo',
+               'siprop'    :'statistics',
+               }
+               wikipedia.output("\nQuerying api for json-formatted data...")
+               try:
+                       data = query.GetData(params,
+                                                                useAPI = True, 
encodeTitle = False)
+               except:
+                       site = wikipedia.getSite()
+                       url = site.protocol() + '://' + site.hostname() + 
site.api_address()
+                       wikipedia.output("The query has failed. Have you check 
the API? Cookies are working?")
+                       wikipedia.output(u"\n>> \03{lightpurple}%s\03{default} 
<<" % url)
+               if data != None:
+                       wikipedia.output("Extracting statistics...")
+                       data = data['query']      # "query" entry of data.
+                       dict = data['statistics'] # "statistics" entry of 
"query" dict.
+                       return dict
+
+       def treat(self):
+                       site = wikipedia.getSite()
+                       page = wikipedia.Page(site, self.your_page)
+                       if page.exists():
+                               wikipedia.output(u'\nWikitable on 
\03{lightpurple}%s\03{default} will be completed with:\n' % self.your_page )
+                               text = page.get()
+                               newtext = self.newraw()
+                               wikipedia.output(newtext)
+                               choice = wikipedia.inputChoice(u'Do you want to 
add these on wikitable?', ['Yes', 'No'], ['y', 'N'], 'N')
+                               text = text[:-3] + newtext
+                               summ = wikipedia.translate(site, summary_update)
+                               if choice == 'y':
+                                       try:
+                                               page.put(u''.join(text), summ)
+                                       except:
+                                               wikipedia.output(u'Impossible 
to edit. It may be an edit conflict... Skipping...')
+                       else:
+                               wikipedia.output(u'\nWikitable on 
\03{lightpurple}%s\03{default} will be created with:\n' % self.your_page )
+                               newtext = self.newtable()+self.newraw()
+                               wikipedia.output(newtext)
+                               summ = wikipedia.translate(site, 
summary_creation)
+                               choice = wikipedia.inputChoice(u'Do you want to 
accept this page creation?', ['Yes', 'No'], ['y', 'N'], 'N')
+                               if choice == 'y':
+                                       try:
+                                               page.put(newtext, summ)
+                                       except wikipedia.LockedPage:
+                                               wikipedia.output(u"Page %s is 
locked; skipping." % title)
+                                       except wikipedia.EditConflict:
+                                               wikipedia.output(u'Skipping %s 
because of edit conflict' % title)
+                                       except wikipedia.SpamfilterError, error:
+                                               wikipedia.output(u'Cannot 
change %s because of spam blacklist entry %s' % (title, error.url))
+
+       def newraw(self):
+               newtext = ('\n|----\n!\'\''+ self.date() +'\'\'')       # new 
raw for date and stats
+               for name in self.dict:
+                       newtext += '\n|'+str(abs(self.dict[name]))
+               newtext += '\n|----\n|}'
+               return newtext
+
+       def newtable(self):
+               newtext = ('\n{| class=wikitable style=text-align:center\n!'+ 
"date")   # create table
+               for name in self.dict:
+                       newtext += '\n|'+name
+               return newtext
+
+       def     date(self):
+               rightime = time.localtime(time.time())
+               year = str(rightime[0])
+               month = str(rightime[1])
+               day = str(rightime[2])
+               date = year+'/'+month+'/'+day
+               return date
+       def outputall(self):
+               list = self.dict.keys()
+               list.sort()
+               for name in self.dict:
+                       wikipedia.output("There are "+str(self.dict[name])+" 
"+name)
+       def idle(self, retry_idle_time):
+               time.sleep(retry_idle_time)
+               wikipedia.output(u"Starting in %i second..." % retry_idle_time)
+               time.sleep(retry_idle_time)
+
+def main(your_page):
+       screen = False # If True it would not edit the wiki, only output 
statistics
+       _page = None
+
+       wikipedia.output("\nBuilding the bot...")
+       for arg in wikipedia.handleArgs():      # Parse command line arguments
+               if arg.startswith('-page'):
+                       if len(arg) == 5:
+                               _page = wikipedia.input(u'On what page do you 
want to add statistics?')
+                       else:
+                               _page = arg[6:]
+               if arg.startswith("-screen"):
+                       screen = True
+       if not _page:
+               _page = your_page
+               if not screen:
+                       wikipedia.output("The bot will add statistics on %s.\n" 
% _page )
+       bot = StatisticsBot(screen, _page) # Launch the instance of a 
StatisticsBot
+       bot.run() # Execute the 'run' method
+
+if __name__ == "__main__":
+    try:
+        main(your_page)
+    finally:
+        wikipedia.stopme()


Property changes on: trunk/pywikipedia/statistics_in_wikitable.py
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native



_______________________________________________
Pywikipedia-svn mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikipedia-svn

Reply via email to