def update_podcast_subscribers(podcast_id): """ Updates the subscriber count of a podcast """ try: podcast = podcast_by_id(podcast_id) # calculate current number of subscribers subscriber_count = podcast_subscriber_count(podcast) subs_cur = SubscriberData(timestamp=datetime.utcnow(), subscriber_count=subscriber_count) # sort all subscriber data entries subs_all = sorted(podcast.subscribers + [subs_cur], key=lambda e: e.timestamp) # move all but latest two to history subs_history = subscriberdata_for_podcast(podcast_id) subs_history.subscribers = subs_all[:-2] subs_history.save() # move latest two to podcast podcast.subscribers = subs_all[-2:] podcast.save() # TODO: which exceptions? except Exception as ex: raise update_podcast_subscribers.retry(exc=ex)
def subscriber_data(podcasts): coll_data = collections.defaultdict(int) for podcast in podcasts: create_entry = lambda r: (r.timestamp.strftime('%y-%m'), r.subscriber_count) subdata = podcast.subscribers + subscriberdata_for_podcast(podcast.get_id()).subscribers data = dict(map(create_entry, subdata)) for k in data: coll_data[k] += data[k] # create a list of {'x': label, 'y': value} coll_data = sorted([dict(x=a, y=b) for (a, b) in coll_data.items()], key=lambda x: x['x']) return coll_data
def handle(self, *args, **options): total = podcast_count() podcasts = all_podcasts() actions = Counter() for n, podcast in enumerate(podcasts): psubscriber = subscriberdata_for_podcast(podcast.get_id()) res = self.update_subscriber_data(podcast, data=psubscriber) self.update_podcast(podcast=podcast) action = 'updated' if res else 'skipped' actions[action] += 1 status_str = ', '.join('%s: %d' % x for x in actions.items()) progress(n+1, total, status_str)