| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 | import pathlibfrom .image import imagefrom .product import productfrom .exception import directory_image_exceptionclass directory_image:    """    This is image directory manager. It could store new images for product,    move it, when product name had been changed, and also remove images.    """    def __init__(self, target: pathlib.Path, thumbnail: int = 400) -> None:        """         This initialize new manager.        Parameters;            target (pathlib.Path): Directory to store images in            thumbnail (int): Dimension of the thumbnails        """        self.__target = target        self.__thumbnail_size = thumbnail        if not self.__target.is_dir():            self.__target.mkdir()    @property    def thumbnail_size(self) -> int:        """ Diameter of the thumbnails. """        return self.__thumbnail_size    def server_path() -> str:        """ This return where bind covers on server. """        return "/covers"    @property    def target(self) -> pathlib.Path:        """ Target directory of the manager. """        return self.__target    def __name(self, target: product) -> str:        """         Base name of the image.                Parameters:             target (product): Target product to generate name of        Returns:            (str): Base part of the name        """        return target.name.encode("UTF-8").hex()    def get_full_name(self, target: product) -> str:        """         Name of the full size image.                Parameters:             target (product): Target product to generate name of        Returns:            (str): Name of the full size file        """        return self.__name(target) + ".full.png"    def get_thumbnail_name(self, target: product) -> str:        """         Name of the thumbnail.                Parameters:             target (product): Target product to generate name of        Returns:            (str): Name of the thumnail file        """        return self.__name(target) + ".thumbnail.webp"    def __full_path(self, target: product) -> pathlib.Path:        """        Path of the full size image.        Parameters:            target (product): Target product to generate path from        Returns:            (pathlib.Parh): Path of the image        """        return self.target / pathlib.Path(self.get_full_name(target))    def __thumbnail_path(self, target: product) -> pathlib.Path:        """        Path of the thumbnail image.        Parameters:            target (product): Target product to generate path from        Returns:            (pathlib.Parh): Path of the thumbnail        """        return self.target / pathlib.Path(self.get_thumbnail_name(target))    def save(self, content: image, target: product) -> None:        """        This save new image for new product.        Parameters:            coded (str): Base64 coded received image            target (product): Target product to save image for        """        full = self.__full_path(target)        thumbnail = self.__thumbnail_path(target)               if full.is_file() or thumbnail.is_file():             content = "Images for product \"" + target.name + "\" "            content = content + "already exists."            raise directory_image_exception(content)        content \        .save_full(full) \        .save_thumbnail(thumbnail, self.thumbnail_size)        def drop(self, target: product) -> None:        """        This drop images for given product.        Parameters:            target (product): Target product to remove images for        """        full = self.__full_path(target)        thumbnail = self.__thumbnail_path(target)                if not full.is_file() or not thumbnail.is_file():            content = "Can not remove images for \"" + target.name + "\" "            content = content + "it not exiets."            raise directory_image_exception(content)        full.unlink()        thumbnail.unlink()    def update(self, old: product, new: product) -> None:        """        This update names of the images for product. Name of the images is        connected with name of the product, and when name of the product         had been changed, also images must be updated.        Parameters:            old (product): Product before update            new (product): Product after update        """        same_name = (            self.get_thumbnail_name(old) == self.get_thumbnail_name(new) and \            self.get_full_name(old) == self.get_full_name(new)        )        if same_name:            return        old_full = self.__full_path(old)        old_thumbnail = self.__thumbnail_path(old)        if not old_full.is_file() or not old_thumbnail.is_file():            content = "Can not move file for \"" + old.name + "\" "            content = content + "because not exists."            raise directory_image_exception(content)        new_full = self.__full_path(new)        new_thumbnail = self.__thumbnail_path(new)        if new_full.is_file() or new_thumbnail.is_file():             content = "Can not move, because images for \"" + new.name + "\" "            content = content + "already exists."            raise directory_image_exception(content)        old_full.rename(new_full)        old_thumbnail.rename(new_thumbnail)
 |