Source code for

from typing import Any, Dict, Optional, TYPE_CHECKING

from .abc import Model
from .manga_list import MangaList
from .mixins import DatetimeMixin
from ..constants import routes
from ..utils import DefaultAttrDict, copy_key_to_attribute

    from ..client import MangadexClient

[docs]class Author(Model, DatetimeMixin): """A :class:`.Model` representing an individual author. .. note:: Artists and authors are stored identically and share all properties. .. versionadded:: 0.2 """ name: str """The name of the author.""" image: Optional[str] """An image of the author, if available.""" biographies: DefaultAttrDict[Optional[str]] """A :class:`.DefaultAttrDict` holding the biographies of the author.""" mangas: MangaList """A list of all the mangas that belong to the author. .. note:: In order to efficiently get all mangas in one go, use: .. code-block:: python await author.load_mangas() """ def __init__( self, client: "MangadexClient", *, id: Optional[str] = None, version: int = 0, data: Optional[Dict[str, Any]] = None, ): self.mangas = MangaList(client) self.biographies = DefaultAttrDict(default=lambda: None) super().__init__(client, id=id, version=version, data=data)
[docs] def parse(self, data: Dict[str, Any]): super().parse(data) if "data" in data and "attributes" in data["data"]: attributes = data["data"]["attributes"] copy_key_to_attribute(attributes, "name", self) copy_key_to_attribute(attributes, "imageUrl", self, "image") if "biography" in attributes and attributes["biography"]: for item in attributes["biography"]: for key, value in item.items(): self.biographies[key] = value self._process_times(attributes) self._parse_relationships(data)
[docs] async def fetch(self): """Fetch data about the author. |permission| ``author.view`` :raises: :class:`.InvalidID` if an author with the ID does not exist. """ await self._fetch("author.view", "author")
[docs] async def load_mangas(self): """Shortcut method that calls :meth:`.MangadexClient.batch_mangas` with the mangas that belong to the author. Roughly equivalent to: .. code-block:: python await client.batch_mangas(*author.mangas) """ await self.client.batch_mangas(*self.mangas)
[docs] async def update(self): """Update the author. |auth| .. versionadded:: 0.5 """ if not hasattr(self, "name"): await self.fetch() params = {"name":, "version": self.version} self.client.raise_exception_if_not_authenticated("PUT", routes["author"]) r = await self.client.request("PUT", routes["author"].format(, json=params) json = await r.json() r.close() obj = type(self)(self.client, data=json) self.transfer(obj)
[docs] async def delete(self): """Delete the author. |auth| .. versionadded:: 0.5 """ return await self._delete("author")