Bump python-dateutil from 2.7.3 to 2.7.4
[mygpo.git] / mygpo / core / slugs.py
blobeaaa6bd4bfa1bec04c72133efe10b1baf38bef37
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 self.obj = obj
11 self.base_slug = self._get_base_slug(obj)
13 @staticmethod
14 def _get_base_slug(obj):
15 if not obj.title:
16 return None
17 base_slug = slugify(obj.title)
18 return base_slug
20 def __iter__(self):
21 """ Generates possible slugs
23 The consumer can can consume until it get's an unused one """
25 if self.obj.slug:
26 # The object already has a slug
27 raise StopIteration
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