1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as
9 # published by the Free Software Foundation, either version 3 of the
10 # License, or (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 ##############################################################################
25 from osv import fields, osv
26 from tools.translate import _
28 import decimal_precision as dp
31 class event_type(osv.osv):
34 _description = __doc__
36 'name': fields.char('Event type', size=64, required=True),
40 class event_event(osv.osv):
43 _description = __doc__
46 def copy(self, cr, uid, id, default=None, context=None):
47 """ Copy record of Given id
48 @param id: Id of Event record.
49 @param context: A standard dictionary for contextual values
55 'registration_ids': False,
57 return super(event_event, self).copy(cr, uid, id, default=default, context=context)
58 def onchange_product(self, cr, uid, ids, product_id):
59 """This function returns value of product's unit price based on product id.
60 @param self: The object pointer
61 @param cr: the current row, from the database cursor,
62 @param uid: the current user’s ID for security checks,
63 @param ids: List of Event IDs
64 @param product_id: Product's id
67 return {'value': {'unit_price': False}}
69 unit_price=self.pool.get('product.product').price_get(cr, uid, [product_id])[product_id]
70 return {'value': {'unit_price': unit_price}}
72 def button_draft(self, cr, uid, ids, context=None):
73 return self.write(cr, uid, ids, {'state': 'draft'}, context=context)
75 def button_cancel(self, cr, uid, ids, context=None):
76 return self.write(cr, uid, ids, {'state': 'cancel'}, context=context)
78 def button_done(self, cr, uid, ids, context=None):
79 if type(ids) in (int, long,):
81 return self.write(cr, uid, ids, {'state': 'done'}, context=context)
83 def do_confirm(self, cr, uid, ids, context=None):
84 """ Confirm Event and send confirmation email to all register peoples
86 register_pool = self.pool.get('event.registration')
87 for event in self.browse(cr, uid, ids, context=context):
88 if event.mail_auto_confirm:
89 #send reminder that will confirm the event for all the people that were already confirmed
90 reg_ids = register_pool.search(cr, uid, [
91 ('event_id', '=', event.id),
92 ('state', 'not in', ['draft', 'cancel'])])
93 register_pool.mail_user_confirm(cr, uid, reg_ids)
95 return self.write(cr, uid, ids, {'state': 'confirm'})
97 def button_confirm(self, cr, uid, ids, context=None):
98 """This Function Confirm Event.
99 @param ids: List of Event IDs
100 @param context: A standard dictionary for contextual values
106 if type(ids) in (int, long,):
108 data_pool = self.pool.get('ir.model.data')
110 for event in self.browse(cr, uid, ids, context=context):
111 total_confirmed = event.register_current
112 if total_confirmed >= event.register_min or event.register_max == 0:
113 res = self.do_confirm(cr, uid, [event.id], context=context)
115 unconfirmed_ids.append(event.id)
117 view_id = data_pool._get_id(cr, uid, 'event', 'view_event_confirm')
118 view_data = data_pool.browse(cr, uid, view_id)
119 view_id = view_data.res_id
120 context['event_ids'] = unconfirmed_ids
122 'name': _('Confirm Event'),
125 'view_mode': 'tree,form',
126 'res_model': 'event.confirm',
127 'views': [(view_id, 'form')],
128 'type': 'ir.actions.act_window',
136 def _get_register(self, cr, uid, ids, fields, args, context=None):
137 """Get Confirm or uncofirm register value.
138 @param ids: List of Event registration type's id
139 @param fields: List of function fields(register_current and register_prospect).
140 @param context: A standard dictionary for contextual values
141 @return: Dictionary of function fields value.
143 register_pool = self.pool.get('event.registration')
145 for event in self.browse(cr, uid, ids, context):
148 res[event.id][field] = False
150 if 'register_current' in fields:
151 state += ['open', 'done']
152 if 'register_prospect' in fields:
153 state.append('draft')
155 reg_ids = register_pool.search(cr, uid, [
156 ('event_id', '=', event.id),
157 ('state', 'in', state)])
161 cr.execute('select sum(nb_register) from event_registration where id IN %s', (tuple(reg_ids),))
162 number = cr.fetchone()
163 if 'register_current' in fields:
164 res[event.id]['register_current'] = number and number[0]
165 if 'register_prospect' in fields:
166 res[event.id]['register_prospect'] = number and number[0]
169 def write(self, cr, uid, ids, vals, context=None):
171 Writes values in one or several fields.
172 @param ids: List of Event registration type's IDs
173 @param vals: dictionary with values to update.
176 register_pool = self.pool.get('event.registration')
177 res = super(event_event, self).write(cr, uid, ids, vals, context=context)
178 if vals.get('date_begin', False) or vals.get('mail_auto_confirm', False) or vals.get('mail_confirm', False):
179 for event in self.browse(cr, uid, ids, context=context):
180 #change the deadlines of the registration linked to this event
182 if vals.get('date_begin', False):
183 register_values['date_deadline'] = vals['date_begin']
185 #change the description of the registration linked to this event
186 if vals.get('mail_auto_confirm', False):
187 if vals['mail_auto_confirm']:
188 if 'mail_confirm' not in vals:
189 vals['mail_confirm'] = event.mail_confirm
191 vals['mail_confirm'] = False
192 if 'mail_confirm' in vals:
193 register_values['description'] = vals['mail_confirm']
196 reg_ids = register_pool.search(cr, uid, [('event_id', '=', event.id)])
197 register_pool.write(cr, uid, reg_ids, register_values)
201 'name': fields.char('Summary', size=64, required=True, translate=True, readonly=False, states={'done': [('readonly', True)]}),
202 'user_id': fields.many2one('res.users', 'Responsible User', readonly=False, states={'done': [('readonly', True)]}),
203 'parent_id': fields.many2one('event.event', 'Parent Event', readonly=False, states={'done': [('readonly', True)]}),
204 'section_id': fields.many2one('crm.case.section', 'Sale Team', readonly=False, states={'done': [('readonly', True)]}),
205 'child_ids': fields.one2many('event.event', 'parent_id', 'Child Events', readonly=False, states={'done': [('readonly', True)]}),
206 'reply_to': fields.char('Reply-To', size=64, readonly=False, states={'done': [('readonly', True)]}, help="The email address put in the 'Reply-To' of all emails sent by OpenERP"),
207 'type': fields.many2one('event.type', 'Type', help="Type of Event like Seminar, Exhibition, Conference, Training.", readonly=False, states={'done': [('readonly', True)]}),
208 'register_max': fields.integer('Maximum Registrations', help="Provide Maximun Number of Registrations", readonly=True, states={'draft': [('readonly', False)]}),
209 'register_min': fields.integer('Minimum Registrations', help="Providee Minimum Number of Registrations", readonly=True, states={'draft': [('readonly', False)]}),
210 'register_current': fields.function(_get_register, method=True, string='Confirmed Registrations', multi='register_current',
211 help="Total of Open and Done Registrations"),
212 'register_prospect': fields.function(_get_register, method=True, string='Unconfirmed Registrations', multi='register_prospect',
213 help="Total of Prospect Registrations"),
214 'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),
215 'date_begin': fields.datetime('Beginning date', required=True, help="Beginning Date of Event", readonly=True, states={'draft': [('readonly', False)]}),
216 'date_end': fields.datetime('Closing date', required=True, help="Closing Date of Event", readonly=True, states={'draft': [('readonly', False)]}),
217 'state': fields.selection([
219 ('confirm', 'Confirmed'),
221 ('cancel', 'Cancelled')],
222 'State', readonly=True, required=True,
223 help='If event is created, the state is \'Draft\'.If event is confirmed for the particular dates the state is set to \'Confirmed\'. If the event is over, the state is set to \'Done\'.If event is cancelled the state is set to \'Cancelled\'.'),
224 'mail_auto_registr': fields.boolean('Mail Auto Register', readonly=False, states={'done': [('readonly', True)]}, help='Check this box if you want to use the automatic mailing for new registration'),
225 'mail_auto_confirm': fields.boolean('Mail Auto Confirm', readonly=False, states={'done': [('readonly', True)]}, help='Check this box if you want ot use the automatic confirmation emailing or the reminder'),
226 'mail_registr': fields.text('Registration Email', readonly=False, states={'done': [('readonly', True)]}, help='This email will be sent when someone subscribes to the event.'),
227 'mail_confirm': fields.text('Confirmation Email', readonly=False, states={'done': [('readonly', True)]}, help="This email will be sent when the event gets confimed or when someone subscribes to a confirmed event. This is also the email sent to remind someone about the event."),
228 'product_id': fields.many2one('product.product', 'Product', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="The invoices of this event registration will be created with this Product. Thus it allows you to set the default label and the accounting info you want by default on these invoices."),
229 'note': fields.text('Notes', help="Description or Summary of Event", readonly=False, states={'done': [('readonly', True)]}),
230 'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', readonly=True, states={'draft': [('readonly', False)]}, help="Pricelist version for current event."),
231 'unit_price': fields.related('product_id', 'list_price', type='float', string='Registration Cost', readonly=True, states={'draft':[('readonly',False)]}, help="This will be the default price used as registration cost when invoicing this event. Note that you can specify for each registration a specific amount if you want to", digits_compute=dp.get_precision('Sale Price')),
232 'main_speaker_id': fields.many2one('res.partner','Main Speaker', readonly=False, states={'done': [('readonly', True)]}, help="Speaker who are giving speech on event."),
233 'speaker_ids':fields.many2many('res.partner', 'event_speaker_rel', 'speaker_id', 'partner_id', 'Other Speakers', readonly=False, states={'done': [('readonly', True)]}),
234 'address_id': fields.many2one('res.partner.address','Location Address', readonly=False, states={'done': [('readonly', True)]}),
235 'speaker_confirmed': fields.boolean('Speaker Confirmed', readonly=False, states={'done': [('readonly', True)]}),
236 'country_id': fields.related('address_id', 'country_id',
237 type='many2one', relation='res.country', string='Country', readonly=False, states={'done': [('readonly', True)]}),
238 'language': fields.char('Language',size=64, readonly=False, states={'done': [('readonly', True)]}),
239 'note': fields.text('Description', readonly=False, states={'done': [('readonly', True)]}),
240 'company_id': fields.many2one('res.company', 'Company', required=False, change_default=True, readonly=False, states={'done': [('readonly', True)]}),
246 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'event.event', context=c),
247 'user_id': lambda obj, cr, uid, context: uid,
250 def _check_recursion(self, cr, uid, ids):
252 Checks for recursion level for event
257 cr.execute('select distinct parent_id from event_event where id IN %s', (tuple(ids),))
258 ids = filter(None, map(lambda x: x[0], cr.fetchall()))
266 (_check_recursion, 'Error ! You cannot create recursive event.', ['parent_id'])
269 def do_team_change(self, cr, uid, ids, team_id, context=None):
271 On Change Callback: when team change, this is call.
272 on this function, take value of reply_to from selected team.
278 team_pool = self.pool.get('crm.case.section')
279 team = team_pool.browse(cr, uid, team_id, context=context)
282 res = {'value': {'reply_to': team.reply_to}}
287 class event_registration(osv.osv):
288 """Event Registration"""
289 _name= 'event.registration'
290 _description = __doc__
291 _inherit = 'mailgate.thread'
293 def _amount_line(self, cr, uid, ids, field_name, arg, context=None):
294 cur_obj = self.pool.get('res.currency')
296 context = context or {}
297 for line in self.browse(cr, uid, ids, context=context):
298 price = line.unit_price * line.nb_register
299 pricelist = line.event_id.pricelist_id or line.partner_invoice_id.property_product_pricelist
300 cur = pricelist and pricelist.currency_id or False
301 res[line.id] = cur and cur_obj.round(cr, uid, cur, price) or price
305 'name': fields.char('Summary', size=124, readonly=True, states={'draft': [('readonly', False)]}),
306 'email_cc': fields.text('CC', size=252 , readonly=False, states={'done': [('readonly', True)]}, help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"),
307 'nb_register': fields.integer('Quantity', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="Number of Registrations or Tickets"),
308 'event_id': fields.many2one('event.event', 'Event', required=True, readonly=True, states={'draft': [('readonly', False)]}),
309 'partner_id': fields.many2one('res.partner', 'Partner', states={'done': [('readonly', True)]}),
310 "partner_invoice_id": fields.many2one('res.partner', 'Partner Invoiced', readonly=True, states={'draft': [('readonly', False)]}),
311 "contact_id": fields.many2one('res.partner.contact', 'Partner Contact', readonly=False, states={'done': [('readonly', True)]}), #TODO: filter only the contacts that have a function into the selected partner_id
312 "unit_price": fields.float('Unit Price', required=True, digits_compute=dp.get_precision('Sale Price'), readonly=True, states={'draft': [('readonly', False)]}),
313 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits_compute=dp.get_precision('Sale Price')),
314 "badge_ids": fields.one2many('event.registration.badge', 'registration_id', 'Badges', readonly=False, states={'done': [('readonly', True)]}),
315 "event_product": fields.char("Invoice Name", size=128, readonly=True, states={'draft': [('readonly', False)]}),
316 "tobe_invoiced": fields.boolean("To be Invoiced", readonly=True, states={'draft': [('readonly', False)]}),
317 "invoice_id": fields.many2one("account.invoice", "Invoice", readonly=True),
318 'date_closed': fields.datetime('Closed', readonly=True),
319 'ref': fields.reference('Reference', selection=crm._links_get, size=128),
320 'ref2': fields.reference('Reference 2', selection=crm._links_get, size=128),
321 'email_from': fields.char('Email', size=128, states={'done': [('readonly', True)]}, help="These people will receive email."),
322 'create_date': fields.datetime('Creation Date' , readonly=True),
323 'write_date': fields.datetime('Write Date' , readonly=True),
324 'description': fields.text('Description', states={'done': [('readonly', True)]}),
325 'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
326 'log_ids': fields.one2many('mailgate.message', 'res_id', 'Logs', domain=[('history', '=', False),('model','=',_name)]),
327 'date_deadline': fields.related('event_id','date_end', type='datetime', string="End Date", readonly=True),
328 'date': fields.related('event_id', 'date_begin', type='datetime', string="Start Date", readonly=True),
329 'user_id': fields.many2one('res.users', 'Responsible', states={'done': [('readonly', True)]}),
330 'active': fields.boolean('Active'),
331 'section_id': fields.related('event_id', 'section_id', type='many2one', relation='crm.case.section', string='Sale Team', store=True, readonly=True),
332 'company_id': fields.related('event_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True, states={'draft':[('readonly',False)]}),
333 'state': fields.selection([('open', 'Confirmed'),
334 ('draft', 'Unconfirmed'),
335 ('cancel', 'Cancelled'),
336 ('done', 'Done')], 'State', \
337 size=16, readonly=True)
341 'tobe_invoiced': True,
342 'state': lambda *a: 'draft',
343 'active': lambda *a: 1,
344 'user_id': lambda self, cr, uid, ctx: uid,
347 def _make_invoice(self, cr, uid, reg, lines, context=None):
348 """ Create Invoice from Invoice lines
349 @param reg : Model of Event Registration
350 @param lines: Ids of Invoice lines
354 inv_pool = self.pool.get('account.invoice')
355 inv_lines_pool = self.pool.get('account.invoice.line')
357 val_invoice = inv_pool.onchange_partner_id(cr, uid, [], 'out_invoice', reg.partner_invoice_id.id, False, False)
358 val_invoice['value'].update({'partner_id': reg.partner_invoice_id.id})
360 inv_lines_pool.product_id_change(cr, uid, [], reg.event_id.product_id.id, uom =False, partner_id=reg.partner_invoice_id.id, fposition_id=reg.partner_invoice_id.property_account_position.id)
362 val_invoice['value'].update({
363 'origin': reg.event_product,
365 'invoice_line': [(6, 0, lines)],
367 'date_invoice': context.get('date_inv', False)
369 inv_id = inv_pool.create(cr, uid, val_invoice['value'])
370 inv_pool.button_compute(cr, uid, [inv_id])
371 self.history(cr, uid, [reg], _('Invoiced'))
374 def action_invoice_create(self, cr, uid, ids, grouped=False, date_inv = False, context=None):
375 """ Action of Create Invoice """
380 inv_lines_pool = self.pool.get('account.invoice.line')
381 inv_pool = self.pool.get('account.invoice')
382 product_pool = self.pool.get('product.product')
383 contact_pool = self.pool.get('res.partner.contact')
386 # If date was specified, use it as date invoiced, usefull when invoices are generated this month and put the
387 # last day of the last month as invoice date
389 context['date_inv'] = date_inv
391 for reg in self.browse(cr, uid, ids, context=context):
393 val_invoice = inv_pool.onchange_partner_id(cr, uid, [], 'out_invoice', reg.partner_invoice_id.id, False, False)
395 val_invoice['value'].update({'partner_id': reg.partner_invoice_id.id})
396 partner_address_id = val_invoice['value']['address_invoice_id']
398 if not partner_address_id:
399 raise osv.except_osv(_('Error !'),
400 _("Registered partner doesn't have an address to make the invoice."))
402 value = inv_lines_pool.product_id_change(cr, uid, [], reg.event_id.product_id.id, uom =False, partner_id=reg.partner_invoice_id.id, fposition_id=reg.partner_invoice_id.property_account_position.id)
403 product = product_pool.browse(cr, uid, reg.event_id.product_id.id, context=context)
404 for tax in product.taxes_id:
405 tax_ids.append(tax.id)
407 vals = value['value']
408 c_name = reg.contact_id and ('-' + contact_pool.name_get(cr, uid, [reg.contact_id.id])[0][1]) or ''
410 'name': reg.event_product + '-' + c_name,
411 'price_unit': reg.unit_price,
412 'quantity': reg.nb_register,
413 'product_id':reg.event_id.product_id.id,
414 'invoice_line_tax_id': [(6, 0, tax_ids)],
416 inv_line_ids = self._create_invoice_lines(cr, uid, [reg.id], vals)
417 invoices.setdefault(reg.partner_id.id, []).append((reg, inv_line_ids))
419 for val in invoices.values():
422 res = self._make_invoice(cr, uid, val[0][0], [v for k , v in val], context=context)
425 self.do_close(cr, uid, [k.id], context={'invoice_id': res})
429 res = self._make_invoice(cr, uid, k, [v], context=context)
430 self.do_close(cr, uid, [k.id], context={'invoice_id': res})
431 if res: new_invoice_ids.append(res)
433 return new_invoice_ids
435 def do_open(self, cr, uid, ids, context=None):
436 """ Open Registration
438 res = self.write(cr, uid, ids, {'state': 'open'}, context=context)
439 self.mail_user(cr, uid, ids)
440 self.history(cr, uid, ids, _('Open'))
443 def do_close(self, cr, uid, ids, context=None):
444 """ Close Registration
448 invoice_id = context.get('invoice_id', False)
449 values = {'state': 'done', 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}
452 values['invoice_id'] = invoice_id
453 res = self.write(cr, uid, ids, values)
454 self.history(cr, uid, ids, msg)
457 def check_confirm(self, cr, uid, ids, context=None):
458 """This Function Open Event Registration and send email to user.
459 @param ids: List of Event registration's IDs
460 @param context: A standard dictionary for contextual values
465 data_pool = self.pool.get('ir.model.data')
467 for registration in self.browse(cr, uid, ids, context=context):
468 total_confirmed = registration.event_id.register_current + registration.nb_register
469 if total_confirmed <= registration.event_id.register_max or registration.event_id.register_max == 0:
470 self.do_open(cr, uid, [registration.id], context)
472 unconfirmed_ids.append(registration.id)
474 view_id = data_pool._get_id(cr, uid, 'event', 'view_event_confirm_registration')
475 view_data = data_pool.browse(cr, uid, view_id)
476 view_id = view_data.res_id
477 context['registration_ids'] = unconfirmed_ids
479 'name': _('Confirm Registration'),
482 'view_mode': 'tree,form',
483 'res_model': 'event.confirm.registration',
484 'views': [(view_id, 'form')],
485 'type': 'ir.actions.act_window',
492 def button_reg_close(self, cr, uid, ids, context=None):
493 """This Function Close Event Registration.
497 data_pool = self.pool.get('ir.model.data')
499 for registration in self.browse(cr, uid, ids, context=context):
500 if registration.tobe_invoiced and not registration.invoice_id:
501 unclosed_ids.append(registration.id)
503 self.do_close(cr, uid, [registration.id])
505 view_id = data_pool._get_id(cr, uid, 'event', 'view_event_make_invoice')
506 view_data = data_pool.browse(cr, uid, view_id)
507 view_id = view_data.res_id
508 context['active_ids'] = unclosed_ids
510 'name': _('Close Registration'),
513 'view_mode': 'tree,form',
514 'res_model': 'event.make.invoice',
515 'views': [(view_id, 'form')],
516 'type': 'ir.actions.act_window',
523 def button_reg_cancel(self, cr, uid, ids, *args):
524 """This Function Cancel Event Registration.
526 registrations = self.browse(cr, uid, ids)
527 self.history(cr, uid, registrations, _('Cancel'))
528 self.write(cr, uid, ids, {'state': 'cancel'})
531 def mail_user(self, cr, uid, ids, confirm=False, context=None):
538 for regestration in self.browse(cr, uid, ids, context=context):
539 src = regestration.event_id.reply_to or False
542 if regestration.email_from:
543 email_to = regestration.email_from
544 if regestration.email_cc:
545 email_cc += [regestration.email_cc]
546 if not (email_to or email_cc):
551 subject = _('Auto Confirmation: [%s] %s') %(regestration.id, regestration.name)
552 body = regestration.event_id.mail_confirm
553 elif regestration.event_id.mail_auto_confirm or regestration.event_id.mail_auto_registr:
554 if regestration.event_id.state in ['draft', 'fixed', 'open', 'confirm', 'running'] and regestration.event_id.mail_auto_registr:
555 subject = _('Auto Registration: [%s] %s') %(regestration.id, regestration.name)
556 body = regestration.event_id.mail_registr
557 if (regestration.event_id.state in ['confirm', 'running']) and regestration.event_id.mail_auto_confirm:
558 subject = _('Auto Confirmation: [%s] %s') %(regestration.id, regestration.name)
559 body = regestration.event_id.mail_confirm
561 tools.email_send(src, email_to, subject, body, email_cc = email_cc, openobject_id = regestration.id)
562 self.history(cr, uid, [regestration], subject, history=True, \
563 email=email_to, details=body, \
564 subject=subject, email_from=src, \
565 email_cc=', '.join(email_cc))
569 def mail_user_confirm(self, cr, uid, ids, context=None):
573 return self.mail_user(cr, uid, ids, confirm=True, context=context)
575 def _create_invoice_lines(self, cr, uid, ids, vals):
576 """ Create account Invoice line for Registration Id.
578 return self.pool.get('account.invoice.line').create(cr, uid, vals)
580 def onchange_contact_id(self, cr, uid, ids, contact, partner):
582 """This function returns value of Badge Name , Badge Title based on Partner contact.
583 @param self: The object pointer
584 @param cr: the current row, from the database cursor,
585 @param uid: the current user’s ID for security checks,
586 @param ids: List of Registration IDs
587 @param contact: Patner Contact IDS
588 @param partner: Partner IDS
593 contact_obj = self.pool.get('res.partner.contact')
594 addr_obj = self.pool.get('res.partner.address')
595 job_obj = self.pool.get('res.partner.job')
598 partner_addresses = addr_obj.search(cr, uid, [('partner_id', '=', partner)])
599 job_ids = job_obj.search(cr, uid, [('contact_id', '=', contact), ('address_id', 'in', partner_addresses)])
601 data['email_from'] = job_obj.browse(cr, uid, job_ids[0]).email
602 return {'value': data}
604 def onchange_event(self, cr, uid, ids, event_id, partner_invoice_id):
605 """This function returns value of Product Name, Unit Price based on Event.
606 @param self: The object pointer
607 @param cr: the current row, from the database cursor,
608 @param uid: the current user’s ID for security checks,
609 @param ids: List of Registration IDs
610 @param event_id: Event ID
611 @param partner_invoice_id: Partner Invoice ID
615 return {'value': {'unit_price': False, 'event_product': False}}
617 event_obj = self.pool.get('event.event')
618 prod_obj = self.pool.get('product.product')
619 res_obj = self.pool.get('res.partner')
621 data_event = event_obj.browse(cr, uid, event_id)
622 res = {'value': {'unit_price': False, 'event_product': False, 'user_id': False,
623 'date': data_event.date_begin, 'date_deadline': data_event.date_end, 'description': data_event.note, 'name': data_event.name,
624 'section_id': data_event.section_id and data_event.section_id.id or False,
626 if data_event.user_id.id:
627 res['value'].update({'user_id':data_event.user_id.id})
628 if data_event.product_id:
629 pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
630 if partner_invoice_id:
631 partner = res_obj.browse(cr, uid, partner_invoice_id, context=context)
632 pricelist_id = pricelist_id or partner.property_product_pricelist.id
633 unit_price = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': pricelist_id})[data_event.product_id.id]
635 unit_price = data_event.unit_price
636 res['value'].update({'unit_price': unit_price, 'event_product': data_event.product_id.name})
639 def onchange_partner_id(self, cr, uid, ids, part, event_id, email=False):
640 """This function returns value of Patner Invoice id, Unit Price, badget title based on partner and Event.
641 @param self: The object pointer
642 @param cr: the current row, from the database cursor,
643 @param uid: the current user’s ID for security checks,
644 @param ids: List of Registration IDs
645 @param event_id: Event ID
646 @param partner_invoice_id: Partner Invoice ID
648 job_obj = self.pool.get('res.partner.job')
649 res_obj = self.pool.get('res.partner')
652 data['contact_id'], data['partner_invoice_id'], data['email_from'] = (False, False, False)
654 return {'value': data}
655 data['partner_invoice_id']=part
656 # this calls onchange_partner_invoice_id
657 d = self.onchange_partner_invoice_id(cr, uid, ids, event_id, part)
658 # this updates the dictionary
659 data.update(d['value'])
660 addr = res_obj.address_get(cr, uid, [part])
662 if addr.has_key('default'):
663 job_ids = job_obj.search(cr, uid, [('address_id', '=', addr['default'])])
665 data['contact_id'] = job_obj.browse(cr, uid, job_ids[0]).contact_id.id
666 d = self.onchange_contact_id(cr, uid, ids, data['contact_id'], part)
667 data.update(d['value'])
668 return {'value': data}
670 def onchange_partner_invoice_id(self, cr, uid, ids, event_id, partner_invoice_id):
671 """This function returns value of Product unit Price based on Invoiced partner.
672 @param self: The object pointer
673 @param cr: the current row, from the database cursor,
674 @param uid: the current user’s ID for security checks,
675 @param ids: List of Registration IDs
676 @param event_id: Event ID
677 @param partner_invoice_id: Partner Invoice ID
681 event_obj = self.pool.get('event.event')
682 prod_obj = self.pool.get('product.product')
683 res_obj = self.pool.get('res.partner')
685 data['unit_price']=False
687 return {'value': data}
688 data_event = event_obj.browse(cr, uid, event_id)
689 if data_event.product_id:
690 data['event_product'] = data_event.product_id.name
691 pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
692 if partner_invoice_id:
693 partner = res_obj.browse(cr, uid, partner_invoice_id, context=context)
694 pricelist_id = pricelist_id or partner.property_product_pricelist.id
695 unit_price = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': pricelist_id})[data_event.product_id.id]
697 unit_price = data_event.unit_price
698 data['unit_price'] = unit_price
699 return {'value': data}
703 class event_registration_badge(osv.osv):
704 _name = 'event.registration.badge'
705 _description = __doc__
707 'registration_id': fields.many2one('event.registration', 'Registration', required=True),
708 "title": fields.char('Title', size=128),
709 "name": fields.char('Name', size=128, required=True),
710 "address_id": fields.many2one('res.partner.address', 'Address'),
712 event_registration_badge()
714 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: