def get(self): while True: new = db.get(LevelStatistics.all(keys_only=True).filter("new =", True).fetch(1000)) if len(new) == 0: break levels = {} for id in set([n.levelid for n in new]): l = Level.gql("WHERE id = :1", id).get() if l is None: continue levels[id] = l updated = [] for n in new: n.new = False updated.append(n) try: l = levels[n.levelid] l.ratings += 1 l.ratingsum += n.rating l.rated = True except KeyError: continue for l in levels.values(): l.rating = float(l.ratingsum) / float(l.ratings) updated.append(l) logging.debug("%s: %f sum=%d ratings=%d" % (l.name, l.rating, l.ratingsum, l.ratings)) db.put(updated)
def do(self): levelid = self.request.get("levelid") l = Level.gql("WHERE id = :1", levelid).get() if l is None: return self.set_error("Level %s does not exist." % levelid) udid = self.request.get("udid") if l.udid == udid: return self.set_error("Sorry, you can't rate your own levels.") levelstat = LevelStatistics.gql("WHERE levelid = :1 AND udid = :2", levelid, udid).get() if levelstat is not None: return self.set_error("Sorry, this level has already been rated from this device.") rating = self.request.get_range("rating", 0, 5) s = LevelStatistics(levelid=levelid, udid=udid, rating=rating, solvetime=self.request.get_range("solvetime", 0, 1000000), pushes=self.request.get_range("pushes", 0, 1000000), moves=self.request.get_range("moves", 0, 1000000), new=True) # make it appear as rated immediately if not l.rated: s.new = False l.ratings = 1 l.ratingsum = rating l.rating = float(rating) l.rated = True l.put() s.put() self.value = "ok"