| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- import pathlib
- from .image import image
- from .product import product
- from .exception import directory_image_exception
- class 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)
|