Beispiel #1
0
    def full_archive(self, activity, delete_after_saved=False):
        pk = activity.id
        REDIS_KEY_RUN = 'game:{}:run'.format(pk)
        REDIS_KEY_START = 'game:{}:start'.format(pk)
        REDIS_KEY_END = 'game:{}:end'.format(pk)
        REDIS_KEY_USER = '******'.format(pk)
        REDIS_KEY_FINAL = 'game:{}:final'.format(pk)

        records = []
        runs = self.redis.hgetall(REDIS_KEY_RUN)
        starts = self.redis.hgetall(REDIS_KEY_START)
        ends = self.redis.hgetall(REDIS_KEY_END)
        users = self.redis.hgetall(REDIS_KEY_USER)
        scores = self.redis.hgetall(REDIS_KEY_FINAL)
        for run_id, uid in iteritems(runs):
            record = {
                'run_id': run_id,
                'uid': uid,
                'start': starts.get(run_id),
                'end': ends.get(run_id),
                'game': pk
            }
            user = users.get(uid)
            if user:
                userinfo = json.loads(user)
            else:
                userinfo = {}
            record.update({
                'info_field_1': userinfo.get('info_field_1'),
                'info_field_2': userinfo.get('info_field_2'),
                'info_field_3': userinfo.get('info_field_3')
            })
            score = scores.get(run_id, 0)
            record.update({'score': int(score)})
            records.append(record)

        if records:
            records = sorted(records, key=lambda r: r.get('score'), reverse=True)
            Archive.delete().where(Archive.game == activity).execute()
            with db.database.atomic():
                for idx in range(0, len(records), 100):
                    Archive.insert_many(records[idx:idx + 100]).execute()

        if delete_after_saved:
            self.redis.delete(REDIS_KEY_RUN)
            self.redis.delete(REDIS_KEY_START)
            self.redis.delete(REDIS_KEY_END)
            self.redis.delete(REDIS_KEY_USER)
            self.redis.delete(REDIS_KEY_FINAL)