Skip to Content

Odoo 19: архіваванне фірмы разам з карыстальнікамі партала – модуль partner_archive_users з пытаннем замест паведамлення пра памылку

3 лістапада 2026 г. | Odoo 19 Community | Уласная распрацоўка
3 лістапада 2026 г. by
Odoo 19: архіваванне фірмы разам з карыстальнікамі партала – модуль partner_archive_users з пытаннем замест паведамлення пра памылку

Модуль Odoo 19 partner_archive_users: пытанне пры архіваванні фірмы з карыстальнікамі партала

Фірма-кліент з'ехала, дагавор скончыўся, і вы хочаце архіваваць яе ў Odoo. Odoo адказвае паведамленнем пра памылку: «Вы не можаце архіваваць кантакты, звязаныя з актыўным карыстальнікам. Спачатку архівуйце адпаведнага карыстальніка.» Калі ў фірмы некалькі доступаў да партала, гэта азначае: кожнага карыстальніка шукаць асобна, архіваваць асобна, вяртацца да фірмы, архіваваць яшчэ раз.

Для гэтага мы напісалі невялікі модуль Архіваванне фірмы разам з карыстальнікамі партала (partner_archive_users) для Odoo 19. Замест паведамлення пра памылку з'яўляецца пытанне, і пры «Так» карыстальнікі партала і фірма архівуюцца за адзін крок. Модуль даступны як свабоднае праграмнае забеспячэнне пад ліцэнзіяй AGPL-3 на GitHub:

github.com/Alex0176/odoo-partner-archive-users

Мы выкарыстоўваем модуль у Biricon IT Services у нашым прадукцыйным асяроддзі з 3 лістапада 2026 г. Ён новы, таму вопыт з ім кароткі. Хто яго пераймае, павінен прачытаць раздзелы пра Аб'ём і Абмежаванні .

Праблема ў стандартным Odoo

Пры архіваванні кантакта Odoo правярае, ці прывязаны да яго карыстальнік, і перарывае аперацыю, калі так. Праверка мае сэнс, бо кожнаму карыстальніку патрэбны кантакт. Для ўнутраных карыстальнікаў, гэта значыць супрацоўнікаў, блакіроўка таксама мэтавая. Але для карыстальнікаў партала ў кліентаў гэта ў першую чаргу ручная праца. Кожная фірма-кліент з доступамі да партала, напрыклад для прагляду рахункаў і тыкетаў, патрабуе пры архіваванні аднаго і таго ж парадку дзеянняў:

  1. знайсці карыстальнікаў фірмы і яе кантактных асоб,
  2. архіваваць кожнага асобна,
  3. вярнуцца да фірмы,
  4. архіваваць фірму.

Рашэнне: пытанне

Модуль пашырае шлях Дзеянне → Архіваваць у кантакце, як у форме, так і ў спісе. Калі да выбранай фірмы або яе кантактных асоб прывязаны актыўныя карыстальнікі партала, адкрываецца дыялог з пытаннем «Ці сапраўды трэба архіваваць фірму? У сістэме яшчэ ёсць актыўныя карыстальнікі.» Ніжэй пералічаны закранутыя карыстальнікі з імем, лагінам і кантактам.

Параўнанне: паведамленне 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 з выпраўленнем таго ж дня. Усе імёны і лагіны на малюнках выбраны адвольна.