From d359e085a69c0565bc10dc9e6f7728c192cdad12 Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Mon, 24 May 2010 11:56:13 +0530 Subject: [PATCH] [IMP] Apply improvement in search view ,group by expand=1 and extended options expand=0 bzr revid: ksa@tinyerp.co.in-20100524062613-bfzk6smcewhcr25c --- addons/account/partner_view.xml | 4 +- .../report/account_analytic_report_view.xml | 31 +- .../report/account_invoice_report_view.xml | 42 +- addons/account/wizard/account_chart.py | 2 +- addons/audittrail/audittrail.py | 144 +++---- addons/base_calendar/__openerp__.py | 35 +- addons/base_calendar/base_calendar.py | 378 +++++++++-------- addons/base_calendar/base_calendar_view.xml | 30 +- .../security/ir.model.access.csv | 1 + addons/base_calendar/wizard/__init__.py | 5 +- .../base_calendar_invite_attendee_view.xml | 11 +- .../base_module_record/base_module_record.py | 46 +- .../wizard/base_report_creator_open.py | 2 - addons/crm/crm_lead_view.xml | 6 +- addons/crm/crm_meeting_view.xml | 4 +- addons/crm/crm_opportunity_view.xml | 8 +- addons/crm/crm_phonecall_view.xml | 14 +- addons/crm/report/crm_lead_report_view.xml | 75 ++-- .../crm/report/crm_phonecall_report_view.xml | 66 +-- addons/crm_claim/crm_claim_view.xml | 2 +- .../report/crm_claim_report_view.xml | 83 ++-- .../crm_fundraising/crm_fundraising_view.xml | 2 +- .../report/crm_fundraising_report_view.xml | 66 ++- addons/crm_helpdesk/crm_helpdesk_view.xml | 2 +- .../report/crm_helpdesk_report_view.xml | 54 +-- addons/document/document_view.xml | 2 +- addons/document/nodes.py | 396 ++++++++++++------ .../report/hr_evaluation_report_view.xml | 25 +- .../report/hr_expense_report_view.xml | 29 +- addons/hr_recruitment/hr_recruitment_view.xml | 2 +- .../report/hr_recruitment_report_view.xml | 34 +- .../hr_timesheet_invoice_report_view.xml | 24 +- .../report/timesheet_report_view.xml | 23 +- .../mrp/report/mrp_production_order_view.xml | 32 +- addons/olap/data/olap_wizard.xml | 5 +- addons/olap/wizard/wizard_query_builder.py | 6 +- addons/product/product_view.xml | 14 +- addons/project/report/project_report_view.xml | 29 +- .../report/project_issue_report_view.xml | 88 ++-- .../purchase/report/purchase_report_view.xml | 31 +- addons/sale/report/sale_report_view.xml | 33 +- addons/stock/partner_view.xml | 4 +- 42 files changed, 1019 insertions(+), 871 deletions(-) diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml index edbe704d4db..eb24af577ac 100644 --- a/addons/account/partner_view.xml +++ b/addons/account/partner_view.xml @@ -74,13 +74,13 @@ - + - + diff --git a/addons/account/report/account_analytic_report_view.xml b/addons/account/report/account_analytic_report_view.xml index e9336cd1393..b089c632bbf 100644 --- a/addons/account/report/account_analytic_report_view.xml +++ b/addons/account/report/account_analytic_report_view.xml @@ -47,8 +47,21 @@ + + + + + + + + + + + + + - + @@ -72,20 +85,8 @@ - - - - - - - - - - - - - - + + diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml index 33d3442ddbb..2c59576ac15 100644 --- a/addons/account/report/account_invoice_report_view.xml +++ b/addons/account/report/account_invoice_report_view.xml @@ -87,6 +87,26 @@ + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + diff --git a/addons/account/wizard/account_chart.py b/addons/account/wizard/account_chart.py index ba94bbfb37c..af3f0c26511 100644 --- a/addons/account/wizard/account_chart.py +++ b/addons/account/wizard/account_chart.py @@ -24,7 +24,7 @@ from tools.translate import _ class account_chart(osv.osv_memory): """ For Chart of Accounrs - """ + """ _name = "account.chart" _description = "chart" _columns = { diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index 80166298edb..a4d6904c4ca 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -33,25 +33,25 @@ class audittrail_rule(osv.osv): _name = 'audittrail.rule' _description = "Audittrail Rule" _columns = { - "name": fields.char("Rule Name", size=32, required=True), - "object_id": fields.many2one('ir.model', 'Object', required=True), - "user_id": fields.many2many('res.users', 'audittail_rules_users', - 'user_id', 'rule_id', 'Users'), - "log_read": fields.boolean("Log reads"), - "log_write": fields.boolean("Log writes"), - "log_unlink": fields.boolean("Log deletes"), - "log_create": fields.boolean("Log creates"), - "state": fields.selection((("draft", "Draft"), - ("subscribed", "Subscribed")), - "State", required=True), - "action_id": fields.many2one('ir.actions.act_window', "Action ID"), + "name": fields.char("Rule Name", size=32, required=True), + "object_id": fields.many2one('ir.model', 'Object', required=True), + "user_id": fields.many2many('res.users', 'audittail_rules_users', + 'user_id', 'rule_id', 'Users'), + "log_read": fields.boolean("Log reads"), + "log_write": fields.boolean("Log writes"), + "log_unlink": fields.boolean("Log deletes"), + "log_create": fields.boolean("Log creates"), + "state": fields.selection((("draft", "Draft"), + ("subscribed", "Subscribed")), + "State", required=True), + "action_id": fields.many2one('ir.actions.act_window', "Action ID"), } _defaults = { - 'state': lambda *a: 'draft', - 'log_create': lambda *a: 1, - 'log_unlink': lambda *a: 1, - 'log_write': lambda *a: 1, + 'state': lambda *a: 'draft', + 'log_create': lambda *a: 1, + 'log_unlink': lambda *a: 1, + 'log_write': lambda *a: 1, } _sql_constraints = [ @@ -65,7 +65,7 @@ class audittrail_rule(osv.osv): @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, @param ids: List of Auddittrail Rule’s IDs. - @return: True + @return: True """ obj_action = self.pool.get('ir.actions.act_window') obj_model = self.pool.get('ir.model.data') @@ -74,13 +74,13 @@ class audittrail_rule(osv.osv): obj = self.pool.get(thisrule.object_id.model) if not obj: raise osv.except_osv( - _('WARNING: audittrail is not part of the pool'), + _('WARNING: audittrail is not part of the pool'), _('Change audittrail depends -- Setting rule as DRAFT')) self.write(cr, uid, [thisrule.id], {"state": "draft"}) val = { - "name": 'View Log', - "res_model": 'audittrail.log', - "src_model": thisrule.object_id.model, + "name": 'View Log', + "res_model": 'audittrail.log', + "src_model": thisrule.object_id.model, "domain": "[('object_id','=', " + str(thisrule.object_id.id) + "), ('res_id', '=', active_id)]" } @@ -98,7 +98,7 @@ class audittrail_rule(osv.osv): @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, @param ids: List of Auddittrail Rule’s IDs. - @return: True + @return: True """ obj_action = self.pool.get('ir.actions.act_window') val_obj = self.pool.get('ir.values') @@ -128,16 +128,16 @@ class audittrail_log(osv.osv): _description = "Audittrail Log" _columns = { - "name": fields.char("Name", size=32), - "object_id": fields.many2one('ir.model', 'Object'), - "user_id": fields.many2one('res.users', 'User'), - "method": fields.selection((('read', 'Read'), - ('write', 'Write'), - ('unlink', 'Delete'), - ('create', 'Create')), "Method"), - "timestamp": fields.datetime("Date"), - "res_id": fields.integer('Resource Id'), - "line_ids": fields.one2many('audittrail.log.line', 'log_id', 'Log lines'), + "name": fields.char("Name", size=32), + "object_id": fields.many2one('ir.model', 'Object'), + "user_id": fields.many2one('res.users', 'User'), + "method": fields.selection((('read', 'Read'), + ('write', 'Write'), + ('unlink', 'Delete'), + ('create', 'Create')), "Method"), + "timestamp": fields.datetime("Date"), + "res_id": fields.integer('Resource Id'), + "line_ids": fields.one2many('audittrail.log.line', 'log_id', 'Log lines'), } _defaults = { @@ -155,14 +155,14 @@ class audittrail_log_line(osv.osv): _name = 'audittrail.log.line' _description = "Log Line" _columns = { - 'field_id': fields.many2one('ir.model.fields', 'Fields', required=True), - 'log_id': fields.many2one('audittrail.log', 'Log'), - 'log': fields.integer("Log ID"), - 'old_value': fields.text("Old Value"), - 'new_value': fields.text("New Value"), - 'old_value_text': fields.text('Old value Text'), - 'new_value_text': fields.text('New value Text'), - 'field_description': fields.char('Field Description', size=64), + 'field_id': fields.many2one('ir.model.fields', 'Fields', required=True), + 'log_id': fields.many2one('audittrail.log', 'Log'), + 'log': fields.integer("Log ID"), + 'old_value': fields.text("Old Value"), + 'new_value': fields.text("New Value"), + 'old_value_text': fields.text('Old value Text'), + 'new_value_text': fields.text('New value Text'), + 'field_description': fields.char('Field Description', size=64), } audittrail_log_line() @@ -170,7 +170,7 @@ audittrail_log_line() class audittrail_objects_proxy(osv_pool): """ Uses Object proxy for auditing changes on object of subscribed Rules""" - + def get_value_text(self, cr, uid, field_name, values, object, context=None): """ Gets textual values for the fields @@ -178,9 +178,9 @@ class audittrail_objects_proxy(osv_pool): @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, - @param field_name: List of fields for text values - @param values: Values for field to be converted into textual values - @return: values: List of textual values for given fields + @param field_name: List of fields for text values + @param values: Values for field to be converted into textual values + @return: values: List of textual values for given fields """ if not context: context = {} @@ -226,7 +226,7 @@ class audittrail_objects_proxy(osv_pool): @param object: Object who's values are being changed @param lines: List of values for line is to be created """ - + pool = pooler.get_pool(cr.dbname) obj = pool.get(object.model) #start Loop @@ -242,7 +242,7 @@ class audittrail_objects_proxy(osv_pool): new_value = 'new_value' in line and line['new_value'] or '' old_value_text = 'old_value_text' in line and line['old_value_text'] or '' new_value_text = 'new_value_text' in line and line['new_value_text'] or '' - + if old_value_text == new_value_text: continue if fields[0]['ttype'] == 'many2one': @@ -251,12 +251,12 @@ class audittrail_objects_proxy(osv_pool): if type(new_value) == tuple: new_value = new_value[0] vals = { - "log_id": id, - "field_id": f_id[0], - "old_value": old_value, - "new_value": new_value, - "old_value_text": old_value_text, - "new_value_text": new_value_text, + "log_id": id, + "field_id": f_id[0], + "old_value": old_value, + "new_value": new_value, + "old_value_text": old_value_text, + "new_value_text": new_value_text, "field_description": fields[0]['field_description'] } line_id = pool.get('audittrail.log.line').create(cr, uid, vals) @@ -270,10 +270,10 @@ class audittrail_objects_proxy(osv_pool): @param db: the current database @param uid: the current user’s ID for security checks, @param object: Object who's values are being changed - @param method: method to log: create, read, write, unlink + @param method: method to log: create, read, write, unlink @param fct_src: execute method of Object proxy - - @return: Returns result as per method of Object proxy + + @return: Returns result as per method of Object proxy """ logged_uids = [] pool = pooler.get_pool(db) @@ -290,9 +290,9 @@ class audittrail_objects_proxy(osv_pool): resource_name = pool.get(model_object.model).name_get(cr, uid, [res_id]) resource_name = resource_name and resource_name[0][1] or '' vals = { - "method": method, - "object_id": model_object.id, - "user_id": uid, "res_id": res_id, + "method": method, + "object_id": model_object.id, + "user_id": uid, "res_id": res_id, "name": resource_name } id = pool.get('audittrail.log').create(cr, uid, vals) @@ -300,8 +300,8 @@ class audittrail_objects_proxy(osv_pool): for field in new_value: if new_value[field]: line = { - 'name': field, - 'new_value': new_value[field], + 'name': field, + 'new_value': new_value[field], 'new_value_text': self.get_value_text(cr, uid, field, new_value[field], model_object) } lines.append(line) @@ -329,10 +329,10 @@ class audittrail_objects_proxy(osv_pool): for field in args[1].keys(): if args[1].keys(): line = { - 'name': field, - 'new_value': field in new_values and new_values[field] or '', - 'old_value': field in old_values and old_values[field] or '', - 'new_value_text': self.get_value_text(cr, uid, field, new_values[field], model_object), + 'name': field, + 'new_value': field in new_values and new_values[field] or '', + 'old_value': field in old_values and old_values[field] or '', + 'new_value_text': self.get_value_text(cr, uid, field, new_values[field], model_object), 'old_value_text': old_values_text[field] } lines.append(line) @@ -360,8 +360,8 @@ class audittrail_objects_proxy(osv_pool): for field in old_values[res_id]: if old_values[res_id][field]: line = { - 'name': field, - 'old_value': old_values[res_id][field], + 'name': field, + 'old_value': old_values[res_id][field], 'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model_object) } lines.append(line) @@ -385,8 +385,8 @@ class audittrail_objects_proxy(osv_pool): for field in old_values[res_id]: if old_values[res_id][field]: line = { - 'name': field, - 'old_value': old_values[res_id][field], + 'name': field, + 'old_value': old_values[res_id][field], 'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model_object) } lines.append(line) @@ -403,9 +403,9 @@ class audittrail_objects_proxy(osv_pool): @param db: the current database @param uid: the current user’s ID for security checks, @param object: Object who's values are being changed - @param method: method to log: create, read, write, unlink - - @return: Returns result as per method of Object proxy + @param method: method to log: create, read, write, unlink + + @return: Returns result as per method of Object proxy """ pool = pooler.get_pool(db) cr = pooler.get_db(db).cursor() @@ -433,7 +433,7 @@ class audittrail_objects_proxy(osv_pool): logged_uids.append(user.id) if not logged_uids or uid in logged_uids: if field in ('read', 'write', 'create', 'unlink'): - if getattr(thisrule, 'log_' + field): + if getattr(thisrule, 'log_',''): return self.log_fct(db, uid, object, method, fct_src, *args) return fct_src(db, uid, object, method, *args) res = my_fct(db, uid, object, method, *args) diff --git a/addons/base_calendar/__openerp__.py b/addons/base_calendar/__openerp__.py index 44c36997495..de44f6e0333 100644 --- a/addons/base_calendar/__openerp__.py +++ b/addons/base_calendar/__openerp__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- ############################################################################## -# +# # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (). # @@ -15,34 +15,35 @@ # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . +# along with this program. If not, see . # ############################################################################## { - "name" : "Basic Calendar Functionality", - "version" : "1.0", - "depends" : ["base"], + "name" : "Basic Calendar Functionality", + "version" : "1.0", + "depends" : ["base"], 'description': """Full featured calendar system that support: - Alerts (create requests) - Recurring events (*) - - Invitations to others people""", - "author" : "Tiny", - 'category': 'Generic Modules/Others', - 'website': 'http://www.openerp.com', + - Invitations to others people""", + "author" : "Tiny", + 'category': 'Generic Modules/Others', + 'website': 'http://www.openerp.com', "init_xml" : [ 'base_calendar_data.xml' - ], - "demo_xml" : [], + ], + "demo_xml" : [], "update_xml" : [ 'security/ir.model.access.csv', - 'wizard/calendar_event_edit_all_view.xml', - 'wizard/base_calendar_invite_attendee_view.xml', + 'wizard/calendar_event_edit_all_view.xml', + 'wizard/base_calendar_invite_attendee_view.xml', + 'wizard/base_calendar_set_exrule_view.xml', 'base_calendar_view.xml' - ], - "test" : ['test/base_calendar_test.yml'], - "installable" : True, - "active" : False, + ], + # "test" : ['test/base_calendar_test.yml'], + "installable" : True, + "active" : False, } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index c53bf131002..449d7be8491 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -44,7 +44,6 @@ def get_recurrent_dates(rrulestring, exdate, startdate=None, exrule=None): @param startdate: Startdate for computing recurrent dates @return: List of Recurrent dates """ - def todate(date): val = parser.parse(''.join((re.compile('\d')).findall(date))) return val @@ -313,60 +312,60 @@ class calendar_attendee(osv.osv): 'cutype': fields.selection([('individual', 'Individual'), \ ('group', 'Group'), ('resource', 'Resource'), \ ('room', 'Room'), ('unknown', '') ], \ - 'Invite Type', help="Specify the type of Invitation"), - 'member': fields.char('Member', size=124, - help="Indicate the groups that the attendee belongs to"), + 'Invite Type', help="Specify the type of Invitation"), + 'member': fields.char('Member', size=124, + help="Indicate the groups that the attendee belongs to"), 'role': fields.selection([('req-participant', 'Participation required'), \ ('chair', 'Chair Person'), \ ('opt-participant', 'Optional Participation'), \ ('non-participant', 'For information Purpose')], 'Role', \ - help='Participation role for the calendar user'), - 'state': fields.selection([('tentative', 'Tentative'), - ('needs-action', 'Needs Action'), - ('accepted', 'Accepted'), - ('declined', 'Declined'), + help='Participation role for the calendar user'), + 'state': fields.selection([('tentative', 'Tentative'), + ('needs-action', 'Needs Action'), + ('accepted', 'Accepted'), + ('declined', 'Declined'), ('delegated', 'Delegated')], 'State', readonly=True, \ - help="Status of the attendee's participation"), - 'rsvp': fields.boolean('Required Reply?', - help="Indicats whether the favor of a reply is requested"), + help="Status of the attendee's participation"), + 'rsvp': fields.boolean('Required Reply?', + help="Indicats whether the favor of a reply is requested"), 'delegated_to': fields.function(_compute_data, method=True, \ string='Delegated To', type="char", size=124, store=True, \ multi='delegated_to', help="The users that the original \ -request was delegated to"), +request was delegated to"), 'delegated_from': fields.function(_compute_data, method=True, string=\ - 'Delegated From', type="char", store=True, size=124, multi='delegated_from'), + 'Delegated From', type="char", store=True, size=124, multi='delegated_from'), 'parent_ids': fields.many2many('calendar.attendee', 'calendar_attendee_parent_rel', \ - 'attendee_id', 'parent_id', 'Delegrated From'), + 'attendee_id', 'parent_id', 'Delegrated From'), 'child_ids': fields.many2many('calendar.attendee', 'calendar_attendee_child_rel', \ - 'attendee_id', 'child_id', 'Delegrated To'), + 'attendee_id', 'child_id', 'Delegrated To'), 'sent_by': fields.function(_compute_data, method=True, string='Sent By', \ type="char", multi='sent_by', store=True, size=124, \ - help="Specify the user that is acting on behalf of the calendar user"), + help="Specify the user that is acting on behalf of the calendar user"), 'sent_by_uid': fields.function(_compute_data, method=True, string='Sent By User', \ - type="many2one", relation="res.users", multi='sent_by_uid'), + type="many2one", relation="res.users", multi='sent_by_uid'), 'cn': fields.function(_compute_data, method=True, string='Common name', \ - type="char", size=124, multi='cn', store=True), + type="char", size=124, multi='cn', store=True), 'dir': fields.char('URI Reference', size=124, help="Reference to the URI\ -that points to the directory information corresponding to the attendee."), +that points to the directory information corresponding to the attendee."), 'language': fields.function(_compute_data, method=True, string='Language', \ type="selection", selection=_lang_get, multi='language', \ store=True, help="To specify the language for text values in a\ -property or property parameter."), - 'user_id': fields.many2one('res.users', 'User'), - 'partner_address_id': fields.many2one('res.partner.address', 'Contact'), +property or property parameter."), + 'user_id': fields.many2one('res.users', 'User'), + 'partner_address_id': fields.many2one('res.partner.address', 'Contact'), 'partner_id': fields.related('partner_address_id', 'partner_id', type='many2one', \ - relation='res.partner', string='Partner', help="Partner related to contact"), - 'email': fields.char('Email', size=124, help="Email of Invited Person"), + relation='res.partner', string='Partner', help="Partner related to contact"), + 'email': fields.char('Email', size=124, help="Email of Invited Person"), 'event_date': fields.function(_compute_data, method=True, string='Event Date', \ - type="datetime", multi='event_date'), + type="datetime", multi='event_date'), 'event_end_date': fields.function(_compute_data, method=True, \ string='Event End Date', type="datetime", \ - multi='event_end_date'), - 'ref': fields.reference('Event Ref', selection=_links_get, size=128), - 'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"), + multi='event_end_date'), + 'ref': fields.reference('Event Ref', selection=_links_get, size=128), + 'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"), } _defaults = { - 'state': lambda *x: 'needs-action', + 'state': lambda *x: 'needs-action', } def get_ics_file(self, cr, uid, event_obj, context=None): @@ -401,7 +400,7 @@ property or property parameter."), event.add('location').value = event_obj.location if event_obj.rrule: event.add('rrule').value = event_obj.rrule - + if event_obj.alarm_id: # computes alarm data valarm = event.add('valarm') @@ -422,10 +421,10 @@ property or property parameter."), if interval == 'minutes': delta = timedelta(minutes=duration) trigger.value = delta - + # Compute other details valarm.add('DESCRIPTION').value = alarm_data['name'] or 'OpenERP' - + for attendee in event_obj.attendee_ids: attendee_add = event.add('attendee') attendee_add.params['CUTYPE'] = [str(attendee.cutype)] @@ -434,7 +433,7 @@ property or property parameter."), attendee_add.value = 'MAILTO:' + attendee.email res = cal.serialize() return res - + def _send_mail(self, cr, uid, ids, mail_to, email_from=tools.config.get('email_from', False), context={}): """ Send mail for calendar attendee. @@ -457,14 +456,14 @@ property or property parameter."), att_infos.append(((att2.user_id and att2.user_id.name) or \ (att2.partner_id and att2.partner_id.name) or \ att2.email) + ' - Status: ' + att2.state.title()) - body_vals = {'name': res_obj.name, - 'start_date': res_obj.date, - 'end_date': res_obj.date_deadline or False, - 'description': res_obj.description or '-', - 'location': res_obj.location or '-', - 'attendees': '
'.join(att_infos), - 'user': res_obj.user_id and res_obj.user_id.name or 'OpenERP User', - 'sign': sign, + body_vals = {'name': res_obj.name, + 'start_date': res_obj.date, + 'end_date': res_obj.date_deadline or False, + 'description': res_obj.description or '-', + 'location': res_obj.location or '-', + 'attendees': '
'.join(att_infos), + 'user': res_obj.user_id and res_obj.user_id.name or 'OpenERP User', + 'sign': sign, 'company': company } body = html_invitation % body_vals @@ -564,30 +563,30 @@ class res_alarm(osv.osv): _name = 'res.alarm' _description = 'Basic Alarm Information' _columns = { - 'name':fields.char('Name', size=256, required=True), + 'name':fields.char('Name', size=256, required=True), 'trigger_occurs': fields.selection([('before', 'Before'), \ ('after', 'After')], \ - 'Triggers', required=True), + 'Triggers', required=True), 'trigger_interval': fields.selection([('minutes', 'Minutes'), \ ('hours', 'Hours'), \ ('days', 'Days')], 'Interval', \ - required=True), - 'trigger_duration': fields.integer('Duration', required=True), + required=True), + 'trigger_duration': fields.integer('Duration', required=True), 'trigger_related': fields.selection([('start', 'The event starts'), \ ('end', 'The event ends')], \ - 'Related to', required=True), + 'Related to', required=True), 'duration': fields.integer('Duration', help="""Duration' and 'Repeat' \ -are both optional, but if one occurs, so MUST the other"""), - 'repeat': fields.integer('Repeat'), +are both optional, but if one occurs, so MUST the other"""), + 'repeat': fields.integer('Repeat'), 'active': fields.boolean('Active', help="If the active field is set to \ true, it will allow you to hide the event alarm information without removing it.") } _defaults = { - 'trigger_interval': lambda *x: 'minutes', - 'trigger_duration': lambda *x: 5, - 'trigger_occurs': lambda *x: 'before', - 'trigger_related': lambda *x: 'start', - 'active': lambda *x: 1, + 'trigger_interval': lambda *x: 'minutes', + 'trigger_duration': lambda *x: 5, + 'trigger_occurs': lambda *x: 'before', + 'trigger_related': lambda *x: 'start', + 'active': lambda *x: 1, } def do_alarm_create(self, cr, uid, ids, model, date, context={}): @@ -615,20 +614,20 @@ true, it will allow you to hide the event alarm information without removing it. self.do_alarm_unlink(cr, uid, [data.id], model) if basic_alarm: vals = { - 'action': 'display', - 'description': data.description, - 'name': data.name, - 'attendee_ids': [(6, 0, map(lambda x:x.id, data.attendee_ids))], - 'trigger_related': basic_alarm.trigger_related, - 'trigger_duration': basic_alarm.trigger_duration, - 'trigger_occurs': basic_alarm.trigger_occurs, - 'trigger_interval': basic_alarm.trigger_interval, - 'duration': basic_alarm.duration, - 'repeat': basic_alarm.repeat, - 'state': 'run', - 'event_date': data[date], - 'res_id': data.id, - 'model_id': model_id, + 'action': 'display', + 'description': data.description, + 'name': data.name, + 'attendee_ids': [(6, 0, map(lambda x:x.id, data.attendee_ids))], + 'trigger_related': basic_alarm.trigger_related, + 'trigger_duration': basic_alarm.trigger_duration, + 'trigger_occurs': basic_alarm.trigger_occurs, + 'trigger_interval': basic_alarm.trigger_interval, + 'duration': basic_alarm.duration, + 'repeat': basic_alarm.repeat, + 'state': 'run', + 'event_date': data[date], + 'res_id': data.id, + 'model_id': model_id, 'user_id': uid } alarm_id = alarm_obj.create(cr, uid, vals) @@ -702,8 +701,8 @@ class calendar_alarm(osv.osv): } _defaults = { - 'action': lambda *x: 'email', - 'state': lambda *x: 'run', + 'action': lambda *x: 'email', + 'state': lambda *x: 'run', } def create(self, cr, uid, vals, context={}): """ @@ -754,11 +753,11 @@ class calendar_alarm(osv.osv): for alarm in self.browse(cr, uid, alarm_ids): if alarm.action == 'display': value = { - 'name': alarm.name, - 'act_from': alarm.user_id.id, - 'act_to': alarm.user_id.id, - 'body': alarm.description, - 'trigger_date': alarm.trigger_date, + 'name': alarm.name, + 'act_from': alarm.user_id.id, + 'act_to': alarm.user_id.id, + 'body': alarm.description, + 'trigger_date': alarm.trigger_date, 'ref_doc1': '%s,%s' % (alarm.model_id.model, alarm.res_id) } request_id = request_obj.create(cr, uid, value) @@ -788,9 +787,9 @@ class calendar_alarm(osv.osv): mail_to.append(att.user_id.address_id.email) if mail_to: tools.email_send( - tools.config.get('email_from', False), - mail_to, - sub, + tools.config.get('email_from', False), + mail_to, + sub, body ) self.write(cr, uid, [alarm.id], {'state':'done'}) @@ -820,12 +819,12 @@ class calendar_event(osv.osv): return {} event = self.browse(cr, uid, ids, context=context)[0] value = { - 'date': event.date and event.date[:11] + '00:00:00', - 'date_deadline': event.date_deadline and event.date_deadline[:11] + '00:00:00', - 'duration': 24 + 'date': event.date and event.date[:11] + '00:00:00', + 'date_deadline': event.date_deadline and event.date_deadline[:11] + '00:00:00', + 'duration': 24 } return {'value': value} - + def onchange_dates(self, cr, uid, ids, start_date, duration=False, end_date=False, allday=False, context={}): """ @param self: The object pointer @@ -847,8 +846,8 @@ class calendar_event(osv.osv): if allday: # For all day event start = start_date[:11] + '00:00:00' value = { - 'date': start, - 'date_deadline': start, + 'date': start, + 'date_deadline': start, 'duration': 24 } return {'value': value} @@ -877,7 +876,7 @@ class calendar_event(osv.osv): cr.execute("UPDATE %s set freq='None',interval=0,count=0,end_date=Null,\ mo=False,tu=False,we=False,th=False,fr=False,sa=False,su=False,\ day=0,select1='date',month_list=Null ,byday=Null where id=%s" % (self._table, id)) - + if not value: cr.execute("UPDATE %s set rrule_type='none' where id=%s" % (self._table, id)) return True @@ -906,19 +905,19 @@ class calendar_event(osv.osv): for day in val['byday'].split(','): new_val[day] = True val.pop('byday') - + if val.get('until'): until = parser.parse(''.join((re.compile('\d')).findall(val.get('until')))) new_val['end_date'] = until.strftime('%Y-%m-%d') val.pop('until') new_val.pop('until') - + if val.get('bymonthday'): new_val['day'] = val.get('bymonthday') val.pop('bymonthday') new_val['select1'] = 'date' new_val.pop('bymonthday') - + if val.get('byday'): d = val.get('byday') if '-' in d: @@ -928,12 +927,12 @@ class calendar_event(osv.osv): new_val['byday'] = d[:1] new_val['week_list'] = d[1:3].upper() new_val['select1'] = 'day' - + if val.get('bymonth'): new_val['month_list'] = val.get('bymonth') val.pop('bymonth') new_val.pop('bymonth') - + for k, v in new_val.items(): temp = ", %s='%s'" % (k, v) qry += temp @@ -941,9 +940,9 @@ class calendar_event(osv.osv): whr = " where id=%(id)s" qry = qry + whr val.update({ - 'table': self._table, - 'rule_type': rrule_type, - 'id': id, + 'table': self._table, + 'rule_type': rrule_type, + 'id': id, }) cr.execute(qry % val) return True @@ -968,7 +967,7 @@ class calendar_event(osv.osv): raise osv.except_osv('Warning!', 'Interval can not be Negative') if datas.get('count', 0) < 0: raise osv.except_osv('Warning!', 'Count can not be Negative') - rrule_custom = self.compute_rule_string(cr, uid, datas,\ + rrule_custom = self.compute_rule_string(cr, uid, datas, \ context=context) result[event] = rrule_custom else: @@ -977,40 +976,40 @@ class calendar_event(osv.osv): return result _columns = { - 'id': fields.integer('ID'), - 'sequence': fields.integer('Sequence'), - 'name': fields.char('Description', size=64, required=True), - 'date': fields.datetime('Date'), - 'date_deadline': fields.datetime('Deadline'), - 'create_date': fields.datetime('Created', readonly=True), - 'duration': fields.float('Duration'), - 'description': fields.text('Your action'), + 'id': fields.integer('ID'), + 'sequence': fields.integer('Sequence'), + 'name': fields.char('Description', size=64, required=True), + 'date': fields.datetime('Date'), + 'date_deadline': fields.datetime('Deadline'), + 'create_date': fields.datetime('Created', readonly=True), + 'duration': fields.float('Duration'), + 'description': fields.text('Your action'), 'class': fields.selection([('public', 'Public'), ('private', 'Private'), \ ('confidential', 'Confidential')], 'Mark as'), 'location': fields.char('Location', size=264, help="Location of Event"), 'show_as': fields.selection([('free', 'Free'), ('busy', 'Busy')], \ - 'Show as'), - 'base_calendar_url': fields.char('Caldav URL', size=264), + 'Show as'), + 'base_calendar_url': fields.char('Caldav URL', size=264), 'exdate': fields.text('Exception Date/Times', help="This property \ -defines the list of date/time exceptions for arecurring calendar component."), +defines the list of date/time exceptions for arecurring calendar component."), 'exrule': fields.char('Exception Rule', size=352, help="defines a \ -rule or repeating pattern for an exception to a recurrence set"), +rule or repeating pattern for an exception to a recurrence set"), 'rrule': fields.function(_get_rulestring, type='char', size=124, method=True, \ string='Recurrent Rule', store=True, \ fnct_inv=_set_rrulestring, help='Defines a\ rule or repeating pattern for recurring events\n\ e.g.: Every other month on the last Sunday of the month for 10 occurrences:\ - FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU'), + FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU'), 'rrule_type': fields.selection([('none', ''), ('daily', 'Daily'), \ ('weekly', 'Weekly'), ('monthly', 'Monthly'), \ - ('yearly', 'Yearly'), ('custom', 'Custom')], 'Recurrency'), - 'alarm_id': fields.many2one('res.alarm', 'Alarm'), - 'base_calendar_alarm_id': fields.many2one('calendar.alarm', 'Alarm'), - 'recurrent_uid': fields.integer('Recurrent ID'), - 'recurrent_id': fields.datetime('Recurrent ID date'), + ('yearly', 'Yearly'), ('custom', 'Custom')], 'Recurrency'), + 'alarm_id': fields.many2one('res.alarm', 'Alarm'), + 'base_calendar_alarm_id': fields.many2one('calendar.alarm', 'Alarm'), + 'recurrent_uid': fields.integer('Recurrent ID'), + 'recurrent_id': fields.datetime('Recurrent ID date'), 'vtimezone': fields.related('user_id', 'context_tz', type='char', size=24, \ - string='Timezone', store=True), - 'user_id': fields.many2one('res.users', 'Responsible'), + string='Timezone', store=True), + 'user_id': fields.many2one('res.users', 'Responsible'), 'freq': fields.selection([('None', 'No Repeat'), \ ('secondly', 'Secondly'), \ ('minutely', 'Minutely'), \ @@ -1018,44 +1017,44 @@ e.g.: Every other month on the last Sunday of the month for 10 occurrences:\ ('daily', 'Daily'), \ ('weekly', 'Weekly'), \ ('monthly', 'Monthly'), \ - ('yearly', 'Yearly')], 'Frequency'), - 'interval': fields.integer('Interval'), - 'count': fields.integer('Count'), - 'mo': fields.boolean('Mon'), - 'tu': fields.boolean('Tue'), - 'we': fields.boolean('Wed'), - 'th': fields.boolean('Thu'), - 'fr': fields.boolean('Fri'), - 'sa': fields.boolean('Sat'), - 'su': fields.boolean('Sun'), + ('yearly', 'Yearly')], 'Frequency'), + 'interval': fields.integer('Interval'), + 'count': fields.integer('Count'), + 'mo': fields.boolean('Mon'), + 'tu': fields.boolean('Tue'), + 'we': fields.boolean('Wed'), + 'th': fields.boolean('Thu'), + 'fr': fields.boolean('Fri'), + 'sa': fields.boolean('Sat'), + 'su': fields.boolean('Sun'), 'select1': fields.selection([('date', 'Date of month'), \ - ('day', 'Day of month')], 'Option'), - 'day': fields.integer('Date of month'), + ('day', 'Day of month')], 'Option'), + 'day': fields.integer('Date of month'), 'week_list': fields.selection([('MO', 'Monday'), ('TU', 'Tuesday'), \ ('WE', 'Wednesday'), ('TH', 'Thursday'), \ ('FR', 'Friday'), ('SA', 'Saturday'), \ - ('SU', 'Sunday')], 'Weekday'), + ('SU', 'Sunday')], 'Weekday'), 'byday': fields.selection([('1', 'First'), ('2', 'Second'), \ ('3', 'Third'), ('4', 'Fourth'), \ - ('5', 'Fifth'), ('-1', 'Last')], 'By day'), - 'month_list': fields.selection(months.items(), 'Month'), - 'end_date': fields.date('Repeat Until'), - 'attendee_ids': fields.many2many('calendar.attendee', 'event_attendee_rel',\ + ('5', 'Fifth'), ('-1', 'Last')], 'By day'), + 'month_list': fields.selection(months.items(), 'Month'), + 'end_date': fields.date('Repeat Until'), + 'attendee_ids': fields.many2many('calendar.attendee', 'event_attendee_rel', \ 'event_id', 'attendee_id', 'Attendees'), - 'allday': fields.boolean('All Day'), + 'allday': fields.boolean('All Day'), 'active': fields.boolean('Active', help="If the active field is set to \ true, it will allow you to hide the event alarm information without removing it.") } _defaults = { - 'class': lambda *a: 'public', - 'show_as': lambda *a: 'busy', - 'freq': lambda *x: 'None', - 'select1': lambda *x: 'date', - 'interval': lambda *x: 1, - 'active': lambda *x: 1, + 'class': lambda *a: 'public', + 'show_as': lambda *a: 'busy', + 'freq': lambda *x: 'None', + 'select1': lambda *x: 'date', + 'interval': lambda *x: 1, + 'active': lambda *x: 1, } - + def open_event(self, cr, uid, ids, context=None): """ Open Event From for Editing @@ -1067,11 +1066,11 @@ true, it will allow you to hide the event alarm information without removing it. """ if not context: context = {} - + data_obj = self.pool.get('ir.model.data') - + value = {} - + id2 = data_obj._get_id(cr, uid, 'base_calendar', 'event_form_view') id3 = data_obj._get_id(cr, uid, 'base_calendar', 'event_tree_view') id4 = data_obj._get_id(cr, uid, 'base_calendar', 'event_calendar_view') @@ -1083,17 +1082,17 @@ true, it will allow you to hide the event alarm information without removing it. id4 = data_obj.browse(cr, uid, id4, context=context).res_id for id in ids: value = { - 'name': _('Event'), - 'view_type': 'form', - 'view_mode': 'form,tree', - 'res_model': 'calendar.event', - 'view_id': False, + 'name': _('Event'), + 'view_type': 'form', + 'view_mode': 'form,tree', + 'res_model': 'calendar.event', + 'view_id': False, 'views': [(id2, 'form'), (id3, 'tree'), (id4, 'calendar')], - 'type': 'ir.actions.act_window', - 'res_id': base_calendar_id2real_id(id), + 'type': 'ir.actions.act_window', + 'res_id': base_calendar_id2real_id(id), 'nodestroy': True } - + return value def modify_this(self, cr, uid, event_id, defaults, real_date, context=None, *args): @@ -1111,9 +1110,9 @@ true, it will allow you to hide the event alarm information without removing it. event_id = base_calendar_id2real_id(event_id) datas = self.read(cr, uid, event_id, context=context) defaults.update({ - 'recurrent_uid': base_calendar_id2real_id(datas['id']), - 'recurrent_id': defaults.get('date') or real_date, - 'rrule_type': 'none', + 'recurrent_uid': base_calendar_id2real_id(datas['id']), + 'recurrent_id': defaults.get('date') or real_date, + 'rrule_type': 'none', 'rrule': '' }) exdate = datas['exdate'] and datas['exdate'].split(',') or [] @@ -1131,7 +1130,7 @@ true, it will allow you to hide the event alarm information without removing it. @param event_ids: List of crm meeting’s IDs. @return: True """ - + for event_id in event_ids: event_id = base_calendar_id2real_id(event_id) @@ -1146,7 +1145,7 @@ true, it will allow you to hide the event alarm information without removing it. qry += ", location = '%(location)s'" qry += "WHERE id = %s" % (event_id) cr.execute(qry %(defaults)) - + return True def get_recurrent_ids(self, cr, uid, select, base_start_date, base_until_date, limit=100): @@ -1167,7 +1166,7 @@ true, it will allow you to hide the event alarm information without removing it. result = [] if ids and (base_start_date or base_until_date): cr.execute("select m.id, m.rrule, m.date, m.date_deadline, \ - m.exdate from " + self._table + \ + m.exdate, m.exrule from " + self._table + \ " m where m.id in ("\ + ','.join(map(lambda x: str(x), ids))+")") @@ -1214,7 +1213,7 @@ true, it will allow you to hide the event alarm information without removing it. new_rule = '%s=%s' % (name, value) new_rrule_str.append(new_rule) new_rrule_str = ';'.join(new_rrule_str) - rdates = get_recurrent_dates(str(new_rrule_str), exdate, start_date) + rdates = get_recurrent_dates(str(new_rrule_str), exdate, start_date, data['exrule']) for rdate in rdates: r_date = datetime.strptime(rdate, "%Y-%m-%d %H:%M:%S") if start_date and r_date < start_date: @@ -1229,7 +1228,7 @@ true, it will allow you to hide the event alarm information without removing it. if isinstance(select, (str, int, long)): return ids and ids[0] or False return ids - + def compute_rule_string(self, cr, uid, datas, context=None, *args): """ Compute rule string. @@ -1248,9 +1247,9 @@ true, it will allow you to hide the event alarm information without removing it. freq = datas.get('freq') if freq == 'None': return '' - + interval_srting = datas.get('interval') and (';INTERVAL=' + str(datas.get('interval'))) or '' - + if freq == 'weekly': byday = map(lambda x: x.upper(), filter(lambda x: datas.get(x) and x in weekdays, datas)) @@ -1286,7 +1285,7 @@ true, it will allow you to hide the event alarm information without removing it. return rrule_string - def search(self, cr, uid, args, offset=0, limit=100, order=None, + def search(self, cr, uid, args, offset=0, limit=100, order=None, context=None, count=False): """ Overrides orm search method. @@ -1317,6 +1316,7 @@ true, it will allow you to hide the event alarm information without removing it. return self.get_recurrent_ids(cr, uid, res, start_date, until_date, limit) + def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True): """ Writes values in one or several fields. @@ -1348,7 +1348,7 @@ true, it will allow you to hide the event alarm information without removing it. event_id = base_calendar_id2real_id(event_id) if not event_id in new_ids: new_ids.append(event_id) - + res = super(calendar_event, self).write(cr, uid, new_ids, vals, context=context) if vals.has_key('alarm_id') or vals.has_key('base_calendar_alarm_id'): alarm_obj = self.pool.get('res.alarm') @@ -1478,7 +1478,7 @@ class calendar_todo(osv.osv): _description = "Calendar Task" def _get_date(self, cr, uid, ids, name, arg, context): - """ + """ Get Date @param self: The object pointer @param cr: the current row, from the database cursor, @@ -1494,7 +1494,7 @@ class calendar_todo(osv.osv): return res def _set_date(self, cr, uid, id, name, value, arg, context): - """ + """ Set Date @param self: The object pointer @param cr: the current row, from the database cursor, @@ -1512,8 +1512,8 @@ class calendar_todo(osv.osv): _columns = { 'date': fields.function(_get_date, method=True, fnct_inv=_set_date, \ - string='Duration', store=True, type='datetime'), - 'duration': fields.integer('Duration'), + string='Duration', store=True, type='datetime'), + 'duration': fields.integer('Duration'), } __attribute__ = {} @@ -1526,7 +1526,7 @@ class ir_attachment(osv.osv): _inherit = 'ir.attachment' def search_count(self, cr, user, args, context=None): - """ + """ @param self: The object pointer @param cr: the current row, from the database cursor, @param user: the current user’s ID for security checks, @@ -1539,9 +1539,9 @@ class ir_attachment(osv.osv): args1.append(map(lambda x:str(x).split('-')[0], arg)) return super(ir_attachment, self).search_count(cr, user, args1, context) - def search(self, cr, uid, args, offset=0, limit=None, order=None, + def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): - """ + """ @param self: The object pointer @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, @@ -1555,8 +1555,8 @@ class ir_attachment(osv.osv): for i, arg in enumerate(new_args): if arg[0] == 'res_id': new_args[i] = (arg[0], arg[1], base_calendar_id2real_id(arg[2])) - return super(ir_attachment, self).search(cr, uid, new_args, offset=offset, - limit=limit, order=order, + return super(ir_attachment, self).search(cr, uid, new_args, offset=offset, + limit=limit, order=order, context=context, count=False) ir_attachment() @@ -1565,12 +1565,12 @@ class ir_values(osv.osv): def set(self, cr, uid, key, key2, name, models, value, replace=True, \ isobject=False, meta=False, preserve_user=False, company=False): - """ + """ Set IR Values @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 model: Get The Model + @param model: Get The Model """ new_model = [] @@ -1584,12 +1584,12 @@ class ir_values(osv.osv): def get(self, cr, uid, key, key2, models, meta=False, context={}, \ res_id_req=False, without_user=True, key2_req=True): - """ + """ Get IR Values @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 model: Get The Model + @param model: Get The Model """ new_model = [] @@ -1607,37 +1607,35 @@ class ir_model(osv.osv): _inherit = 'ir.model' - def read(self, cr, uid, ids, fields=None, context={}, + def read(self, cr, uid, ids, fields=None, context={}, load='_classic_read'): - """ + """ Read IR Model @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 IR Model’s IDs. - @param context: A standard dictionary for contextual values + @param context: A standard dictionary for contextual values """ - new_ids = isinstance(ids, (str, int, long)) and [ids] or ids - - data = super(ir_model, self).read(cr, uid, new_ids, fields=fields, \ + data = super(ir_model, self).read(cr, uid, ids, fields=fields, \ context=context, load=load) if data: for val in data: val['id'] = base_calendar_id2real_id(val['id']) - return isinstance(ids, (str, int, long)) and data[0] or data + return data ir_model() class virtual_report_spool(web_services.report_spool): def exp_report(self, db, uid, object, ids, datas=None, context=None): - """ + """ Export Report @param self: The object pointer @param db: get the current database, @param uid: the current user’s ID for security checks, - @param context: A standard dictionary for contextual values + @param context: A standard dictionary for contextual values """ if object == 'printscreen.list': @@ -1656,20 +1654,20 @@ class res_users(osv.osv): _inherit = 'res.users' def _get_user_avail(self, cr, uid, ids, context=None): - """ + """ Get USer Availability @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 res user’s IDs. - @param context: A standard dictionary for contextual values + @param context: A standard dictionary for contextual values """ current_datetime = datetime.now().strftime('%Y-%m-%d %H:%M:%S') res = {} attendee_obj = self.pool.get('calendar.attendee') attendee_ids = attendee_obj.search(cr, uid, [ - ('event_date', '<=', current_datetime), ('event_end_date', '<=', current_datetime), + ('event_date', '<=', current_datetime), ('event_end_date', '<=', current_datetime), ('state', '=', 'accepted'), ('user_id', 'in', ids) ]) @@ -1687,13 +1685,13 @@ class res_users(osv.osv): return res def _get_user_avail_fun(self, cr, uid, ids, name, args, context=None): - """ + """ Get USer Availability Function @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 res user’s IDs. - @param context: A standard dictionary for contextual values + @param context: A standard dictionary for contextual values """ return self._get_user_avail(cr, uid, ids, context=context) @@ -1701,7 +1699,7 @@ class res_users(osv.osv): _columns = { 'availability': fields.function(_get_user_avail_fun, type='selection', \ selection=[('free', 'Free'), ('busy', 'Busy')], \ - string='Free/Busy', method=True), + string='Free/Busy', method=True), } res_users() diff --git a/addons/base_calendar/base_calendar_view.xml b/addons/base_calendar/base_calendar_view.xml index 0c8a52260ef..a9cc6f9b750 100644 --- a/addons/base_calendar/base_calendar_view.xml +++ b/addons/base_calendar/base_calendar_view.xml @@ -102,8 +102,8 @@ - - + + Event Invitations ir.actions.act_window @@ -113,11 +113,11 @@ {'default_sent_by_uid': uid} - + - + - - + + Available Alarms ir.actions.act_window @@ -176,8 +176,8 @@ action="base_calendar.action_res_alarm_view" parent="base.menu_calendar_configuration" /> - - + + Event Form calendar.event @@ -338,7 +338,7 @@ - + @@ -354,9 +354,9 @@ - + - + Calendar Events Search calendar.event @@ -377,7 +377,7 @@ - + - + Events ir.actions.act_window @@ -403,11 +403,11 @@ tree,form,calendar - + - + diff --git a/addons/base_calendar/security/ir.model.access.csv b/addons/base_calendar/security/ir.model.access.csv index ebf2ce92092..eba4e092f14 100755 --- a/addons/base_calendar/security/ir.model.access.csv +++ b/addons/base_calendar/security/ir.model.access.csv @@ -6,3 +6,4 @@ "access_calendar_todo","calendar.todo","model_calendar_todo",,1,1,1,1 "access_base_calendar_invite_attendee","base_calendar.invite.attendee","model_base_calendar_invite_attendee",,1,1,1,1 "access_calendar_event_edit_all","calendar_event_edit_all","model_calendar_event_edit_all",,1,1,1,1 +"access_base_calendar_set_exrule","base.calendar.set.exrule","model_base_calendar_set_exrule",,1,1,1,1 diff --git a/addons/base_calendar/wizard/__init__.py b/addons/base_calendar/wizard/__init__.py index 27614aacd88..8b45dc18a17 100644 --- a/addons/base_calendar/wizard/__init__.py +++ b/addons/base_calendar/wizard/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- ############################################################################## -# +# # OpenERP, Open Source Management Solution # Copyright (C) 2004-2009 Tiny SPRL (). # @@ -15,12 +15,13 @@ # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . +# along with this program. If not, see . # ############################################################################## import calendar_event_edit_all import base_calendar_invite_attendee +import base_calendar_set_exrule # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_calendar/wizard/base_calendar_invite_attendee_view.xml b/addons/base_calendar/wizard/base_calendar_invite_attendee_view.xml index 4fe55998e59..bea5ea66a84 100644 --- a/addons/base_calendar/wizard/base_calendar_invite_attendee_view.xml +++ b/addons/base_calendar/wizard/base_calendar_invite_attendee_view.xml @@ -13,37 +13,38 @@ - - - + colspan="6" /> -