def _clean(meta_block): ret = copy(dict(meta_block)) for key in ret.keys(): # remove attributes from the meta block if key.startswith('@'): del ret[key] # couchdbkit erroneously converts appVersion to a Decimal just because it is possible (due to it being within a "dynamic" property) # (see https://github.com/benoitc/couchdbkit/blob/a23343e539370cffcf8b0ce483c712911bb022c1/couchdbkit/schema/properties.py#L1038) ret['appVersion'] = get_text(meta_block.get('appVersion')) ret['location'] = get_text(meta_block.get('location')) # couchdbkit chokes on dates that aren't actually dates # so check their validity before passing them up if meta_block: for key in ("timeStart", "timeEnd"): if key in meta_block: if meta_block[key]: if re_date.match(meta_block[key]): # this kind of leniency is pretty bad # and making it midnight in UTC # is totally arbitrary # here for backwards compatibility meta_block[key] += 'T00:00:00.000000Z' try: # try to parse to ensure correctness parsed = iso_string_to_datetime( meta_block[key]) # and set back in the right format in case it was a date, not a datetime ret[key] = json_format_datetime(parsed) except BadValueError: # we couldn't parse it del ret[key] else: # it was empty, also a failure del ret[key] # also clean dicts on the return value, since those are not allowed for key in ret: if isinstance(ret[key], dict): ret[key] = ", ".join(\ "%s:%s" % (k, v) \ for k, v in ret[key].items()) return ret
def _clean(meta_block): ret = copy(dict(meta_block)) for key in ret.keys(): # remove attributes from the meta block if key.startswith('@'): del ret[key] # couchdbkit erroneously converts appVersion to a Decimal just because it is possible (due to it being within a "dynamic" property) # (see https://github.com/benoitc/couchdbkit/blob/a23343e539370cffcf8b0ce483c712911bb022c1/couchdbkit/schema/properties.py#L1038) ret['appVersion'] = get_text(meta_block.get('appVersion')) ret['location'] = get_text(meta_block.get('location')) # couchdbkit chokes on dates that aren't actually dates # so check their validity before passing them up if meta_block: for key in ("timeStart", "timeEnd"): if key in meta_block: if meta_block[key]: if re_date.match(meta_block[key]): # this kind of leniency is pretty bad # and making it midnight in UTC # is totally arbitrary # here for backwards compatibility meta_block[key] += 'T00:00:00.000000Z' try: # try to parse to ensure correctness parsed = iso_string_to_datetime(meta_block[key]) # and set back in the right format in case it was a date, not a datetime ret[key] = json_format_datetime(parsed) except BadValueError: # we couldn't parse it del ret[key] else: # it was empty, also a failure del ret[key] # also clean dicts on the return value, since those are not allowed for key in ret: if isinstance(ret[key], dict): ret[key] = ", ".join(\ "%s:%s" % (k, v) \ for k, v in ret[key].items()) return ret
def _parse_meta_times(meta_block): for key in ("timeStart", "timeEnd"): if key not in meta_block: continue if meta_block[key]: if re_date.match(meta_block[key]): # this kind of leniency is pretty bad and making it midnight in UTC # is totally arbitrary here for backwards compatibility meta_block[key] += 'T00:00:00.000000Z' try: # try to parse to ensure correctness parsed = iso_string_to_datetime(meta_block[key]) # and set back in the right format in case it was a date, not a datetime meta_block[key] = json_format_datetime(parsed) except Exception: logging.exception('Could not parse meta_block') # we couldn't parse it del meta_block[key] else: # it was empty, also a failure del meta_block[key] return meta_block
def _is_date(value): return value and (isinstance(value, datetime.date) or re_date.match(value))