import sqlite3 import random def query(db, stmnt): con = sqlite3.connect(db) cur = con.cursor() cur.execute(stmnt) results = cur.fetchall() con.close() return results def get_authors(db): return query(db, 'SELECT * FROM Author ORDER BY lname') def get_quotes(db): stmnt = """SELECT qtext, fname, lname, source, qdate FROM Quote NATURAL JOIN Author ORDER BY RANDOM()""" return query(db, stmnt) def format_quote(raw_quote): """ Return a tuple containing (text, source) for a quote given a raw quote containing [text, author first name, author last name, source document, quote date] where all fields accept text are possibly None values. Source should be set to "Anonymous" if no other info is provided. Examples: >>> format_quote(['Quote', 'F', 'L', 'Source', 'Date']) ('Quote', 'F L, Source, Date') >>> format_quote(['Quote', 'F', 'L', None, None]) ('Quote', 'F L') >>> format_quote(['Quote', 'F', 'L', 'Source', None]) ('Quote', 'F L, Source') >>> format_quote(['Quote', 'F', 'L', None, 'Date']) ('Quote', 'F L, Date') >>> format_quote(['Quote', None, 'L', None, None]) ('Quote', 'L') >>> format_quote(['Quote', None, None, 'Source', None]) ('Quote', 'Source') >>> format_quote(['Quote', None, None, None, None]) ('Quote', 'Anonymous') """ text = raw_quote[0] source = [] # append author name (first and last) to source list if provided if raw_quote[1] and raw_quote[2]: source.append("%s %s" % (raw_quote[1], raw_quote[2])) elif raw_quote[2]: # only last name provided source.append(raw_quote[2]) # append source document and date to source list if provided for item in raw_quote[-2:]: if item: source.append(item) # join the pieces into a string seperated by comma and space if source: source = ", ".join(source) else: # no source information provided, so make it "Anonymous" source = "Anonymous" return text, source def get_random_quote(db): return format_quote(get_quotes(db)[0]) if __name__ == '__main__': import doctest doctest.testmod()