Initial Core app commit.
This commit is contained in:
parent
739820d401
commit
fa0677de95
10 changed files with 179 additions and 0 deletions
0
savepointradio/core/__init__.py
Normal file
0
savepointradio/core/__init__.py
Normal file
10
savepointradio/core/admin.py
Normal file
10
savepointradio/core/admin.py
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from authtools.admin import UserAdmin
|
||||||
|
|
||||||
|
from .models import RadioUser
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(RadioUser)
|
||||||
|
class RadioUserAdmin(UserAdmin):
|
||||||
|
pass
|
5
savepointradio/core/apps.py
Normal file
5
savepointradio/core/apps.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class CoreConfig(AppConfig):
|
||||||
|
name = 'core'
|
11
savepointradio/core/behaviors.py
Normal file
11
savepointradio/core/behaviors.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
from django.db import models
|
||||||
|
from django.utils import timezone
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
|
class Timestampable(models.Model):
|
||||||
|
created_date = models.DateTimeField(_('added on'), auto_now_add=True)
|
||||||
|
modified_date = models.DateTimeField(_('last modified'), auto_now=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
47
savepointradio/core/migrations/0001_initial.py
Normal file
47
savepointradio/core/migrations/0001_initial.py
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
# Generated by Django 2.0 on 2017-12-27 21:02
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.utils.timezone
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('auth', '0009_alter_user_last_name_max_length'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='RadioUser',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('password', models.CharField(max_length=128, verbose_name='password')),
|
||||||
|
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
|
||||||
|
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
|
||||||
|
('email', models.EmailField(max_length=255, unique=True, verbose_name='email address')),
|
||||||
|
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
|
||||||
|
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
||||||
|
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
||||||
|
('name', models.CharField(max_length=255, verbose_name='name')),
|
||||||
|
('is_dj', models.BooleanField(default=False, help_text='Designates whether this user is the automated dj account or is a real person account.', verbose_name='dj status')),
|
||||||
|
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
|
||||||
|
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'ordering': ['name', 'email'],
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Setting',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=64, unique=True)),
|
||||||
|
('description', models.TextField(blank=True)),
|
||||||
|
('setting_type', models.PositiveIntegerField(choices=[(0, 'Integer'), (1, 'Float'), (2, 'String'), (3, 'Bool')], default=0)),
|
||||||
|
('data', models.TextField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
0
savepointradio/core/migrations/__init__.py
Normal file
0
savepointradio/core/migrations/__init__.py
Normal file
51
savepointradio/core/models.py
Normal file
51
savepointradio/core/models.py
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
from django.db import models
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
from authtools.models import AbstractNamedUser
|
||||||
|
|
||||||
|
|
||||||
|
class RadioUser(AbstractNamedUser):
|
||||||
|
"""
|
||||||
|
Custom user model which uses email as the main identifier and adds a flag
|
||||||
|
for whether the user is the radio DJ.
|
||||||
|
"""
|
||||||
|
is_dj = models.BooleanField(_('dj status'),
|
||||||
|
default=False,
|
||||||
|
help_text=_('Designates whether this user is '
|
||||||
|
'the automated dj account or is a '
|
||||||
|
'real person account.'))
|
||||||
|
|
||||||
|
|
||||||
|
class Setting(models.Model):
|
||||||
|
"""
|
||||||
|
A model for keeping track of dynamic settings while the site is online and
|
||||||
|
the radio is running.
|
||||||
|
"""
|
||||||
|
INTEGER = 0
|
||||||
|
FLOAT = 1
|
||||||
|
STRING = 2
|
||||||
|
BOOL = 3
|
||||||
|
TYPE_CHOICES = (
|
||||||
|
(INTEGER, 'Integer'),
|
||||||
|
(FLOAT, 'Float'),
|
||||||
|
(STRING, 'String'),
|
||||||
|
(BOOL, 'Bool'),
|
||||||
|
)
|
||||||
|
name = models.CharField(max_length=64, unique=True)
|
||||||
|
description = models.TextField(blank=True)
|
||||||
|
setting_type = models.PositiveIntegerField(choices=TYPE_CHOICES,
|
||||||
|
default=INTEGER)
|
||||||
|
data = models.TextField()
|
||||||
|
|
||||||
|
def get(self):
|
||||||
|
if self.setting_type == self.INTEGER:
|
||||||
|
return int(self.data)
|
||||||
|
elif self.setting_type == self.FLOAT:
|
||||||
|
return float(self.data)
|
||||||
|
elif self.setting_type == self.BOOL:
|
||||||
|
return self.data == 'True'
|
||||||
|
else:
|
||||||
|
return self.data
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return '{}: {}'.format(self.name, self.data)
|
3
savepointradio/core/tests.py
Normal file
3
savepointradio/core/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
49
savepointradio/core/utils.py
Normal file
49
savepointradio/core/utils.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
|
||||||
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
from django.db import connection
|
||||||
|
|
||||||
|
from .models import Setting
|
||||||
|
|
||||||
|
|
||||||
|
def generate_password(length=32):
|
||||||
|
possible_characters = string.ascii_letters + string.digits + string.punctuation
|
||||||
|
rng = random.SystemRandom()
|
||||||
|
return ''.join([rng.choice(possible_characters) for i in range(length)])
|
||||||
|
|
||||||
|
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]
|
||||||
|
sql = 'SELECT COUNT(*) FROM (' + rawqueryset.raw_query.format(tuple(params)) + ') B;'
|
||||||
|
cursor = connection.cursor()
|
||||||
|
cursor.execute(sql)
|
||||||
|
row = cursor.fetchone()
|
||||||
|
return row[0]
|
||||||
|
return __len__
|
||||||
|
|
||||||
|
def get_setting(name):
|
||||||
|
setting = Setting.objects.get(name=name)
|
||||||
|
return setting.get()
|
||||||
|
|
||||||
|
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:
|
||||||
|
error_msg = 'New settings need a type (Integer, Float, String, Bool)'
|
||||||
|
raise TypeError(error_msg)
|
||||||
|
return
|
3
savepointradio/core/views.py
Normal file
3
savepointradio/core/views.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
Loading…
Reference in a new issue