Exemplo n.º 1
0
 def __init__(self, api_endpoint, username=None, password=None, domain=None):
     if isinstance(api_endpoint, MediaWikiAPI):
         self._api = api_endpoint
     else:
         self._api = MediaWikiAPI(api_endpoint)
     if username:
         self.login(username, password, domain)
Exemplo n.º 2
0
class Wiki(object):
    def __init__(self, api_endpoint, username=None, password=None, domain=None):
        if isinstance(api_endpoint, MediaWikiAPI):
            self._api = api_endpoint
        else:
            self._api = MediaWikiAPI(api_endpoint)
        if username:
            self.login(username, password, domain)

    def __getitem__(self, key):
        page = self.get_page(key)

        if page is not None:
            return page
        else:
            raise KeyError(key)

    def _get_siteinfo(self, property_name, force=False):
        if not hasattr(self, "_siteinfo_cache"):
            self._siteinfo_cache = {}

        if property_name not in self._siteinfo_cache or force:
            result = self._api.query(meta="siteinfo", siprop=property_name)

            property = result.query[property_name]
            self._siteinfo_cache[property_name] = property
        else:
            property = self._siteinfo_cache[property_name]

        return property

    @property
    def categories(self):
        return Categories(self)

    @property
    def files(self):
        return Files(self)

    def get_category(self, category_name):
        category = Category(self, category_name)

        if category.exists:
            return category
        else:
            return None

    def get_file(self, file_name):
        file = Category(self, file_name)

        if file.exists:
            return file
        else:
            return None

    def get_namespace(self, namespace):
        return self.namespaces[namespace]

    def get_page(self, name, namespace=None):
        if isinstance(name, Title):
            page = Page(self, name)
        elif namespace:
            page = Page(self, Title(self, name, namespace))
        else:
            page = Page(self, Title(self, name))

        if page.exists:
            return page
        else:
            return None

    def get_user(self, username):
        user = User(self, username)

        if user.exists:
            return user
        else:
            return None

    @property
    def language(self):
        siteinfo = self._get_siteinfo("general")
        return dateutil.parser.parse(siteinfo["time"])

    def login(self, username, password, domain=None, wait=False):
        token = None

        def try_login():
            return self._api.login(lgname=username, lgpassword=password, lgdomain=domain, lgtoken=token)

        while True:
            response = try_login().login

            if response.result == "NeedToken":
                token = response.token
            elif response.result == "Success":
                return True
            elif response.result == "Illegal":
                raise IllegalNameError(username)
            elif response.result == "NotExists":
                raise NonexistentUserError(username, domain)
            elif response.result == "EmptyPass":
                raise EmptyPasswordError()
            elif response.result == "WrongPass":
                raise WrongPasswordError(username, password, domain)
            elif response.result == "WrongPluginPass":
                raise PluginWrongPasswordError(username, password, domain)
            elif response.result == "CreateBlocked":
                raise CreateBlockedError()
            elif response.result == "Throttled":
                if wait:
                    time.sleep(response.wait)
                else:
                    raise ThrottledError(response.wait)
            elif response.result == "Blocked":
                raise BlockedError()
            else:
                raise UnknownResponseError(response)

    def logout(self):
        self._api.logout()

    @property
    def main_page(self):
        return self.get_page(self._get_siteinfo("general")["mainpage"])

    @property
    def name(self):
        return self.get_page(self._get_siteinfo("general")["sitename"])

    @property
    def namespaces(self):
        return Namespaces(self)

    @property
    def time(self):
        siteinfo = self._get_siteinfo("general", force=True)
        return dateutil.parser.parse(siteinfo["time"])

    @property
    def timezone(self):
        # TODO: is this hours or seconds?
        siteinfo = self._get_siteinfo("general", force=True)
        return int(siteinfo["timeoffset"])

    @property
    def tzname(self):
        siteinfo = self._get_siteinfo("general", force=True)
        return siteinfo["timezone"]

    @property
    def users(self):
        return Users(self)