Tworzenie "warunków" z użyciem nowego API [Zamknięte]

To pytanie zostało zamknięte z powodu: niezwiązane z tematem lub nieaktualne

przez
Dr.One
na 22.09.2015 13:33:53

Wciąż walczę z warunkami, próbuję różnych wariantów jednak, chyba składnia nie odpowiada bo błąd za błędem mi wyrzuca. Nawet gdy dodałem pole "fields.Selection([('K','Komputer'), ('M','Monitor'), ('P','Procesor')], 'Wybrór', required=True)"

Kod:

 wybór = fields.Selection([('K','Komputer'), ('M','Monitor'), ('P','Procesor')], required=True)  zasadniczo nawet jeśli to pole nie jest zdefiniowane w tym module wybór działa poprawnie i łączenie poszczególnych elementów w nową nazwę działa.

Żeby jednak zredukować

    com0 = fields.Char('Marka')

    com1 = fields.Char('Model')

    com2 = fields.Char('Wielkość')

    com3 = fields.Char('Typ')

    com4 = fields.Char('Złącze')

    com5 = fields.Char('profil')

    com6 = fields.Char('pamięć')

  nowa_nazwa = fields.Char(compute="_get_nowa_nazwa", string="Product Name")

    @api.one

    @api.depends("com0", "com1", "com2", "com3", "com4", "com5", "com6")

    def _get_nowa_nazwa(self):

        com0 = self.com0 or ' '

        com1 = self.com1 or ' '

        com2 = self.com2 or ' '

        com3 = self.com3 or ' '

        com4 = self.com4 or ' '

        com5 = self.com5 or ' '

        com6 = self.com6 or ' '

#============ tak jak jest działa pięknie ============

#=========== warunki jednak nie działają ============

if wybór = 'K':

    name = ustr(com0) + ' ' + ustr(com1) + ' ' + ustr(com2)

if wybór = 'M':

    name = ustr(com0) + ' ' + ustr(com3) + ' ' + ustr(com4)

if wybór = 'P':

    name = ustr(istock_com0) + ' ' + ustr(istock_com5) + ' ' + ustr(istock_com6)

#======  w efekcie działania tego skryptu otrzymuję nową nazwę złożoną z wybranych wartości ======

        self.name = name 

        self.nowa_nazwa = name

Pomijając wszystkie inne aspekty jak gdzie jest umieszczony "wybornik" :)

Jak powinno to wyglądac /

 

Dr.One
Dr.One
341
| 5 3 5
Data pytania 08.04.2015, 09:02
0
głos
1152 Odsłony

Niezbyt rozumiem chyba Twój problem. Dlaczego po prostu nie napiszesz:

if self.state in ('c',):
   self.name = .... tu co chcesz...
if self.state in ('m','k'):
   self.name = .... tu co chcesz innego...

PS. Nazwa state jest zastrzeżona dla reprezentacji stanów obiektów, proponuję używac innej.

 

Janusz Stefaniak
Janusz Stefaniak
597
| 3 1 2
Data odpowiedzi 09.04.2015, 18:03
0
głos

Dziękuję Panie Janusz ;) i o to mnie chodziło. Nie mogłem się doszukać jak to powinno wyglądać dlatego pytałem ale nikt nie odpowiedział do tej pory. Jeszcze jedno pytanie przy okazji jeśli mogę zapytać. Napisałem skrypt który zbiera wartości kilku pól i tworzy jeden string nie wiem jednak jak zmusić żeby zbierał wyświetlaną wartość a nie wskazanie pozycji że tak się wyrażę. Otóż zamiast np nazwy przechwycona wartość wyglą mniej więcej tak: product.costam(numer,) czyli jakby wskazuje na element w tablicy, ktory to element jest a nie na jego wartość. Mam nadzieję, że dostatecznie jasno to opisałem :) Tak się dzieje jeśli odwołanie jest do pola many2one w przypadku każdego innego typu pola char/selection/text już jest prawidłowo.

Dr.One
na 09.04.2015, 21:24

Oznaczenie product.costam(numer,) wskazyje, że to coś jest całym obiektem o danym id. Z tego obiektu możesz wybrać dowolne pole np. product.costam.id, producy.costam.name lub nawet może to wyglądać np tak: product.costam.foo.xyz.name (kolejne pola po kropce z kolejnych odwołań do obiektów)

Janusz Stefaniak
na 10.04.2015, 19:29

A to pewne z tym "state" ? :) Chyba nie, bo w kilku przykładowych modułach które spotkałem w sieci jest używany bez żadnych ograniczeń. Może nie dotyczny to nowego API ? oto przykład https://www.odoo.com/documentation/8.0/howtos/backend.html

Dr.One
na 11.04.2015, 20:34

A propo's if state in ('c',): self.name = .... tu co chcesz... if state in ('m','k'): self.name = .... tu co chcesz innego... nie działa, chyba że ja coś źle robię. :)

Dr.One
na 11.04.2015, 20:47

Prawdopodobnie powinno być self.state - poprawiłem

