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)
def get_all_states(self): from mygpo.users.models import EpisodeUserState r = EpisodeUserState.view('episode_states/by_podcast_episode', startkey = [self.podcast, self._id, None], endkey = [self.podcast, self._id, {}], include_docs=True) return iter(r)
def get_episode_states(podcast): r = EpisodeUserState.view('users/episode_states_by_podcast_episode', startkey = [podcast.get_id(), None, None], endkey = [podcast.get_id(), {}, {}], include_docs = True ) return r
def listener_count(self): """ returns the number of users that have listened to this podcast """ from mygpo.users.models import EpisodeUserState r = EpisodeUserState.view('listeners/by_podcast', startkey = [self.get_id(), None], endkey = [self.get_id(), {}], group = True, group_level = 1, reduce = True, ) return r.first()['value'] if r else 0
def listener_count(self, start=None, end={}): """ returns the number of users that have listened to this episode """ from mygpo.users.models import EpisodeUserState r = EpisodeUserState.view('listeners/by_episode', startkey = [self._id, start], endkey = [self._id, end], reduce = True, group = True, group_level = 1 ) return r.first()['value'] if r else 0
def episode_listener_counts(self): """ (Episode-Id, listener-count) tuples for episodes w/ listeners """ from mygpo.users.models import EpisodeUserState r = EpisodeUserState.view('listeners/by_podcast_episode', startkey = [self.get_id(), None, None], endkey = [self.get_id(), {}, {}], group = True, group_level = 2, reduce = True, ) for res in r: episode = res['key'][1] listeners = res['value'] yield (episode, listeners)
def listener_count_timespan(self, start=None, end={}): """ returns (date, listener-count) tuples for all days w/ listeners """ if isinstance(start, datetime): start = start.isoformat() if isinstance(end, datetime): end = end.isoformat() from mygpo.users.models import EpisodeUserState r = EpisodeUserState.view('listeners/by_podcast', startkey = [self.get_id(), start], endkey = [self.get_id(), end], group = True, group_level = 2, reduce = True, ) for res in r: date = parser.parse(res['key'][1]).date() listeners = res['value'] yield (date, listeners)