From: Jon Date: Thu, 27 May 2010 23:00:57 +0000 (+0100) Subject: Change to use json and event objects X-Git-Url: http://git.maemo.org/git/?p=gigfinder;a=commitdiff_plain;h=cbc998e09ef123ff713c59b76ca37b00a2487bee Change to use json and event objects --- diff --git a/src/opt/gigfinder/events.py b/src/opt/gigfinder/events.py index 1b4902c..390ccae 100644 --- a/src/opt/gigfinder/events.py +++ b/src/opt/gigfinder/events.py @@ -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: diff --git a/src/opt/gigfinder/gigfinder.py b/src/opt/gigfinder/gigfinder.py index 016247a..d360de9 100755 --- a/src/opt/gigfinder/gigfinder.py +++ b/src/opt/gigfinder/gigfinder.py @@ -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() diff --git a/src/opt/gigfinder/locator.py b/src/opt/gigfinder/locator.py index e562e8d..8ed0ece 100644 --- a/src/opt/gigfinder/locator.py +++ b/src/opt/gigfinder/locator.py @@ -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] diff --git a/src/opt/gigfinder/resultsparser.py b/src/opt/gigfinder/resultsparser.py index 9f50ae8..47deac0 100644 --- a/src/opt/gigfinder/resultsparser.py +++ b/src/opt/gigfinder/resultsparser.py @@ -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"