spradio-server-django/savepointradio/core/utils.py

128 lines
4 KiB
Python
Raw Normal View History

2017-12-27 21:11:20 +00:00
import random
2018-01-05 20:18:12 +00:00
import re
2017-12-27 21:11:20 +00:00
import string
2018-01-05 20:18:12 +00:00
from unicodedata import normalize
2017-12-27 21:11:20 +00:00
from django.core.exceptions import ObjectDoesNotExist
from django.db import connection
from .models import Setting
def generate_password(length=32):
2017-12-28 19:44:01 +00:00
chars = string.ascii_letters + string.digits + string.punctuation
2017-12-27 21:11:20 +00:00
rng = random.SystemRandom()
2017-12-28 19:44:01 +00:00
return ''.join([rng.choice(chars) for i in range(length)])
2017-12-27 21:11:20 +00:00
def get_len(rawqueryset):
"""
Adds/Overrides a dynamic implementation of the length protocol to the
definition of RawQuerySet.
"""
def __len__(self):
params = ['{}'.format(p) for p in self.params]
2017-12-28 19:44:01 +00:00
sql = ''.join(('SELECT COUNT(*) FROM (',
rawqueryset.raw_query.format(tuple(params)),
') B;'))
2017-12-27 21:11:20 +00:00
cursor = connection.cursor()
cursor.execute(sql)
row = cursor.fetchone()
return row[0]
return __len__
2017-12-28 19:44:01 +00:00
2017-12-27 21:11:20 +00:00
def get_setting(name):
setting = Setting.objects.get(name=name)
return setting.get()
2017-12-28 19:44:01 +00:00
2017-12-27 21:11:20 +00:00
def set_setting(name, value, setting_type=None):
setting_types = {'Integer': 0, 'Float': 1, 'String': 2, 'Bool': 3}
try:
setting = Setting.objects.get(name=name)
setting.data = str(value)
if setting_type in setting_types:
setting.setting_type = setting_types[setting_type]
setting.save()
except ObjectDoesNotExist:
if setting_type in setting_types:
Setting.objects.create(name=name,
setting_type=setting_types[setting_type],
data=str(value))
else:
2017-12-28 19:44:01 +00:00
error_msg = 'New settings need type (Integer, Float, String, Bool)'
2017-12-27 21:11:20 +00:00
raise TypeError(error_msg)
return
2018-01-05 20:18:12 +00:00
def naturalize(text):
2018-01-05 20:18:12 +00:00
"""
Return a normalized unicode string, with removed starting articles, for use
in natural sorting.
Code was inspired by 'django-naturalsortfield' from Nathan Reynolds:
https://github.com/nathforge/django-naturalsortfield
"""
def naturalize_int_match(match):
2018-01-06 18:11:51 +00:00
return '{:08d}'.format(int(match.group(0)))
2018-01-05 20:18:12 +00:00
text = normalize('NFKD', text).encode('ascii', 'ignore').decode('ascii')
text = text.lower()
punc = re.compile('[{}]'.format(re.escape(string.punctuation)))
text = re.sub(punc, ' ', text)
text = text.strip()
text = re.sub(r'^(a|an|the)\s+', '', text)
text = re.sub(r'\d+', naturalize_int_match, text)
2018-01-05 20:18:12 +00:00
return text
2018-01-14 20:21:04 +00:00
def quantify(quantity, model):
2018-01-14 20:21:04 +00:00
"""
A message based on the quantity and singular/plural name of the model.
2018-01-14 20:21:04 +00:00
"""
if quantity == 1:
message = '1 {}'.format(model._meta.verbose_name)
2018-01-14 20:21:04 +00:00
else:
message = '{} {}'.format(str(quantity),
model._meta.verbose_name_plural)
2018-01-14 20:21:04 +00:00
return message
def create_success_message(parent_model, parent_quantity, child_model,
child_quantity, remove=False):
"""
Creates a message for displaying the success of model modification.
"""
p_message = quantify(parent_quantity, parent_model)
c_message = quantify(child_quantity, child_model)
if remove:
return '{} successfully removed from {}'.format(c_message, p_message)
else:
return '{} successfully added to {}.'.format(c_message, p_message)
2018-03-26 19:28:38 +00:00
def get_pretty_time(seconds):
"""
Displays a human-readable representation of time.
"""
if seconds > 0:
periods = [
('year', 60*60*24*365.25),
('day', 60*60*24),
('hour', 60*60),
('minute', 60),
('second', 1)
]
strings = []
for period_name, period_seconds in periods:
if seconds >= period_seconds:
period_value, seconds = divmod(seconds, period_seconds)
strings.append('{} {}{}'.format(period_value,
period_name,
('s', '')[period_value == 1]))
return ', '.join(strings)
else:
return 'Now'