refactor events and parser, change gps method and wait for second match
[gigfinder] / resultsparser.py
1 from xml.dom.minidom import parseString
2 from datetime import datetime, date
3 import time
4
5 import location
6
7 class EventParser:
8
9     def parse_json(self, json, lat, long):
10         """ Parse json into usable format """
11         pass
12
13     def parse_xml(self, xml, lat, long):
14         """ Parse xml into a dict """
15         events_list = []
16         today = date.today()
17         dom = parseString(xml)
18
19         events = dom.getElementsByTagName('event')
20         for event in events:
21             start_date = self.parse_date(event.getElementsByTagName('startDate')[0].childNodes[0].data)
22             if start_date.date() == today:
23                 title = event.getElementsByTagName('title')[0].childNodes[0].data
24                 
25                 artists_element = event.getElementsByTagName('artists')[0]
26                 artist_list = []
27                 for artist in artists_element.getElementsByTagName('artist'):
28                     artist_list.append(artist.childNodes[0].data)
29                 artists = ', '.join(artist_list)
30
31                 venue_details = event.getElementsByTagName('venue')[0]
32                 venue_name = venue_details.getElementsByTagName('name')[0].childNodes[0].data
33                 address = self.get_address(venue_details.getElementsByTagName('location')[0])
34                 geo_data = venue_details.getElementsByTagName('geo:point')[0]
35                 venue_lat = geo_data.getElementsByTagName('geo:lat')[0].childNodes[0].data
36                 venue_long = geo_data.getElementsByTagName('geo:long')[0].childNodes[0].data
37                 distance = location.distance_between(float(lat), 
38                                                      float(long), 
39                                                      float(venue_lat), 
40                                                      float(venue_long))
41                 
42                 events_list.append({'title': title,
43                                     'venue': venue_name,
44                                     'address': address,
45                                     'distance': distance,
46                                     'artists': artists,
47                                     'date': start_date})
48         return events_list
49     
50     def get_address(self, location):
51         """ Return the venues address details from the xml element """
52         street = ''
53         city = ''
54         country = ''
55         postalcode = ''
56         if location.getElementsByTagName('street')[0].childNodes:
57             street = location.getElementsByTagName('street')[0].childNodes[0].data
58         if location.getElementsByTagName('city')[0].childNodes:
59             city = location.getElementsByTagName('city')[0].childNodes[0].data
60         if location.getElementsByTagName('country')[0].childNodes:
61             country = location.getElementsByTagName('country')[0].childNodes[0].data
62         if location.getElementsByTagName('postalcode')[0].childNodes:
63             postalcode = location.getElementsByTagName('postalcode')[0].childNodes[0].data
64         return '\n'.join([street, city, country, postalcode])
65
66     def parse_date(self, date_string):
67         """ Parse date string into datetime object """
68         fmt =  "%a, %d %b %Y %H:%M:%S"
69         result = time.strptime(date_string, fmt)
70         return datetime(result.tm_year, 
71                         result.tm_mon, 
72                         result.tm_mday, 
73                         result.tm_hour, 
74                         result.tm_min, 
75                         result.tm_sec)