kopia lustrzana https://github.com/collective/icalendar
				
				
				
			Support adding lists to a component property, which value already was a list
and remove the Component.set method, which was only be used by add method.pull/120/merge
							rodzic
							
								
									cf533d22bd
								
							
						
					
					
						commit
						b0f109f3b9
					
				|  | @ -5,6 +5,10 @@ Changelog | |||
| 4.0.dev (unreleased) | ||||
| -------------------- | ||||
| 
 | ||||
| - Support adding lists to a component property, which value already was a list | ||||
|   and remove the Component.set method, which was only be used by add method. | ||||
|   [thet] | ||||
| 
 | ||||
| - Remove ability to add property parameters via a value's params attribute when | ||||
|   adding via cal.add (that was only possible for custom value objects and makes | ||||
|   up a strange API), but support a parameter attribute on cal.add's method | ||||
|  |  | |||
|  | @ -112,16 +112,6 @@ class Component(CaselessDict): | |||
|             obj.params = parameters | ||||
|         return obj | ||||
| 
 | ||||
|     def set(self, name, value, parameters=None, encode=1): | ||||
|         if encode and isinstance(value, list) \ | ||||
|                 and name.lower() not in ['rdate', 'exdate']: | ||||
|             # Individually convert each value to an ical type except rdate and | ||||
|             # exdate, where lists of dates might be passed to vDDDLists. | ||||
|             self[name] = [self._encode(name, v, parameters, encode) | ||||
|                           for v in value] | ||||
|         else: | ||||
|             self[name] = self._encode(name, value, parameters, encode) | ||||
| 
 | ||||
|     def add(self, name, value, parameters=None, encode=1): | ||||
|         """Add a property. | ||||
| 
 | ||||
|  | @ -152,16 +142,29 @@ class Component(CaselessDict): | |||
|                 # assume UTC for naive datetime instances | ||||
|                 value = pytz.utc.localize(value) | ||||
| 
 | ||||
|         # If property already exists, append it. Otherwise create and set it. | ||||
|         if name in self: | ||||
|             oldval = self[name] | ||||
|             value = self._encode(name, value, parameters, encode) | ||||
|             if isinstance(oldval, list): | ||||
|                 oldval.append(value) | ||||
|             else: | ||||
|                 self.set(name, [oldval, value], None, encode=0) | ||||
|         # encode value | ||||
|         if encode and isinstance(value, list) \ | ||||
|                 and name.lower() not in ['rdate', 'exdate']: | ||||
|             # Individually convert each value to an ical type except rdate and | ||||
|             # exdate, where lists of dates might be passed to vDDDLists. | ||||
|             value = [self._encode(name, v, parameters, encode) for v in value] | ||||
|         else: | ||||
|             self.set(name, value, parameters, encode) | ||||
|             value = self._encode(name, value, parameters, encode) | ||||
| 
 | ||||
|         # set value | ||||
|         if name in self: | ||||
|             # If property already exists, append it. | ||||
|             #if name == 'attendee': import pdb; pdb.set_trace() | ||||
|             oldval = self[name] | ||||
|             if isinstance(oldval, list): | ||||
|                 if isinstance(value, list): | ||||
|                     value = oldval + value | ||||
|                 else: | ||||
|                     oldval.append(value) | ||||
|                     value = oldval | ||||
|             else: | ||||
|                 value = [oldval, value] | ||||
|         self[name] = value | ||||
| 
 | ||||
|     def _decode(self, name, value): | ||||
|         """Internal for decoding property values. | ||||
|  |  | |||
|  | @ -32,18 +32,39 @@ class TestCalComponent(unittest.TestCase): | |||
|                       'PRODID': '-//max m//icalendar.mxm.dk/'}) | ||||
|         ) | ||||
| 
 | ||||
|         ### ADD MULTIPLE VALUES TO A PROPERTY | ||||
| 
 | ||||
|         # if you use the add method you don't have to considder if a value is | ||||
|         # a list or not. | ||||
|         c = Component() | ||||
|         c.name = 'VEVENT' | ||||
| 
 | ||||
|         # add multiple values at once | ||||
|         c.add('attendee', | ||||
|               ['test@test.com', 'test2@test.com']) | ||||
| 
 | ||||
|         # or add one per line | ||||
|         c.add('attendee', 'maxm@mxm.dk') | ||||
|         c.add('attendee', 'test@example.dk') | ||||
| 
 | ||||
|         # add again multiple values at once to very concatenaton of lists | ||||
|         c.add('attendee', | ||||
|               ['test3@test.com', 'test4@test.com']) | ||||
| 
 | ||||
|         self.assertEqual( | ||||
|             c, | ||||
|             Event({'ATTENDEE': [prop.vCalAddress('maxm@mxm.dk'), | ||||
|                                 prop.vCalAddress('test@example.dk')]}) | ||||
|             Event({'ATTENDEE': [ | ||||
|                 prop.vCalAddress('test@test.com'), | ||||
|                 prop.vCalAddress('test2@test.com'), | ||||
|                 prop.vCalAddress('maxm@mxm.dk'), | ||||
|                 prop.vCalAddress('test@example.dk'), | ||||
|                 prop.vCalAddress('test3@test.com'), | ||||
|                 prop.vCalAddress('test4@test.com') | ||||
|             ]}) | ||||
|         ) | ||||
| 
 | ||||
|         ### | ||||
| 
 | ||||
|         # You can get the values back directly ... | ||||
|         c.add('prodid', '-//my product//') | ||||
|         self.assertEqual(c['prodid'], prop.vText(u'-//my product//')) | ||||
|  | @ -284,7 +305,7 @@ class TestCal(unittest.TestCase): | |||
|         event = icalendar.cal.Event() | ||||
|         event['summary'] = 'Python meeting about calendaring' | ||||
|         event['uid'] = '42' | ||||
|         event.set('dtstart', datetime(2005, 4, 4, 8, 0, 0)) | ||||
|         event.add('dtstart', datetime(2005, 4, 4, 8, 0, 0)) | ||||
|         cal.add_component(event) | ||||
|         self.assertEqual( | ||||
|             cal.subcomponents[0].to_ical(), | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Johannes Raggam
						Johannes Raggam