import tools
import decimal_precision as dp
-
class event_type(osv.osv):
""" Event Type """
_name = 'event.type'
_columns = {
'name': fields.char('Event type', size=64, required=True),
}
+
event_type()
class event_event(osv.osv):
})
return super(event_event, self).copy(cr, uid, id, default=default, context=context)
- def onchange_product(self, cr, uid, ids, product_id):
+ def onchange_product(self, cr, uid, ids, product_id=False):
"""This function returns value of product's unit price based on product id.
@param self: The object pointer
@param cr: the current row, from the database cursor,
#send reminder that will confirm the event for all the people that were already confirmed
reg_ids = register_pool.search(cr, uid, [
('event_id', '=', event.id),
- ('state', 'not in', ['draft', 'cancel'])])
+ ('state', 'not in', ['draft', 'cancel'])], context=context)
register_pool.mail_user_confirm(cr, uid, reg_ids)
- return self.write(cr, uid, ids, {'state': 'confirm'})
+ return self.write(cr, uid, ids, {'state': 'confirm'}, context=context)
def button_confirm(self, cr, uid, ids, context=None):
"""This Function Confirm Event.
@param context: A standard dictionary for contextual values
@return: True
"""
- if not context:
- context = {}
res = False
if type(ids) in (int, long,):
ids = [ids]
+ if context is None:
+ context = {}
data_pool = self.pool.get('ir.model.data')
unconfirmed_ids = []
for event in self.browse(cr, uid, ids, context=context):
else:
unconfirmed_ids.append(event.id)
if unconfirmed_ids:
- view_id = data_pool._get_id(cr, uid, 'event', 'view_event_confirm')
- view_data = data_pool.browse(cr, uid, view_id)
- view_id = view_data.res_id
+ view_id = data_pool.get_object_reference(cr, uid, 'event', 'view_event_confirm')
+ view_id = view_id and view_id[1] or False
context['event_ids'] = unconfirmed_ids
return {
'name': _('Confirm Event'),
}
return res
-
def _get_register(self, cr, uid, ids, fields, args, context=None):
"""Get Confirm or uncofirm register value.
@param ids: List of Event registration type's id
"""
register_pool = self.pool.get('event.registration')
res = {}
- for event in self.browse(cr, uid, ids, context):
+ for event in self.browse(cr, uid, ids, context=context):
res[event.id] = {}
for field in fields:
res[event.id][field] = False
reg_ids = register_pool.search(cr, uid, [
('event_id', '=', event.id),
- ('state', 'in', state)])
+ ('state', 'in', state)], context=context)
number = 0.0
if reg_ids:
- cr.execute('select sum(nb_register) from event_registration where id IN %s', (tuple(reg_ids),))
+ cr.execute('SELECT SUM(nb_register) FROM event_registration WHERE id IN %s', (tuple(reg_ids),))
number = cr.fetchone()
+
if 'register_current' in fields:
- res[event.id]['register_current'] = number and number[0]
+ res[event.id]['register_current'] = number and number[0] or 0.0
if 'register_prospect' in fields:
- res[event.id]['register_prospect'] = number and number[0]
+ res[event.id]['register_prospect'] = number and number[0] or 0.0
return res
def write(self, cr, uid, ids, vals, context=None):
register_values['description'] = vals['mail_confirm']
if register_values:
- reg_ids = register_pool.search(cr, uid, [('event_id', '=', event.id)])
- register_pool.write(cr, uid, reg_ids, register_values)
+ reg_ids = register_pool.search(cr, uid, [('event_id', '=', event.id)], context=context)
+ register_pool.write(cr, uid, reg_ids, register_values, context=context)
return res
_columns = {
'register_current': fields.function(_get_register, method=True, string='Confirmed Registrations', multi='register_current',
help="Total of Open and Done Registrations"),
'register_prospect': fields.function(_get_register, method=True, string='Unconfirmed Registrations', multi='register_prospect',
- help="Total of Prospect Registrations"),
+ help="Total of Prospect Registrati./event/event.py:41:ons"),
'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),
'date_begin': fields.datetime('Beginning date', required=True, help="Beginning Date of Event", readonly=True, states={'draft': [('readonly', False)]}),
'date_end': fields.datetime('Closing date', required=True, help="Closing Date of Event", readonly=True, states={'draft': [('readonly', False)]}),
'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', readonly=True, states={'draft': [('readonly', False)]}, help="Pricelist version for current event."),
'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')),
'main_speaker_id': fields.many2one('res.partner','Main Speaker', readonly=False, states={'done': [('readonly', True)]}, help="Speaker who are giving speech on event."),
- 'speaker_ids':fields.many2many('res.partner', 'event_speaker_rel', 'speaker_id', 'partner_id', 'Other Speakers', readonly=False, states={'done': [('readonly', True)]}),
+ 'speaker_ids': fields.many2many('res.partner', 'event_speaker_rel', 'speaker_id', 'partner_id', 'Other Speakers', readonly=False, states={'done': [('readonly', True)]}),
'address_id': fields.many2one('res.partner.address','Location Address', readonly=False, states={'done': [('readonly', True)]}),
'speaker_confirmed': fields.boolean('Speaker Confirmed', readonly=False, states={'done': [('readonly', True)]}),
'country_id': fields.related('address_id', 'country_id',
'language': fields.char('Language',size=64, readonly=False, states={'done': [('readonly', True)]}),
'note': fields.text('Description', readonly=False, states={'done': [('readonly', True)]}),
'company_id': fields.many2one('res.company', 'Company', required=False, change_default=True, readonly=False, states={'done': [('readonly', True)]}),
-
}
_defaults = {
'user_id': lambda obj, cr, uid, context: uid,
}
- def _check_recursion(self, cr, uid, ids):
+ def _check_recursion(self, cr, uid, ids, context=None):
"""
Checks for recursion level for event
"""
level = 100
-
while len(ids):
- cr.execute('select distinct parent_id from event_event where id IN %s', (tuple(ids),))
+ cr.execute('SELECT DISTINCT parent_id FROM event_event WHERE id IN %s', (tuple(ids),))
ids = filter(None, map(lambda x: x[0], cr.fetchall()))
if not level:
return False
level -= 1
+ return True
+ def _check_closing_date(self, cr, uid, ids, context=None):
+ for event in self.browse(cr, uid, ids, context=context):
+ if event.date_end < event.date_begin:
+ return False
return True
_constraints = [
- (_check_recursion, 'Error ! You cannot create recursive event.', ['parent_id'])
+ (_check_recursion, 'Error ! You cannot create recursive event.', ['parent_id']),
+ (_check_closing_date, 'Error ! Closing Date cannot be set before Beginning Date.', ['date_end']),
]
def do_team_change(self, cr, uid, ids, team_id, context=None):
if context is None:
context = {}
team_pool = self.pool.get('crm.case.section')
- team = team_pool.browse(cr, uid, team_id, context=context)
res = {}
+ team = team_pool.browse(cr, uid, team_id, context=context)
if team.reply_to:
res = {'value': {'reply_to': team.reply_to}}
return res
_columns = {
'name': fields.char('Summary', size=124, readonly=True, states={'draft': [('readonly', False)]}),
- '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"),
+ '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"),
'nb_register': fields.integer('Quantity', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="Number of Registrations or Tickets"),
'event_id': fields.many2one('event.event', 'Event', required=True, readonly=True, states={'draft': [('readonly', False)]}),
'partner_id': fields.many2one('res.partner', 'Partner', states={'done': [('readonly', True)]}),
"partner_invoice_id": fields.many2one('res.partner', 'Partner Invoiced', readonly=True, states={'draft': [('readonly', False)]}),
"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
"unit_price": fields.float('Unit Price', required=True, digits_compute=dp.get_precision('Sale Price'), readonly=True, states={'draft': [('readonly', False)]}),
- 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits_compute=dp.get_precision('Sale Price')),
+ 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits_compute=dp.get_precision('Sale Price'), store=True),
"badge_ids": fields.one2many('event.registration.badge', 'registration_id', 'Badges', readonly=False, states={'done': [('readonly', True)]}),
"event_product": fields.char("Invoice Name", size=128, readonly=True, states={'draft': [('readonly', False)]}),
"tobe_invoiced": fields.boolean("To be Invoiced", readonly=True, states={'draft': [('readonly', False)]}),
'ref': fields.reference('Reference', selection=crm._links_get, size=128),
'ref2': fields.reference('Reference 2', selection=crm._links_get, size=128),
'email_from': fields.char('Email', size=128, states={'done': [('readonly', True)]}, help="These people will receive email."),
- 'create_date': fields.datetime('Creation Date' , readonly=True),
- 'write_date': fields.datetime('Write Date' , readonly=True),
+ 'create_date': fields.datetime('Creation Date', readonly=True),
+ 'write_date': fields.datetime('Write Date', readonly=True),
'description': fields.text('Description', states={'done': [('readonly', True)]}),
'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
'log_ids': fields.one2many('mailgate.message', 'res_id', 'Logs', domain=[('history', '=', False),('model','=',_name)]),
'nb_register': 1,
'tobe_invoiced': True,
'state': 'draft',
- 'active': True,
+ 'active': 1,
'user_id': lambda self, cr, uid, ctx: uid,
}
def _make_invoice(self, cr, uid, reg, lines, context=None):
""" Create Invoice from Invoice lines
- @param reg : Model of Event Registration
+ @param reg: Model of Event Registration
@param lines: Ids of Invoice lines
"""
if context is None:
context = {}
inv_pool = self.pool.get('account.invoice')
- inv_lines_pool = self.pool.get('account.invoice.line')
-
val_invoice = inv_pool.onchange_partner_id(cr, uid, [], 'out_invoice', reg.partner_invoice_id.id, False, False)
val_invoice['value'].update({'partner_id': reg.partner_invoice_id.id})
-
- 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)
-
val_invoice['value'].update({
'origin': reg.event_product,
'reference': False,
'comment': "",
'date_invoice': context.get('date_inv', False)
})
- inv_id = inv_pool.create(cr, uid, val_invoice['value'])
+ inv_id = inv_pool.create(cr, uid, val_invoice['value'], context=context)
inv_pool.button_compute(cr, uid, [inv_id])
self.history(cr, uid, [reg], _('Invoiced'))
return inv_id
+ def copy(self, cr, uid, id, default=None, context=None):
+ """ Copy record of Given id
+ @param id: Id of Registration record.
+ @param context: A standard dictionary for contextual values
+ """
+ if not default:
+ default = {}
+ default.update({
+ 'invoice_id': False,
+ })
+ return super(event_registration, self).copy(cr, uid, id, default=default, context=context)
+
def action_invoice_create(self, cr, uid, ids, grouped=False, date_inv = False, context=None):
""" Action of Create Invoice """
res = False
inv_pool = self.pool.get('account.invoice')
product_pool = self.pool.get('product.product')
contact_pool = self.pool.get('res.partner.contact')
- if not context:
+ if context is None:
context = {}
# If date was specified, use it as date invoiced, usefull when invoices are generated this month and put the
# last day of the last month as invoice date
context['date_inv'] = date_inv
for reg in self.browse(cr, uid, ids, context=context):
-
val_invoice = inv_pool.onchange_partner_id(cr, uid, [], 'out_invoice', reg.partner_invoice_id.id, False, False)
-
val_invoice['value'].update({'partner_id': reg.partner_invoice_id.id})
partner_address_id = val_invoice['value']['address_invoice_id']
-
if not partner_address_id:
raise osv.except_osv(_('Error !'),
_("Registered partner doesn't have an address to make the invoice."))
product = product_pool.browse(cr, uid, reg.event_id.product_id.id, context=context)
for tax in product.taxes_id:
tax_ids.append(tax.id)
-
vals = value['value']
c_name = reg.contact_id and ('-' + contact_pool.name_get(cr, uid, [reg.contact_id.id])[0][1]) or ''
vals.update({
})
inv_line_ids = self._create_invoice_lines(cr, uid, [reg.id], vals)
invoices.setdefault(reg.partner_id.id, []).append((reg, inv_line_ids))
-
for val in invoices.values():
res = False
if grouped:
- res = self._make_invoice(cr, uid, val[0][0], [v for k , v in val], context=context)
+ res = self._make_invoice(cr, uid, val[0][0], [v for k, v in val], context=context)
- for k , v in val:
+ for k, v in val:
self.do_close(cr, uid, [k.id], context={'invoice_id': res})
else:
- for k , v in val:
+ for k, v in val:
res = self._make_invoice(cr, uid, k, [v], context=context)
self.do_close(cr, uid, [k.id], context={'invoice_id': res})
if res: new_invoice_ids.append(res)
-
return new_invoice_ids
def do_open(self, cr, uid, ids, context=None):
def do_close(self, cr, uid, ids, context=None):
""" Close Registration
"""
- if not context:
+ if context is None:
context = {}
invoice_id = context.get('invoice_id', False)
values = {'state': 'done', 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}
@param context: A standard dictionary for contextual values
@return: True
"""
- if not context:
- context = {}
+ if type(ids) in (int, long,):
+ ids = [ids]
data_pool = self.pool.get('ir.model.data')
unconfirmed_ids = []
+ if context is None:
+ context = {}
for registration in self.browse(cr, uid, ids, context=context):
total_confirmed = registration.event_id.register_current + registration.nb_register
if total_confirmed <= registration.event_id.register_max or registration.event_id.register_max == 0:
- self.do_open(cr, uid, [registration.id], context)
+ self.do_open(cr, uid, [registration.id], context=context)
else:
unconfirmed_ids.append(registration.id)
if unconfirmed_ids:
- view_id = data_pool._get_id(cr, uid, 'event', 'view_event_confirm_registration')
- view_data = data_pool.browse(cr, uid, view_id)
- view_id = view_data.res_id
+ view_id = data_pool.get_object_reference(cr, uid, 'event', 'view_event_confirm_registration')
+ view_id = view_id and view_id[1] or False
context['registration_ids'] = unconfirmed_ids
return {
'name': _('Confirm Registration'),
def button_reg_close(self, cr, uid, ids, context=None):
"""This Function Close Event Registration.
"""
- if not context:
- context = {}
data_pool = self.pool.get('ir.model.data')
unclosed_ids = []
+ if context is None:
+ context = {}
for registration in self.browse(cr, uid, ids, context=context):
if registration.tobe_invoiced and not registration.invoice_id:
unclosed_ids.append(registration.id)
else:
- self.do_close(cr, uid, [registration.id])
+ self.do_close(cr, uid, [registration.id], context=context)
if unclosed_ids:
- view_id = data_pool._get_id(cr, uid, 'event', 'view_event_make_invoice')
- view_data = data_pool.browse(cr, uid, view_id)
- view_id = view_data.res_id
+ view_id = data_pool.get_object_reference(cr, uid, 'event', 'view_event_make_invoice')
+ view_id = view_id and view_id[1] or False
context['active_ids'] = unclosed_ids
return {
'name': _('Close Registration'),
"""
registrations = self.browse(cr, uid, ids)
self.history(cr, uid, registrations, _('Cancel'))
- self.write(cr, uid, ids, {'state': 'cancel'})
- return True
+ return self.write(cr, uid, ids, {'state': 'cancel'})
def mail_user(self, cr, uid, ids, confirm=False, context=None):
"""
Send email to user
"""
- if not context:
- context = {}
for regestration in self.browse(cr, uid, ids, context=context):
src = regestration.event_id.reply_to or False
subject = _('Auto Confirmation: [%s] %s') %(regestration.id, regestration.name)
body = regestration.event_id.mail_confirm
if subject or body:
- tools.email_send(src, email_to, subject, body, email_cc = email_cc, openobject_id = regestration.id)
- self.history(cr, uid, [regestration], subject, history=True, \
+ tools.email_send(src, email_to, subject, body, email_cc=email_cc, openobject_id=regestration.id)
+ self.history(cr, uid, [regestration], subject, history = True, \
email=email_to, details=body, \
- subject=subject, email_from=src, \
+ subjec=subject, email_from=src, \
email_cc=', '.join(email_cc))
return True
def onchange_contact_id(self, cr, uid, ids, contact, partner):
- """This function returns value of Badge Name , Badge Title based on Partner contact.
+ """This function returns value of Badge Name, Badge Title based on Partner contact.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param event_id: Event ID
@param partner_invoice_id: Partner Invoice ID
"""
- context={}
+ context = {}
if not event_id:
return {'value': {'unit_price': False, 'event_product': False}}
res_obj = self.pool.get('res.partner')
data_event = event_obj.browse(cr, uid, event_id)
- res = {'value': {'unit_price': False, 'event_product': False, 'user_id': False,
- 'date': data_event.date_begin, 'date_deadline': data_event.date_end, 'description': data_event.note, 'name': data_event.name,
- 'section_id': data_event.section_id and data_event.section_id.id or False,
+ res = {'value': {'unit_price': False,
+ 'event_product': False,
+ 'user_id': False,
+ 'date': data_event.date_begin,
+ 'date_deadline': data_event.date_end,
+ 'description': data_event.note,
+ 'name': data_event.name,
+ 'section_id': data_event.section_id and data_event.section_id.id or False,
}}
if data_event.user_id.id:
- res['value'].update({'user_id':data_event.user_id.id})
+ res['value'].update({'user_id': data_event.user_id.id})
if data_event.product_id:
pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
if partner_invoice_id:
data['contact_id'], data['partner_invoice_id'], data['email_from'] = (False, False, False)
if not part:
return {'value': data}
- data['partner_invoice_id']=part
+ data['partner_invoice_id'] = part
# this calls onchange_partner_invoice_id
d = self.onchange_partner_invoice_id(cr, uid, ids, event_id, part)
# this updates the dictionary
@param event_id: Event ID
@param partner_invoice_id: Partner Invoice ID
"""
- data={}
- context={}
+ data = {}
+ context = {}
event_obj = self.pool.get('event.event')
prod_obj = self.pool.get('product.product')
res_obj = self.pool.get('res.partner')
data['unit_price']=False
if not event_id:
return {'value': data}
- data_event = event_obj.browse(cr, uid, event_id)
+ data_event = event_obj.browse(cr, uid, event_id, context=context)
if data_event.product_id:
data['event_product'] = data_event.product_id.name
pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
_name = 'event.registration.badge'
_description = __doc__
_columns = {
- 'registration_id': fields.many2one('event.registration', 'Registration', required=True),
+ "registration_id": fields.many2one('event.registration', 'Registration', required=True),
"title": fields.char('Title', size=128),
"name": fields.char('Name', size=128, required=True),
"address_id": fields.many2one('res.partner.address', 'Address'),
}
+
event_registration_badge()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file