def changeCell(self, row_nbr, col_nbr, table, name): """ returns the new representation of the table """ col_nbr = int(col_nbr) row_nbr = int(row_nbr) # Get the current state of the clicked cell state = int(table[WIDTH * row_nbr + col_nbr]) # Change it to new value state -= 1 if state < 0: state = 2 # Add the new state to the table position = WIDTH * row_nbr + col_nbr if position == 0: table = str(state) + table[1:] elif position == WIDTH * (WIDTH - 1) + (HEIGHT - 1): table = table[:-1] + str(state) else: table = table[:position] + str(state) + table[position+1:] # Check if the grid is solved bin_number = str(bin(name_to_number(name))) bin_number = bin_number[2:] # Remove the leading '0b'" bin_number = '0'*((WIDTH * HEIGHT)-len(bin_number)) + bin_number solved = True for position in xrange(WIDTH * HEIGHT): if table[position] == '1' and bin_number[position] != '1': solved = False break elif table[position] != '1' and bin_number[position] == '1': solved = False break if solved: table = table.replace('2', '0') table += '1' # Get value from DB grid = self._get_db_entry(name) result = grid.get() if result: result.grid_table = self._decode_table(table) result.state = 1 result.put() else: table += '0' return table
def get(self): userlogin = users.get_current_user() if not userlogin: # Redirect to the login page self.redirect(users.create_login_url(self.request.uri)) else: # Get last unsolved Grid from user last_grid = db.GqlQuery("SELECT * FROM Grid_db " "WHERE user = :user AND " "state = 0 AND " "ANCESTOR IS :ancestor", user = userlogin, ancestor = grid_key()) result = last_grid.get() if result: # Get last unsolved grid # number = name_to_number(result.name) table = result.grid_table number = name_to_number(result.name) else: # Get last entry number previous = db.GqlQuery("SELECT * " "FROM Grid_db " "WHERE ANCESTOR IS :1 " "ORDER BY date DESC LIMIT 1", grid_key()) result = previous.get() if result: prev_number = name_to_number(result.name) else: prev_number = 0 # Get a new valid grid number, _ = next_valid_number(prev_number) table = [[None]*WIDTH for _ in range(HEIGHT)] # Add it to the database state unsolved new_grid = Grid_db(parent=grid_key()) new_grid.user = userlogin new_grid.name = number_to_name(number) new_grid.state = 0 new_grid.grid_type = "nonogram" new_grid.grid_table = table new_grid.put() name = number_to_name(number) col_counts, row_counts = solver.get_counts(number_to_table(number, WIDTH, HEIGHT)) grid = solver.Grid(col_counts, row_counts, table) text_info = "" # if self.request.get('row'): # row = int(self.request.get('row')) # col = int(self.request.get('col')) # # if grid.get_value(col, row) == True: # grid.set_value(col, row, False) # elif grid.get_value(col, row) == False: # grid.set_value(col, row, None) # else: # grid.set_value(col, row, True) # # if grid.is_complete(): # if solver.check_solution(grid): # result.state = 1 # text_info = """ Grid complete ! Congratulation !<br /> # <a href="/">Next</a> """ # # Update the entry in database # result.grid_table = grid.get_grid() # result.put() # Display the problem nonogram = display_nonogram(grid) ##############" # Display recent results recentquery = db.GqlQuery("SELECT * " "FROM Grid_db " "WHERE user = :user AND " "state = 1 AND " "ANCESTOR IS :ancestor " "ORDER BY date DESC LIMIT 5", user = userlogin, ancestor = grid_key()) recent = '' for item in recentquery: recent += display_img(item.grid_table) recent += '<br /> <br />' # Set the Logout link url_logout = users.create_logout_url(self.request.uri) url_logout_text = 'Logout' # Set values that will be used in the template template_values = { 'zoom': ZOOM, 'height_row': ZOOM + 1, 'width': WIDTH, 'height': HEIGHT, 'nonogram': nonogram, 'nonogram_name': name, 'url_logout': url_logout, 'url_logout_text': url_logout_text, 'text_info': text_info, 'recent': recent } # Display the page from the template path = os.path.join(os.path.dirname(__file__), 'index.html') self.response.out.write(template.render(path, template_values))