David, That is a much better way of putting a dictionary in a Session - thanks, new source included below. Is there anything else you would do differently/better, not that there is much to this app? Also is there a qp site for qp addons and recipes similar to this? -------------------------------- qp_sites/sudoku/__init__.py -------------------------------- from qpy.compile import compile_qpy_files compile_qpy_files(__path__[0]) from qp.sites.sudoku.slash import SitePublisher, SiteRootDirectory used = [SitePublisher, SiteRootDirectory] # To mute qpcheck.py -------------------------------- qp_sites/sudoku/slash.qpy -------------------------------- from qp.pub.publish import Publisher from qp.pub.session import Session from qp.pub.common import get_site, get_session, header, footer, get_request, get_response, redirect, get_path from qp.fill.directory import Directory from qp.pub.user import User from qp.lib.spec import add_getters from durus.persistent_dict import PersistentDict class MySession(Session): game_is = PersistentDict def __init__(self): Session.__init__(self) self.game = PersistentDict() add_getters(MySession) class SitePublisher (Publisher): configuration = dict( durus_address=('localhost', 7000), http_address=('', 8000), as_https_address=('localhost', 9000), https_address=('localhost', 10000), ) def create_session(self): return MySession() class Cell: def __init__(self, id): self.id = id self.poss = [1,2,3,4,5,6,7,8,9] self.val = "_" self.msg = None def del_poss(self, num): num = int(num) if num in self.poss: del self.poss[self.poss.index(num)] class SiteRootDirectory (Directory): """ This site is a simple Sudoku app (only 3 rules computed). It can solve easy- medium difficulty puzzles and helps remove the cruft in hard puzzles. The app demonstrates a qp Session. Provided as is by Tristan Short - hope you enjoy. """ def get_exports(self): yield ('', '_q_index', None, None) yield ('start_session', 'start_session', None, None) yield ('end_session', 'end_session', None, None) def _q_index [html] (self): sess = get_session() game = sess.get_game() req = get_request() fields = req.fields cnames = [] for a in range(1 , 10): for b in range(1 , 10): cell_name = 'c'+`a`+`b` cnames.append(cell_name) if game.has_key('cells'): cells = game['cells'] else: cells = {} for cell_name in cnames: cell = Cell(cell_name) cells[cell_name] = cell game['cells'] = cells # create sets sets = {} # box sets sets['box1'] = ['c11', 'c12', 'c13', 'c14', 'c15', 'c16', 'c17', 'c18', 'c19'] sets['box2'] = ['c21', 'c22', 'c23', 'c24', 'c25', 'c26', 'c27', 'c28', 'c29'] sets['box3'] = ['c31', 'c32', 'c33', 'c34', 'c35', 'c36', 'c37', 'c38', 'c39'] sets['box4'] = ['c41', 'c42', 'c43', 'c44', 'c45', 'c46', 'c47', 'c48', 'c49'] sets['box5'] = ['c51', 'c52', 'c53', 'c54', 'c55', 'c56', 'c57', 'c58', 'c59'] sets['box6'] = ['c61', 'c62', 'c63', 'c64', 'c65', 'c66', 'c67', 'c68', 'c69'] sets['box7'] = ['c71', 'c72', 'c73', 'c74', 'c75', 'c76', 'c77', 'c78', 'c79'] sets['box8'] = ['c81', 'c82', 'c83', 'c84', 'c85', 'c86', 'c87', 'c88', 'c89'] sets['box9'] = ['c91', 'c92', 'c93', 'c94', 'c95', 'c96', 'c97', 'c98', 'c99'] # row sets sets['row1'] = ['c11', 'c12', 'c13', 'c21', 'c22', 'c23', 'c31', 'c32', 'c33'] sets['row2'] = ['c14', 'c15', 'c16', 'c24', 'c25', 'c26', 'c34', 'c35', 'c36'] sets['row3'] = ['c17', 'c18', 'c19', 'c27', 'c28', 'c29', 'c37', 'c38', 'c39'] sets['row4'] = ['c41', 'c42', 'c43', 'c51', 'c52', 'c53', 'c61', 'c62', 'c63'] sets['row5'] = ['c44', 'c45', 'c46', 'c54', 'c55', 'c56', 'c64', 'c65', 'c66'] sets['row6'] = ['c47', 'c48', 'c49', 'c57', 'c58', 'c59', 'c67', 'c68', 'c69'] sets['row7'] = ['c71', 'c72', 'c73', 'c81', 'c82', 'c83', 'c91', 'c92', 'c93'] sets['row8'] = ['c74', 'c75', 'c76', 'c84', 'c85', 'c86', 'c94', 'c95', 'c96'] sets['row9'] = ['c77', 'c78', 'c79', 'c87', 'c88', 'c89', 'c97', 'c98', 'c99'] # column sets sets['col1'] = ['c11', 'c14', 'c17', 'c41', 'c44', 'c47', 'c71', 'c74', 'c77'] sets['col2'] = ['c12', 'c15', 'c18', 'c42', 'c45', 'c48', 'c72', 'c75', 'c78'] sets['col3'] = ['c13', 'c16', 'c19', 'c43', 'c46', 'c49', 'c73', 'c76', 'c79'] sets['col4'] = ['c21', 'c24', 'c27', 'c51', 'c54', 'c57', 'c81', 'c84', 'c87'] sets['col5'] = ['c22', 'c25', 'c28', 'c52', 'c55', 'c58', 'c82', 'c85', 'c88'] sets['col6'] = ['c23', 'c26', 'c29', 'c53', 'c56', 'c59', 'c83', 'c86', 'c89'] sets['col7'] = ['c31', 'c34', 'c37', 'c61', 'c64', 'c67', 'c91', 'c94', 'c97'] sets['col8'] = ['c32', 'c35', 'c38', 'c62', 'c65', 'c68', 'c92', 'c95', 'c98'] sets['col9'] = ['c33', 'c36', 'c39', 'c63', 'c66', 'c69', 'c93', 'c96', 'c99'] ## deal with entered data if fields.has_key('action'): if fields['action'] == 'select': cname = fields['cname'] value = fields['value'] cells[cname].val = value cells[cname].poss = [] for set in sets.itervalues(): if cname in set: for cellid in set: cells[cellid].del_poss(value) ## add tips for cname in cnames: p = 0 # numbers 1 to 10 #cnt = 0 # count number of copies of number p cid_lst = [] cellid_single = ('','') # holder for cellid that (potentially) has only copy of number p tup = (cellid, p) for set in sets.iteritems(): if cname in set[1]: for p in range(1, 11): cid_lst = [] for cellid in set[1]: if p in cells[cellid].poss: cid_lst.append(cellid) cellid_single = (cellid, p) if len(cid_lst) == 1: cells[cellid_single[0]].msg = "Only cell in set %s that can have value: %i" %(set[0], cellid_single[1]) if ( len(cid_lst) == 2 and set[0] in ['box1', 'box2', 'box3', 'box4', 'box5', 'box6', 'box7', 'box8', 'box9'] ): for set2 in sets.iteritems(): if set2[0] == set[0]: pass elif cid_lst[0] in set2[1] and cid_lst[1] in set2[1]: for cellid2 in set2[1]: if cellid2 in cid_lst: pass # skip the double cells else: cells[cellid2].del_poss(p) if ( len(cid_lst) == 3 and set[0] in ['box1', 'box2', 'box3', 'box4', 'box5', 'box6', 'box7', 'box8', 'box9'] ): for set2 in sets.iteritems(): if set2[0] == set[0]: pass # skip box 'n' sets elif cid_lst[0] in set2[1] and cid_lst[1] in set2[1] and cid_lst[2] in set2[1]: for cellid2 in set2[1]: if cellid2 in cid_lst: pass # skip the double cells else: cells[cellid2].del_poss(p) # start rendering the page header(get_site().get_name()) """ """ '
'
' ' ' ' '' '' ' ' if sess.effective_user: ' '
'Session active'
else:
' '
'Session inactive'
' '
' | '
' '
"qp Sudoku" "
|