Beispiel #1
0
    def move(self, new_title, reason='', move_talk=True, no_redirect=False):
        """Move (rename) page to new_title.

        If user account is an administrator, specify no_direct as True to not
        leave a redirect.

        If user does not have permission to move page, an InsufficientPermission
        exception is raised.

        """
        if not self.can('move'):
            raise errors.InsufficientPermission(self)

        if not self.site.writeapi:
            raise errors.NoWriteApi(self)

        data = {}
        if move_talk:
            data['movetalk'] = '1'
        if no_redirect:
            data['noredirect'] = '1'
        result = self.site.api('move', ('from', self.name),
                               to=new_title,
                               token=self.get_token('move'),
                               reason=reason,
                               **data)
        return result['move']
Beispiel #2
0
    def delete(self, reason='', watch=False, unwatch=False, oldimage=False):
        """Delete page.

        If user does not have permission to delete page, an InsufficientPermission
        exception is raised.

        """
        if not self.can('delete'):
            raise errors.InsufficientPermission(self)

        if not self.site.writeapi:
            raise errors.NoWriteApi(self)

        data = {}
        if watch:
            data['watch'] = '1'
        if unwatch:
            data['unwatch'] = '1'
        if oldimage:
            data['oldimage'] = oldimage
        result = self.site.api('delete',
                               title=self.name,
                               token=self.get_token('delete'),
                               reason=reason,
                               **data)
        return result['delete']
Beispiel #3
0
    def save(self,
             text,
             summary=u'',
             minor=False,
             bot=True,
             section=None,
             **kwargs):
        """
        Update the text of a section or the whole page by performing an edit operation.
        """
        if not self.site.logged_in and self.site.force_login:
            # Should we really check for this?
            raise errors.LoginError(
                self.site,
                'By default, mwclient protects you from accidentally ' +
                'editing without being logged in. If you actually want to edit without '
                'logging in, you can set force_login on the Site object to False.'
            )
        if self.site.blocked:
            raise errors.UserBlocked(self.site.blocked)
        if not self.can('edit'):
            raise errors.ProtectedPageError(self)

        if self.section is not None and section is None:
            warnings.warn(
                'From mwclient version 0.8.0, the `save()` method will no longer '
                +
                'implicitly use the `section` parameter from the last `text()` or '
                +
                '`edit()` call. Please pass the `section` parameter explicitly to '
                + 'the save() method to save only a single section.',
                category=DeprecationWarning,
                stacklevel=2)
            section = self.section

        if not self.site.writeapi:
            raise errors.NoWriteApi(self)

        data = {}
        if minor:
            data['minor'] = '1'
        if not minor:
            data['notminor'] = '1'
        if self.last_rev_time:
            data['basetimestamp'] = time.strftime('%Y%m%d%H%M%S',
                                                  self.last_rev_time)
        if self.edit_time:
            data['starttimestamp'] = time.strftime('%Y%m%d%H%M%S',
                                                   self.edit_time)
        if bot:
            data['bot'] = '1'
        if section:
            data['section'] = section

        data.update(kwargs)

        def do_edit():
            result = self.site.api('edit',
                                   title=self.name,
                                   text=text,
                                   summary=summary,
                                   token=self.get_token('edit'),
                                   **data)
            if result['edit'].get('result').lower() == 'failure':
                raise errors.EditError(self, result['edit'])
            return result

        try:
            result = do_edit()
        except errors.APIError as e:
            if e.code == 'badtoken':
                # Retry, but only once to avoid an infinite loop
                self.get_token('edit', force=True)
                try:
                    result = do_edit()
                except errors.APIError as e:
                    self.handle_edit_error(e, summary)
            else:
                self.handle_edit_error(e, summary)

        # 'newtimestamp' is not included if no change was made
        if 'newtimestamp' in result['edit'].keys():
            self.last_rev_time = client.parse_timestamp(
                result['edit'].get('newtimestamp'))
        return result['edit']