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()
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
))
30 self
.base_slug
= self
._get
_base
_slug
(obj
)
34 def _get_base_slug(obj
):
37 base_slug
= slugify(obj
.title
)
42 def _get_existing_slugs():
47 """ Gets existing slugs and appends numbers until slug is unique """
48 if not self
.base_slug
:
51 existing_slugs
= self
._get
_existing
_slugs
()
53 if not self
.base_slug
in existing_slugs
:
54 return str(self
.base_slug
)
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
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 """
74 class PodcastSlug(PodcastGroupSlug
):
75 """ Generates slugs for Podcasts """
78 def _get_base_slug(podcast
):
79 base_slug
= SlugGenerator
._get
_base
_slug
(podcast
)
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
)
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
)
109 short_title
= obj
.get_short_title(self
.common_title
)
111 return slugify(short_title
)
114 return slugify(obj
.title
)