Witamy!

Forum dla profesjonalistów i entuzjastów systemu Odoo. Dyskusje, porady, opinie, komentarze.

0

Porada, tworzenie pola

przez
Dawid Turoń
na 02.09.2019, 08:53 83 odsłony

Witam, 

mam pole many2many (res.user), chcę zrobić przycisk tworzący linie one2many (account.analityc.line) dla każdego ID z res.user.

Kod, tworzy poprawnie, gdy w many2many jest jeden ID  

  @api.multi

    def generuj_karty(self):

        zespol = self.pomocnicy_id.id

        vals_tools = []

        for line in self:

            if zespol:

                vals_tools.append((0, 0, {

                    'date': line.date,

                    'user_id': zespol,

                    'name': '(wygenerowana)',

                    'unit_amount': line.czas_trwania,

                    'project_id': line.task_id.project_id,

                    'task_id': line.task_id

                }))

            else:

                raise UserError(('Uzupełnij listę pomocników'))

            self.karty_pracy_id = vals_tools

        return True


Jeżeli dodam drugi ID to mam taki błąd:
Traceback (most recent call last):
  File "/opt/odoo10/odoo/http.py", line 640, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/opt/odoo10/odoo/http.py", line 677, in dispatch
    result = self._call_function(**self.params)
  File "/opt/odoo10/odoo/http.py", line 333, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/opt/odoo10/odoo/service/model.py", line 101, in wrapper
    return f(dbname, *args, **kwargs)
  File "/opt/odoo10/odoo/http.py", line 326, in checked_call
    result = self.endpoint(*a, **kw)
  File "/opt/odoo10/odoo/http.py", line 935, in __call__
    return self.method(*args, **kw)
  File "/opt/odoo10/odoo/http.py", line 506, in response_wrap
    response = f(*args, **kw)
  File "/opt/odoo10/addons/web/controllers/main.py", line 889, in call_button
    action = self._call_kw(model, method, args, {})
  File "/opt/odoo10/addons/web/controllers/main.py", line 877, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "/opt/odoo10/odoo/api.py", line 689, in call_kw
    return call_kw_multi(method, model, args, kwargs)
  File "/opt/odoo10/odoo/api.py", line 680, in call_kw_multi
    result = method(recs, *args, **kwargs)
  File "/opt/odoo10/addons/ocena_pracownika/models/ocena.py", line 511, in generuj_karty
    zespol = self.pomocnicy_id.id
  File "/opt/odoo10/odoo/fields.py", line 2477, in __get__
    return record.ensure_one()._ids[0]
  File "/opt/odoo10/odoo/models.py", line 4820, in ensure_one
    raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: res.users(15, 32)

0
Dawid Turoń
na 02.09.2019, 22:08

Nie wiem czy się rozumiemy.

Mam pole, gdzie wybieram użytkowników będących pomocnikami. Chce zrobić przycisk który dla każdego pracownika utworzy karte pracy.

    pomocnicy_id = fields.Many2many('res.users', 'project_task_res_pomocnicy_rel', 'project_task_id',

                                   'res_pomocnicy_id', string='Pomocnicy', )

    karty_pracy_id = fields.One2many('account.analytic.line', 'raport_realizacji_id', string='Karty pracy',)


  • Oflaguj

Chyba rozumiem. Pole pomocnicy_id jest many2many - zatem kliku, nie jeden (czyli powinno być nazwane poprawniej pomocnicy_ids, a ich id-y pobierane jako pomocnicy_ids.ids)

Dariusz Żbikowski
na 03.09.2019, 12:15

rozwiązaniem było:

rec = super(generatorKart, self).default_get(fields)

context = dict(self._context or {})

active_model = context.get('active_model')

active_ids = context.get('active_ids')

raport = self.env[active_model].browse(active_ids)

vals = []

for line in raport:

pomocnicy_ids = line.pomocnicy_ids + line.user_id

for record in pomocnicy_ids:

vals.append((0, 0, {

'date': line.date,

...

}))

rec.update({'karty_id': vals})

return rec

Dawid Turoń
na 19.09.2019, 17:42

0

Dariusz Żbikowski

--Dariusz Żbikowski--

1280
| 4 3 3
LODZ, Polska
--Dariusz Żbikowski--
Dariusz Żbikowski
na 02.09.2019, 10:38

Jeśli w zbiorze  zwracanych rekordów znajduje się ich kilka a nie jeden, w tedy należy używać atrybutu ids zamiast id.

Zetem poprawny będzie zapis:

zespol = self.pomocnicy_id.ids

po pomocnicy_id są typu many2many (zatem kilka rekordów, swoją drogą winni być raczej nazwani jako pomocnicy_ids).
Ponieważ zespol to kilku, bledny bedzie także zapis:

'user_id': zespol,


  • Oflaguj

Twoja odpowiedź

Spróbuj dać znacząca odpowiedź. Jeśli chcesz wypowiedzieć się na temat pytania lub odpowiedzi, po prostu użyj narzędzia komentowania. Proszę pamiętać, że zawsze można zrewidować swoją odpowiedź - nie ma potrzeby odpowiadać na to samo pytanie dwa razy. Także prosimy, nie zapomnij zagłosować - to naprawdę pomaga wybrać najlepsze pytania i odpowiedzi!

Bądź na bieżąco

O tym forum

Forum dla profesjonalistów i entuzjastów systemu Odoo. Dyskusje, porady, opinie, komentarze. Przeczytaj wytyczne

Narzędzia do pytań

7 obserwujący

Statystyki

Spytał/a: 02.09.2019, 08:53
Oglądano: 83 razy
Ostatnia aktualizacja: 02.09.2019, 22:08