Beispiel #1
0
 def next_interval(self, after=None):
     """Returns the next Period this event is in effect, or None if the event
     has no remaining periods."""
     if after is None:
         after = timezone.now()
     after = self.to_timezone(after)
     return next(self.intervals(range_start=after), None)
Beispiel #2
0
 def next_interval(self, after=None):
     """Returns the next Period this event is in effect, or None if the event
     has no remaining periods."""
     if after is None:
         after = timezone.now()
     after = self.to_timezone(after)
     return next(self.intervals(range_start=after), None)
Beispiel #3
0
def _change_expires(entry, time=None):
    expires = entry.xpath('age:expires', namespaces=NSMAP)
    if expires:
        expires = expires[0]
    else:
        expires = etree.Element('{%s}expires' % NS_AGE)
        entry.append(expires)
    if not time:
        time = timezone.now()
    expires.text = time
Beispiel #4
0
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
Beispiel #5
0
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