use protocol-relative imports in base.html
[mygpo.git] / mygpo / admin / tasks.py
blobe84f4c9e932fcd37a2c1a853160f5aefd2cb9cdd
1 from collections import Counter
3 from mygpo.cel import celery
4 from mygpo.core.slugs import get_duplicate_slugs, EpisodeSlug
5 from mygpo.maintenance.merge import PodcastMerger
6 from mygpo.db.couchdb.podcast import podcasts_by_id
7 from mygpo.db.couchdb.episode import episodes_for_podcast_uncached
9 from celery.utils.log import get_task_logger
10 logger = get_task_logger(__name__)
13 @celery.task
14 def merge_podcasts(podcast_ids, num_groups):
15 """ Task to merge some podcasts"""
17 logger.info('merging podcast ids %s', podcast_ids)
19 podcasts = podcasts_by_id(podcast_ids)
21 logger.info('merging podcasts %s', podcasts)
23 actions = Counter()
25 pm = PodcastMerger(podcasts, actions, num_groups)
26 podcast = pm.merge()
28 logger.info('merging result: %s', actions)
30 return actions, podcast
33 @celery.task
34 def unify_slugs(podcast):
35 """ Removes duplicate slugs of a podcast's episodes """
37 logger.warn('unifying slugs for podcast %s', podcast)
38 episodes = episodes_for_podcast_uncached(podcast)
39 logger.info('found %d episodes', len(episodes))
41 common_title = podcast.get_common_episode_title()
42 actions = Counter()
44 # get episodes with duplicate slugs
45 for slug, dups in get_duplicate_slugs(episodes):
46 actions['dup-slugs'] += 1
47 # and remove their slugs
48 logger.info('Found %d duplicates for slug %s', len(dups), slug)
49 for dup in dups:
50 actions['dup-episodes'] += 1
52 # check if we're removing the "main" slug
53 if dup.slug == slug:
55 # if possible, replace it with a "merged" slug
56 if dup.merged_slugs:
57 dup.slug = dup.merged_slugs.pop()
58 actions['replaced-with-merged'] += 1
59 logger.info('Replacing slug with merged slug %s', dup.slug)
61 # try to find a new slug
62 else:
63 dup.slug = EpisodeSlug(dup, common_title,
64 override_existing=True).get_slug()
65 actions['replaced-with-new'] += 1
66 logger.info('Replacing slug with new slug %s', dup.slug)
68 # if the problematic slug is a merged one, remove it
69 if slug in dup.merged_slugs:
70 actions['removed-merged'] += 1
71 logger.info('Removing merged slug %s', slug)
72 dup.merged_slugs.remove(slug)
74 dup.save()
76 return actions, podcast