Source code for pywikibot.site._decorators

"""Decorators used by site models."""
#
# (C) Pywikibot team, 2008-2020
#
# Distributed under the terms of the MIT license.
#
from pywikibot.exceptions import UnknownExtension, UserRightsError
from pywikibot.tools import deprecated_args, manage_wrapping, MediaWikiVersion


[docs]@deprecated_args(right=True) def must_be(group=None): """Decorator to require a certain user status when method is called. @param group: The group the logged in user should belong to. This parameter can be overridden by keyword argument 'as_group'. @type group: str or None @return: method decorator @raises UserRightsError: user is not part of the required user group. """ def decorator(fn): def callee(self, *args, **kwargs): grp = kwargs.pop('as_group', group) if self.obsolete: if not self.has_group('steward'): raise UserRightsError( 'Site {} has been closed. Only steward ' 'can perform requested action.' .format(self.sitename)) elif not self.has_group(grp): raise UserRightsError('User "{}" is not part of the required ' 'user group "{}"' .format(self.user(), grp)) return fn(self, *args, **kwargs) if not __debug__: return fn manage_wrapping(callee, fn) return callee return decorator
[docs]def need_extension(extension: str): """Decorator to require a certain MediaWiki extension. @param extension: the MediaWiki extension required @return: a decorator to make sure the requirement is satisfied when the decorated function is called. """ def decorator(fn): def callee(self, *args, **kwargs): if not self.has_extension(extension): raise UnknownExtension( 'Method "{}" is not implemented without the extension {}' .format(fn.__name__, extension)) return fn(self, *args, **kwargs) if not __debug__: return fn manage_wrapping(callee, fn) return callee return decorator
[docs]def need_right(right=None): """Decorator to require a certain user right when method is called. @param right: The right the logged in user should have. @type right: str or None @return: method decorator @raises UserRightsError: user has insufficient rights. """ def decorator(fn): def callee(self, *args, **kwargs): if self.obsolete: if not self.has_group('steward'): raise UserRightsError( 'Site {} has been closed. Only steward ' 'can perform requested action.' .format(self.sitename)) elif right is not None and not self.has_right(right): raise UserRightsError('User "{}" does not have required ' 'user right "{}"' .format(self.user(), right)) return fn(self, *args, **kwargs) if not __debug__: return fn manage_wrapping(callee, fn) return callee return decorator
[docs]def need_version(version: str): """Decorator to require a certain MediaWiki version number. @param version: the mw version number required @return: a decorator to make sure the requirement is satisfied when the decorated function is called. """ def decorator(fn): def callee(self, *args, **kwargs): if MediaWikiVersion(self.version()) < MediaWikiVersion(version): raise NotImplementedError( 'Method or function "%s"\n' "isn't implemented in MediaWiki version < %s" % (fn.__name__, version)) return fn(self, *args, **kwargs) if not __debug__: return fn manage_wrapping(callee, fn) return callee return decorator