# songs/ui/song.qpy # For further information - # - QPY templates: http://www.mems-exchange.org/software/qpy/ # - QP Python web framework: http://www.mems-exchange.org/software/qpy/ import sys from qp.fill.css import BASIC_FORM_CSS from qp.fill.directory import Directory from qp.fill.form import Form from qp.pub.common import header, footer, page, redirect from qp.sites.songs.song import get_song_db from qp.sites.songs.api import SongDatabaseResource class SongDatabaseDirectory(Directory): def get_exports(self): yield ('', 'index', 'Song List', 'This is the root / page of this site.') yield ('api', 'api', 'API', 'API documentation and entry point') yield ('new', 'new', 'New', 'Add a song to collection') yield ('delete', 'clear', 'Delete', 'Delete all songs from collection') def index:xml(self): header('Song Database') '

Songs

' '' footer() def clear:xml(self): form = Form() form.add_submit('clear', "Yes, I'm certain, clear the database!") form.add_submit('cancel', 'Cancel') if form.get('cancel'): redirect('.') if not form.is_submitted(): page('Delete all songs from collection', '

Are you certain you wish to delete ' 'all songs from the collection?

', form.render(), style=BASIC_FORM_CSS) else: get_song_db().clear() redirect('.') def new:xml(self): _edit_form(get_song_db().create_song()) def _q_lookup(self, component): try: component = int(component) song = get_song_db().get(component) if song: return SongDirectory(song) except ValueError: # None / an empty '' response being returned from _q_lookup # will result in 404 not_found being delivered as the response. return None api = SongDatabaseResource() class SongDirectory(Directory): def __init__(self, song): self.song = song def get_exports(self): yield ('', 'index', 'Song Info', None) yield ('edit', 'edit', 'Edit', 'Edit song data') yield ('listened', 'next', 'Listened', "Add to the song's listened-to count") yield ('remove', 'delete', 'Delete', 'Remove song from collection') def _header:xml(self): '

' self.song.title '

' def index:xml(self): header(self.song.title) self._header() '

This tune has been heard %d times.

' % \ self.song.was_heard() footer() def edit:xml(self): _edit_form(self.song, header=self._header()) def next(self): form = Form() form.add_submit('heard_it', 'I listened to this song!') form.add_submit('cancel', 'Cancel') def render:xml(): page('Did you hear it?', self._header(), '

Keep track of how many times you heard ' '%s! So far it has been ' 'listened to %d times.

' % ( self.song.title, self.song.was_heard()), form.render(), style=BASIC_FORM_CSS) if form.get('cancel'): redirect('.') if not form.has_errors() and form.get('heard_it'): self.song.counter.next() return render() def delete:xml(self): form = Form() form.add_submit('delete', 'Yes, remove this song from the collection.') form.add_submit('cancel', 'No, get me out of here!') def render:xml(): page('Delete %s?' % self.song.title, self._header(), '

Confirm Deletion

' '

Do you really want to permanently remove ' '%s from the collection?

' % self.song.title, form.render(), style=BASIC_FORM_CSS) if form.get('cancel'): redirect('.') if not form.has_errors() and form.get('delete'): get_song_db().remove(self.song) redirect('..') return render() def _edit_form:xml(song, header=None): form = Form() form.add_string('song_title', song.title, title='Song Title', required=True) form.add_submit('save', 'Save') form.add_submit('cancel', 'Cancel') def render(): title = 'Add Song' if not song.key else 'Edit %s' % song.title return page(title, header, form.render(), style=BASIC_FORM_CSS) if form.get('cancel'): redirect('.') if form.is_submitted(): # basic validation existing = get_song_db().get_by_title(form.get('song_title')) if existing and song.key != existing.key: form.set_error('song_title', 'Song with this title already exists.') if not form.is_submitted() or form.has_errors(): render() else: song.title = form.get('song_title') try: if not song.key: get_song_db().add(song) redirect('./%s/' % song.key) else: redirect('.') except ValueError: form.set_error('song_title', sys.exc_info()[1]) render()