Фірма-кліент з'ехала, дагавор скончыўся, і вы хочаце архіваваць яе ў Odoo. Odoo адказвае паведамленнем пра памылку: «Вы не можаце архіваваць кантакты, звязаныя з актыўным карыстальнікам. Спачатку архівуйце адпаведнага карыстальніка.» Калі ў фірмы некалькі доступаў да партала, гэта азначае: кожнага карыстальніка шукаць асобна, архіваваць асобна, вяртацца да фірмы, архіваваць яшчэ раз.
Для гэтага мы напісалі невялікі модуль Архіваванне фірмы разам з карыстальнікамі партала (partner_archive_users) для Odoo 19. Замест паведамлення пра памылку з'яўляецца пытанне, і пры «Так» карыстальнікі партала і фірма архівуюцца за адзін крок. Модуль даступны як свабоднае праграмнае забеспячэнне пад ліцэнзіяй AGPL-3 на GitHub:
github.com/Alex0176/odoo-partner-archive-users
Мы выкарыстоўваем модуль у Biricon IT Services у нашым прадукцыйным асяроддзі з 3 лістапада 2026 г. Ён новы, таму вопыт з ім кароткі. Хто яго пераймае, павінен прачытаць раздзелы пра Аб'ём і Абмежаванні .
Праблема ў стандартным Odoo
Пры архіваванні кантакта Odoo правярае, ці прывязаны да яго карыстальнік, і перарывае аперацыю, калі так. Праверка мае сэнс, бо кожнаму карыстальніку патрэбны кантакт. Для ўнутраных карыстальнікаў, гэта значыць супрацоўнікаў, блакіроўка таксама мэтавая. Але для карыстальнікаў партала ў кліентаў гэта ў першую чаргу ручная праца. Кожная фірма-кліент з доступамі да партала, напрыклад для прагляду рахункаў і тыкетаў, патрабуе пры архіваванні аднаго і таго ж парадку дзеянняў:
- знайсці карыстальнікаў фірмы і яе кантактных асоб,
- архіваваць кожнага асобна,
- вярнуцца да фірмы,
- архіваваць фірму.
Рашэнне: пытанне
Модуль пашырае шлях Дзеянне → Архіваваць у кантакце, як у форме, так і ў спісе. Калі да выбранай фірмы або яе кантактных асоб прывязаны актыўныя карыстальнікі партала, адкрываецца дыялог з пытаннем «Ці сапраўды трэба архіваваць фірму? У сістэме яшчэ ёсць актыўныя карыстальнікі.» Ніжэй пералічаны закранутыя карыстальнікі з імем, лагінам і кантактам.
- Так, архіваваць фірму і карыстальнікаў: спачатку архівуюцца карыстальнікі, потым фірма.
- Скасаваць: нічога не мяняецца.
- Карыстальнікаў партала няма: Odoo паводзіць сябе як раней, дыялог не з'яўляецца.
Што архівуецца, а што не
Аб'ём наўмысна вузкі:
- Толькі карыстальнікі партала і публічныя карыстальнікі (
share = True). Унутраныя карыстальнікі гэтым шляхам ніколі не архівуюцца. Калі да кантакта прывязаны доступ супрацоўніка, паведамленне Odoo пра памылку застаецца. Так ніхто не заблакуе супрацоўніка выпадкова толькі таму, што архівуе фірму. - Кантактныя асобы застаюцца актыўнымі кантактамі. Архівуюцца толькі іх доступы да партала. Гэта адпавядае стандарту Odoo, які пры архіваванні фірмы таксама не чапае даччыныя кантакты.
- Толькі шлях архівавання праз інтэрфейс. Непасрэдны
write({'active': False}), напрыклад пры імпарце або ў скрыпце, трапляе без змен у праверку Odoo.
Тэхнічная рэалізацыя
Модуль не мае новых палёў у наяўных мадэлях. Ён складаецца з пашырэння res.partner.action_archive і памочніка (partner.archive.users.wizard), які з'яўляецца як дыялог.
| Элемент | Задача |
|---|---|
action_archive у кантакце | Шукае актыўных карыстальнікаў з share = True, прывязаных да кантакта або (у выпадку фірмаў) да кантактаў фірмы. Калі такія ёсць, замест архівавання вяртаецца дыялог. |
| Памочнік | Захоўвае фірму і знойдзеных карыстальнікаў, паказвае іх і пры «Так» выконвае архіваванне з ключом кантэксту archive_linked_users. |
Кантэкст skip_archive_users_wizard | Адключае дыялог. Тады зноў дзейнічае праверка Odoo. |
| Доступ | Памочніка могуць ствараць і выкарыстоўваць унутраныя карыстальнікі (base.group_user). |
| Пераклад | Нямецкая мова (de.po) і шаблон (.pot) прыкладаюцца. |
Карыстальнікі шукаюцца і архівуюцца з павышанымі правамі (sudo). Дзякуючы гэтаму дыялог працуе і для карыстальнікаў без доступу да кіравання карыстальнікамі. Адваротны бок апісаны ў раздзеле Абмежаванні.
Выснова: тэст быў зялёны, але дыялог усё роўна зламаны
Пры першым выкарыстанні ў модуля была памылка, якой не знайшлі аўтаматычныя тэсты. Пры першым клікам на «Архіваваць» у інтэрфейсе замест дыялога з'явіўся экран памылкі Odoo з Cannot read properties of undefined (reading 'map').
Прычына: вэб-кліент выклікае action_archive непасрэдна і выконвае вернутае дзеянне без дадатковай апрацоўкі. Пры гэтым ён абавязкова чытае ключ views дзеяння. У нашага дзеяння быў толькі view_mode. Дзеянні з кнопак з type="object" сервер дапаўняе загадзя (clean_action у call_button), але не пры непасрэдным выкліку action_archive. Тэсты выклікалі метад толькі ў Python, і там адсутнае поле не выявілася.
Выпраўленне — адзін радок ("views": [(False, "form")]), да гэтага дадаецца праверка ў тэсце, якая патрабуе менавіта гэтага ключа. Пры гэтым нічога не архівавалася. Урок: хто вяртае дзеянне з метада, які кліент выклікае непасрэдна (action_archive, action_unarchive і падобныя), павінен заўсёды перадаваць views.
Устаноўка
git clone https://github.com/Alex0176/odoo-partner-archive-users.git
ln -s /pfad/odoo-partner-archive-users/partner_archive_users /pfad/addons/
odoo-bin -c odoo.conf -d <datenbank> -i partner_archive_users --stop-after-init
Залежнасці — base і contacts. Пасля ўстаноўкі службу Odoo трэба перазапусціць, бо модуль утрымлівае код Python. Хто эксплуатуе прадукцыйную сістэму, усталёўвае модуль спачатку на копіі базы даных.
Абмежаванні
- Дазвол. Паколькі карыстальнікі архівуюцца з павышанымі правамі, кожны, каму дазволена архіваваць кантакт, можа праз дыялог архіваваць і доступы да партала гэтай фірмы. Для ўнутраных карыстальнікаў гэта не дзейнічае. Хто хоча больш дакладна абараніць доступы да партала, павінен адаптаваць модуль.
- Няма аўтаматычнага аднаўлення. Калі фірма пазней зноў актывуецца, карыстальнікі застаюцца ў архіве. Іх трэба рэактываваць уручную.
- Толькі кантакты. Модуль тычыцца фірмаў як кантактаў (
res.partner). Архіваванне фірмы Odoo (res.company) мае іншыя праверкі, напрыклад калі яна яшчэ з'яўляецца стандартнай фірмай карыстальнікаў. Для гэтага модуль не прызначаны. - Пратэставана толькі з Odoo 19.0 Community. Для іншых версій мы яго не правяралі.
Частыя пытанні
Чаму супрацоўнікі не архівуюцца разам?
Унутраны карыстальнік мае правы ў сістэме і звычайна звязаны з уласнымі данымі, задачамі і дазволамі. Блакіраваць яго як пабочны эфект архівавання фірмы для нас занадта рызыкоўна. Таму застаецца паведамленне Odoo пра памылку.
Ці магу я адключыць пытанне?
У кодзе праз кантэкст skip_archive_users_wizard. Налады ў інтэрфейсе няма. Хто выдаляе модуль, зноў атрымлівае стандартныя паводзіны Odoo.
Пад якой ліцэнзіяй ён распаўсюджваецца?
Пад AGPL-3. Паведамленні пра памылкі і паляпшэнні вітаюцца як issue ў рэпазіторыі GitHub .
Падтрымка ад Biricon IT Services
Мы суправаджаем устаноўкі Odoo для малых і сярэдніх прадпрыемстваў: ад укаранення праз адаптацыі і міграцыі да штодзённай эксплуатацыі. Калі вы хочаце спрасціць працэсы, такія як архіваванне фірмаў-кліентаў, у Odoo, наладзіць партал для сваіх кліентаў або бяспечна ўвесці модуль у прадукцыйнае асяроддзе, мы з ахвотай дапаможам. Іншыя ўласныя распрацоўкі: Нумары дакументаў з прэфікса, года і лічыльніка, Firmenbuch і праверка адрасоў для аўстрыйскіх кліентаў і Наборы прадуктаў у прапанове як раздзел.
Стан на 3 лістапада 2026 г. Версія модуля 19.0.1.0.0 з выпраўленнем таго ж дня. Усе імёны і лагіны на малюнках выбраны адвольна.