Change to use json and event objects
authorJon <jmstaley@gmail.com>
Thu, 27 May 2010 23:00:57 +0000 (00:00 +0100)
committerJon <jmstaley@gmail.com>
Thu, 27 May 2010 23:00:57 +0000 (00:00 +0100)
src/opt/gigfinder/events.py
src/opt/gigfinder/gigfinder.py
src/opt/gigfinder/locator.py
src/opt/gigfinder/resultsparser.py

index 1b4902c..390ccae 100644 (file)
@@ -1,7 +1,9 @@
 import urllib
 import urllib2
 
-from resultsparser import parse_xml
+import location
+
+from resultsparser import  parse_json
 
 class Event:
     def __init__(self, 
@@ -34,25 +36,26 @@ class Events:
         self.method = 'geo.getevents'
 
     def get_events(self, lat, lng, distance):
-        """ Retrieve xml and parse into events list """
+        """ Retrieve json and parse into events list """
         events = []
-        xml = self.get_xml(lat, lng, distance)
-        events.extend(parse_xml(xml, 
-                                lat,
-                                lng))
-        return self.sort_events(events)
+        result = self.get_json(lat, lng, distance)
+        for event  in parse_json(result):
+            events.append(Event(event[0],
+                                event[1],
+                                event[2],
+                                event[3],
+                                event[4],
+                                event[5],
+                                event[6]))
+        return self.sort_events(events, lat, lng)
 
-    def sort_events(self, events):
+    def sort_events(self, events, lat, lng):
         """ Sort gig by distance """
         if len(events) > 1:
-            events.sort(cmp=self.distance_cmp, key=lambda x: x['distance'])
+            events.sort(cmp=self.distance_cmp, key=lambda x: x.get_distance_from(lng, lat))
         return events
 
     def get_json(self, lat='', lng='', distance=''):
-        # testing json results
-        lat = '51.5174'
-        lng = '-0.0829'
-        distance = '10'
         params = urllib.urlencode({'method': self.method,
                                    'api_key': self.api_key,
                                    'distance': distance,
@@ -62,19 +65,8 @@ class Events:
         url = '%s?%s' % (self.url_base, params)
         request = urllib2.Request(url, None)
         response = urllib2.urlopen(request)
-        return response
-        
-    def get_xml(self, lat, lng, distance, page='1'):
-        """ Return xml from lastfm """
-        params = urllib.urlencode({'method': self.method,
-                                   'api_key': self.api_key,
-                                   'distance': distance,
-                                   'long': lng,
-                                   'lat': lat,
-                                   'page': page})
-        response = urllib.urlopen(self.url_base, params)
         return response.read()
-    
+        
     def distance_cmp(self, x, y):
         """ Compare distances for list sort """
         if x > y:
index 016247a..d360de9 100755 (executable)
@@ -142,7 +142,7 @@ class GigFinder:
     def show_details(self, widget, data):
         """ Open new window showing gig details """
         win = hildon.StackableWindow()
-        win.set_title(data['title'])
+        win.set_title(data.title)
 
         win.vbox = gtk.VBox()
         win.add(win.vbox)
@@ -156,11 +156,11 @@ class GigFinder:
         view.set_wrap_mode(gtk.WRAP_WORD)
         buffer = view.get_buffer()
         end = buffer.get_end_iter()
-        buffer.insert(end, '%s\n' % data['title'])
-        buffer.insert(end, 'Artists: %s\n' % data['artists'])
-        buffer.insert(end, 'Venue: %s\n' % data['venue'])
-        buffer.insert(end, '%s\n' % data['address'])
-        buffer.insert(end, 'When: %s\n' % data['date'].strftime('%H:%M %d/%m/%Y'))
+        buffer.insert(end, '%s\n' % data.title)
+        buffer.insert(end, 'Artists: %s\n' % data.artists)
+        buffer.insert(end, 'Venue: %s\n' % data.venue_name)
+        buffer.insert(end, '%s\n' % data.address)
+        buffer.insert(end, 'When: %s\n' % data.start_date.strftime('%H:%M %d/%m/%Y'))
         buffer.insert(end, '\n')
         scroll.add_with_viewport(view)
 
@@ -178,7 +178,7 @@ class GigFinder:
         for event in events:
             button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, 
                                    hildon.BUTTON_ARRANGEMENT_VERTICAL)
-            button.set_text(event['title'], "distance: %0.02f km" % event['distance'])
+            button.set_text(event.title, "distance: %0.02f km" % event.get_distance_from(self.location.long, self.location.lat))
             button.connect("clicked", self.show_details, event)
             self.box.pack_start(button)
         self.box.show_all()
index e562e8d..8ed0ece 100644 (file)
@@ -38,6 +38,7 @@ class LocationUpdater:
         if device.fix:
             # once fix is found and long, lat available set long lat
             if device.fix[1] & location.GPS_DEVICE_LATLONG_SET:
+                # wait for a second fix before exiting
                 self.fix_count += 1
                 if self.fix_count > 1:
                     self.lat, self.long = device.fix[4:6]
index 9f50ae8..47deac0 100644 (file)
@@ -1,16 +1,12 @@
-from xml.dom.minidom import parseString
 from datetime import datetime, date
 import time
 import simplejson
 
-import location
-
-from events import Event
-
-def parse_json(json, lat, lng):
+def parse_json(json):
     """ Parse json into usable format """
     events_list = []
     today = date.today()
+    json = simplejson.loads(json)
     
     events = json['events']['event']
     for event in events:
@@ -25,78 +21,15 @@ def parse_json(json, lat, lng):
         else:
             artist = event['artists']['artist']
                 
-        event_obj = Event(event['title'], 
-                          event['venue']['name'], 
-                          address, 
-                          venue_geo['geo:long'],
-                          venue_geo['geo:lat'],
-                          artist, 
-                          parse_date(event['startDate']))
-        event_list.append(event_obj)
-    return event_list
+        yield (event['title'], 
+               event['venue']['name'], 
+               address, 
+               venue_geo['geo:long'],
+               venue_geo['geo:lat'],
+               artist, 
+               parse_date(event['startDate']))
         
 
-def parse_xml(xml, lat, lng):
-    """ Parse xml into a dict """
-    events_list = []
-    today = date.today()
-    dom = parseString(xml)
-
-    events = dom.getElementsByTagName('event')
-    for event in events:
-        start_date = parse_date(event.getElementsByTagName('startDate')[0]\
-                .childNodes[0].data)
-        if start_date.date() == today:
-            title = event.getElementsByTagName('title')[0].childNodes[0].data
-            
-            artists_element = event.getElementsByTagName('artists')[0]
-            artist_list = []
-            for artist in artists_element.getElementsByTagName('artist'):
-                artist_list.append(artist.childNodes[0].data)
-            artists = ', '.join(artist_list)
-
-            v_details = event.getElementsByTagName('venue')[0]
-            venue_name = v_details.getElementsByTagName('name')[0]\
-                    .childNodes[0].data
-            address = get_address(v_details.getElementsByTagName('location')[0])
-            geo_data = v_details.getElementsByTagName('geo:point')[0]
-            venue_lat = geo_data.getElementsByTagName('geo:lat')[0]\
-                    .childNodes[0].data
-            venue_long = geo_data.getElementsByTagName('geo:long')[0]\
-                    .childNodes[0].data
-            distance = location.distance_between(float(lat), 
-                                                 float(lng), 
-                                                 float(venue_lat), 
-                                                 float(venue_long))
-            
-            events_list.append({'title': title,
-                                'venue': venue_name,
-                                'address': address,
-                                'distance': distance,
-                                'artists': artists,
-                                'date': start_date})
-    return events_list
-
-def get_address(location_element):
-    """ Return the venues address details from the xml element """
-    street = ''
-    city = ''
-    country = ''
-    postalcode = ''
-    if location_element.getElementsByTagName('street')[0].childNodes:
-        street = location_element.getElementsByTagName('street')[0]\
-                .childNodes[0].data
-    if location_element.getElementsByTagName('city')[0].childNodes:
-        city = location_element.getElementsByTagName('city')[0]\
-                .childNodes[0].data
-    if location_element.getElementsByTagName('country')[0].childNodes:
-        country = location_element.getElementsByTagName('country')[0]\
-                .childNodes[0].data
-    if location_element.getElementsByTagName('postalcode')[0].childNodes:
-        postalcode = location_element.getElementsByTagName('postalcode')[0]\
-                .childNodes[0].data
-    return '\n'.join([street, city, country, postalcode])
-
 def parse_date(date_string):
     """ Parse date string into datetime object """
     fmt =  "%a, %d %b %Y %H:%M:%S"