On 2016-05-05 17:43, Sergi Almacellas Abellana wrote: > El 05/05/16 a les 17:35, Clemens Hupka ha escrit: > >Hello! > > > >I'm working on a ticket reservation and selling system based on tryton 3.8. > > > >As discussed with pokoli on #tryton, my model is quite special because i > >have two one2many-relations towards ticket.ticket (one from > >ticket.reservation and one from ticket.sale). > > Here is the link to the discussion on the irc: > > http://www.tryton.org/~irclog/2016-05-05.log.html#t2016-05-05%2015:09 > > > >The goal was to get all tickets of a reservation into a sale with the > >following on_change function (the number of tickets in the system should > >be kept constant). The problem is, that with this piece of code the > >number of reserved ticket is newly created, so if i select a reservation > >with tickets id:162 and id:163 it creates me two new empty tickets > >instead of updating the reserved ones... > > As shown in the irclog, this Returns: > > [{'tickets': defaultdict(<type 'list'>, {'add': [(0, {}), (1, {})]})}] > > To the client code, because the records have no modified property. > So I'm wondering if we should at least return the id in order to relate > already existing records.
The code managed this behaviour is: http://hg.tryton.org/trytond/file/default/trytond/model/modelview.py#l673 With the active record design, it had to choose the behaviour of the on_change for the One2Many and the Many2Many. We could not mix both because they have incompatible design (dict actions vs list of ids). I think the older design was a little bit problematic because when overriding we could be know which one will be used. So it was decided to stick on_change behaviour to the default behaviour of the client which means for One2Many: create, update and delete and for ManyMany: add/remove. > >Here is the code: > > > >class Ticketsale(ModelSQL, ModelView): > > """ > > Ticket sale > > """ > > __name__ = 'ticket.sale' > > receipt_number = fields.Char('Receipt number', readonly=True, > >select=True) > > pos_create_date = fields.DateTime('Create date', readonly=True) > > reservation = fields.Many2One('ticket.reservation', 'Reservation') > > voucher = fields.Many2One('ticket.voucher', 'Voucher') > > tickets = fields.One2Many('ticket.ticket', 'sale', "Tickets") > > @fields.depends('reservation','tickets') > > def on_change_reservation(self): > > if self.reservation: > > tkts = list(self.tickets) > > for t in self.reservation.tickets: > > tkts.append(t) > > self.tickets = tuple(tkts) > > > >I already found another solution with the use of a button. Just wanted > >to know (btw pokoli too) if the behaviour of tryton is correct in that > >(indeed very special and uncommon) case. I think the behaviour of Tryton shows you that there is a design issue in this code. The tickers should be a Many2Many even if you would like to have ticket linked to only one sale. I said that because nothing prevent the user to select a reservation that is already selected on another sale so you will re-link the tickets from one sale to another. I think it is not what you want. If you are using a Many2Many (with a unique constraint), this case will raise an error and so the user could correct it. -- Cédric Krier - B2CK SPRL Email/Jabber: cedric.kr...@b2ck.com Tel: +32 472 54 46 59 Website: http://www.b2ck.com/ -- You received this message because you are subscribed to the Google Groups "tryton-dev" group. To view this discussion on the web visit https://groups.google.com/d/msgid/tryton-dev/20160506085535.GV13326%40tetsuo.