Forrás: Szerkesztő:Tgr/napkepe.py

#!/usr/bin/python
# -*- coding: utf-8  -*-
#TODO: force, külön csak egy nap, külön csak a gallery, csak a nemlétezők, osztály, hiányzó cikkek nem bot módban, {{napképe-galéria}}, notify-textben az egyes piros linkekhez dátum és link a képre (vagy a galériára?), fordított irány
"""
HU
Feladata:
A huwiki nap képéhez másolja át a szükséges allapokat a Commonsból, és legyártja a havi archívum galériát.
A hiányzó commonsos magyar képaláírásoknál leállt, így a képaláírás-másoló részt kikommenteltem. 2014.07.23 (ato)

ato, 2015. 06. 07.:
Migrálva a pywikibot core-ra.

EN
Task:
Copy subpages for Picture Of The Day
 
 
v0.46
Source: http://hu.wikipedia.org/wiki/Szerkesztő:SamatBot/napkepe.py
 
Usage:
napkepe.py --január
or
napkepe.py thismonth
or
napkepe.py nextmonth
or
napkepe.py nextmonth2
or
napkepe.py nextmonth3
"""
import sys, string, re, datetime, calendar
import pywikibot
 
# debug/testing helper (replace page.put with page_put)
def page_put(text, summary, botflag = False, minorEdit=False):
  pywikibot.output(text)
  pywikibot.output('--------------------------------------------------------')
  pywikibot.output(summary)
  pywikibot.output('=====================================================')
  pywikibot.output('=====================================================')
 
# where it makes sense, the following mapping keys will be replaced using the % operator:
# filename, desc, year, month, day, lang, monthname
potd_filename_page = {
    'hu': u'Sablon:Napképe/%(year)d-%(month)02d-%(day)02d',
}
potd_gallery_page = {
    'hu': u'Wikipédia:Kezdőlapműhely/A nap képe/%(year)d-%(month)02d',
}
# potd_desc_page = {
#     'hu': u'Sablon:Napképe/%(year)d-%(month)02d-%(day)02d (hu)',
# }
potd_filename_text = {
    'hu': u'%(filename)s<!--\n\n' \
        + u'--><noinclude>[[Kategória:A nap képe fájlsablonjai %(year)d| ]]</noinclude>',
}
potd_desc_text = {
    'hu': u'%(desc)s<noinclude>[[Kategória:A nap képe képaláírás-sablonjai %(year)d| ]]</noinclude>',
}
potd_summary = {
    'hu': u'allap másolása a Commonsból',
}
archive_page = {
    'hu': u'Wikipédia:A nap képe/%(year)d-%(month)02d'
}
#archive_text_old = { # "records" will be replaced with list of records
#    'hu': u'== %(monthname)si képek archívuma ==\n\n<gallery perrow="6">\n%(records)s</gallery>',
#}
archive_text = { # "records" will be replaced with list of records
    'hu': u'{{Napképe/Galériatáblázat|%(year)d|%(month)02d}}\n' \
        + u'[[Kategória:A nap képe a Kezdőlapműhelyben]]\n',
}
archive_record = { # filename and desc will also be replaced
    'hu': u'Fájl:%(filename)s|%(day)d. {{napképe/%(year)d-%(month)02d-%(day)02d (hu)}}' \
        + u' {{szerkeszt|Sablon:Napképe/%(year)d-%(month)02d-%(day)02d (hu)|<sub>(javít)</sub>}}\n',
}
archive_text = { # filename and desc will also be replaced
    'hu': u'{{Napképe/Galériatáblázat|%(year)d|%(month)02d}}\n' \
        + u'[[Kategória:A nap képe a Kezdőlapműhelyben]]\n',
}
archive_summary = {
    'hu': u'%(month)d. hónap archívum galéria',
}
redlink_notify_page = {
    'hu': u'Wikipédia:Kocsmafal (egyéb)',
}
redlink_notify_title = {
    'hu': u'Piros linkek a %(monthnamei)si napok képeiben',
}
redlink_notify_text = { # "redlinks" will be replaced with a list
    'hu': u'%(redlinks)s\n--~~~~',
}
 
# regexps to obtain filename/description from the commons subpages
# expected filename template format: <filename> or {{Potd filename|<filename>|<year>|<month>|<day>}} 
commons_filename_re = re.compile(r"\{\{Potd filename\|(?P<filename>[^|]+)\|(?P<year>\d+)\|(?P<month>\d+)\|(?P<day>\d+)\}\}")
# expected description template format: <description> or {{Potd description|1=<description>|2=<lang>|3=<year>|4=<month>|5=<day>}}
# commons_desc_re = re.compile(r"\{\{Potd (description|page)\|1=(?P<desc>.+)\|2=(?P<lang>\w+)\|3=(?P<year>\d+)\|4=(?P<month>\d+)\|5=(?P<day>\d+)\}\}")
# this was used before the Potd templates, checked for backwards compatibility
oldcat_re = re.compile(r'\s*<noinclude>\[\[Category:Potd templates\]\]</noinclude>', re.S)
 
# XXX: should link to wikipedia, not home wiki?
def fix_links(text, lang):
    """turns [[:hu:blah|blah]] and similar into [[blah]]"""
    text = re.sub(r"\[\[(?::w)?:?" + lang + r":(?P<page>[^|\]]+)\|(?P<text>.*?)\]\]", r"[[\g<page>|\g<text>]]", text)
    text = re.sub(r"\[\[(?::w)?:?" + lang + r":(?P<page>[^|\]]+)\]\]", r"[[\g<page>]]", text)
    text = re.sub(r"\{\{wh\|(.*?)\}\}", r"[[\1]]", text) # {{wh}} is sometimes used for hu: links
    text = re.sub(r"\[\[(?P<page>[^|]+)\|(?P=page)\]\]", r"[[\g<page>]]", text)
    return text
 
