def schedule(self): sched = self.xml_elem.find('schedule') if sched is None: raise ValidationError("Schedule is required") tzname = self.xml_elem.findtext('timezone') if tzname: timezone = pytz.timezone(tzname) else: timezone = self.cached_jurisdiction.default_timezone return Schedule.from_element(sched, timezone)
def convert_to_atom(input, feed_url="http://example.org/open511-feed", feed_title="Open511 Example Feed", include_expires=False, default_timezone_name='UTC'): A = ElementMaker(namespace=NS_ATOM, nsmap={ None: NS_ATOM, 'html': NS_XHTML, 'georss': NS_GEORSS }) feed = A('feed', A('id', feed_url), A('link', href=feed_url, rel='self'), A('title', feed_title, type='text'), A('updated', datetime.datetime.utcnow().isoformat() + 'Z')) base_url = input.get(XML_BASE, feed_url) for event in input.xpath('events/event'): entry = A( 'entry', A('id', urljoin(base_url, event.xpath('link[@rel="self"]/@href')[0]))) active = event.findtext('status') == 'ACTIVE' if include_expires: tz = event.findtext('timezone') tz = pytz.timezone(tz) if tz else pytz.timezone( default_timezone_name) schedule = Schedule.from_element(event.find('schedules'), tz) timestamp = now() next_period = schedule.next_interval(timestamp) if next_period is None: active = False else: if next_period.start > timestamp: # Add effective tag for future events effective = etree.Element(MASAS_EFFECTIVE) effective.text = next_period.start.isoformat() entry.append(effective) if next_period.end - timestamp < datetime.timedelta(days=14): expires = etree.Element('{%s}expires' % NS_AGE) expires.text = next_period.end.isoformat() entry.append(expires) entry.extend([ A('category', label='Status', scheme='masas:category:status', term='Actual' if active else 'Draft'), A('category', label='Severity', scheme='masas:category:severity', term=_cap_severity(event.findtext('severity'))), A('category', label='Category', scheme='masas:category:category', term=_cap_category(event.findtext('event_type'))), A('category', label='Open511 ID', scheme='open511:event:id', term=event.findtext('id')) ]) if event.xpath('certainty'): entry.append( A('category', label='Certainty', scheme='masas:category:certainty', term=event.findtext('certainty').title())) title = A('title', type='xhtml') for headline in event.xpath('headline'): title.append(_el_to_html(headline)) entry.append(title) if event.xpath('description'): content = A('content', type='xhtml') for description in event.xpath('description'): # FIXME HTML conversion? content.append(_el_to_html(description)) entry.append(content) entry.append(_gml_to_georss(event.xpath('geography')[0][0])) feed.append(entry) return feed
def setUp(self): self.timezone = pytz.timezone(self.tzname) self.elem = etree.fromstring(self.data) assert self.elem.tag == 'schedule' self.sched = Schedule.from_element(self.elem, self.timezone)
def convert_to_atom(input, feed_url="http://example.org/open511-feed", feed_title="Open511 Example Feed", include_expires=False, default_timezone_name='UTC'): A = ElementMaker(namespace=NS_ATOM, nsmap={None: NS_ATOM, 'html': NS_XHTML, 'georss': NS_GEORSS}) feed = A('feed', A('id', feed_url), A('link', href=feed_url, rel='self'), A('title', feed_title, type='text'), A('updated', datetime.datetime.utcnow().isoformat() + 'Z') ) base_url = input.get(XML_BASE, feed_url) for event in input.xpath('events/event'): entry = A('entry', A('id', urljoin(base_url, event.xpath('link[@rel="self"]/@href')[0])) ) active = event.findtext('status') == 'ACTIVE' if include_expires: tz = event.findtext('timezone') tz = pytz.timezone(tz) if tz else pytz.timezone(default_timezone_name) schedule = Schedule.from_element(event.find('schedules'), tz) timestamp = now() next_period = schedule.next_interval(timestamp) if next_period is None: active = False else: if next_period.start > timestamp: # Add effective tag for future events effective = etree.Element(MASAS_EFFECTIVE) effective.text = next_period.start.isoformat() entry.append(effective) if next_period.end - timestamp < datetime.timedelta(days=14): expires = etree.Element('{%s}expires' % NS_AGE) expires.text = next_period.end.isoformat() entry.append(expires) entry.extend([ A('category', label='Status', scheme='masas:category:status', term='Actual' if active else 'Draft'), A('category', label='Severity', scheme='masas:category:severity', term=_cap_severity(event.findtext('severity'))), A('category', label='Category', scheme='masas:category:category', term=_cap_category(event.findtext('event_type'))), A('category', label='Open511 ID', scheme='open511:event:id', term=event.findtext('id')) ]) if event.xpath('certainty'): entry.append(A('category', label='Certainty', scheme='masas:category:certainty', term=event.findtext('certainty').title())) title = A('title', type='xhtml') for headline in event.xpath('headline'): title.append(_el_to_html(headline)) entry.append(title) if event.xpath('description'): content = A('content', type='xhtml') for description in event.xpath('description'): # FIXME HTML conversion? content.append(_el_to_html(description)) entry.append(content) entry.append(_gml_to_georss(event.xpath('geography')[0][0])) feed.append(entry) return feed