ЗаписиУлучшенный аналог ondelete=restrict для полей many2many

По умолчанию у полей с типом many2many нет параметра ondelete, как у полей с типом many2one, который отвечает за то, что делать с элементом, который ссылается на другой элемент, если этот другой элемент удаляют.

У опции ondelete есть в таком случае два варианта:
cascade – удалять элемент при удалении родителя (не знаю как правильно назвать тот элемент, НА который ссылаются)
restrict – запрет удаления родительского элемента

Бывают случаи, когда для полей many2many тоже было бы неплохо использовать аналог опции ondelete=restrict. У меня как раз такой случай. Есть две модели – product.attribute и product.attribute.group, между которыми связь many2many.

Я переопределил метод unlink, внутри которого проверяю наличие связей у удаляемой записи. Ниже пример для проверки связей при попытке удаления product.attribute:

def unlink(self, cr, uid, ids, context=None):
        if context is None:
            context = {}
        for attribute in self.browse(cr, uid, ids):
            attribute_group = self.pool.get('product.attribute.group')
            attribute_group_ids = attribute_group.search(cr, uid, [('attribute_ids', 'in', attribute.id),])
            if attribute_group_ids:
                attribute_group_names = []
                for attribute_group_element in attribute_group.browse(cr, uid, attribute_group_ids):
                    attribute_group_names.append(attribute_group_element.name)
                attribute_group_names_str = ', '.join(attribute_group_names)
                raise osv.except_osv(_('Some attribute groups have references to the attribute ') + attribute.name + '!',
                                     _('First remove these  references: ') + attribute_group_names_str)
        return super(product_attribute_group, self).unlink(cr, uid, ids)

Аналогичный код написан и для проверки при попытке удаления product.attribute.group. Если находим ссылки на удаляемую запись, тогда формируем строку с перечислением записей, которые ссылаются на текущую, и выводим пользователю сообщение о том, что сначала нужно удалить эти ссылки. Таким образом пользователь сразу узнает, что конкретно мешает удалению текущей записи (кстати хорошо бы было сделать такое же сообщение и при ondelete=restrict, а то там просто выводится ошибка, а что конкретно нужно сделать чтобы все-таки удалить запись, не написано).

Вы можете заметить что тексты сообщения обрамлены в функцию _(), это для того чтобы строки были переводимыми. Чтобы эту функцию использовать, нужно подключить ее такой строкой:

from tools.translate import _

Вопросы и комментарии приветствуются.

ЗаписиTOP 7 поисковых фраз (ответы на вопросы)

Всем привет!

Просматривая статистику по поисковым запросам, которые приводят на мой сайт, выявил популярные вопросы.

1 – shell du посчитать количество файлов

Вероятно, вас интересует, как посчитать количество файлов с помощью команды du (disk usage). Вообще, не очень понятен смысл считать количество файлов командой du, т.к. она показывает количество используемого места на диске. Обычно я считаю количество файлов с помощью команды find. Но раз вы так хотите, то и это осуществимо.

Для начала, чтобы посчитать количество файлов, нужно вывести все файлы в выбранном каталоге командой du. Для этого служит параметр -a или –all. Нижеприведенная команда показывает все файлы в каталоге /var

du -a /var
du --all /var

Потом нужно все эти файлы посчитать. Этим займется команда wc. Эта команда печатает количество строк, слов и байт в указанном файле, но в данном случае она будет брать не файл а входной поток. Т.е. вывод предыдущей команды она воспринимает как текстовый файл, и считает в нем строки, т.к. у нас каждый файл на новой строке. Чтобы команда wc считала исключительно строки, добавляем параметр -l (–lines). Выглядеть это будет так:

du -a /var | wc -l
du --all /var | wc --lines

У меня в /var получилось 24009 файлов. Кстати, если вы хотите подсчитать суммарный размер файлов, используйте команду du с флагом -s. И чтобы вывод был не в байтах, а в человечном виде (например в гигабайтах), нужно использовать еще флаг -h. Так можно узнать суммарный размер любого каталога.

du -sh /var
du --summarize --human-readable /var

2 – наложить патч на файл linux

Как это делается было объяснено в статье Создание и наложение патчей. Если что-то не понятно, пишите там в комментарии, я отвечу. Возможно вам придется поставить пакет patch чтобы установить недостающие компоненты, если что-то не работает.

3 – не запускается web клиент openerp

