Задать вопрос
  • Передать параметры (высота и ширина) в класс. models.ImageField?

    @mmailcompany Автор вопроса
    Dev-op,
    спасибо за идеи. ответ отмечу решением.
    но оформил пока так (может потом придет озарение или, кто-нибудь еще идеи подкинет):

    def converter_compressor(content, max_width, max_height):
        content.file.seek(0)
        image = Image.open(content.file)
        (w, h) = image.size
        if    w > max_width:
              img_ratio = int(float(image.size[0]) / max_width)
              new_height = int(float(image.size[1]) / img_ratio)
              image = image.resize((max_width, new_height), Image.LANCZOS)
        elif  h > max_height:
              img_ratio = int(float(image.size[1]) / max_height)
              new_width = int(float(image.size[0]) / img_ratio)
              image = image.resize((new_width, max_height), Image.LANCZOS)
        else:
              image = image.resize(image.size, Image.LANCZOS)
    
        image_bytes = io.BytesIO()
        image.save(fp=image_bytes, format="WEBP")
        image_content_file = ContentFile(content=image_bytes.getvalue())
        return image_content_file
    
    class WEBPThumbnailImg(ImageFieldFile):
            
        def save(self, name, content, save=True):
            image_content_file = converter_compressor(content, 300, 300)
            super().save(name, image_content_file, save)
    
    class WEBPThumbnail(models.ImageField):
        attr_class = WEBPThumbnailImg
    Написано
  • Передать параметры (высота и ширина) в класс. models.ImageField?

    @mmailcompany Автор вопроса
    Dev-op,
    если так пишу
    class WEBPThumbnailImg(ImageFieldFile):
    
        def __init__(self, *args, **kwargs):
            self.max_width = kwargs.pop('max_width', 300)
            self.max_height = kwargs.pop('max_height', 200)
            super().__init__(*args, **kwargs)
            
        def save(self, name, content, save=True, max_width=None, max_height=None):
            content.file.seek(0)
            image = Image.open(content.file)
            max_width  = self.max_width
            max_height = self.max_height
            (w, h) = image.size
            if    w > max_width:
                  img_ratio = int(float(image.size[0]) / max_width)
                  new_heigh = int(float(image.size[1]) / img_ratio)
                  image = image.resize((max_width, new_heigh), Image.LANCZOS)
            elif  h > max_height:
                  img_ratio = int(float(image.size[1]) / max_height)
                  new_width = int(float(image.size[0]) / img_ratio)
                  image = image.resize((new_width, max_height), Image.LANCZOS)
            else:
                  image = image.resize(image.size, Image.LANCZOS)
    
            image_bytes = io.BytesIO()
            image.save(fp=image_bytes, format="WEBP")
            image_content_file = ContentFile(content=image_bytes.getvalue())
            super().save(name, image_content_file, save)
    
    
    class WEBPThumbnail(models.ImageField):
        attr_class = WEBPThumbnailImg  # атрибут
    
        def __init__(self, *args, **kwargs):
            self.max_width = kwargs.pop('max_width', 200)
            self.max_height = kwargs.pop('max_height', 200)
            super().__init__(*args, **kwargs)


    то обрабатывает, но значения берет сверху (300 и 200). переданные значения не воспринимает и нижние не учитывает
    Написано
  • Передать параметры (высота и ширина) в класс. models.ImageField?

    @mmailcompany Автор вопроса
    Dev-op,
    зачем вам это Django?))


    хочется)))

    Попробуйте так:


    загружает, но не обрабатывает
    условие if max_width and max_height: файлит))

    я кст до форума так пробовал
    def save(self, name, content, save=True, max_width=None, max_height=None):
    не помогает... у самого голова уже пухнет....
    лог на код последний, что я выкладывал:
    spoiler
    66c770cc6e51f939315698.jpeg

    консоль тоже самое говорит

    сорян, что мозг Вам взорвал... пора отдыхать. спасибо за наводи. может завтра, что додумаю)))
    Написано
  • Передать параметры (высота и ширина) в класс. models.ImageField?

    @mmailcompany Автор вопроса
    Dev-op,
    1. не принципиально. главное что в обеих строках одинаково.
    2. учту, спасибо
    3. да, уже коментил. без него тоже все работает, но если руками прописать величины.

    суть в том, что до обработки изо дело не доходит.
    обработчик ругается на эти строки:
    max_width  = self.max_width
    max_height = self.max_height

    self.max_width и self.max_height он не видит
    если руками прописать им величины, то код полностью отрабатывает как надо...
    Написано
  • Передать параметры (высота и ширина) в класс. models.ImageField?

    @mmailcompany Автор вопроса
    Dev-op, может я их не так добавляю в class Category?!!
    Написано
  • Передать параметры (высота и ширина) в класс. models.ImageField?

    @mmailcompany Автор вопроса
    Dev-op,
    class WEBPThumbnailImg(ImageFieldFile):
            
        def save(self, name, content, save=True):
            content.file.seek(0)
            image = Image.open(content.file)
            max_width  = self.max_width
            max_height = self.max_height
            (w, h) = image.size
            if  w > max_width:
                img_ratio = (float(image.size[0]) / max_width)
                new_heigh = int(float(image.size[1]) / img_ratio)
                image = image.resize((max_width, new_heigh), Image.LANCZOS)
            elif h > max_height:
                img_ratio = (float(image.size[1]) / max_height)
                new_width = int(float(image.size[0]) / img_ratio)
                image = image.resize((new_width, max_height), Image.LANCZOS)
            else:
                image = image.resize(image.size, Image.LANCZOS)
    
            image_bytes = io.BytesIO()
            image.save(fp=image_bytes, format="WEBP")
            image_content_file = ContentFile(content=image_bytes.getvalue())
            super().save(name, image_content_file, save)
    
    
    class WEBPThumbnail(models.ImageField):
        attr_class = WEBPThumbnailImg
    
        def __init__(self, *args, **kwargs):
            self.max_width = kwargs.pop('max_width', 200)
            self.max_height = kwargs.pop('max_height', 200)
            super().__init__(*args, **kwargs)
    
        def pre_save(self, model_instance, add):
            file = super().pre_save(model_instance, add)
            if file and not file._committed:
                file.max_width = self.max_width
                file.max_height = self.max_height
            return file


    class Category(models.Model):
        name         = models.CharField("Категория", max_length=100, db_index=True)
        slug         = models.SlugField("URL", max_length=44, unique=True, db_index=True)
        # thumbnail    = models.ImageField("Миниатюра", upload_to=upload_cats_thumbnail, blank=True)
        thumbnail    = WEBPThumbnail("Миниатюра", upload_to=upload_cats_thumbnail, blank=True, max_width=400, max_height=200 )


    Ругается на строку max_width = self.max_width:

    class WEBPThumbnailImg(ImageFieldFile):
            
        def save(self, name, content, save=True):
            content.file.seek(0)
            image = Image.open(content.file)
            max_width  = self.max_width

    если вручную прописываю, то на след строку ругается max_height
    Написано
  • Передать параметры (высота и ширина) в класс. models.ImageField?

    @mmailcompany Автор вопроса
    Dev-op, я убирал комментарий, он все-равно не видит почему-то
    Написано
  • Передать параметры (высота и ширина) в класс. models.ImageField?

    @mmailcompany Автор вопроса
    Dev-op, да это бывает. я методом тыка подправил. теперь получается передать параметры, ошибок нету

    thumbnail    = WEBPThumbnail("Миниатюра", upload_to=upload_cats_thumbnail, blank=True, max_width=400, max_height=200 )


    остался вопрос как их в классе WEBPThumbnailImg принять

    class WEBPThumbnailImg(ImageFieldFile):
            
        def save(self, name, content, save=True):
            content.file.seek(0)
            image = Image.open(content.file)
            # max_width  = self.max_width
            # max_height = self.max_height
            (w, h) = image.size
            if float(w > max_width):


    при загрузке ругается, что нет параметров max_width (name 'max_width' is not defined)
    Написано
  • Передать параметры (высота и ширина) в класс. models.ImageField?

    @mmailcompany Автор вопроса
    Exception Type: TypeError
    Exception Value:
    WEBPThumbnail.attr_class() takes 1 positional argument but 4 were given

    P.s

    Если вы хотите использовать класс в других проектах то первое, это не надо жестко кодировать max_width и max_height


    просто тестировал уменьшение и конвертацию изо

    class полностью:

    class WEBPThumbnailImg(ImageFieldFile):
        def save(self, name, content, save=True):
            content.file.seek(0)
            image = Image.open(content.file)
            # max_width  = 200
            # max_height = 200
            (w, h) = image.size
            if float(w > max_width):
                img_ratio = (float(image.size[0]) / max_width)
                new_heigh = int(float(image.size[1]) / img_ratio)
                image = image.resize((max_width, new_heigh), Image.LANCZOS)
            elif h > max_height:
                img_ratio = (float(image.size[1]) / max_height)
                new_width = int(float(image.size[0]) / img_ratio)
                image = image.resize((new_width, max_height), Image.LANCZOS)
            else:
                image = image.resize(image.size, Image.LANCZOS)
    
            image_bytes = io.BytesIO()
            image.save(fp=image_bytes, format="WEBP")
            image_content_file = ContentFile(content=image_bytes.getvalue())
            super().save(name, image_content_file, save)

    Написано
  • Почему не удаётся запустить imagick на php 8.2, 8.3?

    @mmailcompany Автор вопроса
    Как вариант можно переименовать/удалить папки ранее используемых версий php ибо:


    никак не могу понять, что и как, но заработало, включая 8.1.

    довольно интересная ситуация. даже ребут не помогал. переименовать или удалить ранее используемую (папку) версию помогает...

    досадно. столько времени потратил. пол интернета перерыл.

    думаю, ради интереса, позже, закину на чистую систему, погляжу как себя будет вести...
    Написано
  • Почему не удаётся запустить imagick на php 8.2, 8.3?

    @mmailcompany Автор вопроса
    ThunderCat,
    или пробовать с 8.0 что-то химичить...


    так она стоит и работает отлично (в вопросе написано).

    насколько я прочесал темы, нормальной библиотеки под 8.2+ пока официально нет


    печально, конечно, но спасибо за ваше время и помощь. буду рыть интернет дальше. если, что стоящее найду, обязательно отпишусь...
    Написано
  • Почему не удаётся запустить imagick на php 8.2, 8.3?

    @mmailcompany Автор вопроса
    ThunderCat,
    1. да
    2. пробовал и так и так, но хоть и в инструкции указано extension=php_imagick.dll, должно быть extension=imagick
    3. разумеется. само название папки при распаковки все говорит (php_imagick-3.7.0-8.3-ts-vs16-x64)
    4. да
    5. да
    6. да
    Написано
  • Почему не удаётся запустить imagick на php 8.2, 8.3?

    @mmailcompany Автор вопроса
    может я как-то криво написал. постараюсь быть точнее...
    через power shell командой php -i проверял, всегда показывало, что imagick есть и версия та, которую ставил.


    это говорит о том, что показывает те данные, которые я патчил в переменных средах. (даже, если полностью погасить веб сервер)

    Это говорит о том, что меняли вы не тот php.ini


    редактировал я там файл, куда я его и положил.

    На винде 10 стоит связка Nginx - Apache - PHP (7.4 и 8.0) в портабл режиме.


    я сам ее собирал (портабл) и точно знаю, где и что лежит.

    а также отсутствует инфа в php info.


    речь и идет о функции phpinfo() не просто файлик пхп, а специальный раздел опций на сайте под вордпресс, который выводит всю эту инфу через данную функцию. и я смотрел пути на ини файл (все как я и говорил выше - файл там куда я его ложу). и кроме того, что в логах я вижу PHP Warning: PHP Startup: Unable to load dynamic library 'imagick', в phpinfo() соответственно нет инфы о imagick, что логично.

    з.ы. как может движок WP реагировать на изменения ини файла, если я не то редачу? здоровье сайта то же гляжу писал ведь...
    Написано
  • Почему не удаётся запустить imagick на php 8.2, 8.3?

    @mmailcompany Автор вопроса
    Дмитрий, проверял
    , а так же отсутствует инфа в php info.

    по поводу ручной сборки есть мануалы какие? ни разу не делал этого...
    Написано
  • Все файлы формата кроме конкретного?

    @mmailcompany Автор вопроса
    dodo512, ну я сейчас уже не скажу, что именно перепробовал ибо весь этот мусор удалил, НО видимо с «косой» не пробовал, т.к. сейчас проверил - да, Вы правы на 100% (оба последних варианта), работает. Сделаю заметку в черновиках)) Спасибо...
  • Все файлы формата кроме конкретного?

    @mmailcompany Автор вопроса
    Page-Audit.ru,
    Если в варианте с "=" прописать полный точный путь с учётом регистра, то всё должно сработать

    пробовал ещё до того, как вопрос задал (один из первых вариантов)... и ещё кучу всего - не вышло
  • Все файлы формата кроме конкретного?

    @mmailcompany Автор вопроса
    перепробовал варианты. Не знаю на сколько верно, но сработало только так:
    location ~* ^.+my\.jpg$ {
      ...
    }
    
    location ~* ^.+\.(...|ico|jpeg|jpg|...)$ {
      ...
    }


    т.е регулярка статики ~* ^.+
    то и исключение так ~* ^.+
  • Перенос Ubuntu с SSD на NVMe, проверить NVMe?

    @mmailcompany Автор вопроса
    xotkot,
    No errors detected.
    Header version: 1.0
    Using 3 out of 128 partitions.
    A total of 4397 free sectors is available in 2 segments (the largest is 1.2 MiB).

    если я верно понял, то речь об этом - in 2 segments (the largest is 1.2 MiB)... т.е. все нормально
  • Перенос Ubuntu с SSD на NVMe, проверить NVMe?

    @mmailcompany Автор вопроса
    xotkot,
    если решать проблему с меньшим сопротивлением(для новичка) то можно загрузится с liveusb и удалив/уменьшив раздел подкачки сместить корневой раздел влево на освободившееся место а потом уже переносить.


    Было бы не плохо, если в ответ перенесёте закрыть вопрос галочкой (т.к. основное, что нужно было решилось) ...

    1 загрузившись с usb через gparted сравнил и взял разницу м/у накопителями (за основу неизменного взял корневой катало SSD - /dev/sda3)
    2 Уменьшил на SSD swap и сделал ремап (
    сместить корневой раздел влево
    )
    3 Уменьшил аналогично swap на nvme и оставшееся отдал /dev/nvme0n1p3 - разделы получились один в один и на SSD остался хвост неразмеченный (разница)
    4 перезагружаю, проверяю SSD
    5 Далее чтобы не пробовал, помогло только одно:
    а) делаю бекап SSD акронисом
    б) накатываю на nvme по разделам, указывая ручками (иначе nvme не активен при выборе)
    6 Отключаюсь, отсоединяю все (оставляю только nvme), включаю - все работает...

    если вы про тест скорости то


    да, о нем. хотелось бы видеть реальную картину... вот только как упоминалось в вопросе система Ubuntu Server - она без десктопа и я может плохо посмотрел, но не нашёл никакого упоминания о просмотре и тестах через консоль - KDiskMark...

    в остальном большое спасибо - выручили ( сэкономили мне время и дали немного знаний ) ...