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
):
11 self
.base_slug
= self
._get
_base
_slug
(obj
)
14 def _get_base_slug(obj
):
17 base_slug
= slugify(obj
.title
)
21 """ Generates possible slugs
23 The consumer can can consume until it get's an unused one """
26 # The object already has a slug
29 if not self
.base_slug
:
32 # first we try with the base slug
33 yield str(self
.base_slug
)
36 tmp_slug
= '%s-%d' % (self
.base_slug
, n
)
37 # slugify returns SafeUnicode, we need a plain string
41 class PodcastGroupSlugs(SlugGenerator
):
42 """ Generates slugs for Podcast Groups """
46 class PodcastSlugs(PodcastGroupSlugs
):
47 """ Generates slugs for Podcasts """
49 def _get_base_slug(self
, podcast
):
50 base_slug
= SlugGenerator
._get
_base
_slug
(podcast
)
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
)
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
)
76 short_title
= obj
.get_short_title(self
.common_title
)
78 return slugify(short_title
)
81 return slugify(obj
.title
)