def test_add_property(self): """Test adding a property to any component. """ cal = self.cal2 event = cal.get_components('VEVENT')[1] # other property (MYADD) name, value = 'MYADD', Property(u'Résumé à crêtes') cal.update_record(event.id, **{name: value}) property = event.get_property(name) self.assertEqual(property[0], value) self.assertEqual(property[0].value, value.value) # property DESCRIPTION name = 'DESCRIPTION' value = Property(u'Property added by calling add_property') cal.update_record(event.id, **{name: value}) property = event.get_property(name) self.assertEqual(property, value) # property ATTENDEE name = 'ATTENDEE' value = event.get_property(name) member = '"mailto:[email protected]"' value.append(Property('mailto:[email protected]', MEMBER=[member])) cal.update_record(event.id, **{name: value}) property = event.get_property(name) self.assertEqual(str(property[0].value), 'mailto:[email protected]') self.assertEqual(property[1].parameters, {'MEMBER': [member]}) self.assertEqual(property[1], value[1])
def test_add_property(self): """Test adding a property to any component. """ cal = self.cal2 event = cal.get_components('VEVENT')[1] # other property (MYADD) name, value = 'MYADD', Property(u'Résumé à crêtes') cal.update_component(event.uid, **{name: value}) property = event.get_property_values(name) self.assertEqual(property[0], value) self.assertEqual(property[0].value, value.value) # property DESCRIPTION name = 'DESCRIPTION' value = Property(u'Property added by calling add_property') cal.update_component(event.uid, **{name: value}) property = event.get_property_values(name) self.assertEqual(property, value) # property ATTENDEE name = 'ATTENDEE' value = event.get_property_values(name) member = '"mailto:[email protected]"' value.append(Property('mailto:[email protected]', MEMBER=[member])) cal.update_component(event.uid, **{name: value}) property = event.get_property_values(name) self.assertEqual(str(property[0].value), 'mailto:[email protected]') self.assertEqual(property[1].parameters, {'MEMBER': [member]}) self.assertEqual(property[1], value[1])
def _load_state_from_file(self, file): # Read the data and figure out the encoding data = file.read() encoding = guess_encoding(data) self.encoding = encoding # Parse lines = [] for name, value, parameters in parse_table(data): # Deserialize datatype = self.get_record_datatype(name) if isinstance(datatype, Unicode): value = datatype.decode(value, encoding=encoding) else: value = datatype.decode(value) # Build the value (a Property instance) deserialize_parameters(parameters, self.record_parameters) value = Property(value, **parameters) # Append lines.append((name, value)) # Read first line first = lines[0] if (first[0] != 'BEGIN' or first[1].value != 'VCALENDAR' or len(first[1].parameters) != 0): raise ValueError, 'icalendar must begin with BEGIN:VCALENDAR' lines = lines[1:] ################################################################### # Read properties n_line = 0 for name, value in lines: if name == 'BEGIN': break elif name == 'END': break elif name == 'VERSION': if 'VERSION' in self.properties: raise ValueError, 'VERSION can appear only one time' elif name == 'PRODID': if 'PRODID' in self.properties: raise ValueError, 'PRODID can appear only one time' # Add the property self.properties[name] = value n_line += 1 # The properties VERSION and PRODID are mandatory if ('VERSION' not in self.properties or 'PRODID' not in self.properties): raise ValueError, 'PRODID or VERSION parameter missing' lines = lines[n_line:] ################################################################### # Read components c_type = None c_inner_type = None uid = None for prop_name, prop_value in lines[:-1]: if prop_name in ('PRODID', 'VERSION'): raise ValueError, 'PRODID and VERSION must appear before '\ 'any component' if prop_name == 'BEGIN': if c_type is None: c_type = prop_value.value c_properties = {} c_inner_components = [] else: # Inner component like DAYLIGHT or STANDARD c_inner_type = prop_value.value c_inner_properties = {} continue if prop_name == 'END': value = prop_value.value if value == c_type: if uid is None: raise ValueError, 'UID is not present' if uid in self.components: component = self.components[uid] component.add_version(c_properties) else: component = Component(c_type, uid) component.add_version(c_properties) component.c_inner_components = c_inner_components self.components[uid] = component # Next c_type = None uid = None # Inner component elif value == c_inner_type: inner_component = InnerComponent(c_inner_type) inner_component.add_version(c_inner_properties) c_inner_components.append(inner_component) c_inner_type = None else: raise ValueError, 'Component %s found, %s expected' \ % (value, c_inner_type) else: datatype = self.get_record_datatype(prop_name) if c_inner_type is None: if prop_name in ('UID', 'TZID'): uid = prop_value.value else: if getattr(datatype, 'multiple', False) is True: value = c_properties.setdefault(prop_name, []) value.append(prop_value) else: # Check the property has not yet being found if prop_name in c_properties: msg = ('the property %s can be assigned only ' 'one value' % prop_name) raise ValueError, msg # Set the property c_properties[prop_name] = prop_value else: # Inner component properties if getattr(datatype, 'multiple', False) is True: value = c_inner_properties.setdefault(prop_name, []) value.append(prop_value) else: # Check the property has not yet being found if prop_name in c_inner_properties: msg = ('the property %s can be assigned only one' ' value' % prop_name) raise ValueError, msg value = prop_value # Set the property c_inner_properties[prop_name] = value ################################################################### # Index components for uid in self.components: component = self.components[uid] self.catalog.index_document(component)