You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.2 KiB
103 lines
3.2 KiB
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# missingnotice.py
|
|
#
|
|
# Copyright 2018 Jonathan Golder <jonathan@golderweb.de>
|
|
#
|
|
# 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 2 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, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
# MA 02110-1301, USA.
|
|
#
|
|
#
|
|
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.engine.url import URL
|
|
|
|
import pywikibot
|
|
|
|
import jogobot
|
|
|
|
|
|
class MissingNoticeBot():
|
|
"""
|
|
"""
|
|
|
|
# MySQL-query to get articles with notice
|
|
cat_article_query = """
|
|
SELECT `page_title`
|
|
FROM `categorylinks`
|
|
JOIN `category`
|
|
ON `cl_to` = `cat_title`
|
|
AND `cat_title` LIKE "{cat}\_%%"
|
|
JOIN `page`
|
|
ON `cl_from` = `page_id`
|
|
""".format(cat=jogobot.config["red.missingnotice"]["article_category"])
|
|
|
|
def __init__( self, genFactory, **kwargs ):
|
|
pass
|
|
|
|
def run( self ):
|
|
print(type(self).get_categorized_articles() )
|
|
|
|
def treat_articles(self, articles):
|
|
"""
|
|
Iterates over given articles and checks weather them are included in
|
|
self.categorized_articles (contain the notice)
|
|
|
|
@param articles Articles to check
|
|
@type articles iterable of pywikibot.page() objects
|
|
|
|
@returns Possibly empty list of wikitext links ("[[article]]")
|
|
@rtype list
|
|
"""
|
|
links = list()
|
|
|
|
for article in articles:
|
|
|
|
if article.title(underscore=True, with_section=False ) not in \
|
|
self.categorized_articles:
|
|
|
|
links.append( article.title(as_link=True, textlink=True) )
|
|
|
|
return links
|
|
|
|
@classmethod
|
|
def get_categorized_articles( cls ):
|
|
"""
|
|
Queries all articles containing the notice based on category set by
|
|
notice template. Category can be configured in
|
|
jogobot.config["red.missingnotice"]["article_category"]
|
|
|
|
@returns List of all articles containing notice
|
|
@rtype list
|
|
"""
|
|
|
|
# construct connection url for sqlalchemy
|
|
url = URL( "mysql+pymysql",
|
|
username=pywikibot.config.db_username,
|
|
password=pywikibot.config.db_password,
|
|
host=jogobot.config["red.missingnotice"]["wikidb_host"],
|
|
port=jogobot.config["red.missingnotice"]["wikidb_port"],
|
|
database=jogobot.config["red.missingnotice"]["wikidb_name"],
|
|
query={'charset': 'utf8'} )
|
|
|
|
# create sqlalchemy engine
|
|
engine = create_engine(url, echo=True)
|
|
|
|
# fire the query to get articles with notice
|
|
result = engine.execute(cls.cat_article_query)
|
|
|
|
# return list with articles with notice
|
|
return [ row['page_title'].decode("utf-8") for row in result ]
|
|
|