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)