Fix generating candidate Slugs for podcast update
[mygpo.git] / mygpo / core / slugs.py
blob230fb15abb78c7a1f46519b3708831b36e57d8e1
1 from itertools import count
3 from django.utils.text import slugify
6 class SlugGenerator(object):
7 """ Generates a unique slug for an object """
9 def __init__(self, obj):
10 if obj.slug:
11 raise ValueError('%(obj)s already has slug %(slug)s' %
12 dict(obj=obj, slug=obj.slug))
14 self.obj = obj
15 self.base_slug = self._get_base_slug(obj)
17 @staticmethod
18 def _get_base_slug(obj):
19 if not obj.title:
20 return None
21 base_slug = slugify(obj.title)
22 return base_slug
24 def __iter__(self):
25 """ Generates possible slugs
27 The consumer can can consume until it get's an unused one """
29 if not self.base_slug:
30 raise StopIteration
32 # first we try with the base slug
33 yield str(self.base_slug)
35 for n in count(1):
36 tmp_slug = '%s-%d' % (self.base_slug, n)
37 # slugify returns SafeUnicode, we need a plain string
38 yield str(tmp_slug)
41 class PodcastGroupSlugs(SlugGenerator):
42 """ Generates slugs for Podcast Groups """
43 pass
46 class PodcastSlugs(PodcastGroupSlugs):
47 """ Generates slugs for Podcasts """
49 def _get_base_slug(self, podcast):
50 base_slug = SlugGenerator._get_base_slug(podcast)
52 if not base_slug:
53 return None
55 # append group_member_name to slug
56 if podcast.group_member_name:
57 member_slug = slugify(podcast.group_member_name)
58 if member_slug and not member_slug in base_slug:
59 base_slug = '%s-%s' % (base_slug, member_slug)
61 return base_slug
64 class EpisodeSlugs(SlugGenerator):
65 """ Generates slugs for Episodes """
67 def __init__(self, episode, common_title):
68 self.common_title = common_title
69 super().__init__(episode)
71 def _get_base_slug(self, obj):
72 number = obj.get_episode_number(self.common_title)
73 if number:
74 return str(number)
76 short_title = obj.get_short_title(self.common_title)
77 if short_title:
78 return slugify(short_title)
80 if obj.title:
81 return slugify(obj.title)
83 return None