From 6645b590b87aa944510bc2cad730b1b1a9486148 Mon Sep 17 00:00:00 2001 From: Dmitry Borzenin Date: Fri, 7 Feb 2020 15:52:25 +0300 Subject: [PATCH] Add Parser for News slug --- apps/utils/parsers.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 apps/utils/parsers.py diff --git a/apps/utils/parsers.py b/apps/utils/parsers.py new file mode 100644 index 00000000..30ed754e --- /dev/null +++ b/apps/utils/parsers.py @@ -0,0 +1,43 @@ + + +class NewsSlug: + def __init__(self, value=None, locale=None, count=0): + self.value = value + self.locale = locale + self.count = count + + @classmethod + def parse(cls, raw_slug, country_codes): + slug, *rest = raw_slug.split('-') + instance = NewsSlug() + + if len(rest) >= 1 and rest[-1] in country_codes: + instance.value = '-'.join([slug, *rest[:-1]]) + instance.locale = rest[-1] + elif len(rest) >= 2 and rest[-1].isdigit() and rest[-2] in country_codes: + instance.value = '-'.join([slug, *rest[:-2]]) + instance.locale = rest[-2] + instance.count = int(rest[-1]) + else: + instance.value = '-'.join([slug, *rest]) + + return instance + + def __lt__(self, other): + return self.value < other.value + + def __str__(self): + if self.value is None: + raise ValueError('No value for slug') + + slug_parts = [self.value] + if self.locale is not None: + slug_parts.append(self.locale) + + if self.count != 0: + slug_parts.append(str(self.count)) + + return '-'.join(slug_parts) + + def __repr__(self): + return f'<{self.__class__.__name__} {self.value}, {self.locale}, {self.count}>'