1.1 --- a/imip_manager.py Sat Jan 31 22:34:12 2015 +0100
1.2 +++ b/imip_manager.py Sun Feb 01 01:59:37 2015 +0100
1.3 @@ -30,10 +30,8 @@
1.4
1.5 sys.path.append(LIBRARY_PATH)
1.6
1.7 -from imiptools.content import Handler, get_address, \
1.8 - get_item, get_items, get_uri, get_utc_datetime, \
1.9 - get_value, get_value_map, get_values, \
1.10 - parse_object, to_part
1.11 +from imiptools.content import Handler
1.12 +from imiptools.data import get_address, get_uri, parse_object, Object
1.13 from imiptools.dates import format_datetime, get_datetime, get_start_of_day, \
1.14 get_end_of_day, ends_on_same_day, to_timezone
1.15 from imiptools.mail import Messenger
1.16 @@ -42,9 +40,8 @@
1.17 get_scale, have_conflict, get_slots, get_spans, \
1.18 partition_by_day
1.19 from imiptools.profile import Preferences
1.20 -from vCalendar import to_node
1.21 +import imip_store
1.22 import markup
1.23 -import imip_store
1.24
1.25 getenv = os.environ.get
1.26 setenv = os.environ.__setitem__
1.27 @@ -116,14 +113,11 @@
1.28 """
1.29
1.30 def __init__(self, obj, user, messenger):
1.31 - details, details_attr = obj.values()[0]
1.32 - Handler.__init__(self, details)
1.33 - self.obj = obj
1.34 + Handler.__init__(self, obj, messenger=messenger)
1.35 self.user = user
1.36 - self.messenger = messenger
1.37
1.38 - self.organiser = self.get_value("ORGANIZER")
1.39 - self.attendees = self.get_values("ATTENDEE")
1.40 + self.organiser = self.obj.get_value("ORGANIZER")
1.41 + self.attendees = self.obj.get_values("ATTENDEE")
1.42
1.43 # Communication methods.
1.44
1.45 @@ -134,8 +128,7 @@
1.46 to the appropriate recipients, also sending a copy to the 'sender'.
1.47 """
1.48
1.49 - node = to_node(self.obj)
1.50 - part = to_part(method, [node])
1.51 + part = self.obj.to_part(method)
1.52
1.53 if self.user == self.organiser:
1.54 recipients = map(get_address, self.attendees)
1.55 @@ -161,16 +154,16 @@
1.56 # When accepting or declining, do so only on behalf of this user,
1.57 # preserving any other attributes set as an attendee.
1.58
1.59 - for attendee, attendee_attr in self.get_items("ATTENDEE"):
1.60 + for attendee, attendee_attr in self.obj.get_items("ATTENDEE"):
1.61
1.62 if attendee == self.user:
1.63 attendee_attr["PARTSTAT"] = accept and "ACCEPTED" or "DECLINED"
1.64 if self.messenger and self.messenger.sender != get_address(attendee):
1.65 attendee_attr["SENT-BY"] = get_uri(self.messenger.sender)
1.66 - self.details["ATTENDEE"] = [(attendee, attendee_attr)]
1.67 + self.obj["ATTENDEE"] = [(attendee, attendee_attr)]
1.68 if update:
1.69 - sequence = self.get_value("SEQUENCE") or "0"
1.70 - self.details["SEQUENCE"] = [(str(int(sequence) + 1), {})]
1.71 + sequence = self.obj.get_value("SEQUENCE") or "0"
1.72 + self.obj["SEQUENCE"] = [(str(int(sequence) + 1), {})]
1.73 self.update_dtstamp()
1.74
1.75 self.send_message("REPLY", get_address(attendee))
1.76 @@ -189,9 +182,13 @@
1.77 to override any previous message.
1.78 """
1.79
1.80 + organiser, organiser_attr = self.obj.get_item("ORGANIZER")
1.81 +
1.82 + if self.messenger and self.messenger.sender != get_address(organiser):
1.83 + organiser_attr["SENT-BY"] = get_uri(self.messenger.sender)
1.84 if update:
1.85 - sequence = self.get_value("SEQUENCE") or "0"
1.86 - self.details["SEQUENCE"] = [(str(int(sequence) + 1), {})]
1.87 + sequence = self.obj.get_value("SEQUENCE") or "0"
1.88 + self.obj["SEQUENCE"] = [(str(int(sequence) + 1), {})]
1.89 self.update_dtstamp()
1.90
1.91 self.send_message("REQUEST", get_address(self.organiser))
1.92 @@ -237,17 +234,11 @@
1.93 if not f:
1.94 return None
1.95
1.96 - self.objects[uid] = obj = parse_object(f, "utf-8")
1.97 -
1.98 - if not obj:
1.99 - return None
1.100 + fragment = parse_object(f, "utf-8")
1.101 + obj = self.objects[uid] = fragment and Object(fragment)
1.102
1.103 return obj
1.104
1.105 - def _get_details(self, obj):
1.106 - details, details_attr = obj.values()[0]
1.107 - return details
1.108 -
1.109 def _get_requests(self):
1.110 if self.requests is None:
1.111 self.requests = self.store.get_requests(self.user)
1.112 @@ -258,10 +249,9 @@
1.113 for uid in self._get_requests():
1.114 obj = self._get_object(uid)
1.115 if obj:
1.116 - details = self._get_details(obj)
1.117 summary.append((
1.118 - get_value(details, "DTSTART"),
1.119 - get_value(details, "DTEND"),
1.120 + obj.get_value("DTSTART"),
1.121 + obj.get_value("DTEND"),
1.122 uid
1.123 ))
1.124 return summary
1.125 @@ -406,8 +396,7 @@
1.126 # Update the object.
1.127
1.128 if args.has_key("summary"):
1.129 - details = self._get_details(obj)
1.130 - details["SUMMARY"] = [(args["summary"][0], {})]
1.131 + obj["SUMMARY"] = [(args["summary"][0], {})]
1.132
1.133 # Process any action.
1.134
1.135 @@ -452,11 +441,10 @@
1.136
1.137 page = self.page
1.138
1.139 - details = self._get_details(obj)
1.140 - is_organiser = get_value(details, "ORGANIZER") == self.user
1.141 + is_organiser = obj.get_value("ORGANIZER") == self.user
1.142
1.143 if not is_organiser:
1.144 - attendees = get_value_map(details, "ATTENDEE")
1.145 + attendees = obj.get_value_map("ATTENDEE")
1.146 attendee_attr = attendees.get(self.user)
1.147
1.148 if attendee_attr:
1.149 @@ -519,8 +507,6 @@
1.150
1.151 # Provide a summary of the object.
1.152
1.153 - details = self._get_details(obj)
1.154 -
1.155 page.table(id="object", cellspacing=5, cellpadding=5)
1.156 page.thead()
1.157 page.tr()
1.158 @@ -537,7 +523,7 @@
1.159 # Handle datetimes specially.
1.160
1.161 if name in ["DTSTART", "DTEND"]:
1.162 - value, attr = get_item(details, name)
1.163 + value, attr = obj.get_item(name)
1.164 tzid = attr.get("TZID", tzid)
1.165 value = self.format_datetime(to_timezone(get_datetime(value), tzid), "full")
1.166 page.th(label, class_="objectheading")
1.167 @@ -547,7 +533,7 @@
1.168 # Handle the summary specially.
1.169
1.170 elif name == "SUMMARY":
1.171 - value = get_value(details, name)
1.172 + value = obj.get_value(name)
1.173 page.th(label, class_="objectheading")
1.174 page.td()
1.175 page.input(name="summary", type="text", value=value, size=80)
1.176 @@ -557,7 +543,7 @@
1.177 # Handle potentially many values.
1.178
1.179 else:
1.180 - items = get_items(details, name)
1.181 + items = obj.get_items(name)
1.182 page.th(label, class_="objectheading", rowspan=len(items))
1.183
1.184 first = True
1.185 @@ -582,8 +568,8 @@
1.186 page.tbody.close()
1.187 page.table.close()
1.188
1.189 - dtstart = format_datetime(get_utc_datetime(details, "DTSTART"))
1.190 - dtend = format_datetime(get_utc_datetime(details, "DTEND"))
1.191 + dtstart = format_datetime(obj.get_utc_datetime("DTSTART"))
1.192 + dtend = format_datetime(obj.get_utc_datetime("DTEND"))
1.193
1.194 # Indicate whether there are conflicting events.
1.195
1.196 @@ -593,7 +579,7 @@
1.197
1.198 # Obtain any time zone details from the suggested event.
1.199
1.200 - _dtstart, attr = get_item(details, "DTSTART")
1.201 + _dtstart, attr = obj.get_item("DTSTART")
1.202 tzid = attr.get("TZID", tzid)
1.203
1.204 # Show any conflicts.
1.205 @@ -612,8 +598,7 @@
1.206
1.207 found_obj = self._get_object(found_uid)
1.208 if found_obj:
1.209 - found_details = self._get_details(found_obj)
1.210 - page.a(get_value(found_details, "SUMMARY"), href=self.env.new_url(found_uid))
1.211 + page.a(found_obj.get_value("SUMMARY"), href=self.env.new_url(found_uid))
1.212
1.213 self.show_request_controls(obj, needs_action)
1.214 page.form.close()
1.215 @@ -637,9 +622,8 @@
1.216 for request in requests:
1.217 obj = self._get_object(request)
1.218 if obj:
1.219 - details = self._get_details(obj)
1.220 self.page.li()
1.221 - self.page.a(get_value(details, "SUMMARY"), href="#request-%s" % request)
1.222 + self.page.a(obj.get_value("SUMMARY"), href="#request-%s" % request)
1.223 self.page.li.close()
1.224
1.225 self.page.ul.close()
1.226 @@ -1020,8 +1004,7 @@
1.227 if not obj:
1.228 page.span("")
1.229 else:
1.230 - details = self._get_details(obj)
1.231 - summary = get_value(details, "SUMMARY")
1.232 + summary = obj.get_value("SUMMARY")
1.233
1.234 # Only link to events if they are not being
1.235 # updated by requests.