jenkins-bot has submitted this change and it was merged.
Change subject: ProofreadPage support in Site ......................................................................
ProofreadPage support in Site
When ProofreadPage extension is installed, API query proofreadinfo is available.
Query returns Index and Page namespaces used by the extension and the definition of the proofread quality levels used on the site.
This is preparation work in Site before introducing ProofreadPage(Page).
Change-Id: I83cb7fc39b604672e5aaefec90af08b035028bf8 --- M pywikibot/__init__.py M pywikibot/data/api.py M pywikibot/exceptions.py M pywikibot/site.py M tests/site_tests.py M tests/utils.py 6 files changed, 142 insertions(+), 2 deletions(-)
Approvals: John Vandenberg: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/__init__.py b/pywikibot/__init__.py index 89d748f..21b4dbf 100644 --- a/pywikibot/__init__.py +++ b/pywikibot/__init__.py @@ -40,6 +40,7 @@ from pywikibot.exceptions import ( Error, InvalidTitle, BadTitle, NoPage, SectionError, SiteDefinitionError, NoSuchSite, UnknownSite, UnknownFamily, + UnknownExtension, NoUsername, UserBlocked, UserActionRefuse, PageRelatedError, IsRedirectPage, IsNotRedirectPage, PageSaveRelatedError, PageNotSaved, OtherPageSaveError, @@ -77,6 +78,7 @@ 'calledModuleName', 'Bot', 'CurrentPageBot', 'WikidataBot', 'Error', 'InvalidTitle', 'BadTitle', 'NoPage', 'SectionError', 'SiteDefinitionError', 'NoSuchSite', 'UnknownSite', 'UnknownFamily', + 'UnknownExtension', 'NoUsername', 'UserBlocked', 'UserActionRefuse', 'PageRelatedError', 'IsRedirectPage', 'IsNotRedirectPage', 'PageSaveRelatedError', 'PageNotSaved', 'OtherPageSaveError', diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py index 1171473..c6cbf67 100644 --- a/pywikibot/data/api.py +++ b/pywikibot/data/api.py @@ -2369,6 +2369,7 @@ version of each Page (default False)
""" + # If possible, use self.request after __init__ instead of appendParams def appendParams(params, key, value): if key in params: params[key] += '|' + value @@ -2383,9 +2384,15 @@ if not ('inprop' in kwargs and 'protection' in kwargs['inprop']): appendParams(kwargs, 'inprop', 'protection') appendParams(kwargs, 'iiprop', 'timestamp|user|comment|url|size|sha1|metadata') - self.props = kwargs['prop'].split('|') QueryGenerator.__init__(self, generator=generator, **kwargs) self.resultkey = "pages" # element to look for in result + + # TODO: Bug T91912 when using step > 50 with proofread, with queries + # returning Pages from Page ns. + if self.site.has_extension('ProofreadPage'): + self.request['prop'].append('proofread') + + self.props = self.request['prop']
def result(self, pagedata): """Convert page dict entry from api to Page object. @@ -2581,6 +2588,11 @@ raise AssertionError( "Page %s has neither 'pageid' nor 'missing' attribute" % pagedict['title']) page._contentmodel = pagedict.get('contentmodel') # can be None + if (page._contentmodel and + page._contentmodel == 'proofread-page' and + 'proofread' in pagedict): + page._quality = pagedict['proofread']['quality'] + page._quality_text = pagedict['proofread']['quality_text'] if 'info' in props: page._isredir = 'redirect' in pagedict if 'touched' in pagedict: diff --git a/pywikibot/exceptions.py b/pywikibot/exceptions.py index 117165a..7684d9f 100644 --- a/pywikibot/exceptions.py +++ b/pywikibot/exceptions.py @@ -235,6 +235,13 @@ pass
+class UnknownExtension(SiteDefinitionError): # noqa + + """Extension is not defined for this site.""" + + pass + + class IsRedirectPage(PageRelatedError): # noqa
"""Page is a redirect page""" diff --git a/pywikibot/site.py b/pywikibot/site.py index 7f25aea..306b683 100644 --- a/pywikibot/site.py +++ b/pywikibot/site.py @@ -54,6 +54,7 @@ LockedNoPage, NoPage, UnknownSite, + UnknownExtension, FamilyMaintenanceWarning, NoUsername, SpamfilterError, @@ -2297,6 +2298,77 @@ # 'title' is expected to be URL-encoded already return self.siteinfo["articlepath"].replace("$1", title)
+ @need_version('1.21') + def _cache_proofreadinfo(self, expiry=False): + """Retrieve proofreadinfo from site and cache response. + + Applicable only to sites with ProofreadPage extension installed. + + The following info is returned by the query and cached: + - self._proofread_index_ns: Index Namespace + - self._proofread_page_ns: Page Namespace + - self._proofread_levels: a dictionary with: + keys: int in the range [0, 1, ..., 4] + values: category name corresponding to the 'key' quality level + e.g. on en.wikisource: + {0: u'Without text', 1: u'Not proofread', 2: u'Problematic', + 3: u'Proofread', 4: u'Validated'} + + @param expiry: either a number of days or a datetime.timedelta object + @type expiry: int (days), L{datetime.timedelta}, False (config) + @return: A tuple containing _proofread_index_ns, self._proofread_page_ns + and self._proofread_levels. + @rtype: Namespace, Namespace, dict + + """ + if not self.has_extension('ProofreadPage'): + raise UnknownExtension('ProofreadPage extension is not installed on %s' + % self) + + if (not hasattr(self, '_proofread_index_ns') or + not hasattr(self, '_proofread_page_ns') or + not hasattr(self, '_proofread_levels')): + + pirequest = api.CachedRequest( + site=self, + expiry=pywikibot.config.API_config_expiry if expiry is False else expiry, + action='query', + meta='proofreadinfo', + piprop='namespaces|qualitylevels' + ) + + pidata = pirequest.submit() + ns_id = pidata['query']['proofreadnamespaces']['index']['id'] + self._proofread_index_ns = self.namespaces[ns_id] + + ns_id = pidata['query']['proofreadnamespaces']['page']['id'] + self._proofread_page_ns = self.namespaces[ns_id] + + self._proofread_levels = {} + for ql in pidata['query']['proofreadqualitylevels']: + self._proofread_levels[ql['id']] = ql['category'] + + @property + def proofread_index_ns(self): + """Return Index namespace for the ProofreadPage extension.""" + if not hasattr(self, '_proofread_index_ns'): + self._cache_proofreadinfo() + return self._proofread_index_ns + + @property + def proofread_page_ns(self): + """Return Page namespace for the ProofreadPage extension.""" + if not hasattr(self, '_proofread_page_ns'): + self._cache_proofreadinfo() + return self._proofread_page_ns + + @property + def proofread_levels(self): + """Return Quality Levels for the ProofreadPage extension.""" + if not hasattr(self, '_proofread_levels'): + self._cache_proofreadinfo() + return self._proofread_levels + @property def namespaces(self): """Return dict of valid namespaces on this wiki.""" @@ -3226,7 +3298,10 @@ raise ValueError( "loadrevisions: endid > startid with rvdir=False")
- rvargs = dict(type_arg=u"info|revisions") + if self.has_extension('ProofreadPage'): + rvargs = {'type_arg': 'info|revisions|proofread'} + else: + rvargs = {'type_arg': 'info|revisions'}
if getText: rvargs[u"rvprop"] = u"ids|flags|timestamp|user|comment|content" diff --git a/tests/site_tests.py b/tests/site_tests.py index 1fe5e1a..b279c02 100644 --- a/tests/site_tests.py +++ b/tests/site_tests.py @@ -2493,6 +2493,46 @@ site.attr
+class TestSiteProofreadinfo(DefaultSiteTestCase): + + """Test proofreadinfo information.""" + + sites = { + 'en.ws': { + 'family': 'wikisource', + 'code': 'en', + }, + 'en.wp': { + 'family': 'wikipedia', + 'code': 'en', + }, + } + + cached = True + + def test_cache_proofreadinfo_on_site_with_ProofreadPage(self): + """Test Site._cache_proofreadinfo().""" + site = self.get_site('en.ws') + ql_res = {0: u'Without text', 1: u'Not proofread', 2: u'Problematic', + 3: u'Proofread', 4: u'Validated'} + + site._cache_proofreadinfo() + self.assertEqual(site.namespaces[106], site.proofread_index_ns) + self.assertEqual(site.namespaces[104], site.proofread_page_ns) + self.assertEqual(site.proofread_levels, ql_res) + self.assertEqual(site.namespaces[106], site.proofread_index_ns) + del site._proofread_page_ns # Check that property reloads. + self.assertEqual(site.namespaces[104], site.proofread_page_ns) + + def test_cache_proofreadinfo_on_site_without_ProofreadPage(self): + """Test Site._cache_proofreadinfo().""" + site = self.get_site('en.wp') + self.assertRaises(pywikibot.UnknownExtension, site._cache_proofreadinfo) + self.assertRaises(pywikibot.UnknownExtension, lambda x: x.proofread_index_ns, site) + self.assertRaises(pywikibot.UnknownExtension, lambda x: x.proofread_page_ns, site) + self.assertRaises(pywikibot.UnknownExtension, lambda x: x.proofread_levels, site) + + if __name__ == '__main__': try: unittest.main() diff --git a/tests/utils.py b/tests/utils.py index 913b213..78645ac 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -203,6 +203,10 @@ self._namespaces = SelfCallDict( Namespace.builtin_namespaces( case=self.siteinfo['case'])) + extensions = [] + if self.family.name == 'wikisource': + extensions.append({'name': 'ProofreadPage'}) + self._siteinfo._cache['extensions'] = (extensions, True)
def __repr__(self): """Override default so warnings and errors indicate test is dry."""
pywikibot-commits@lists.wikimedia.org