From 29b06ee78aea21fa6212a56ec05d432ad768f1f0 Mon Sep 17 00:00:00 2001 From: "atp (OpenERP)" <> Date: Wed, 9 Jun 2010 19:28:21 +0530 Subject: [PATCH 1/4] [IMP] event: improvement bzr revid: hmo@tinyerp.com-20100609135821-61rfaf9lnqit5aez --- addons/event/__init__.py | 2 + addons/event/__openerp__.py | 4 +- addons/event/event.py | 230 ++++++++------ addons/event/event_view.xml | 294 ++++++++---------- addons/event/report/__init__.py | 24 ++ .../event/report/report_event_registration.py | 83 +++++ .../report/report_event_registration_view.xml | 117 +++++++ addons/event/security/ir.model.access.csv | 1 - addons/event/test/test_event.yml | 239 ++++++++++++++ .../event_confirm_registration_view.xml | 22 +- addons/event/wizard/event_make_invoice.py | 64 ++-- addons/event/wizard/event_registration.py | 12 +- .../event/wizard/event_registration_view.xml | 25 +- .../wizard/event_registrations_partner.py | 9 + .../wizard/event_registrations_partner.xml | 25 +- 15 files changed, 827 insertions(+), 324 deletions(-) create mode 100644 addons/event/report/__init__.py create mode 100644 addons/event/report/report_event_registration.py create mode 100644 addons/event/report/report_event_registration_view.xml create mode 100644 addons/event/test/test_event.yml diff --git a/addons/event/__init__.py b/addons/event/__init__.py index 55915834aa9..7bfc93318eb 100644 --- a/addons/event/__init__.py +++ b/addons/event/__init__.py @@ -21,5 +21,7 @@ import event import wizard +import report + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py index 3e76b9d19a2..61cb62ee600 100644 --- a/addons/event/__openerp__.py +++ b/addons/event/__openerp__.py @@ -34,7 +34,7 @@ Note that: - You can define new types of events in Events / Configuration / Types of Events - - You can access predefined reports about number of registration per event or per event category in : + - You can access predefined reports about number of registration per event or per event category in: Events / Reporting """, 'author': 'Tiny', @@ -43,6 +43,7 @@ 'update_xml': [ 'wizard/event_confirm_registration_view.xml', 'event_view.xml', + 'report/report_event_registration_view.xml', 'event_sequence.xml', 'security/event_security.xml', 'security/ir.model.access.csv', @@ -51,6 +52,7 @@ 'wizard/event_make_invoice_view.xml', ], 'demo_xml': ['event_demo.xml'], + 'test': ['test/test_event.yml'], 'installable': True, 'active': False, 'certificate': '0083059161581', diff --git a/addons/event/event.py b/addons/event/event.py index 1985cf9cc7d..73cab202df6 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -19,30 +19,47 @@ # ############################################################################## +from crm import crm from osv import fields, osv -import time +from tools.translate import _ import netsvc import pooler +import time import tools -from tools.translate import _ -from crm import crm class event_type(osv.osv): + + """ Event Type """ + _name = 'event.type' - _description= 'Event type' + _description = __doc__ _columns = { 'name': fields.char('Event type', size=64, required=True), } + event_type() class event(osv.osv): + + """Event""" + _name = 'event.event' - _description = 'Event' - _inherits = {'crm.case.section': 'section_id'} + _description = __doc__ + _inherit = 'crm.case.section' _order = 'date_begin' def copy(self, cr, uid, id, default=None, context=None): + + """ + Copy record of Given id + @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 id: Id of Event Registration type record. + @param context: A standard dictionary for contextual values + """ + return super(event, self).copy(cr, uid, id, default={'code': self.pool.get('ir.sequence').get(cr, uid, 'event.event'), 'state': 'draft'}) def button_draft(self, cr, uid, ids, context={}): @@ -55,16 +72,32 @@ class event(osv.osv): return self.write(cr, uid, ids, {'state': 'done'}) def button_confirm(self, cr, uid, ids, context={}): + for eve in self.browse(cr, uid, ids): if eve.mail_auto_confirm: #send reminder that will confirm the event for all the people that were already confirmed - reg_ids = self.pool.get('event.registration').search(cr, uid, [('event_id', '=', eve.id), ('state', 'not in', ['draft', 'cancel'])]) + reg_ids = self.pool.get('event.registration').search(cr, uid, + [('event_id', '=', eve.id), + ('state', 'not in', ['draft', 'cancel'])]) if reg_ids: self.pool.get('event.registration').mail_user_confirm(cr, uid, reg_ids) + return self.write(cr, uid, ids, {'state': 'confirm'}) def _get_register(self, cr, uid, ids, name, args, context=None): - res={} + + """ + Get Confirm or uncofirm register value. + @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 ids: List of Event registration type's id + @param name: List of function fields(register_current and register_prospect). + @param context: A standard dictionary for contextual values + @return: Dictionary of function fields value. + """ + + res = {} for event in self.browse(cr, uid, ids, context): res[event.id] = {} state = 'draft' @@ -74,22 +107,35 @@ class event(osv.osv): from event_registration r where state=%s and event_id=%s""" - cr.execute(query, (state, event.id, )) + cr.execute(query, (state, event.id,)) res2 = cr.fetchone() + if res2 and res2[0]: res[event.id][name[0]] = res2[0] else: res[event.id][name[0]] = 0 + return res def write(self, cr, uid, ids, vals, *args, **kwargs): + """ + Writes values in one or several fields. + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of Event registration type's IDs + @param vals: dictionary with values to update. + @return: True + """ + res = super(event, self).write(cr, uid, ids, vals, *args, **kwargs) if 'date_begin' in vals and vals['date_begin']: for eve in self.browse(cr, uid, ids): #change the deadlines of the registration linked to this event - reg_ids = self.pool.get('event.registration').search(cr, uid, [('event_id', '=', eve.id)]) + reg_ids = self.pool.get('event.registration').search(cr, uid, + [('event_id', '=', eve.id)]) if reg_ids: - self.pool.get('event.registration').write(cr, uid, reg_ids, {'date_deadline': vals['date_begin']}) + self.pool.get('event.registration').write(cr, uid, reg_ids, + {'date_deadline': vals['date_begin']}) #change the description of the registration linked to this event if 'mail_auto_confirm' in vals: @@ -98,17 +144,18 @@ class event(osv.osv): for eve in self.browse(cr, uid, ids): vals['mail_confirm'] = eve.mail_confirm else: - vals['mail_confirm']=False + vals['mail_confirm'] = False if 'mail_confirm' in vals: for eve in self.browse(cr, uid, ids): - reg_ids = self.pool.get('event.registration').search(cr, uid, [('event_id', '=', eve.id)]) + reg_ids = self.pool.get('event.registration').search(cr, uid, + [('event_id', '=', eve.id)]) if reg_ids: - self.pool.get('event.registration').write(cr, uid, reg_ids, {'description': vals['mail_confirm']}) + self.pool.get('event.registration').write(cr, uid, reg_ids, + {'description': vals['mail_confirm']}) return res _columns = { 'type': fields.many2one('event.type', 'Type'), - 'section_id': fields.many2one('crm.case.section', 'Case section', required=True), 'register_max': fields.integer('Maximum Registrations'), 'register_min': fields.integer('Minimum Registrations'), 'register_current': fields.function(_get_register, method=True, string='Confirmed Registrations', multi='register_current'), @@ -134,8 +181,20 @@ class event(osv.osv): event() class event_registration(osv.osv): + + """Event Registration""" def check_confirm(self, cr, uid, ids, context): + + """ + Check confirm event register on given id. + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of Event registration's IDs + @param context: A standard dictionary for contextual values + @return: Dictionary value which open Confirm registration form. + """ + mod_obj = self.pool.get('ir.model.data') current_registration = self.browse(cr, uid, [ids[0]])[0] total_confirmed = current_registration.event_id.register_current + current_registration.nb_register @@ -161,6 +220,16 @@ class event_registration(osv.osv): } def _history(self, cr, uid, ids, keyword, history=False, email=False, context={}): + + """ + Create value in mailgateway.message model. + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of Event registration's IDs + @param context: A standard dictionary for contextual values + @return: True + """ + for case in self.browse(cr, uid, ids): data = { 'name': keyword, @@ -183,24 +252,43 @@ class event_registration(osv.osv): return True def create(self, cr, uid, *args, **argv): + """ Overrides orm create method. + @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 *args: Fields value + @return : New created record Id. + """ + event = self.pool.get('event.event').browse(cr, uid, args[0]['event_id'], None) - args[0]['section_id']= event.section_id.id + args[0]['date_deadline']= event.date_begin args[0]['description']= event.mail_confirm res = super(event_registration, self).create(cr, uid, *args, **argv) + self._history(cr, uid, [res], 'Created', history=True) + return res def write(self, cr, uid, *args, **argv): + if 'event_id' in args[1]: event = self.pool.get('event.event').browse(cr, uid, args[1]['event_id'], None) - args[1]['section_id']= event.section_id.id + args[1]['date_deadline']= event.date_begin args[1]['description']= event.mail_confirm return super(event_registration, self).write(cr, uid, *args, **argv) def mail_user_confirm(self, cr, uid, ids): - reg_ids = self.browse(cr,uid,ids) + """ + @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 ids: List of Event Registration's Id. + @return : False + """ + + reg_ids = self.browse(cr, uid, ids) for reg_id in reg_ids: src = reg_id.event_id.reply_to or False dest = [] @@ -215,7 +303,15 @@ class event_registration(osv.osv): return False def mail_user(self, cr, uid, ids): + """ + @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 ids: List of Event Registration's Id. + @return : False + """ reg_ids = self.browse(cr, uid, ids) + for reg_id in reg_ids: src = reg_id.event_id.reply_to or False dest = [] @@ -234,16 +330,26 @@ class event_registration(osv.osv): return False def _create_invoice_lines(self, cr, uid, ids, vals): + + """ Create account Invoice line for Registration Id. + @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 Ids: List of event registration's Id + @param vals: Create fields value + @return : New created record Id. + """ + return self.pool.get('account.invoice.line').create(cr, uid, vals) _name= 'event.registration' - _description = 'Event Registration' + _description = __doc__ _inherit = 'crm.meeting' _columns = { 'email_cc': fields.text('Watchers Emails', size=252 , help="These \ people will receive a copy of the future communication between partner \ -and users by email"), +and users by email"), 'nb_register': fields.integer('Number of Registration', readonly=True, states={'draft': [('readonly', False)]}), 'event_id': fields.many2one('event.event', 'Event Related', required=True), "partner_invoice_id": fields.many2one('res.partner', 'Partner Invoiced'), @@ -272,6 +378,7 @@ and users by email"), } def onchange_badge_name(self, cr, uid, ids, badge_name): + data ={} if not badge_name: return data @@ -279,9 +386,11 @@ and users by email"), return {'value': data} def onchange_contact_id(self, cr, uid, ids, contact, partner): + data ={} if not contact: return data + contact_id = self.pool.get('res.partner.contact').browse(cr, uid, contact) data['badge_name'] = contact_id.name data['badge_title'] = contact_id.title @@ -298,20 +407,23 @@ and users by email"), def onchange_event(self, cr, uid, ids, event_id, partner_invoice_id): context={} if not event_id: - return {'value': {'unit_price': False , 'invoice_label': False }} + return {'value': {'unit_price': False, 'invoice_label': False}} data_event = self.pool.get('event.event').browse(cr, uid, event_id) + if data_event.product_id: if not partner_invoice_id: unit_price=self.pool.get('product.product').price_get(cr, uid, [data_event.product_id.id], context=context)[data_event.product_id.id] - return {'value': {'unit_price': unit_price , 'invoice_label': data_event.product_id.name}} + return {'value': {'unit_price': unit_price, 'invoice_label': data_event.product_id.name}} data_partner = self.pool.get('res.partner').browse(cr, uid, partner_invoice_id) context.update({'partner_id': data_partner}) unit_price = self.pool.get('product.product')._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': data_partner.property_product_pricelist.id})[data_event.product_id.id] - return {'value': {'unit_price': unit_price , 'invoice_label': data_event.product_id.name}} + return {'value': {'unit_price': unit_price, 'invoice_label': data_event.product_id.name}} + return {'value': {'unit_price': False, 'invoice_label': False}} def onchange_partner_id(self, cr, uid, ids, part, event_id, email=False): + data={} data['badge_partner'] = data['contact_id'] = data['partner_invoice_id'] = data['email_from'] = data['badge_title'] = data['badge_name'] = False if not part: @@ -334,6 +446,7 @@ and users by email"), return {'value': data} def onchange_partner_invoice_id(self, cr, uid, ids, event_id, partner_invoice_id): + data={} context={} data['unit_price']=False @@ -351,80 +464,9 @@ and users by email"), return {'value': data} return {'value': data} - def onchange_categ_id(self, cr, uid, ids, categ, context={}): - if not categ: - return {'value': {}} - cat = self.pool.get('crm.case.categ').browse(cr, uid, categ, context).probability - return {'value': {'probability': cat}} event_registration() - -class report_event_registration(osv.osv): - _name = "report.event.registration" - _description = "Events on registrations" - _auto = False - _columns = { - 'name': fields.char('Event', size=20), - 'date_begin': fields.datetime('Beginning date', required=True), - 'date_end': fields.datetime('Ending date', required=True), - 'draft_state': fields.integer('Draft Registration', size=20), - 'confirm_state': fields.integer('Confirm Registration', size=20), - 'register_max': fields.integer('Maximum Registrations'), - } - def init(self, cr): - cr.execute(""" - create or replace view report_event_registration as ( - select - e.id as id, - c.name as name, - e.date_begin as date_begin, - e.date_end as date_end, - (SELECT sum(c.nb_register) FROM event_registration c WHERE c.section_id=e.section_id and state in ('draft')) as draft_state, - (SELECT sum(c.nb_register) FROM event_registration c WHERE c.section_id=e.section_id and state in ('open')) as confirm_state, - e.register_max as register_max - from - event_event e,crm_case_section c - where - e.section_id=c.id - )""") - -report_event_registration() - -class report_event_type_registration(osv.osv): - _name = "report.event.type.registration" - _description = "Event type on registration" - _auto = False - _columns = { - 'name': fields.char('Event Type', size=20), - 'nbevent': fields.integer('Number Of Events'), - 'draft_state': fields.integer('Draft Registrations', size=20), - 'confirm_state': fields.integer('Confirm Registrations', size=20), - } - - - def init(self, cr): - cr.execute(""" - create or replace view report_event_type_registration as ( - select - count(t.id) as id, - t.name as name, - (select sum(c.nb_register) from event_registration c, event_event e where c.section_id=e.section_id and c.state='draft' and e.type=t.id ) as draft_state , - (select sum(c.nb_register) from event_registration c, event_event e where c.section_id=e.section_id and c.state='open' and e.type=t.id ) as confirm_state, - count(t.id) as nbevent - from - event_event e - inner join - crm_case_section c1 on (e.section_id=c1.id) - inner join - event_type t on (e.type=t.id) - group by - t.name,t.id - - )""") -report_event_type_registration() - - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml index a238f637dad..201cbff93f0 100644 --- a/addons/event/event_view.xml +++ b/addons/event/event_view.xml @@ -80,17 +80,23 @@