6f4db3ca5a28869f6715986c4e3892c16143f3a6
[gigfinder] / gig_finder.py
1 from xml.dom.minidom import parseString
2 from datetime import datetime, date
3 import time
4 import gtk
5 import hildon
6
7 def parse_xml(xml):
8     """ Parse xml into a dict """
9     events_list = []
10     today = date.today()
11     dom = parseString(xml)
12
13     events = dom.getElementsByTagName('event')
14     for event in events:
15         title = event.getElementsByTagName('title')[0].childNodes[0].data
16         
17         artists_element = event.getElementsByTagName('artists')[0]
18         artist_list = []
19         for artist in artists_element.getElementsByTagName('artist'):
20             artist_list.append(artist.childNodes[0].data)
21         artists = ', '.join(artist_list)
22
23         venue = event.getElementsByTagName('venue')[0].getElementsByTagName('name')[0].childNodes[0].data
24         start_date = parse_date(event.getElementsByTagName('startDate')[0].childNodes[0].data)
25         events_list.append({'title': title,
26                             'venue': venue,
27                             'artists': artists,
28                             'date': start_date})
29     return events_list
30
31 def parse_date(date_string):
32     fmt =  "%a, %d %b %Y %H:%M:%S"
33     result = time.strptime(date_string, fmt)
34     return datetime(result.tm_year, 
35                     result.tm_mon, 
36                     result.tm_mday, 
37                     result.tm_hour, 
38                     result.tm_min, 
39                     result.tm_sec)
40
41 def get_xml():
42     # TODO: Add code to retrieve location and data from lastfm
43     return open('response.xml', 'r').read()
44
45 def create_table(events):
46     table = gtk.Table(columns=1)
47     table.set_row_spacings(10)
48     table.set_col_spacings(10)
49
50     table.show()
51     pos = 0
52     for event in events:
53         button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, 
54                                hildon.BUTTON_ARRANGEMENT_VERTICAL)
55         button.set_text(event['title'], "")
56         button.connect("clicked", show_details, event)
57         table.attach(button, 0, 1, pos, pos+1)
58         pos += 1
59     return table
60
61 def show_details(widget, data):
62     win = hildon.StackableWindow()
63     win.set_title(data['title'])
64
65     win.vbox = gtk.VBox()
66     win.add(win.vbox)
67
68     scroll = hildon.PannableArea()
69     win.vbox.pack_start(scroll, True, True, 0)
70
71     view = hildon.TextView()
72     view.set_editable(False)
73     view.unset_flags(gtk.CAN_FOCUS)
74     view.set_wrap_mode(gtk.WRAP_WORD)
75     buffer = view.get_buffer()
76     end = buffer.get_end_iter()
77     buffer.insert(end, '%s\n' % data['title'])
78     buffer.insert(end, 'Artists: %s\n' % data['artists'])
79     buffer.insert(end, 'Venue: %s\n' % data['venue'])
80     buffer.insert(end, 'When: %s\n' % data['date'].strftime('%H:%M'))
81     buffer.insert(end, '\n')
82     scroll.add_with_viewport(view)
83
84     win.show_all()
85
86 def main():
87     program = hildon.Program.get_instance()
88     win = hildon.StackableWindow()
89     win.set_title('Gig Finder')
90     win.connect("destroy", gtk.main_quit, None)
91
92     pannable_area = hildon.PannableArea()
93    
94     xml = get_xml()
95     events = parse_xml(xml)
96
97     table = create_table(events)
98     pannable_area.add_with_viewport(table)
99
100     win.add(pannable_area)
101     win.show_all()
102     gtk.main()
103
104 if __name__ == "__main__":
105     main()