Last active
August 24, 2022 02:18
-
-
Save mckabi/7990635 to your computer and use it in GitHub Desktop.
Flask Converters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ListConverter(BaseConverter): | |
def to_python(self, value): | |
if isinstance(value, (set, list, tuple)): | |
return list(value) | |
try: | |
parsed_value = json.loads(value) | |
except: | |
parsed_value = None | |
if isinstance(parsed_value, (set, list, tuple)): | |
return parsed_value | |
return value.split(',') | |
def to_url(self, values): | |
return ','.join(map(url_quote, values)) | |
class LongConverter(IntegerConverter): | |
num_convert = long | |
class BooleanConverter(BaseConverter): | |
def __init__(self, url_map, randomify=False): | |
self.regex_true = ['yes', 'y', 'true', 't', '1'] | |
self.regex_false = ['no', 'n', 'false', 'f', '0'] | |
super(BooleanConverter, self).__init__(url_map) | |
self.randomify = randomify | |
self.regex = '(?:{0}|{1}|maybe)'.format('|'.join(self.regex_true), '|'.join(self.regex_false)) | |
def to_python(self, value): | |
if hasattr(value, 'lower'): | |
value = value.lower() | |
if value == 'maybe': | |
if self.randomify: | |
return not random.randrange(2) | |
raise ValidationError() | |
return value in self.regex_true | |
def to_url(self, value): | |
return value and self.regex_true[0] or self.regex_false[0] | |
class DateTimeConverter(BaseConverter): | |
def to_python(self, value): | |
if value == 'now': | |
return now() | |
elif value in ('', None): | |
return value | |
try: | |
value = parse(value) | |
except (ValueError, AttributeError): | |
return value | |
if value.tzinfo is None: | |
current_timezone = getattr(g, 'current_timezone') if hasattr(g, 'current_timezone') else tzlocal() | |
value = value.replace(tzinfo=current_timezone) | |
return value.astimezone(tzutc()) | |
def to_url(self, value): | |
value = value.replace(microsecond=0) | |
if value.tzinfo is None: | |
current_timezone = getattr(g, 'current_timezone') if hasattr(g, 'current_timezone') else tzlocal() | |
value = as_localtime(value, current_timezone) | |
return value.isoformat() | |
app.url_map.converters.update({ | |
'long': helpers.LongConverter, | |
'list': helpers.ListConverter, | |
'bool': helpers.BooleanConverter, | |
'datetime': helpers.DateTimeConverter, | |
'date': helpers.DateTimeConverter, | |
'time': helpers.DateTimeConverter, | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Very good!