Budowanie nazwy z wartości innych pól [Zamknięte]

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

przez
Dr.One
na 16.04.2015 21:14:50

Ciąg dalszy musiał nastąpić ....

Panowie, podpowiedzcie mi jak:

W moim module wprowadzam poszczególne informacje w osobnych polach np: marka, model, wielkość i te właśnie informacje chcialbym umieścić w polu name w modelu product.template ale chciałbym aby odbywało się to automatycznie. Gdzieś wyczytałem o utworzeniu funkcji zbierającej ale nie do końca wiem "gdzie dzwoni dzwonek"

jak pozbierać wartości wprowadzone z kilku pól i umieścić w jednym ?

W przypadku php najprostszym rozwiązaniem może być: $product_name = ( '$brand_name' . ' ' . '$model_name' . ' ' . '$size_id' ); co automatycznie utworzy zmienną $product_name "brand model size" 

... "bułka z masłem" natomiast w Odoo ..... Backbone jest dla mnie jeszcze niezrozumiały.

W międzyczasie znalazłem kod ale jak twierdzi jego autor jest "globalny" i zmienia product name wszędzie  a chodzi o zmianę tylko lokalnie podczas tworzenia / edycji produktu.

Potrzebuję prostego rozwiązania. Podpowiecie ?

Mam taki skrypt:

from openerp import models, fields, api, _
class product_template(models.Model):
    _inherit = 'product.template'

@api.one
@api.depends()
@api.multi

 

def _get_name(self, cr, uid, ids, name, arg, context=None):

        reads = self.read(cr, uid, ids, ['brand','model','size'], context=context)

        res = []

        for record in reads:

            name = '%s -> %s' % (record['brand'], record['model'], record['size'])

            res.append((record['id'], name))

        return res

i pole:

'name': fields.function(_get_name, type='char', store=True)

ale coś mi nie działa. co może być przyczyną ?

funkcja biera z trzech pól vartości i robi z tego string który ląduje w <field name="name"/>

a co za tym idzie mam to co chciałem .... prawie bo nie działa :)

Przy okazji nowe API a może to nie API sensu stricto ale przy próbie uruchamiania wciąż pojawiają  się błędy albo o złej indentacji albo return poza funkcją i troszkę mnie to irytuje bo defacto pojawia się błąd indentacji, zmieniam indentację i wywala return poza funkcją. Są na to jakieś specjalne ściśle określone reguły ?

Ten przykład okazał się nie najlepszym ;)

Dr.One
Dr.One
341
| 5 3 5
Data pytania 23.03.2015, 16:36
1
głos
763 Odsłony

Nieco czasu poświęciłem na rozpracowanie tematu, okazało się, że to wcale nie takie trudne. W wyniku mojego działania dowiedziałem się jak i w końcu mam, działające rozwiązanie. Wprowadzane informacje czy to z ręki czy z list rozwijanych składają się w nazwę tak jak chciałem. Zasadniczo pozostaje do rozwiązania jeszcze jeden problem ale to już innym razem ........

Dr.One
na 05.04.2015, 21:47

Jeśli znalazłeś właściwą odpowiedź na swoje pytanie, to może warto ją opubikować i zaznaczyć jako rozwiązującą problem? Przy okazji również zapytam dlaczego nie zaznaczasz, które odpowiedzi na Twe pytania były poprawne, które złe i które warto uznać jako wartościowe głosując na nie?

Janusz Stefaniak
na 09.04.2015, 18:09

Pewnie dlatego, że nie zaznajomiłem się z systemem :) Postaram się poświęcić więcej czasu temu tematowi. A z drugiej strony system "karmowy" trochę mnie irytuje. Chciałem coś zrobić ... nie mogłem bo "Karmy" brak i takie tam :)

Dr.One
na 09.04.2015, 21:28

Wymyśliłem jeszcze coś takiego: def onchange_state(self, cr, uid, ids, state, context=None): if x = state: state if x == "value": return {name = ustr(pole_0) + ' ' + ustr(pole_1) + ' ' + ustr(pole_2)} daleko jestem od prawdy ??

Dr.One
na 09.04.2015, 23:20

Wrzuciłem na YT filmik co wytworzyłem ;) https://www.youtube.com/watch?v=zfryXrBTp0s

Dr.One
na 10.04.2015, 20:53

Przykład @api.onchange:

@api.onchange('state')
def onchange_state(self):
     if self.state == "value":
         self.name = self.pole_0 + ' ' + self.pole_1 + ' ' + self.pole_2

konwerjsa na stringi jest zbędna

Dariusz Żbikowski
Dariusz Żbikowski
1263
| 4 3 3
Data odpowiedzi 10.04.2015, 09:25
0
głos

Za namową któregoś z kolegów poszedłem w tę stronę a to dlatego, że bez konwersji pojawiały się błędy. Sprawdzę jednak ponownie i tę opcję.

Dr.One
na 10.04.2015, 10:57

Nie wiem dlaczego Darku, ale jak w ten sposób zrobiłem to mi wywalało komunikat o błędzie .... w tej chwili nie pamiętam dokładnie ale będę temat jeszcze przerabiał.

Dr.One
na 16.04.2015, 21:25

Jak nadmieniłem na początku zmuszony niemalże zostałem do takiego zorganizowania interfejsu, żeby małpa sobie poradziła i nie narobiła bałaganu. Dokładniej rzecz ujmując wprowadzane poszczególne elementy produktu miały się automatycznie łączyć i w taki sposób uzyskany łańcuch ma stanowić nazwę produktu. Ma to na celu utrzymanie pewnego ustalonego shcematu nadawania nazw produktom. Zawsze taki sam szyk, zestaw elementów itd.

Posłużę się przykładem:

Dzisiaj
osoba wprowadzająca dane do systemu nadała nazwę: Nvidia FX4600

Wczoraj ta sama
osoba wprowadzająca dane do systemu nadała nazwę: nvidia Quadro FX 4600 

niby nic a jednak, wprowadza niepotrzebnie produkt który juz jest to po pierwsze a po drugie nieco brzydko to wygląa jak każda pozycja składa się z innych informacji nawet jeśli dotyczy tego samego produktu.

Mamy więc listy stałych "kawałków" z których będziemy sklejać nazwy, będzie zawsze poprawnie i zawsze tak samo dla każdego typu produktu.

Pewnie, można zawsze znaleźć milion powodów żeby tego nie robić .... niemniej, ja zrobiłem.

Przykładowy kod:

class Product_Template(models.Model): ponieważ  wykorzystujemy istniejący Model Product_Template

    _inherit = "product.template"

    marka = fields.Char('Marka')

    seria = fields.Char('seria')

    model = fields.Char('model')

    prod_name = fields.Char(compute="_get_prod_name", string="Product Name") definiujemy pole w ktorym będziemy przechowywać nazwę produktu

    @api.one

    @api.depends("marka", "seria", "model") informujemy api jakie pola nas interesują (tak mi się przynajmniej wydaje :) )

    def _get_prod_name(self):

        marka = self.marka or ' ' jeśli "marka" pusty to "spacja"

        seria = self.seria or ' ' jeśli "seria" pusty to "spacja"

        model = self.model or ' ' jeśli "model" pusty to "spacja"

        name = ustr(marka) + ' ' + ustr(seria) + ' ' + ustr(model) przechwytujemy do name wartości pól tworząc jeden string.

        self.name = name 

        self.prod_name = name

Jak widać na tym prostym przykładzie możemy łączyć, liczyć wartości wybranych pól.

W dalszym planie skrypt zostanie rozwinięty o kombinacje pól warunkowane tym które w wybranym typie produktu będą potrzebne, ponieważ do jej utworzenia wymagane są specyficzne informacje nieco odmienne niż w przypadku poozstałych.

Przykład:

Komputer: Marka Seria Model Wielkość Procesor - name = ustr(marka) + ' ' + ustr(seria) + ' ' + ustr(model) ...

Monitor: Marka Przekątna/Wielkość Ratio Kolor - name = ustr(marka) + ' ' + ustr(przekatna) + ' ' + ustr(ratio) ...

Klawiatura: Marka Kolor Układ klawiszy Złącze - name = ustr(marka) + ' ' + ustr(kolor) + ' ' + ustr(uklad) ...

