[Podcasts] remove unused class
[mygpo.git] / mygpo / core / slugs.py
blob1661c279521489d73991bc97f6cdec6cc61a21c1
1 from itertools import count
3 from django.utils.text import slugify
5 from mygpo.podcasts.models import Slug, Episode
8 # TODO: move to feed-downloader?
9 def assign_missing_episode_slugs(podcast):
10 common_title = podcast.get_common_episode_title()
12 episodes = Episode.objects.filter(podcast=podcast, slugs__isnull=True)
14 for episode in episodes:
15 slug = EpisodeSlug(episode, common_title).get_slug()
16 if slug:
17 episode.set_slug(slug)
20 class SlugGenerator(object):
21 """ Generates a unique slug for an object """
24 def __init__(self, obj, override_existing=False):
25 if obj.slug and not override_existing:
26 raise ValueError('%(obj)s already has slug %(slug)s' % \
27 dict(obj=obj, slug=obj.slug))
29 self.obj = obj
30 self.base_slug = self._get_base_slug(obj)
33 @staticmethod
34 def _get_base_slug(obj):
35 if not obj.title:
36 return None
37 base_slug = slugify(obj.title)
38 return base_slug
41 @staticmethod
42 def _get_existing_slugs():
43 return []
46 def get_slug(self):
47 """ Gets existing slugs and appends numbers until slug is unique """
48 if not self.base_slug:
49 return None
51 existing_slugs = self._get_existing_slugs()
53 if not self.base_slug in existing_slugs:
54 return str(self.base_slug)
56 for n in count(1):
57 tmp_slug = '%s-%d' % (self.base_slug, n)
58 if not tmp_slug in existing_slugs:
59 # slugify returns SafeUnicode, we need a plain string
60 return str(tmp_slug)
62 def _get_existing_slugs(self):
63 query = Slug.objects.filter(scope=self.obj.scope,
64 slug__startswith=self.base_slug)
65 return [s.slug for s in query]
68 class PodcastGroupSlug(SlugGenerator):
69 """ Generates slugs for Podcast Groups """
71 pass
74 class PodcastSlug(PodcastGroupSlug):
75 """ Generates slugs for Podcasts """
77 @staticmethod
78 def _get_base_slug(podcast):
79 base_slug = SlugGenerator._get_base_slug(podcast)
81 if not base_slug:
82 return None
84 # append group_member_name to slug
85 if podcast.group_member_name:
86 member_slug = slugify(podcast.group_member_name)
87 if member_slug and not member_slug in base_slug:
88 base_slug = '%s-%s' % (base_slug, member_slug)
90 return base_slug
94 class EpisodeSlug(SlugGenerator):
95 """ Generates slugs for Episodes """
97 def __init__(self, episode, common_title, override_existing=False):
98 self.common_title = common_title
99 super(EpisodeSlug, self).__init__(episode, override_existing)
100 self.podcast_id = episode.podcast
103 def _get_base_slug(self, obj):
105 number = obj.get_episode_number(self.common_title)
106 if number:
107 return str(number)
109 short_title = obj.get_short_title(self.common_title)
110 if short_title:
111 return slugify(short_title)
113 if obj.title:
114 return slugify(obj.title)
116 return None