diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 0b799060f98edb8389faa7415ca4fbe2078da55a..a6981b466a70d38fb41a19abb0938cea956bb5b6 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -4,7 +4,9 @@ This is the development version of mwclient. *Dropped support for Python 2.4–2.5 and MediaWiki 1.11–1.15. -This version requires minimum Python 2.6 and MediaWiki 1.16.* +This version requires minimum Python 2.6 and MediaWiki 1.16. +Compability methods for working with MediaWiki < 1.16 have been +removed.* * [2012-08-30] [@btongminh](https://github.com/btongminh): Allow setting both the upload description and the page content separately. diff --git a/mwclient/errors.py b/mwclient/errors.py index 27afffcd4c33a98d90a2d51a2f570bf5e2fd1ed9..6540c2d73e2d69da9c16f5c4c4845da517e14124 100644 --- a/mwclient/errors.py +++ b/mwclient/errors.py @@ -52,3 +52,7 @@ class EmailError(MwClientError): class NoSpecifiedEmail(EmailError): pass + + +class NoWriteApi(MwClientError): + pass diff --git a/mwclient/page.py b/mwclient/page.py index fb951644fe7e8ca95bec5b406c733c773c4554d2..e7995ec32b4ee14d2bac1ef2297c3531838cf966 100644 --- a/mwclient/page.py +++ b/mwclient/page.py @@ -1,7 +1,6 @@ import client import errors import listing -from page_nowriteapi import OldPage import urllib import urlparse @@ -171,7 +170,7 @@ class Page(object): section = self.section if not self.site.writeapi: - return OldPage.save(self, text=text, summary=summary, minor=False) + raise errors.NoWriteApi(self) data = {} if minor: @@ -246,8 +245,7 @@ class Page(object): raise errors.InsufficientPermission(self) if not self.site.writeapi: - return OldPage.move(self, new_title=new_title, - reason=reason, move_talk=move_talk) + raise errors.NoWriteApi(self) data = {} if move_talk: @@ -269,7 +267,7 @@ class Page(object): raise errors.InsufficientPermission(self) if not self.site.writeapi: - return OldPage.delete(self, reason=reason) + raise errors.NoWriteApi(self) data = {} if watch: diff --git a/mwclient/page_nowriteapi.py b/mwclient/page_nowriteapi.py deleted file mode 100644 index d6f68cdb7a0cc7c896bd399e3ac526b1fb9a75ef..0000000000000000000000000000000000000000 --- a/mwclient/page_nowriteapi.py +++ /dev/null @@ -1,133 +0,0 @@ -import time -from HTMLParser import HTMLParser -from htmlentitydefs import name2codepoint - -import errors - - -class OldPage(object): - - @staticmethod - def save(self, text=u'', summary=u'', minor=False): - data = {} - data['wpTextbox1'] = text - data['wpSummary'] = summary - data['wpSave'] = 'Save page' - data['wpEditToken'] = self.get_token('edit') - if self.last_rev_time: - data['wpEdittime'] = time.strftime('%Y%m%d%H%M%S', self.last_rev_time) - else: - data['wpEdittime'] = time.strftime('%Y%m%d%H%M%S', time.gmtime()) - if self.edit_time: - data['wpStarttime'] = time.strftime('%Y%m%d%H%M%S', self.edit_time) - else: - data['wpStarttime'] = time.strftime('%Y%m%d%H%M%S', time.gmtime()) - data['wpStarttime'] = time.strftime('%Y%m%d%H%M%S', time.gmtime()) - - if minor: - data['wpMinoredit'] = '1' - data['title'] = self.name - - page_data = self.site.raw_index('submit', **data) - - page = EditPage('editform') - page.feed(page_data) - page.close() - - if page.data: - if page.readonly: - raise errors.ProtectedPageError(self) - self.get_token('edit', True) - raise errors.EditError(page.title, data) - - @staticmethod - def move(self, new_title, reason='', move_talk=True): - postdata = {'wpNewTitle': new_title, - 'wpOldTitle': self.name, - 'wpReason': reason, - 'wpMove': '1', - 'wpEditToken': self.get_token('move')} - if move_talk: - postdata['wpMovetalk'] = '1' - postdata['title'] = 'Special:Movepage' - - page_data = self.site.raw_index('submit', **data) - - page = EditPage('movepage') - page.feed(page_data.decode('utf-8', 'ignore')) - page.close() - - if 'wpEditToken' in page.data: - raise errors.EditError(page.title, postdata) - - @staticmethod - def delete(self, reason=''): - postdata = {'wpReason': reason, - 'wpConfirmB': 'Delete', - 'mw-filedelete-submit': 'Delete', - 'wpEditToken': self.get_token('delete'), - 'title': self.name} - - page_data = self.site.raw_index('delete', **postdata) - - -class EditPage(HTMLParser): - - def __init__(self, form): - HTMLParser.__init__(self) - - self.form = form - - self.in_form = False - self.in_text = False - self.in_title = False - - self.data = {} - self.textdata = [] - self.title = u'' - - self.readonly = True - - def handle_starttag(self, tag, attrs): - self.in_title = (tag == 'title') - - if (u'id', self.form) in attrs: - attrs = dict(attrs) - self.in_form = True - self.action = attrs['action'] - - if tag == 'input' and self.in_form and (u'type', u'submit') \ - not in attrs and (u'type', u'checkbox') not in attrs: - attrs = dict(attrs) - if u'name' in attrs: - self.data[attrs[u'name']] = attrs.get(u'value', u'') - - if self.in_form and tag == 'textarea': - self.in_text = True - self.readonly = (u'readonly', u'readonly') in attrs - - def handle_endtag(self, tag): - if self.in_title and tag == 'title': - self.in_title = False - if self.in_form and tag == 'form': - self.in_form = False - if self.in_text and tag == 'textarea': - self.in_text = False - - def handle_data(self, data): - if self.in_text: - self.textdata.append(data) - if self.in_title: - self.title += data - - 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)