From fa0677de95df4ef2eab75c7960ca248515ef11c7 Mon Sep 17 00:00:00 2001 From: Josh Washburne Date: Wed, 27 Dec 2017 16:11:20 -0500 Subject: [PATCH] Initial Core app commit. --- savepointradio/core/__init__.py | 0 savepointradio/core/admin.py | 10 ++++ savepointradio/core/apps.py | 5 ++ savepointradio/core/behaviors.py | 11 ++++ .../core/migrations/0001_initial.py | 47 +++++++++++++++++ savepointradio/core/migrations/__init__.py | 0 savepointradio/core/models.py | 51 +++++++++++++++++++ savepointradio/core/tests.py | 3 ++ savepointradio/core/utils.py | 49 ++++++++++++++++++ savepointradio/core/views.py | 3 ++ 10 files changed, 179 insertions(+) create mode 100644 savepointradio/core/__init__.py create mode 100644 savepointradio/core/admin.py create mode 100644 savepointradio/core/apps.py create mode 100644 savepointradio/core/behaviors.py create mode 100644 savepointradio/core/migrations/0001_initial.py create mode 100644 savepointradio/core/migrations/__init__.py create mode 100644 savepointradio/core/models.py create mode 100644 savepointradio/core/tests.py create mode 100644 savepointradio/core/utils.py create mode 100644 savepointradio/core/views.py diff --git a/savepointradio/core/__init__.py b/savepointradio/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/savepointradio/core/admin.py b/savepointradio/core/admin.py new file mode 100644 index 0000000..4365793 --- /dev/null +++ b/savepointradio/core/admin.py @@ -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 \ No newline at end of file diff --git a/savepointradio/core/apps.py b/savepointradio/core/apps.py new file mode 100644 index 0000000..26f78a8 --- /dev/null +++ b/savepointradio/core/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class CoreConfig(AppConfig): + name = 'core' diff --git a/savepointradio/core/behaviors.py b/savepointradio/core/behaviors.py new file mode 100644 index 0000000..b4bbf0c --- /dev/null +++ b/savepointradio/core/behaviors.py @@ -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 diff --git a/savepointradio/core/migrations/0001_initial.py b/savepointradio/core/migrations/0001_initial.py new file mode 100644 index 0000000..648ccdd --- /dev/null +++ b/savepointradio/core/migrations/0001_initial.py @@ -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()), + ], + ), + ] diff --git a/savepointradio/core/migrations/__init__.py b/savepointradio/core/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/savepointradio/core/models.py b/savepointradio/core/models.py new file mode 100644 index 0000000..81a4a67 --- /dev/null +++ b/savepointradio/core/models.py @@ -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) diff --git a/savepointradio/core/tests.py b/savepointradio/core/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/savepointradio/core/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/savepointradio/core/utils.py b/savepointradio/core/utils.py new file mode 100644 index 0000000..10bf49c --- /dev/null +++ b/savepointradio/core/utils.py @@ -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 diff --git a/savepointradio/core/views.py b/savepointradio/core/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/savepointradio/core/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.