Janusz Stefaniak
na 12.04.2015, 08:21

Pole state w przykładzie odwzorowuje właśnie stany obiektu (draft, cancel, itd.)

Janusz Stefaniak
na 12.04.2015, 08:24

Rozumiem, nie będę więc nawet próbował używać :) Ale , Janusz, proszę podpowiedz mi jak mam to zrobić, do tej pory nie mogę sobie z tym poradzić, przeanalizowałem wiele różnych przykładów w których zastosowano i "onchange" i najprostszy "if" nie mogę jednak uzyskać dziłającej formy dla mojego przypadku, albo tego jeszcze nie załapałem. Czy tak powinna wyglądać składnia w tym przypadku ? ... computer = self.computer or ' ' processor = self.processor or ' ' if product_lines_id in ('computer',): self.name = ustr(condition) + ustr(product_brand_id) self.prod_name = name

Dr.One
na 12.04.2015, 11:32

Nie podajesz czym jest i skąd się wzięło product_lines_id, trudno jest pomóc jeżeli brakuje kompletu informacji, jeśli jest to pole bieżącego obiektu to zapewne podobnie wymaga użycia self.product_lines_id

Janusz Stefaniak
na 12.04.2015, 12:20

product_lines_id jest polem typu selection ale zadeklarowane w drugim module do ktorego tem fragment stanowi uzupełnienie.

Dr.One
na 12.04.2015, 15:37

Sugerujesz, że ponieważ to pole nie jest zadeklarowane w "tym" module to nie dziala ?

Dr.One
na 13.04.2015, 09:33

Dokładnie tak. Skąd system ma wiedzieć jaka jest wartość tego pola w danym momencie. Być może potrzebujesz dodatkowo pola typu relacja lub inaczej musisz wydobyć wartość.

Janusz Stefaniak
na 13.04.2015, 16:00

Walkę z indentami wygrałem ;)

Strasznie wybredny jest ten python ;)

Wystarczy gdzieś jedna za mało lub za dużo spacja i wszystko się sypie ;)

 

Dr.One
Dr.One
341
| 5 3 5
Data odpowiedzi 10.04.2015, 09:33
0
głos

Indenty to inaczej wcięcia kodu (znaki spacji i tabulacji) python wymaga poprawnej struktury w tym zakresie.

Dariusz Żbikowski
na 10.04.2015, 10:09

W końcu doszedłem, poukładałem jak należy. Niestety w dalszym ciągu nie mogę sobie poradzić. W najlepszym wypadku działa ale .... zamiast nazwy(w przypadku użycia pola typu many2one) pojawia się "product.template(190,)" i nie wiem co z tym zrobić :(

Dr.One
na 10.04.2015, 12:33

zamiast np. xxx_id użyj xxx_id.name

Dariusz Żbikowski
na 10.04.2015, 12:58

from openerp import models, api, fields from openerp.tools import ustr class Product_Template(models.Model): _inherit = "product.template" istock_com0a = fields.Char('brand') istock_com1 = fields.Char('type') istock_com2 = fields.Char('size') istock_com3 = fields.Char('mem') istock_com4 = fields.Char('con') istock_com5 = fields.Char('out') istock_com6 = fields.Char('usb') prod_name = fields.Char(compute="_get_prod_name", string="Product Name") @api.one @api.depends("istock_com0a", "istock_com1", "istock_com2", "istock_com3", "istock_com4", "istock_com5", "istock_com6") def _get_prod_name(self): istock_com0a.name = self.istock_com0a.name or ' ' istock_com1 = self.istock_com1 or ' ' istock_com2 = self.istock_com2 or ' ' istock_com3 = self.istock_com3 or ' ' istock_com4 = self.istock_com4 or ' ' istock_com5 = self.istock_com5 or ' ' istock_com6 = self.istock_com6 or ' ' name = ustr(istock_com0a) + ustr(istock_com1) + ustr(istock_com2) + ustr(istock_com3) + ustr(istock_com4) + ustr(istock_com5) + ustr(istock_com6) self.name = name self.prod_name = name Na próbę zrobiłem tak, błąd "istock_com0a.name = self.istock_com0a.name or ' ' NameError: global name 'istock_com0a' is not defined" wygląda na to, że albo w złym miejscy dodałem .name albo .... ?

Dr.One
na 10.04.2015, 13:25

ale juz wiem dlaczego

Dr.One
na 10.04.2015, 13:26

Kurcze, nie rozumiem, w przypadku odwołania do pola utworzonego pierwszym modulem dziala(stare API), w przypadku odwołania do pola utworzonego nowym modulem (nowe API) wywala błąd processor = self.processor.name or '' AttributeError: 'bool' object has no attribute 'name' a wszystko co zmieniłem to nazwa pola z istock_com0a na processor :)

Dr.One
na 10.04.2015, 13:50

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!

Zadaj Pytanie

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ń

3 obserwujący

Statystyki

Spytał/a: 08.04.2015, 09:02
Oglądano: 1152 razy
Ostatnia aktualizacja: 22.09.2015, 13:33