diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index 18b27820766..4d0f85376f3 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -207,63 +207,64 @@ class invite_attendee_wizard(osv.osv_memory):
}
def do_invite(self, cr, uid, ids, context={}):
- datas = self.read(cr, uid, ids)[0]
- model = False
- model_field = False
- if not context or not context.get('model'):
- return {}
- else:
- model = context.get('model')
- model_field = context.get('attendee_field', False)
- obj = self.pool.get(model)
- res_obj = obj.browse(cr, uid, context['active_id'])
- type = datas.get('type')
- att_obj = self.pool.get('calendar.attendee')
- vals = {}
- mail_to = []
- if not model == 'calendar.attendee':
- vals = {'ref': '%s,%s' % (model, base_calendar_id2real_id(context['active_id']))}
-
- if type == 'internal':
- user_obj = self.pool.get('res.users')
- for user_id in datas.get('user_ids', []):
- user = user_obj.browse(cr, uid, user_id)
- vals.update({'user_id': user_id,
- 'email': user.address_id.email})
- if user.address_id.email:
- mail_to.append(user.address_id.email)
-
- elif type == 'external' and datas.get('email'):
- vals.update({'email': datas['email']})
- mail_to.append(datas['email'])
- elif type == 'partner':
- add_obj = self.pool.get('res.partner.address')
- for contact in add_obj.browse(cr, uid, datas['contact_ids']):
+ for att_id in ids:
+ datas = self.read(cr, uid, att_id)
+ model = False
+ model_field = False
+ if not context or not context.get('model'):
+ return {}
+ else:
+ model = context.get('model')
+ model_field = context.get('attendee_field', False)
+ obj = self.pool.get(model)
+ res_obj = obj.browse(cr, uid, context['active_id'])
+ type = datas.get('type')
+ att_obj = self.pool.get('calendar.attendee')
+ vals = {}
+ mail_to = []
+ if not model == 'calendar.attendee':
+ vals = {'ref': '%s,%s' % (model, base_calendar_id2real_id(context['active_id']))}
+
+ if type == 'internal':
+ user_obj = self.pool.get('res.users')
+ if not datas.get('user_ids'):
+ raise osv.except_osv(_('Error!'), ("Please select any User"))
+ for user_id in datas.get('user_ids'):
+ user = user_obj.browse(cr, uid, user_id)
+ vals.update({'user_id': user_id,
+ 'email': user.address_id.email})
+ if user.address_id.email:
+ mail_to.append(user.address_id.email)
+
+ elif type == 'external' and datas.get('email'):
+ vals.update({'email': datas['email']})
+ mail_to.append(datas['email'])
+ elif type == 'partner':
+ add_obj = self.pool.get('res.partner.address')
+ for contact in add_obj.browse(cr, uid, datas['contact_ids']):
+ vals.update({
+ 'partner_address_id': contact.id,
+ 'email': contact.email})
+ if contact.email:
+ mail_to.append(contact.email)
+
+ if model == 'calendar.attendee':
+ att = att_obj.browse(cr, uid, context['active_id'])
vals.update({
- 'partner_address_id': contact.id,
- 'email': contact.email})
- if contact.email:
- mail_to.append(contact.email)
-
- if model == 'calendar.attendee':
- att = att_obj.browse(cr, uid, context['active_id'])
- vals.update({
- 'parent_ids' : [(4, att.id)],
- 'ref': att.ref
- })
- att_id = att_obj.create(cr, uid, vals)
- if model_field:
- obj.write(cr, uid, res_obj.id, {model_field: [(4, att_id)]})
-
- if datas.get('send_mail'):
- if not mail_to:
- name = map(lambda x: x[1], filter(lambda x: type==x[0], \
- self._columns['type'].selection))
- raise osv.except_osv(_('Error!'), ("%s must have an email \
-Address to send mail") % (name[0]))
- att_obj._send_mail(cr, uid, [att_id], mail_to, \
- email_from=tools.config.get('email_from', False))
-
+ 'parent_ids' : [(4, att.id)],
+ 'ref': att.ref
+ })
+ if datas.get('send_mail'):
+ if not mail_to:
+ name = map(lambda x: x[1], filter(lambda x: type==x[0], \
+ self._columns['type'].selection))
+ raise osv.except_osv(_('Error!'), ("%s must have an email \
+ Address to send mail") % (name[0]))
+ att_obj._send_mail(cr, uid, [att_id], mail_to, \
+ email_from=tools.config.get('email_from', False))
+ att_id = att_obj.create(cr, uid, vals)
+ if model_field:
+ obj.write(cr, uid, res_obj.id, {model_field: [(4, att_id)]})
return {}
@@ -313,12 +314,14 @@ class calendar_attendee(osv.osv):
if name == 'delegated_to':
todata = []
for parent in attdata.parent_ids:
- todata.append('MAILTO:' + parent.email)
+ if parent.email:
+ todata.append('MAILTO:' + parent.email)
result[id][name] = ', '.join(todata)
if name == 'delegated_from':
fromdata = []
for child in attdata.child_ids:
- fromdata.append('MAILTO:' + child.email)
+ if child.email:
+ fromdata.append('MAILTO:' + child.email)
result[id][name] = ', '.join(fromdata)
if name == 'event_date':
if attdata.ref:
@@ -481,18 +484,20 @@ request was delegated to"),
self.write(cr, uid, ids, {'state': 'tentative'}, context)
def do_accept(self, cr, uid, ids, context=None, *args):
- vals = self.read(cr, uid, ids, context=context)[0]
- user = vals.get('user_id')
- if user:
- ref = vals.get('ref', None)
- if ref:
- model, event = ref.split(',')
- model_obj = self.pool.get(model)
- event_ref = model_obj.browse(cr, uid, event, context=context)[0]
- if event_ref.user_id.id != user[0]:
- defaults = {'user_id': user[0]}
- new_event = model_obj.copy(cr, uid, event, default=defaults, context=context)
- self.write(cr, uid, ids, {'state': 'accepted'}, context)
+ for invite in ids:
+ vals = self.read(cr, uid, invite, context=context)
+ user = vals.get('user_id')
+ if user:
+ ref = vals.get('ref', None)
+ if ref:
+ model, event = ref.split(',')
+ model_obj = self.pool.get(model)
+ event_ref = model_obj.browse(cr, uid, event, context=context)[0]
+ if event_ref.user_id.id != user[0]:
+ defaults = {'user_id': user[0]}
+ new_event = model_obj.copy(cr, uid, event, default=defaults, context=context)
+ self.write(cr, uid, invite, {'state': 'accepted'}, context)
+ return True
def do_decline(self, cr, uid, ids, context=None, *args):
self.write(cr, uid, ids, {'state': 'declined'}, context)
@@ -729,7 +734,7 @@ class calendar_event(osv.osv):
def _get_rulestring(self, cr, uid, ids, name, arg, context=None):
result = {}
for event in ids:
- datas = self.read(cr, uid, ids)[0]
+ datas = self.read(cr, uid, event)
if datas.get('rrule_type'):
if datas.get('rrule_type') == 'none':
result[event] = False
@@ -811,9 +816,9 @@ rule or repeating pattern for anexception to a recurrence set"),
'interval': lambda *x: 1,
}
- def modify_this(self, cr, uid, ids, defaults, real_date, context=None, *args):
- ids = map(lambda x: base_calendar_id2real_id(x), ids)
- datas = self.read(cr, uid, ids[0], context=context)
+ def modify_this(self, cr, uid, event_id, defaults, real_date, context=None, *args):
+ 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,
@@ -823,12 +828,12 @@ rule or repeating pattern for anexception to a recurrence set"),
exdate = datas['exdate'] and datas['exdate'].split(',') or []
if real_date and defaults.get('date'):
exdate.append(real_date)
- self.write(cr, uid, ids, {'exdate': ','.join(exdate)}, context=context)
- new_id = self.copy(cr, uid, ids[0], default=defaults, context=context)
+ self.write(cr, uid, event_id, {'exdate': ','.join(exdate)}, context=context)
+ new_id = self.copy(cr, uid, event_id, default=defaults, context=context)
return new_id
- def modify_all(self, cr, uid, ids, defaults, context=None, *args):
- ids = map(lambda x: base_calendar_id2real_id(x), ids)
+ def modify_all(self, cr, uid, event_id, defaults, context=None, *args):
+ event_id = base_calendar_id2real_id(event_id)
defaults.pop('id')
defaults.update({'table': self._table})
@@ -838,7 +843,7 @@ rule or repeating pattern for anexception to a recurrence set"),
qry += ", alarm_id=%(alarm_id)s"
if defaults.get('location'):
qry += ", location='%(location)s'"
- qry += "WHERE id=%s" % (ids[0])
+ qry += "WHERE id=%s" % (event_id)
cr.execute(qry % (defaults))
return True
@@ -984,23 +989,26 @@ rule or repeating pattern for anexception to a recurrence set"),
else:
select = ids
new_ids = []
- for id in select:
- if len(str(id).split('-')) > 1:
- data = self.read(cr, uid, id, ['date', 'date_deadline', 'rrule', 'duration'])
+ for event_id in select:
+ if len(str(event_id).split('-')) > 1:
+ data = self.read(cr, uid, event_id, ['date', 'date_deadline', \
+ 'rrule', 'duration'])
if data.get('rrule'):
real_date = data.get('date')
data.update(vals)
- new_id = self.modify_this(cr, uid, [id], data, real_date, context)
+ new_id = self.modify_this(cr, uid, event_id, data, \
+ real_date, context)
context.update({'active_id': new_id,'active_ids': [new_id]})
continue
- id = base_calendar_id2real_id(id)
- if not id in new_ids:
- new_ids.append(id)
+ 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')
context.update({'alarm_id': vals.get('alarm_id')})
- alarm_obj.do_alarm_create(cr, uid, new_ids, self._name, 'date', context=context)
+ alarm_obj.do_alarm_create(cr, uid, new_ids, self._name, 'date', \
+ context=context)
return res
def browse(self, cr, uid, ids, context=None, list_class=None, fields_process={}):
@@ -1009,7 +1017,8 @@ rule or repeating pattern for anexception to a recurrence set"),
else:
select = ids
select = map(lambda x: base_calendar_id2real_id(x), select)
- res = super(calendar_event, self).browse(cr, uid, select, context, list_class, fields_process)
+ res = super(calendar_event, self).browse(cr, uid, select, context, \
+ list_class, fields_process)
if isinstance(ids, (str, int, long)):
return res and res[0] or False
return res
@@ -1057,7 +1066,8 @@ rule or repeating pattern for anexception to a recurrence set"),
res = self.write(cr, uid, [base_calendar_id2real_id(id)], {'exdate': exdate})
else:
ids = map(lambda x: base_calendar_id2real_id(x), ids)
- res = super(calendar_event, self).unlink(cr, uid, base_calendar_id2real_id(ids))
+ res = super(calendar_event, self).unlink(cr, uid, \
+ base_calendar_id2real_id(ids))
alarm_obj = self.pool.get('res.alarm')
alarm_obj.do_alarm_unlink(cr, uid, ids, self._name)
else:
@@ -1094,7 +1104,7 @@ class calendar_todo(osv.osv):
_columns = {
'date': fields.function(_get_date, method=True, fnct_inv=_set_date, \
- string='Duration', store=True, type='datetime'),
+ string='Duration', store=True, type='datetime'),
'duration': fields.integer('Duration'),
}
@@ -1216,3 +1226,4 @@ class res_users(osv.osv):
res_users()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/base_calendar/wizard/wizard_cal_edit_event.py b/addons/base_calendar/wizard/wizard_cal_edit_event.py
index 40a658eb431..8c2da2314c5 100644
--- a/addons/base_calendar/wizard/wizard_cal_edit_event.py
+++ b/addons/base_calendar/wizard/wizard_cal_edit_event.py
@@ -55,10 +55,10 @@ class event_edit_all(wizard.interface):
})
return event
- def _modify_this(self, cr, uid, datas, context=None):
+ def _modify_all(self, cr, uid, datas, context=None):
model = datas.get('model')
model_obj = pooler.get_pool(cr.dbname).get(model)
- model_obj.modify_all(cr, uid, [datas['id']], datas['form'], context)
+ model_obj.modify_all(cr, uid, datas['id'], datas['form'], context)
return {}
states = {
@@ -69,7 +69,7 @@ class event_edit_all(wizard.interface):
},
'edit': {
'actions': [],
- 'result': {'type': 'action', 'action': _modify_this, 'state': 'end'}
+ 'result': {'type': 'action', 'action': _modify_all, 'state': 'end'}
}
}
diff --git a/addons/board_sale/__terp__.py b/addons/board_sale/__terp__.py
index 4a08eed8d96..bf4e572d031 100644
--- a/addons/board_sale/__terp__.py
+++ b/addons/board_sale/__terp__.py
@@ -33,7 +33,7 @@ This module implements a dashboard for salesman that includes:
* Graph of cases of the month
""",
'author': 'Tiny',
- 'depends': ['board', 'sale', 'report_crm', 'report_sale'],
+ 'depends': ['board', 'sale'],
'update_xml': ['board_sale_view.xml'],
'demo_xml': ['board_sale_demo.xml'],
'installable': True,
diff --git a/addons/board_sale/board_sale_view.xml b/addons/board_sale/board_sale_view.xml
index 496f189bf89..509bcb5428b 100644
--- a/addons/board_sale/board_sale_view.xml
+++ b/addons/board_sale/board_sale_view.xml
@@ -33,15 +33,11 @@
-
-
-
-
diff --git a/addons/caldav/__terp__.py b/addons/caldav/__terp__.py
index 8bdb50bdf8c..db6e46b1daa 100644
--- a/addons/caldav/__terp__.py
+++ b/addons/caldav/__terp__.py
@@ -27,8 +27,20 @@
"base",
],
'description': """
- Contains basic functionality for caldav system like:
- - Availabilities of synchronisation using WebDAV
+ This module Contains basic functionality for caldav system like:
+ - Webdav server that provides remote access to calendar
+ - Synchronisation of calendar using WebDAV
+ - Customize calendar event and todo attribute with any of OpenERP model
+ - Provides iCal Import/Export functionality
+
+ To access OpenERP Calendar using caldav to remote site use the URL like:
+ http://HOSTNAME:PORT/calendar/DATABASE_NAME/CALENDAR_NAME.ics
+
+ Where,
+ HOSTNAME: Host on which OpenERP server(With webdav) is running
+ PORT : Port on which OpenERP server is running (By Default : 8069)
+ DATABASE_NAME: Name of database on which OpenERP Calendar is created
+ CALENDAR_NAME: Name of calendar to access
""",
"author" : "Tiny",
'category': 'Generic Modules/Others',
diff --git a/addons/crm/report/crm_report_view.xml b/addons/crm/report/crm_report_view.xml
index 6ecdcfb755a..7427fe64588 100644
--- a/addons/crm/report/crm_report_view.xml
+++ b/addons/crm/report/crm_report_view.xml
@@ -124,7 +124,6 @@
-
@@ -139,7 +138,6 @@
tree
-
diff --git a/addons/crm/scripts/openerp_mailgate/openerp_mailgate.py b/addons/crm/scripts/openerp_mailgate/openerp_mailgate.py
index 0e4fd4347bd..85f5d24279d 100755
--- a/addons/crm/scripts/openerp_mailgate/openerp_mailgate.py
+++ b/addons/crm/scripts/openerp_mailgate/openerp_mailgate.py
@@ -29,24 +29,17 @@ import os
import binascii
import time, socket
-email_re = re.compile(r"""
- ([a-zA-Z][\w\.-]*[a-zA-Z0-9] # username part
- @ # mandatory @ sign
- [a-zA-Z0-9][\w\.-]* # domain must start with a letter ... Ged> why do we include a 0-9 then?
- \.
- [a-z]{2,3} # TLD
- )
- """, re.VERBOSE)
+email_re = re.compile(r"[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*\.[a-z]{2,3}", re.VERBOSE)
case_re = re.compile(r"\[([0-9]+)\]", re.UNICODE)
command_re = re.compile("^Set-([a-z]+) *: *(.+)$", re.I + re.UNICODE)
reference_re = re.compile("<.*-tinycrm-(\\d+)@(.*)>", re.UNICODE)
priorities = {
- '1': '1 (Highest)',
- '2': '2 (High)',
- '3': '3 (Normal)',
- '4': '4 (Low)',
- '5': '5 (Lowest)',
+ '1': '1 (Highest)',
+ '2': '2 (High)',
+ '3': '3 (Normal)',
+ '4': '4 (Low)',
+ '5': '5 (Lowest)',
}
def html2plaintext(html, body_id=None, encoding='utf-8'):
@@ -88,18 +81,18 @@ def html2plaintext(html, body_id=None, encoding='utf-8'):
html = html.replace(d['tag'], '%s [%s]' % (d['title'], i))
url_index.append(d['url'])
- html = html.replace('','*').replace('','*')
- html = html.replace('','*').replace('','*')
- html = html.replace('','*').replace('
','*')
- html = html.replace('','**').replace('
','**')
- html = html.replace('','**').replace('
','**')
- html = html.replace('','/').replace('','/')
+ html = html.replace('', '*').replace('', '*')
+ html = html.replace('', '*').replace('', '*')
+ html = html.replace('', '*').replace('
', '*')
+ html = html.replace('', '**').replace('
', '**')
+ html = html.replace('', '**').replace('
', '**')
+ html = html.replace('', '/').replace('', '/')
# the only line breaks we respect is those of ending tags and
# breaks
- html = html.replace('\n',' ')
+ html = html.replace('\n', ' ')
html = html.replace('
', '\n')
html = html.replace('', '\n')
html = html.replace('', '\n\n')
@@ -135,12 +128,14 @@ class rpc_proxy(object):
return self.rpc.execute(self.dbname, self.user_id, self.passwd, *request)
class email_parser(object):
- def __init__(self, uid, password, section, email, email_default, dbname, host, port):
+ def __init__(self, uid, password, model, email, email_default, dbname, host, port):
self.rpc = rpc_proxy(uid, password, host=host, port=port, dbname=dbname)
try:
- self.section_id = int(section)
+ self.model_id = int(model)
+ self.model = str(model)
except:
- self.section_id = self.rpc('crm.case.section', 'search', [('code','=',section)])[0]
+ self.model_id = self.rpc('ir.model', 'search', [('model', '=', model)])[0]
+ self.model = str(model)
self.email = email
self.email_default = email_default
self.canal_id = False
@@ -156,8 +151,8 @@ class email_parser(object):
return {}
adr = self.rpc('res.partner.address', 'read', adr_ids, ['partner_id'])
return {
- 'partner_address_id': adr[0]['id'],
- 'partner_id': adr[0].get('partner_id',False) and adr[0]['partner_id'][0] or False
+ 'partner_address_id': adr[0]['id'],
+ 'partner_id': adr[0].get('partner_id', False) and adr[0]['partner_id'][0] or False
}
def _decode_header(self, s):
@@ -168,14 +163,13 @@ class email_parser(object):
def msg_new(self, msg):
message = self.msg_body_get(msg)
data = {
- 'name': self._decode_header(msg['Subject']),
- 'section_id': self.section_id,
- 'email_from': self._decode_header(msg['From']),
- 'email_cc': self._decode_header(msg['Cc'] or ''),
- 'canal_id': self.canal_id,
- 'user_id': False,
- 'description': message['body'],
- 'history_line': [(0, 0, {'description': message['body'], 'email': msg['From'] })],
+ 'name': self._decode_header(msg['Subject']),
+ 'email_from': self._decode_header(msg['From']),
+ 'email_cc': self._decode_header(msg['Cc'] or ''),
+ 'canal_id': self.canal_id,
+ 'user_id': False,
+ 'description': message['body'],
+ 'history_line': [(0, 0, {'description': message['body'], 'email': msg['From'] })],
}
try:
data.update(self.partner_get(self._decode_header(msg['From'])))
@@ -184,21 +178,21 @@ class email_parser(object):
netsvc.Logger().notifyChannel('mailgate', netsvc.LOG_ERROR, "%s" % e)
try:
- id = self.rpc('crm.case', 'create', data)
- self.rpc('crm.case','case_open', [id])
- except Exception,e:
- if getattr(e,'faultCode','') and 'AccessError' in e.faultCode:
+ id = self.rpc(self.model, 'create', data)
+ self.rpc(self.model, 'case_open', [id])
+ except Exception, e:
+ if getattr(e, 'faultCode', '') and 'AccessError' in e.faultCode:
e = '\n\nThe Specified user does not have an access to the CRM case.'
print e
attachments = message['attachment']
for attach in attachments or []:
data_attach = {
- 'name': str(attach),
- 'datas':binascii.b2a_base64(str(attachments[attach])),
- 'datas_fname': str(attach),
- 'description': 'Mail attachment',
- 'res_model': 'crm.case',
+ 'name': str(attach),
+ 'datas': binascii.b2a_base64(str(attachments[attach])),
+ 'datas_fname': str(attach),
+ 'description': 'Mail attachment',
+ 'res_model': self.model,
'res_id': id
}
self.rpc('ir.attachment', 'create', data_attach)
@@ -273,22 +267,22 @@ class email_parser(object):
body['body'] = body_data
data = {
- 'description': body['body'],
- 'history_line': [(0, 0, {'description': body['body'], 'email': msg['From']})],
+ 'description': body['body'],
+ 'history_line': [(0, 0, {'description': body['body'], 'email': msg['From']})],
}
act = 'case_pending'
if 'state' in actions:
- if actions['state'] in ['draft','close','cancel','open','pending']:
+ if actions['state'] in ['draft', 'close', 'cancel', 'open', 'pending']:
act = 'case_' + actions['state']
- for k1,k2 in [('cost','planned_cost'),('revenue','planned_revenue'),('probability','probability')]:
+ for k1, k2 in [('cost', 'planned_cost'), ('revenue', 'planned_revenue'), ('probability', 'probability')]:
try:
data[k2] = float(actions[k1])
except:
pass
if 'priority' in actions:
- if actions['priority'] in ('1','2','3','4','5'):
+ if actions['priority'] in ('1', '2', '3', '4', '5'):
data['priority'] = actions['priority']
if 'partner' in actions:
@@ -299,8 +293,8 @@ class email_parser(object):
if uids:
data['user_id'] = uids[0][0]
- self.rpc('crm.case', act, [id])
- self.rpc('crm.case', 'write', [id], data)
+ self.rpc(self.model, act, [id])
+ self.rpc(self.model, 'write', [id], data)
return id
def msg_send(self, msg, emails, priority=None):
@@ -326,19 +320,19 @@ class email_parser(object):
message = self.msg_body_get(msg)
body = message['body']
act = 'case_open'
- self.rpc('crm.case', act, [id])
+ self.rpc(self.model, act, [id])
body2 = '\n'.join(map(lambda l: '> '+l, (body or '').split('\n')))
data = {
- 'description':body,
- 'history_line': [(0, 0, {'description': body, 'email': msg['From'][:84]})],
+ 'description':body,
+ 'history_line': [(0, 0, {'description': body, 'email': msg['From'][:84]})],
}
- self.rpc('crm.case', 'write', [id], data)
+ self.rpc(self.model, 'write', [id], data)
return id
def msg_test(self, msg, case_str):
if not case_str:
return (False, False)
- emails = self.rpc('crm.case', 'emails_get', int(case_str))
+ emails = self.rpc(self.model, 'emails_get', int(case_str))
return (int(case_str), emails)
def parse(self, msg):
@@ -363,12 +357,12 @@ class email_parser(object):
msg['Subject'] = '['+str(case_id)+'] '+subject
msg['Message-Id'] = '<'+str(time.time())+'-tinycrm-'+str(case_id)+'@'+socket.gethostname()+'>'
- emails = self.rpc('crm.case', 'emails_get', case_id)
+ emails = self.rpc(self.model, 'emails_get', case_id)
priority = emails[3]
em = [emails[0], emails[1]] + (emails[2] or '').split(',')
emails = map(self.email_get, filter(None, em))
- mm = [self._decode_header(msg['From']), self._decode_header(msg['To'])]+self._decode_header(msg.get('Cc','')).split(',')
+ mm = [self._decode_header(msg['From']), self._decode_header(msg['To'])]+self._decode_header(msg.get('Cc', '')).split(',')
msg_mails = map(self.email_get, filter(None, mm))
emails = filter(lambda m: m and m not in msg_mails, emails)
@@ -385,10 +379,9 @@ class email_parser(object):
if __name__ == '__main__':
import sys, optparse
parser = optparse.OptionParser(
- usage='usage: %prog [options]',
+ usage='usage: %prog [options]',
version='%prog v1.0')
-
- group = optparse.OptionGroup(parser, "Note",
+ group = optparse.OptionGroup(parser, "Note",
"This program parse a mail from standard input and communicate "
"with the Open ERP server for case management in the CRM module.")
parser.add_option_group(group)
@@ -396,7 +389,7 @@ if __name__ == '__main__':
parser.add_option("-u", "--user", dest="userid", help="ID of the user in Open ERP", default=1, type='int')
parser.add_option("-p", "--password", dest="password", help="Password of the user in Open ERP", default='admin')
parser.add_option("-e", "--email", dest="email", help="Email address used in the From field of outgoing messages")
- parser.add_option("-s", "--section", dest="section", help="ID or code of the case section", default="support")
+ parser.add_option("-o", "--model", dest="model", help="Name or ID of crm model", default="crm.lead")
parser.add_option("-m", "--default", dest="default", help="Default eMail in case of any trouble.", default=None)
parser.add_option("-d", "--dbname", dest="dbname", help="Database name (default: terp)", default='terp')
parser.add_option("--host", dest="host", help="Hostname of the Open ERP Server", default="localhost")
@@ -404,15 +397,14 @@ if __name__ == '__main__':
(options, args) = parser.parse_args()
- parser = email_parser(options.userid, options.password, options.section, options.email, options.default, dbname=options.dbname, host=options.host, port=options.port)
+ parser = email_parser(options.userid, options.password, options.model, options.email, options.default, dbname=options.dbname, host=options.host, port=options.port)
msg_txt = email.message_from_file(sys.stdin)
try :
parser.parse(msg_txt)
- except Exception,e:
- if getattr(e,'faultCode','') and 'Connection unexpectedly closed' in e.faultCode:
+ except Exception, e:
+ if getattr(e, 'faultCode', '') and 'Connection unexpectedly closed' in e.faultCode:
print e
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv
index e6c961a4c35..c3888951d4c 100644
--- a/addons/crm/security/ir.model.access.csv
+++ b/addons/crm/security/ir.model.access.csv
@@ -31,3 +31,5 @@
"access_crm_lead_report_user","crm.lead.report","model_crm_lead_report","crm.group_crm_user",1,0,0,0
"access_crm_phonecall_report_user","crm.phonecall.report","model_crm_phonecall_report","crm.group_crm_user",1,0,0,0
"access_crm_opportunity_report_user","crm.opportunity.report","model_crm_opportunity_report","crm.group_crm_user",1,0,0,0
+"access_report_crm_case_service_dashboard","report.crm.case.service.dashboard","model_report_crm_case_service_dashboard","crm.group_crm_user",1,0,0,0
+
diff --git a/addons/document_ics/document_demo.xml b/addons/document_ics/document_demo.xml
index b21842214b1..a4c892340de 100644
--- a/addons/document_ics/document_demo.xml
+++ b/addons/document_ics/document_demo.xml
@@ -23,7 +23,7 @@
dtstart
-
+
diff --git a/addons/hr_contract/security/ir.model.access.csv b/addons/hr_contract/security/ir.model.access.csv
index 29290f16067..ab6179c530f 100644
--- a/addons/hr_contract/security/ir.model.access.csv
+++ b/addons/hr_contract/security/ir.model.access.csv
@@ -8,3 +8,5 @@
"access_hr_contract_user","hr.contract user","model_hr_contract","hr.group_hr_user",1,0,0,0
"access_hr_contract","hr.contract","model_hr_contract","group_hr_contract",1,1,1,1
"access_hr_employee_contract","hr.employee contract","hr.model_hr_employee","group_hr_contract",1,0,0,0
+"access_hr_contract_type_user","hr.contract.type user","model_hr_contract_type","hr.group_hr_user",1,0,0,0
+"access_hr_contract_type","hr.contract.type","model_hr_contract_type","group_hr_contract",1,1,1,1
diff --git a/addons/l10n_be/__terp__.py b/addons/l10n_be/__terp__.py
index 84e3354a332..43d5a189247 100644
--- a/addons/l10n_be/__terp__.py
+++ b/addons/l10n_be/__terp__.py
@@ -52,7 +52,7 @@
'l10n_be_wizard.xml',
'l10n_be_sequence.xml',
'fiscal_templates.xml',
- #'security/ir.model.access.csv'
+ 'security/ir.model.access.csv'
],
'demo_xml': [
'account.report.report.csv'
diff --git a/addons/l10n_be/security/ir.model.access.csv b/addons/l10n_be/security/ir.model.access.csv
new file mode 100644
index 00000000000..daadf3d4b22
--- /dev/null
+++ b/addons/l10n_be/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_vat_listing_clients","vat.listing.clients","model_vat_listing_clients",,1,1,1,1
diff --git a/addons/l10n_ch/bank.py b/addons/l10n_ch/bank.py
index 280057a558b..18aac869b77 100755
--- a/addons/l10n_ch/bank.py
+++ b/addons/l10n_ch/bank.py
@@ -48,8 +48,8 @@ class bvr_checkbox(osv.osv):
""" Add function to generate function """
_inherit = "res.partner.bank"
_columns = {
- 'printBank' : fields.boolean('Print Bank on BVR'),
- 'printAccount' : fields.boolean('Print Account Number on BVR'),
+ 'print_bank' : fields.boolean('Print Bank on BVR'),
+ 'print_account' : fields.boolean('Print Account Number on BVR'),
}
bvr_checkbox()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ch/bank_view.xml b/addons/l10n_ch/bank_view.xml
index 35593c2688c..6da45b45f0c 100755
--- a/addons/l10n_ch/bank_view.xml
+++ b/addons/l10n_ch/bank_view.xml
@@ -32,8 +32,8 @@
-
-
+
+
@@ -45,8 +45,8 @@
-
-
+
+
diff --git a/addons/multi_company/multi_company_demo.xml b/addons/multi_company/multi_company_demo.xml
index 7f18b7edd86..592e63d5ed2 100644
--- a/addons/multi_company/multi_company_demo.xml
+++ b/addons/multi_company/multi_company_demo.xml
@@ -24,30 +24,36 @@
OpenERP Corp.
+
+
OpenERP Editor
+
OpenERP US
+
OpenERP BE
- OpenERP IN
+
+
OpenERP IN
+
Odoo
diff --git a/addons/thunderbird/__terp__.py b/addons/thunderbird/__terp__.py
index 3447b0377c2..8ebe6b80b10 100644
--- a/addons/thunderbird/__terp__.py
+++ b/addons/thunderbird/__terp__.py
@@ -55,7 +55,7 @@
"category" : "Generic Modules/Thunderbird interface",
"init_xml" : [],
"demo_xml" : [],
- "update_xml" : [],
+ "update_xml" : ['security/ir.model.access.csv'],
"active": False,
"installable": True
}
diff --git a/addons/thunderbird/security/ir.model.access.csv b/addons/thunderbird/security/ir.model.access.csv
new file mode 100644
index 00000000000..fdd310a0679
--- /dev/null
+++ b/addons/thunderbird/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_tinythunderbird_partner","tinythunderbird.partner","model_tinythunderbird_partner",,1,1,1,1
+