# HG changeset patch # User Paul Boddie # Date 1505161895 -7200 # Node ID ea2b740d77457ed980488af1bd180e7704326381 # Parent c0ee74128fca71ac67efc0b26a849fc38b6b8468 Handled null datetimes in form periods, also serialising nulls as empty strings. Added a function that exposes the field inputs used to provide datetime details. diff -r c0ee74128fca -r ea2b740d7745 imipweb/data.py --- a/imipweb/data.py Mon Sep 11 16:39:20 2017 +0200 +++ b/imipweb/data.py Mon Sep 11 22:31:35 2017 +0200 @@ -35,7 +35,8 @@ intended to represent information obtained from an iCalendar resource. """ - def __init__(self, start, end, tzid=None, origin=None, start_attr=None, end_attr=None, form_start=None, form_end=None, replaced=False): + def __init__(self, start, end, tzid=None, origin=None, start_attr=None, + end_attr=None, form_start=None, form_end=None, replaced=False): """ Initialise a period with the given 'start' and 'end' datetimes, together @@ -50,7 +51,8 @@ self.replaced = replaced def as_tuple(self): - return self.start, self.end, self.tzid, self.origin, self.start_attr, self.end_attr, self.form_start, self.form_end, self.replaced + return self.start, self.end, self.tzid, self.origin, self.start_attr, \ + self.end_attr, self.form_start, self.form_end, self.replaced def __repr__(self): return "EventPeriod%r" % (self.as_tuple(),) @@ -101,7 +103,8 @@ "A period whose information originates from a form." - def __init__(self, start, end, end_enabled=True, times_enabled=True, tzid=None, origin=None, replaced=False): + def __init__(self, start, end, end_enabled=True, times_enabled=True, + tzid=None, origin=None, replaced=False): self.start = start self.end = end self.end_enabled = end_enabled @@ -138,12 +141,14 @@ index is not None and ("dtend", index) or "dtend" ]) - return EventPeriod(dtstart, end_date_to_calendar(dtend), self.tzid, self.origin, dtstart_attr, dtend_attr, self.start, self.end, self.replaced) + return EventPeriod(dtstart, end_date_to_calendar(dtend), self.tzid, + self.origin, dtstart_attr, dtend_attr, + self.start, self.end, self.replaced) # Period data methods. def get_start(self): - return self.start.as_datetime(self.times_enabled) + return self.start and self.start.as_datetime(self.times_enabled) or None def get_end(self): @@ -178,10 +183,10 @@ return dtend def get_start_attr(self): - return self.start.get_attributes(self.times_enabled) + return self.start and self.start.get_attributes(self.times_enabled) or {} def get_end_attr(self): - return self.end.get_attributes(self.times_enabled) + return self.end and self.end.get_attributes(self.times_enabled) or {} # Form data methods. @@ -323,8 +328,26 @@ else: return event_period_from_period(period).as_form_period() + + # Form field extraction and serialisation. +def get_date_control_inputs(args, name, tzid_name=None): + + """ + Return a tuple of date control inputs taken from 'args' for field names + starting with 'name'. + + If 'tzid_name' is specified, the time zone information will be acquired + from fields starting with 'tzid_name' instead of 'name'. + """ + + return args.get("%s-date" % name, []), \ + args.get("%s-hour" % name, []), \ + args.get("%s-minute" % name, []), \ + args.get("%s-second" % name, []), \ + args.get("%s-tzid" % (tzid_name or name), []) + def get_date_control_values(args, name, multiple=False, tzid_name=None, tzid=None): """ @@ -341,11 +364,7 @@ time zone information is indicated in the field data. """ - dates = args.get("%s-date" % name, []) - hours = args.get("%s-hour" % name, []) - minutes = args.get("%s-minute" % name, []) - seconds = args.get("%s-second" % name, []) - tzids = args.get("%s-tzid" % (tzid_name or name), []) + dates, hours, minutes, seconds, tzids = get_date_control_inputs(args, name, tzid_name) # Handle absent values by employing None values. @@ -384,11 +403,11 @@ args["%s-tzid" % (tzid_name or name)] = [] for d in formdates: - args["%s-date" % name].append(d.date) - args["%s-hour" % name].append(d.hour) - args["%s-minute" % name].append(d.minute) - args["%s-second" % name].append(d.second) - args["%s-tzid" % (tzid_name or name)].append(d.tzid) + args["%s-date" % name].append(d and d.date or "") + args["%s-hour" % name].append(d and d.hour or "") + args["%s-minute" % name].append(d and d.minute or "") + args["%s-second" % name].append(d and d.second or "") + args["%s-tzid" % (tzid_name or name)].append(d and d.tzid or "") def get_period_control_values(args, start_name, end_name, end_enabled_name, times_enabled_name,