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)
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)