I to by było na tyle jak mawiał Prof Jan Tadeusz Stanisławski ;)

 

(Jeśli coś się nie zgadza lub powinno być inaczej, proszę o wskazanie błędów ... dziękuję).

 

Ponieważ brakuje mozliwości kontynuowania prezentacji dalszych postępów (kolejnego okienka) kontynuuję w tym :)

 

W końcu dopracowalem funkcję zbierającą, otóż z uporem maniaka usilnie starałem się utworzyć pola przejmujące funkcje pól już istniejących .... dlaczego ... nie wiem. Okazały się nie tylko niepotrzebne ale także skutecznie przeszkadzały wprawidłowej pracy skryptu :) W końcu po kilku godzinach prób rozpracowalem gdzie tkwił mój błąd. Pozostało tylko dodać warunki żeby zapobiec zbieraniu niepotrzebnych spacji tworzących niepotrzebnie zwiększone odstępy pomiędzy poszczególnych fragmentów. (estetyka).

Ostatecznie kod przyjął formę:

class Product_Template(models.Model):

    _inherit = "product.template"

    prod_name = fields.Char(compute="_get_prod_name", string="Product Name")

    @api.one

    @api.depends("condition", ... )

    def _get_prod_name(self):

        condition = self.condition or ' ' <- dla wartości pobieranych z pola char lub selection

        series = self.series.name or ' ' <- dla wartości pobieranych z pól many2one
...

   name = ustr(condition) + ' ' ...

        self.name = name

        self.prod_name = name

Tym sposobem tworzone są nazwy produktów ze stałych elementów pobieranych z list rozwijanych. Szybkość działania jest znacząco większa niz rozwiązanie które zastosowałem wczesniej. Liczba pól jak wcześniej wspominalem również zdecydowanie została zmiejszona (z ponad 400 do 23) :)

 

 

 

Dr.One
Dr.One
341
| 5 3 5
Data odpowiedzi 09.04.2015, 22:48
0
głos

Dzisiaj od rana staram się uruchomić "if'y" ale ciągle mam problemy. Ta funkcja miała zbierać wartości pól, łączyć je i wpisywać do pola "name" Niestety im więcej dodaje, tym więcej problemów i wynika to z pewnością z mojej niewiedzy. from openerp import models, api, fields from openerp.osv import orm, fields from openerp.tools import ustr class product_brand(orm.Model): _name = 'product.brand' name = fields.char('Brand') description = fields.text('Description', translate=True) partner_id = fields.many2one('res.partner','partner',help='Select a partner for this brand if it exists.',ondelete='restrict') logo = fields.binary('Logo File') class product_template(orm.Model): _inherit = 'product.template' product_brand_id = fields.many2one('product.brand','Brand', help='Select a brand for this product.', ondelete='restrict') class Product_Template(models.Model): _inherit = "product.template" condition = fields.selection([('New','New'), ('Used','Used'), ('Refurbished','Refurbished')],'Condition',required=False) product_brand_id = fields.many2one('product.template','Brand') istock_com0a = fields.char('Processor') istock_com2 = fields.char('size') prod_name = fields.char(compute="_get_prod_name", string="Product Name") @api.one @api.depends("product_brand_id", "istock_com0a", "istock_com2") def _get_prod_name(self): product_brand_id = self.product_brand_id or ' ' istock_com0a = self.istock_com0a or ' ' istock_com2 = self.istock_com2 or ' ' name = product_brand_id + ' ' + istock_com0a + ' ' + istock_com2 self.name = name self.prod_name = name Ponieważ pojawial się komunikat o braku pola condition, dodałem .... ponieważ pojawial się komunikat o braku pola product_brand_id, dodałem .... i mimo to w dalszym ciągu twierdzi, że tego pola niema ....

Dr.One
na 10.04.2015, 12:30

Zamieszczanie kodu programu w komentarzu uniemożliwia w zasadzie jego analizę.

Dariusz Żbikowski
na 10.04.2015, 12:57

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: 23.03.2015, 16:36
Oglądano: 763 razy
Ostatnia aktualizacja: 02.07.2015, 16:48