Package: garpix-utils
Garpix UtilsНабор утилит для GARPIX CMS.Утилиты:file.get_file_path- генерация пути для сохранения файла (для FileField)string.get_random_string- создание строки случайных символовsignature.make_signature_sha512- создание цифровой подписиmodels.ActiveMixin- миксин для моделей, которым необходимо поле "Активность"models.EmptyMixin- миксин-пустышка, который можно использовать при обязательных миксинахmodels.AvailableMixin- миксин для моделей, которые должны обладать полями "Активность" и "Удалено"models.PolymorphicActiveMixin- миксин для моделиgarpix_page.BasePage, добавляет возможность выбора доступных страниц (которые активны). Используется внутри GARPIX CMS.templatetags.url_replace- подмена одного значения в dict на другое в Django-шаблонах.models.DeleteMixin- миксин для моделей, добавляющий функционал мягкого/жесткого удаления,models.AdminDeleteMixin- миксин для админ.модели.models.PolymorphicAvailableMixin- миксин для моделиgarpix_page.BasePage, добавляет возможность выбора доступных страниц (которые активны и неудалены). Используется внутри GARPIX CMS.models.GarpixSiteConfiguration- класс для добавления мультисайтовых настроек в проекте,admin.GarpixSiteConfigurationAdmin- класс для админ.панелиУстановкаУстановка с помощью pip:pipinstallgarpix_utilsУтилитыfile.get_file_path- генерация пути для сохранения файла (для FileField)file.get_secret_path- генерация уникального пути для переданного имени файлаФормирует путь файла относительно года и месяца, чтобы множество файлов не скапливались на одном уровне.Можно использовать в качестве значения 'upload_to' поля FileField модели Django.ПРИМЕР:from garpix_utils.file import get_file_path
from django.db import models


class FileModel(models.Model):
    # ...
    file = models.FileField(upload_to=get_file_path, blank=True, null=True, verbose_name=_('File'))
    # ...string.get_random_string- создание строки случайных символовСоздает случайную строку указанного размера и с указанными символами.Параметры:size: int - количество символов. По умолчанию - 8.chars: str - строка из списка символов, которые могут быть в строке. По умолчаниюstring.ascii_uppercase + string.digits.ПРИМЕР:Пример 1from garpix_utils.string import get_random_string

random_string = get_random_string(16)

# random_string = '451DNCLZLY2HDDDX'Пример 2import string
from garpix_utils.string import get_random_string

random_string = get_random_string(8, string.ascii_lowercase)

# random_string = 'palsjpyz'Пример 3from garpix_utils.string import get_random_string

random_string = get_random_string(16, '01')

