#
##############################################################################
-import time
from document_webdav import nodes
-from document.nodes import _str2time
+from document.nodes import _str2time, nodefd_static
import logging
-import StringIO
from orm_utils import get_last_modified
-from tools.dict_tools import dict_merge, dict_merge2
+try:
+ from tools.dict_tools import dict_merge2
+except ImportError:
+ from document.dict_tools import dict_merge2
# TODO: implement DAV-aware errors, inherit from IOError
_log.debug("Unknown calendar-query element: %s", filter_child.localName)
return res
elif filters.localName == 'calendar-multiget':
- names = []
- for filter_child in filters.childNodes:
- if filter_child.nodeType == filter_child.TEXT_NODE:
- continue
- if filter_child.localName == 'href':
- if not filter_child.firstChild:
- continue
- uri = filter_child.firstChild.data
- caluri = uri.split('/')
- if len(caluri):
- caluri = caluri[-2]
- if caluri not in names : names.append(caluri)
- else:
- _log.debug("Unknonwn multiget element: %s", filter_child.localName)
- res = [('name','in',names)]
- return res
+ # this is not the place to process, as it wouldn't support multi-level
+ # hrefs. So, the code is moved to document_webdav/dav_fs.py
+ pass
else:
_log.debug("Unknown element in REPORT: %s", filters.localName)
return res
ctx = self.context.context.copy()
ctx.update(self.dctx)
where = []
+ bc_obj = dirobj.pool.get('basic.calendar')
+
if name:
if name.endswith('.ics'):
name = name[:-4]
try:
- where.append(('id','=',int(name)))
+ if name.isdigit():
+ where.append(('id','=',int(name)))
+ else:
+ bca_obj = dirobj.pool.get('basic.calendar.alias')
+ bc_alias = bca_obj.search(cr, uid,
+ [('cal_line_id.calendar_id', '=', self.calendar_id),
+ ('name', '=', name)] )
+ if not bc_alias:
+ return []
+ bc_val = bca_obj.read(cr, uid, bc_alias, ['res_id',])
+ where.append(('id', '=', bc_val[0]['res_id']))
except ValueError:
# if somebody requests any other name than the ones we
# generate (non-numeric), it just won't exist
- # FIXME: however, this confuses Evolution (at least), which
- # thinks the .ics node hadn't been saved.
return []
if not domain:
domain = []
- bc_obj = dirobj.pool.get('basic.calendar')
# we /could/ be supplying an invalid calendar id to bc_obj, it has to check
res = bc_obj.get_calendar_objects(cr, uid, [self.calendar_id], self, domain=where, context=ctx)
return res
assert isinstance(res[0], (int, long))
fnodes = fil_obj.get_calendar_objects(cr, uid, [self.calendar_id], self,
domain=[('id','=',res[0])], context=ctx)
+ if self.context.get('DAV-client','') in ('iPhone', 'iCalendar',):
+ # For those buggy clients, register the alias
+ bca_obj = fil_obj.pool.get('basic.calendar.alias')
+ ourcal = fil_obj.browse(cr, uid, self.calendar_id)
+ line_id = None
+ for line in ourcal.line_ids:
+ if line.name == ourcal.type:
+ line_id = line.id
+ break
+ assert line_id, "Calendar #%d must have at least one %s line" % \
+ (ourcal.id, ourcal.type)
+ if path.endswith('.ics'):
+ path = path[:-4]
+ bca_obj.create(cr, uid, { 'cal_line_id': line_id,
+ 'res_id': res[0], 'name': path}, context=ctx)
return fnodes[0]
# If we reach this line, it means that we couldn't import any useful
# (and matching type vs. our node kind) data from the iCal content.
res.append(child._get_caldav_calendar_data(cr))
return res
+ def open_data(self, cr, mode):
+ return nodefd_static(self, cr, mode)
+
def _get_caldav_calendar_description(self, cr):
uid = self.context.uid
calendar_obj = self.context._dirobj.pool.get('basic.calendar')
try:
calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx)
return calendar.description or calendar.name
- except Exception, e:
+ except Exception:
return None
def _get_dav_supported_report_set(self, cr):
self.calendar_id = hasattr(parent, 'calendar_id') and parent.calendar_id or False
if res_obj:
if not self.calendar_id: self.calendar_id = res_obj.id
- pr = res_obj.perm_read()[0]
+ pr = res_obj.perm_read(context=context, details=False)[0]
self.create_date = pr.get('create_date')
self.write_date = pr.get('write_date') or pr.get('create_date')
self.displayname = res_obj.name
self.model = res_model
self.res_id = res_id
- def open(self, cr, mode=False):
- if self.type in ('collection','database'):
- return False
- s = StringIO.StringIO(self.get_data(cr))
- s.name = self
- return s
+ def open_data(self, cr, mode):
+ return nodefd_static(self, cr, mode)
- def get_data(self, cr, fil_obj = None):
+ def get_data(self, cr, fil_obj=None):
uid = self.context.uid
calendar_obj = self.context._dirobj.pool.get('basic.calendar')
context = self.context.context.copy()