Кампанія-кліент сышла, дагавор скончыўся, і вы хочаце заархіваваць яе ў Odoo. Odoo выдае паведамленне пра памылку: «Нельга архіваваць кантакты, звязаныя з актыўным карыстальнікам. Спачатку заархівуйце адпаведнага карыстальніка». Калі кампанія мае некалькі ўліковых запісаў на партале, давядзецца шукаць і архіваваць кожнага карыстальніка асобна, потым вяртацца да кампаніі і зноў спрабаваць яе заархіваваць.
Для гэтага мы распрацавалі невялікі модуль Архіваванне кампаніі разам з карыстальнікамі партала (partner_archive_users) для Odoo 19. Замест паведамлення пра памылку з'яўляецца запыт пацвярджэння, і пасля адказу «Так» карыстальнікі партала і кампанія архівуюцца за адзін крок. Модуль даступны на GitHub як свабоднае праграмнае забеспячэнне пад ліцэнзіяй AGPL-3:
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. Паведамленні пра памылкі і прапановы паляпшэнняў у выглядзе зваротаў у рэпазіторыі GitHub — будзем рады.
Падтрымка ад Biricon IT Services
Мы суправаджаем сістэмы Odoo для малых і сярэдніх прадпрыемстваў: ад укаранення, дапрацовак і міграцый да штодзённай эксплуатацыі. Калі вы хочаце спрасціць такія працэсы, як архіваванне кампаній-кліентаў у Odoo, наладзіць партал для кліентаў або бяспечна ўсталяваць модуль у рабочай сістэме, мы ахвотна дапаможам. Іншыя ўласныя распрацоўкі: Нумары дакументаў з прэфікса, года і лічыльніка, Рэестр кампаній і праверка адрасоў для аўстрыйскіх кліентаў і Наборы тавараў як раздзел камерцыйнай прапановы.
Стан на 3 лістапада 2026. Версія модуля 19.0.1.0.0 з выпраўленнем ад таго ж дня. Усе імёны і лагіны на ілюстрацыях выдуманыя.