Здесь нужно смотреть, какие при этом он выдает ошибки в консоли терминала. Как правило не установлены нужные модули (зависимости). Посмотрите еще раз в документации по установке на сайте OpenERP (ссылка для версии 6.0.x, для 6.1 нужны другие зависимости)

4 – bash количество каталогов

Ну, это совсем просто. Нам потребуется использовать две команды в связке. Первая выводит все каталоги в нужной папке (type=directory), вторая, уже описанная в этом посте выше, считает количество строк в выводе и выводит результат.

find /var -type d | wc -l

5 – debian denwer

Извините, но зачем вам denwer на debian, когда полноценный веб-сервер ставится за одну минуту? Точно не уверен, но мне кажется что denwer под debian не существует, по крайней мере необходимости в нем на linux нет. Наберите команду:

aptitude update && aptitude install apache2 php5 mysql-server php5-mysql

можно еще добавить нужные вам библиотеки, например я обычно еще добавляю php5-gd для уменьшения изображений.

6 – linux bash shell команды

Постоянно обновляемый и пополняемый список полезных linux bash shell команд приведен на странице Полезные команды Linux

7 – кто работал с openerp

OpenERP сообщество в России еще не особо большое. Можно посмотреть в российской ветке форума OpenERP.

Еще есть arterp.ru – по ссылке имеется список клиентов с успешными внедрениями в России. Еще посетите wiki.arterp.ru, там есть инструкции со скриншотами и красивые схемы движения материалов :)

Блоги наших зарубежных коллег:
http://mohsinpage.wordpress.com/category/openerp/
http://www.zbeanztech.com/blog

С OpenERP также работаю я :)

  • мои записи по OpenERP можно посмотреть в этом блоге по тегу openerp.
  • написанные мной модули и патчи к OpenERP можно посмотреть на GitHub.

С OpenERP можешь начать работать и ты! Дерзай и все получится.

ЗаписиFATAL: Ident authentication failed for user “openerp”

If you see this error, try to change ‘ident’ to ‘md5′ in file /etc/postgresql/9.0/main/pg_hba.conf

It works!

ЗаписиOpenERP Tips & Tricks

If you’re looking for manipulate many2many and one2many fields in OpenERP (to link objects to each other or delete or modify this link), you must write one of these values to many2many or one2many field:

many2many:

(0, 0,  { values })    link to a new record that needs to be created with the given values dictionary
(1, ID, { values })    update the linked record with id = ID (write *values* on it)
(2, ID)                remove and delete the linked record with id = ID (calls unlink on ID, that will delete the object completely, and the link to it as well)
(3, ID)                cut the link to the linked record with id = ID (delete the relationship between the two objects but does not delete the target object itself)
(4, ID)                link to existing record with id = ID (adds a relationship)
(5)                    unlink all (like using (3,ID) for all linked records)
(6, 0, [IDs])          replace the list of linked IDs (like using (5) then (4,ID) for each ID in the list of IDs)

Example:
   [(6, 0, [8, 5, 6, 4])] sets the many2many to ids [8, 5, 6, 4]

one2many:

(0, 0,  { values })    link to a new record that needs to be created with the given values dictionary
(1, ID, { values })    update the linked record with id = ID (write *values* on it)
(2, ID)                remove and delete the linked record with id = ID (calls unlink on ID, that will delete the object completely, and the link to it as well)

Example:
   [(0, 0, {'field_name':field_value_record1, ...}), (0, 0, {'field_name':field_value_record2, ...})]

ЗаписиСоздание и наложение патчей

Приходится по работе сейчас патчить openerp-web (веб-клиент для открытой ERP системы OpenERP http://openerp.com), т.к. он глюковат.

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

Создать патч:

diff -uN file.orig file.new > file.patch

Наложить патч:

patch file.orig < file.patch

Если кого-то интересуют патчи к openerp-web, загляните ко мне на GitHub: https://github.com/dskarataev/dskopenerp

ЗаписиЗапускаем openerp-web как сервис (для версии 6.0)

Если вы уже скачали и установили openerp-web (об этом написано в инструкции), он запускается вручную и всё работает, и вы просто хотите чтобы он работал не только запущенным вручную, а всегда, то эта статья для вас.

Для того чтобы openerp-web работал всегда, нужно запускать его как сервис, т.е. прописать в /etc/init.d/

Для начала скопируйте содержимое скрипта, представленного ниже, в файл /etc/init.d/openerp-web

Продолжить чтение →