IT Блог

Документации и переводы

Статьи на технические темы

Добавление copy_relations за пределами плагина с помощью signals в django cms

В django-cms иногда необходимо добавить или расширить copy_relations() в модели стороннего плагина для обработки внешних ключей: ForeignKeyOneToOneField или ManyToManyField.

Например, есть некое стороннее приложение (cms плагин) text_block с моделью TextBlock:

# models.py
class TextBlock(CMSPlugin):
    title = models.CharField(_('Title'), max_length=255)
    content = models.TextField(_('Content'))


# cms_plugins.py
class TextBlockPlugin(CMSPluginBase):
    model = TextBlock
    name = 'TextBlock'
    render_template = 'text_block.html'

И нам нужно добавить какое-нибудь дополнительное поле, например, description (описание).

Для этого добавляем в проект новое приложение, например, text_block_ext с моделью TextBlockExt:

class TextBlockExt(models.Model):
    text_block = models.OneToOneField(TextBlock, on_delete=models.CASCADE)
    description = models.TextField(_('Description'))

Ext (в слове TextBlockExt) - это сокращение слова Extension...


django.urls.exceptions.NoReverseMatch при создании sitemap django AppHookConfig

При использовании aldryn-apphooks-config (или без него, при стандартном использовании apphooks) может возникнуть ошибка при создании sitemap, например, такая:

   return reverse('{}:category'.format(self.app_config.namespace), kwargs={'slug': self.slug})
django.urls.exceptions.NoReverseMatch: Reverse for 'category' not found. 'category' is not a valid view function or pattern name.

При использовании модели, например, такой:

class Category(models.Model):
    app_config = AppHookConfigField(AlbumConfig, verbose_name='Конфигурация')

    title = models.CharField('Название', max_length=80)
    slug = models.SlugField('Путь', max_length=80, unique=True)

    objects = ActiveQuerySet.as_manager()

    def get_absolute_url(self):
        return reverse('{}:category'.format(self.app_config.namespace), kwargs={'slug': self.slug})


    def __str__(self):
        return self.title

    class Meta(object):
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'

И sitemap:

class SBAlbumCategorySitemap(Sitemap):
    changefreq = 'monthly'
    priority = 0.5
    i18n = True

    def items(self):
        return Category.objects.all()

Хотя на сайте...


django-cms this.ui.container.data(...).push is not a function

В django 3.7.X (возможно, и в более ранней версии) до текущей 3.8.0 (на момент написания статьи) существует ошибка при открытии структуры страницы:

`Uncaught TypeError: this.ui.container.data(...).push is not a function
at s.initialize (bundle.toolbar.min.js:1)

Возникает она тогда, когда шаблон содержит несколько static_templates с одинаковыми именами, например: {% static_placeholder 'header' %}

На гитхабе есть тикет , и пока что разработчики не поправили это дело. 

Покопавшись в файле bundle.toolbar.min.js, где возникает ошибка, я смог найти временное решение.

Временное решение ошибки

Нужно скопировать файл /path_to_env_of_my_project/lib/python3.8/site-packages/cms/static/cms/js/dist/3.8.0/bundle.toolbar.min.js в /path_to_my_project/static/cms/js/dist/3.8.0/bundle.toolbar.min.js.

Обратите внимание, что вместо имени папки 3.8.0 используйте имя папки соответствующее вами используемой версии django-cms....


Установка python 3

Установка из репозиториев

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
apt update
sudo apt install python3.9

Теперь можно проверить, что python установился:

$ python3.9 -V
Python 3.9.4

Если во время apt update после добавления репозитория возникает ошибка:

E: Репозиторий «http://ppa.launchpad.net/deadsnakes/ppa/ubuntu hirsute Release» не содержит файла Release

Можно попытаться исправить ошибку, вписав вместо hirsute доступный репозиторий, который можно найти на странице . Например, вписать bionic. Но при apt update может возникнуть ошибка:

Ошб:5 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu bionic InRelease
  Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY BA6932366A755776
Чтение списков пакетов… Готово
W: Ошибка GPG: http://ppa.launchpad.net/deadsnakes/ppa/ubuntu bionic...

Couldn't install package: rcssmin

С установкой django-compressor или другим пакетом может возникнуть ошибка установки пакета rcssmin:

[pipenv.exceptions.InstallError]:     In file included from rcssmin.c:18:
_setup/include/cext.h:34:10: fatal error: Python.h: Нет такого файла или каталога
   34 | #include "Python.h"
      |          ^~~~~~~~~~
    compilation terminated.
    error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
    ----------------------------------------
ERROR: Command errored out with exit status 1

ERROR: Couldn't install package: rcssmin

pip

Используя pip, вы можете установить rcssmin через флаг --install-option="--without-c-extensions":

pip install rjsmin --install-option="--without-c-extensions"

И тогда django-compressor и другие пакеты, требующие rcssmin установятся успешно.

pipenv

pipenv на момент написания статьи не поддерживает флаг --install-option, поэтому нужно установить pythonX-dev, где...


Json в mql: JAson

В MQL нет возможности хранить данные различных типов через стандартные типы данных, как это можно сделать в python через словари или в javascript через объекты. Так как MQL типизированный язык, то реализация данных в виде словаря, где хранятся данные в виде пар "ключ - значение", весьма трудоёмко. К счастью, есть замечательная библиотека JAson, которая позволяет хранить данные различных типов в виде словаря, а если быть точнее, то в виде JSON. Также библиотека преобразовывать JSON объект в виде строки и обратно.

Код библиотеки можно найти на странице . Так как библиотека не находится в каком-либо репозитории, то во-первых, сложно следить за...


Установка pgadmin4 на Linux

Прежде всего удалите pgadmin3 или pgadmin4, если вы пытались установить его через исходный код или apt:

sudo apt purge pgadmin3 pgadmin4
sudo apt autoremove

Теперь выполните следующие шаги:

1. Откройте терминал и склонируйте репозиторий куда-нибудь в свою домашнюю папку.

git clone https://github.com/vivazzi/py_pg_admin.git
cd py_pg_admin

2. (Опционально) Скопируйте local_settings_sample.py в local_settings.py и установите желаемые параметры. Установщик содержит несколько сохранённых конфигураций Pipfile-ов. Чтобы посмотреть доступные, введите:

python3 pre_install.py --help

3. Запустите pre_install.py и следуйте инструкциям:

python3 pre_install.py

Эта команда создаёт папку .venv в папке проекта для того, чтобы pipenv установил виртуальное окружение рядом с проектом. Также команда попытается добавить Pipfile,...


Установка и обновление pip и pipenv

Сначала проверьте, установлен ли пакет pip устанавливается вместе с python (в версиях python 2 >= 2.7.9 и python 3 >= 3.4) ставится по умолчанию. Если pip не установлена, то установите:

sudo apt install python3-pip

Теперь нужно решить, куда вы хотите установить pipenv: можно в домашнюю папку, а можно в системную.

В большинстве случаев разницы нет, куда её установить, но иногда, если pipenv установлена в домашнюю папку, то могут возникнуть проблемы с использованием команд subprocess.Popen() или subprocess.check_output(): например, pipenv не сможет найти virtualenv. Конечно, можно просто и virtualenv установить в домашнюю папку и не забыть добавить путь в...


hplip plugin.run file does not match its checksum. File may have been corrupted or altered

Для установки драйвера для принтера HP в Linux достаточно ввести в терминале команды (принтер должен быть включён):

sudo apt-get install hplip-gui
sudo hp-setup -i

Ответив на несколько вопросов, вы установите драйвер. Но при установке может быть ошибка автоматического скачивания плагина, например, в моём случае на Linux Mint 20.1:

/home/vivazzi/.hplip/hplip-3.20.11-plugin.run file does not match its checksum. File may have been corrupted or altered

У меня принтер hp laserJet P1006, и в моём случае, как видим, не удаётся скачать файл hplip-3.20.11-plugin.run. В вашем случае может быть плагин с другим названием. Чтобы решить проблему с установкой драйвера HP на Linux, нужно...


Отладка в mql. Улучшить дебаг с помощью mql_debug

Зачастую при написании кода mql в среде разработки MetaEditor не хватает отладчика (дебаггера), который мог бы не только следить за переменными, но и вычислять выражения. К сожалению, в MetaEditor такого нет. Например, в коде:

int OnInit(){
    double a = MathPow(2, 1) + MathAbs(-10)/2;

    for (int i=0, len=OrdersTotal(); i < len; i++)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderType() == OP_BUY)
           OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 70);
}

поставив точку останова, например, на 2-ой, мы не можем посмотреть в дебаггере отдельно, чему равно MathPow(2, 1) или MathAbs(-10)/2. Только если мы пошагово перейдём на следующую строчку, мы сможем узнать в дебаггере, чему равно...

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте

Выберите валюту для отображения денежных единиц