From 63f3465ca4c4cca1bf0ff5ece0a3293004fbc0de Mon Sep 17 00:00:00 2001 From: Daniel Dupriest Date: Tue, 22 Jan 2019 17:03:07 -0800 Subject: [PATCH] Created initial user and some sample report objects. Initialized superuser to admin/admin --- back/backend/admin.py | 11 ++- back/backend/migrations/0001_initial.py | 88 ++++++++++++++++++ .../migrations/0002_auto_20190123_0038.py | 58 ++++++++++++ back/db.sqlite3 | Bin 0 -> 208896 bytes back/users/admin.py | 1 + back/users/migrations/0001_initial.py | 45 +++++++++ 6 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 back/backend/migrations/0001_initial.py create mode 100644 back/backend/migrations/0002_auto_20190123_0038.py create mode 100644 back/db.sqlite3 create mode 100644 back/users/migrations/0001_initial.py diff --git a/back/backend/admin.py b/back/backend/admin.py index 8c38f3f..82c2833 100644 --- a/back/backend/admin.py +++ b/back/backend/admin.py @@ -1,3 +1,12 @@ from django.contrib import admin +from .models import * -# Register your models here. +admin.site.register(Report) +admin.site.register(Section) +admin.site.register(Field) +admin.site.register(DataBool) +admin.site.register(DataDecimal) +admin.site.register(DataDate) +admin.site.register(DataFile) +admin.site.register(DataString) +admin.site.register(DataInteger) diff --git a/back/backend/migrations/0001_initial.py b/back/backend/migrations/0001_initial.py new file mode 100644 index 0000000..1176375 --- /dev/null +++ b/back/backend/migrations/0001_initial.py @@ -0,0 +1,88 @@ +# Generated by Django 2.1.5 on 2019-01-23 00:38 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='DataBool', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('data', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='DataDate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('data', models.DateField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='DataDecimal', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('data', models.DecimalField(blank=True, decimal_places=2, max_digits=9, null=True)), + ], + ), + migrations.CreateModel( + name='DataFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('data', models.FileField(blank=True, null=True, upload_to='')), + ], + ), + migrations.CreateModel( + name='DataInteger', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('data', models.IntegerField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='DataString', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('data', models.TextField(default='')), + ], + ), + migrations.CreateModel( + name='Field', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.CharField(max_length=256)), + ('number', models.IntegerField()), + ('type', models.CharField(max_length=128)), + ('completed', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='Report', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=128)), + ('date_created', models.DateTimeField(verbose_name='date created')), + ('date_submitted', models.DateTimeField(blank=True, null=True, verbose_name='date submitted')), + ('submitted', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='Section', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('completed', models.BooleanField()), + ('title', models.CharField(max_length=256)), + ('html_description', models.TextField()), + ('number', models.IntegerField()), + ('report_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.Report')), + ], + ), + ] diff --git a/back/backend/migrations/0002_auto_20190123_0038.py b/back/backend/migrations/0002_auto_20190123_0038.py new file mode 100644 index 0000000..c29c19d --- /dev/null +++ b/back/backend/migrations/0002_auto_20190123_0038.py @@ -0,0 +1,58 @@ +# Generated by Django 2.1.5 on 2019-01-23 00:38 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('backend', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='report', + name='user_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='field', + name='section_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.Section'), + ), + migrations.AddField( + model_name='datastring', + name='field_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.Field'), + ), + migrations.AddField( + model_name='datainteger', + name='field_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.Field'), + ), + migrations.AddField( + model_name='datafile', + name='field_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.Field'), + ), + migrations.AddField( + model_name='datadecimal', + name='field_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.Field'), + ), + migrations.AddField( + model_name='datadate', + name='field_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.Field'), + ), + migrations.AddField( + model_name='databool', + name='field_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.Field'), + ), + ] diff --git a/back/db.sqlite3 b/back/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..9f3a8ef15ae5c1535b26a172205ccaf55b275793 GIT binary patch literal 208896 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 OFbEuX&G@&U|NnnR-PVi% literal 0 HcmV?d00001 diff --git a/back/users/admin.py b/back/users/admin.py index 2787176..f82158a 100644 --- a/back/users/admin.py +++ b/back/users/admin.py @@ -8,5 +8,6 @@ class CustomUserAdmin(UserAdmin): add_form = CustomUserCreationForm form = CustomUserChangeForm model = CustomUser + list_display = ['username', 'email', 'first_name', 'last_name'] admin.site.register(CustomUser, CustomUserAdmin) diff --git a/back/users/migrations/0001_initial.py b/back/users/migrations/0001_initial.py new file mode 100644 index 0000000..89ddacf --- /dev/null +++ b/back/users/migrations/0001_initial.py @@ -0,0 +1,45 @@ +# Generated by Django 2.1.5 on 2019-01-23 00:38 + +import django.contrib.auth.models +import django.contrib.auth.validators +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='CustomUser', + 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')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, 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')), + ('age', models.PositiveIntegerField(blank=True, null=True)), + ('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={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ]