def update_episodes(user, actions, now, ua_string): update_urls = [] grouped_actions = defaultdict(list) # group all actions by their episode for action in actions: podcast_url = action['podcast'] podcast_url = sanitize_append(podcast_url, 'podcast', update_urls) if podcast_url == '': continue episode_url = action['episode'] episode_url = sanitize_append(episode_url, 'episode', update_urls) if episode_url == '': continue act = parse_episode_action(action, user, update_urls, now, ua_string) grouped_actions[ (podcast_url, episode_url) ].append(act) # Prepare the updates for each episode state obj_funs = [] for (p_url, e_url), action_list in grouped_actions.iteritems(): episode_state = EpisodeUserState.for_ref_urls(user, p_url, e_url) fun = partial(update_episode_actions, action_list=action_list) obj_funs.append( (episode_state, fun) ) db = get_main_database() bulk_save_retry(db, obj_funs) return update_urls
def execute(self): """ Executes all added actions in bulk """ db = get_main_database() obj_funs = map(self._get_obj_fun, self.actions) bulk_save_retry(db, obj_funs) # prepare for another run self.actions = []
def handle(self, *args, **options): skip = options.get('skip') total = EpisodeUserState.view('episode_states/by_user_episode', limit=0, ).total_rows db = get_main_database() actions = Counter() actions['merged'] = 0 for n in count(skip): first = EpisodeUserState.view('episode_states/by_user_episode', skip = n, include_docs = True, limit = 1, ) first = list(first) if not first: break first = first[0] states = EpisodeUserState.view('episode_states/by_user_episode', key = [first.user, first.episode], include_docs = True, ) states = list(states) l1 = len(states) # we don't want to delete this one states.remove(first) assert len(states) == l1-1 if states: updater = get_updater(states) obj_funs = [(first, updater)] + [(state, do_delete) for state in states] bulk_save_retry(db, obj_funs) merged = len(states)-1 actions['merged'] += merged total -= merged status_str = ', '.join('%s: %d' % x for x in actions.items()) progress(n+1, total, status_str)