9f50ae8358158bed107b295ca8d1bab9cc5982e6
[gigfinder] / src / opt / gigfinder / resultsparser.py
1 from xml.dom.minidom import parseString
2 from datetime import datetime, date
3 import time
4 import simplejson
5
6 import location
7
8 from events import Event
9
10 def parse_json(json, lat, lng):
11     """ Parse json into usable format """
12     events_list = []
13     today = date.today()
14     
15     events = json['events']['event']
16     for event in events:
17         venue_location = event['venue']['location']
18         address = '\n'.join([venue_location['street'],
19                              venue_location['city'],
20                              venue_location['country'],
21                              venue_location['postalcode']])
22         venue_geo = venue_location['geo:point']
23         if type(event['artists']['artist']) == list:
24             artist = '\n'.join(event['artists']['artist'])
25         else:
26             artist = event['artists']['artist']
27                 
28         event_obj = Event(event['title'], 
29                           event['venue']['name'], 
30                           address, 
31                           venue_geo['geo:long'],
32                           venue_geo['geo:lat'],
33                           artist, 
34                           parse_date(event['startDate']))
35         event_list.append(event_obj)
36     return event_list
37         
38
39 def parse_xml(xml, lat, lng):
40     """ Parse xml into a dict """
41     events_list = []
42     today = date.today()
43     dom = parseString(xml)
44
45     events = dom.getElementsByTagName('event')
46     for event in events:
47         start_date = parse_date(event.getElementsByTagName('startDate')[0]\
48                 .childNodes[0].data)
49         if start_date.date() == today:
50             title = event.getElementsByTagName('title')[0].childNodes[0].data
51             
52             artists_element = event.getElementsByTagName('artists')[0]
53             artist_list = []
54             for artist in artists_element.getElementsByTagName('artist'):
55                 artist_list.append(artist.childNodes[0].data)
56             artists = ', '.join(artist_list)
57
58             v_details = event.getElementsByTagName('venue')[0]
59             venue_name = v_details.getElementsByTagName('name')[0]\
60                     .childNodes[0].data
61             address = get_address(v_details.getElementsByTagName('location')[0])
62             geo_data = v_details.getElementsByTagName('geo:point')[0]
63             venue_lat = geo_data.getElementsByTagName('geo:lat')[0]\
64                     .childNodes[0].data
65             venue_long = geo_data.getElementsByTagName('geo:long')[0]\
66                     .childNodes[0].data
67             distance = location.distance_between(float(lat), 
68                                                  float(lng), 
69                                                  float(venue_lat), 
70                                                  float(venue_long))
71             
72             events_list.append({'title': title,
73                                 'venue': venue_name,
74                                 'address': address,
75                                 'distance': distance,
76                                 'artists': artists,
77                                 'date': start_date})
78     return events_list
79
80 def get_address(location_element):
81     """ Return the venues address details from the xml element """
82     street = ''
83     city = ''
84     country = ''
85     postalcode = ''
86     if location_element.getElementsByTagName('street')[0].childNodes:
87         street = location_element.getElementsByTagName('street')[0]\
88                 .childNodes[0].data
89     if location_element.getElementsByTagName('city')[0].childNodes:
90         city = location_element.getElementsByTagName('city')[0]\
91                 .childNodes[0].data
92     if location_element.getElementsByTagName('country')[0].childNodes:
93         country = location_element.getElementsByTagName('country')[0]\
94                 .childNodes[0].data
95     if location_element.getElementsByTagName('postalcode')[0].childNodes:
96         postalcode = location_element.getElementsByTagName('postalcode')[0]\
97                 .childNodes[0].data
98     return '\n'.join([street, city, country, postalcode])
99
100 def parse_date(date_string):
101     """ Parse date string into datetime object """
102     fmt =  "%a, %d %b %Y %H:%M:%S"
103     result = time.strptime(date_string, fmt)
104     return datetime(result.tm_year, 
105                     result.tm_mon, 
106                     result.tm_mday, 
107                     result.tm_hour, 
108                     result.tm_min, 
109                     result.tm_sec)