def translate(text):
    return pywikibot.translate(homeWiki, text) % translate_dict
 
def today():
    return datetime.datetime.today()
 
# FIXME
honapok = [u'január', u'február', u'március', u'április', u'május', u'június', u'július',
           u'augusztus', u'szeptember', u'október', u'november', u'december']
 
#XXX pywikibot.stopme()?
arg = pywikibot.handle_args()
commons = pywikibot.Site(code='commons', fam='commons')
homeWiki = pywikibot.Site()
if len(arg) == 0:
    pywikibot.output(u'Nem kaptam paramétert! Honnan tudjam melyik havi adagot másoljam?')
    sys.exit()
elif arg == ['thismonth']:
    mode = arg
    month = today().month
    year = today().year
elif arg == ['nextmonth']:
    mode = arg
    month = today().month + 1
    year = today().year
    if month > 12:
      month = month - 12
      year += 1
elif arg == ['nextmonth2']:
    mode = arg
    month = today().month + 2
    year = today().year
    if month > 12:
      month = month - 12
      year += 1
elif arg == ['nextmonth3']:
    mode = arg
    month = today().month + 3
    year = today().year
    if month > 12:
      month = month - 12
      year += 1
elif not (arg[0][0:2] == u'--' and honapok.count(arg[0][2:]) == 1):
    pywikibot.output(u'Hibás paraméter!')
    sys.exit()
 
date = datetime.date.today()
if not arg == ['thismonth'] and not arg == ['nextmonth'] and not arg == ['nextmonth2'] and not arg == ['nextmonth3']:
    if True: # XXX month argument required for now
      date = datetime.date(date.year, honapok.index(arg[0][2:]) + 1, 1)
    elif date > date.replace(day = 15): # probably intended for next month
      date += datetime.timedelta(days = calendar.monthrange(year, month)[1])
else:
    date = date.replace(year=year, month=month, day=1)
 
# XXX
monthname = arg[0][2:].capitalize()
 
# XXX hogy kéne ezt normálisan?
# dict used for the l10n substitutions
translate_dict  = {
    'year':      date.year,
    'month':     date.month,
    'monthname': monthname,
    'monthnamei':monthname.lower(),
    #'lang':      homeWiki.language(),
    'filename':  None,
    'desc':      None,
}
 
if arg == ['thismonth'] or arg == ['nextmonth'] or arg == ['nextmonth2'] or arg == ['nextmonth3']:
    pywikibot.output('year=%d, month=%d' % (year, month))

if arg == ['thismonth']:
    day = calendar.monthrange(date.year, date.month)[1]
    date = date.replace(day=day)
    page = pywikibot.Page(homeWiki, u'Sablon:Napképe/%s' % date.isoformat())
if arg == ['thismonth'] and page.exists():
    pywikibot.output(u'Last template already exists: %s' % page)
    sys.exit()

# Gallery page creation
date = date.replace(day=1)
page = pywikibot.Page(commons, 'Template:Potd/%s' % date.isoformat())
if page.exists():
    page = pywikibot.Page(homeWiki, translate(potd_gallery_page))
    if not page.exists():
        page.put(translate(archive_text), translate(archive_summary))

# Subpage creation

try:
    records = ''
    links = []
 
    for day in range(1, calendar.monthrange(date.year, date.month)[1] + 1):
        date = date.replace(day=day)
        translate_dict['day'] = day
        del translate_dict['filename']
        # del translate_dict['desc']
 
        # get image name
        page = pywikibot.Page(commons, 'Template:Potd/%s' % date.isoformat())
        if not page.exists():
            pywikibot.output(u'The following page does not exist: %s' % page)
            sys.exit()
        text = page.get()
        m = commons_filename_re.match(text)
        translate_dict['filename'] = m.group('filename') if m else oldcat_re.sub('', text)        
 
        # get description
        # page = pywikibot.Page(commons, 'Template:Potd/%s (%s)' % (date.isoformat(), homeWiki.language()))
        # text = page.get()
        # m = commons_desc_re.match(text)
        # desc = m.group('desc') if m else oldcat_re.sub('', text)
        # translate_dict['desc'] = fix_links(desc, homeWiki.language())
 
        # copy stuff
        page = pywikibot.Page(homeWiki, translate(potd_filename_page))
        if page.exists() and arg == ['thismonth']:
            pywikibot.output(
                u'\03{lightyellow}' + page.title(asLink=True) + \
                u' already exists, will be skipped.\03{default}' + \
                u'\nUse --[actual month] to force bot to process it.')
        else:
            page.put(translate(potd_filename_text), translate(potd_summary))
        # page = pywikibot.Page(homeWiki, translate(potd_desc_page))
        # page.put(translate(potd_desc_text), translate(potd_summary))
 
        # get links
        # page = pywikibot.Page(homeWiki, translate(potd_desc_page)) # required because put doesn't refresh internal cache
        # links.extend(page.linkedPages())
 
        records += translate(archive_record)
 
    translate_dict['records'] = records
    page = pywikibot.Page(homeWiki, translate(archive_page))
    # page.put(translate(archive_text), translate(archive_summary))
 
    redlinks = u''
    for page in links:
      if page.exists():
        continue
      redlinks += u'* [[%s]]\n' % page.title()
    translate_dict['redlinks'] = redlinks
    page = pywikibot.Page(homeWiki, translate(redlink_notify_page))
    section_header = u'\n\n== %s ==\n\n' % translate(redlink_notify_title)
    # page.put(page.get() + section_header + translate(redlink_notify_text), translate(redlink_notify_title), botflag = False, minorEdit = False) # TODO még így is bot módban van
 
finally:
    pywikibot.stopme()