# random_string = '0110111101010100'signature.make_signature_sha512- создание цифровой подписиСоздает сигнатуру (цифровую подпись) по указанным параметрам с хэшированием SHA-512.Обычно используется для эквайринга в качестве защиты цифровой подписью.ВНИМАНИЕ! Если необходим другой алгоритм шифрования, то загляните в эту функцию, можно сделать свой по аналогии.Параметры:params: dict - словарь параметров. Если присутствует signature_key, то он будет удален.signature_key: str - ключ параметра с сигнатурой. По умолчанию "sig".secret: str - секретный ключ, который будет приконкатенирован в конце перед хэшированием.Алгоритм:Берет словарь параметров, удаляет оттуда параметр с ключом сигнатуры (см. переменную signature_key, по умолчанию значение "sig")Получившийся словарь сортирует по названию ключа в алфавитном порядке. Все вложенные данные тоже сортируются по ключу, списочные - просто по алфавиту.Последовательно конкатенирует ключ со значением в единую строку.В конце конкатенирует значение переменной secret (по умолчанию равна "secret").Хэширует по алгоритму SHA-512 и возвращает строку в нижнем регистре.Возвращает получившийся результат.ПРИМЕР:# необходимый вам файлfromgarpix_utils.signatureimportmake_signature_sha512sig=make_signature_sha512({'a':'xxx','c':'ggg','b':'111','sig':'123','d':[3,1,2],'e':{'b':'2','a':'1'}},signature_key='sig',secret='secret')# sig = '2123086085ec1fe67595d7b3d2b6a0dbf3f33e528d78366b8d62d7f0a7e3c090077b0f7b8dc84921a6087aa57b8284bd1e74702df7a16e96f73f627e6eea815a'Разбор примера по шагам:Шаг 1Было: {'a': 'xxx', 'c': 'ggg', 'b': '111', 'sig': '123', 'd': [3, 1, 2], 'e': {'b': '2', 'a': '1'}}Стало: {'a': 'xxx', 'c': 'ggg', 'b': '111', 'd': [3, 1, 2], 'e': {'b': '2', 'a': '1'}}Шаг 2Было: {'a': 'xxx', 'c': 'ggg', 'b': '111', 'd': [3, 1, 2], 'e': {'b': '2', 'a': '1'}}Стало: {'a': 'xxx', 'b': '111', 'c': 'ggg', 'd': [1, 2, 3], 'e': {'a': '1', 'b': '2'}}Шаг 3Было: {'a': 'xxx', 'b': '111', 'c': 'ggg', 'd': [1, 2, 3], 'e': {'a': '1', 'b': '2'}}Стало: 'axxxb111cgggd123ea1b2'Шаг 4Было: 'axxxb111cgggd123ea1b2'Стало: 'axxxb111cgggd123ea1b2secret'Шаг 5Было: 'axxxb111cgggd123ea1b2secret'Стало: '2123086085ec1fe67595d7b3d2b6a0dbf3f33e528d78366b8d62d7f0a7e3c090077b0f7b8dc84921a6087aa57b8284bd1e74702df7a16e96f73f627e6eea815a'models.ActiveMixin- миксин для моделей, которым необходимо поле "Активность"Добавляет полеis_active (Boolean, default=True). Добавляет менеджераactive_objects, который выбирает только активные объекты (is_active=True).ПРИМЕР:# необходимый вам файлfromdjango.dbimportmodelsfromgarpix_utils.modelsimportActiveMixinclassProduct(ActiveMixin,models.Model):passProduct.active_objects.all()# Будут выбраны записи только с is_active == True.models.EmptyMixin- миксин-пустышка, который можно использовать при обязательных миксинахПРИМЕР:# необходимый вам файлfromdjango.dbimportmodelsfromgarpix_utils.modelsimportEmptyMixinclassProduct(EmptyMixin,models.Model):pass# Ничего не изменилось.Или использование в пакетеgarpix_blog:# app/settings.pyGARPIX_BLOG_MIXIN='garpix_utils.models.EmptyMixin'models.AvailableMixin- миксин для моделей, которые должны обладать полями "Активность" и "Удалено"Добавляет поляis_active (Boolean, default=True)иis_deleted (Boolean, default=False). Добавляет менеджераavailable_objects, который выбирает только доступные объекты (is_active=True, is_deleted=False).ПРИМЕР:# необходимый вам файлfromdjango.dbimportmodelsfromgarpix_utils.modelsimportAvailableMixinclassProduct(AvailableMixin,models.Model):passProduct.available_objects.all()# Будут выбраны записи только с is_active == True.templatetags.url_replace- подмена одного значения в dict на другое в Django-шаблонах.ПРИМЕР для пагинации (взято изhttps://github.com/garpixcms/garpix_page/):{% load url_replace %}

<nav>
    <ul class="pagination">
        {% for page_num in page_range %}
            <li class="page-item {% if page_num == page %}active{% endif %}">
                <a class="page-link" href="?{% url_replace request 'page' page_num %}">{{ page_num }}</a>
            </li>
        {% endfor %}
    </ul>
</nav>ChangelogSeeCHANGELOG.md.ContributingSeeCONTRIBUTING.md.LicenseMIT