From 8287fef883f79489a59884321b97768b3a563820 Mon Sep 17 00:00:00 2001 From: Bill DeRusha Date: Fri, 18 Mar 2016 15:58:05 -0400 Subject: [PATCH] Basic data model (no overrides, no multitenant) --- course_discovery/apps/core/admin.py | 14 +- .../core/migrations/0004_language_locale.py | 46 ++++ course_discovery/apps/core/models.py | 24 ++ .../migrations/0003_auto_20160318_1900.py | 214 ++++++++++++++++++ .../apps/course_metadata/models.py | 114 +++++++++- 5 files changed, 409 insertions(+), 3 deletions(-) create mode 100644 course_discovery/apps/core/migrations/0004_language_locale.py create mode 100644 course_discovery/apps/course_metadata/migrations/0003_auto_20160318_1900.py diff --git a/course_discovery/apps/core/admin.py b/course_discovery/apps/core/admin.py index 5dd43b29a8..77da2867f7 100644 --- a/course_discovery/apps/core/admin.py +++ b/course_discovery/apps/core/admin.py @@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _ from course_discovery.apps.core.forms import UserThrottleRateForm -from course_discovery.apps.core.models import User, UserThrottleRate +from course_discovery.apps.core.models import Language, Locale, User, UserThrottleRate class CustomUserAdmin(UserAdmin): @@ -26,5 +26,17 @@ class UserThrottleRateAdmin(admin.ModelAdmin): raw_id_fields = ('user',) +class LocaleAdmin(admin.ModelAdmin): + """ Admin configuration for the Locale model. """ + list_display = ('iso_code', 'name', 'language') + + +class LanguageAdmin(admin.ModelAdmin): + """ Admin configuration for the Locale model. """ + list_display = ('iso_code', 'name',) + + admin.site.register(User, CustomUserAdmin) admin.site.register(UserThrottleRate, UserThrottleRateAdmin) +admin.site.register(Locale, LocaleAdmin) +admin.site.register(Language, LanguageAdmin) diff --git a/course_discovery/apps/core/migrations/0004_language_locale.py b/course_discovery/apps/core/migrations/0004_language_locale.py new file mode 100644 index 0000000000..8be7ec10c7 --- /dev/null +++ b/course_discovery/apps/core/migrations/0004_language_locale.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import django_extensions.db.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0003_auto_20160315_1910'), + ] + + operations = [ + migrations.CreateModel( + name='Language', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('iso_code', models.CharField(max_length=2)), + ('name', models.CharField(max_length=255)), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='Locale', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('iso_code', models.CharField(max_length=5)), + ('name', models.CharField(max_length=255)), + ('language', models.ForeignKey(to='core.Language')), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + ] diff --git a/course_discovery/apps/core/models.py b/course_discovery/apps/core/models.py index d1c092eb21..3269676bd8 100644 --- a/course_discovery/apps/core/models.py +++ b/course_discovery/apps/core/models.py @@ -3,6 +3,7 @@ from django.contrib.auth.models import AbstractUser from django.db import models from django.utils.translation import ugettext_lazy as _ +from django_extensions.db.models import TimeStampedModel class User(AbstractUser): @@ -37,3 +38,26 @@ class UserThrottleRate(models.Model): 'The rate of requests to limit this user to. The format is specified by Django' ' Rest Framework (see http://www.django-rest-framework.org/api-guide/throttling/).') ) + + +class Language(TimeStampedModel): + """ + Language model. + """ + iso_code = models.CharField(max_length=2) + name = models.CharField(max_length=255) + + def __str__(self): + return self.iso_code + + +class Locale(TimeStampedModel): + """ + Locale model. + """ + iso_code = models.CharField(max_length=5) + name = models.CharField(max_length=255) + language = models.ForeignKey(Language) + + def __str__(self): + return self.iso_code diff --git a/course_discovery/apps/course_metadata/migrations/0003_auto_20160318_1900.py b/course_discovery/apps/course_metadata/migrations/0003_auto_20160318_1900.py new file mode 100644 index 0000000000..9baadbe4fe --- /dev/null +++ b/course_discovery/apps/course_metadata/migrations/0003_auto_20160318_1900.py @@ -0,0 +1,214 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import django_extensions.db.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0004_language_locale'), + ('course_metadata', '0002_course_name'), + ] + + operations = [ + migrations.CreateModel( + name='CourseOrganization', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('type', models.CharField(max_length=100)), + ('course', models.ForeignKey(related_name='relationship', to='course_metadata.Course')), + ('organization', models.ForeignKey(related_name='relationship', to='course_metadata.Organization')), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='CourseRunPerson', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('type', models.CharField(max_length=100)), + ('index', models.IntegerField()), + ('course_run', models.ForeignKey(related_name='relationship', to='course_metadata.CourseRun')), + ('person', models.ForeignKey(related_name='relationship', to='course_metadata.Person')), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='Effort', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('min', models.IntegerField()), + ('max', models.IntegerField()), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='ExpectedLearningItem', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('value', models.CharField(max_length=255)), + ('index', models.IntegerField()), + ('course', models.ForeignKey(to='course_metadata.Course')), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='Image', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('height', models.IntegerField()), + ('width', models.IntegerField()), + ('src', models.CharField(max_length=255)), + ('description', models.CharField(max_length=255)), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='LevelType', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('name', models.CharField(max_length=255)), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='PacingType', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('name', models.CharField(max_length=255)), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='Prerequisite', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('name', models.CharField(max_length=255)), + ('course', models.ManyToManyField(to='course_metadata.Course')), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='Subject', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('name', models.CharField(max_length=255)), + ('course', models.ManyToManyField(to='course_metadata.Course')), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='SyllabusItem', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('index', models.IntegerField()), + ('value', models.CharField(max_length=255)), + ('course_run', models.ForeignKey(to='course_metadata.CourseRun')), + ('parent', models.ForeignKey(blank=True, null=True, related_name='children', to='course_metadata.SyllabusItem')), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='TranscriptLocale', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('course_run', models.ForeignKey(to='course_metadata.CourseRun')), + ('locale', models.ForeignKey(to='core.Locale')), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.CreateModel( + name='Video', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('type', models.CharField(max_length=255)), + ('src', models.CharField(max_length=255)), + ('description', models.CharField(max_length=255)), + ('image', models.ForeignKey(to='course_metadata.Image')), + ], + options={ + 'ordering': ('-modified', '-created'), + 'abstract': False, + 'get_latest_by': 'modified', + }, + ), + migrations.AddField( + model_name='course', + name='organizations', + field=models.ManyToManyField(through='course_metadata.CourseOrganization', to='course_metadata.Organization'), + ), + migrations.AddField( + model_name='courserun', + name='people', + field=models.ManyToManyField(through='course_metadata.CourseRunPerson', to='course_metadata.Person'), + ), + ] diff --git a/course_discovery/apps/course_metadata/models.py b/course_discovery/apps/course_metadata/models.py index 675d222484..a3dda1c3c6 100644 --- a/course_discovery/apps/course_metadata/models.py +++ b/course_discovery/apps/course_metadata/models.py @@ -3,6 +3,8 @@ from django.db import models from django_extensions.db.models import TimeStampedModel +from course_discovery.apps.core.models import Locale + logger = logging.getLogger(__name__) @@ -10,8 +12,9 @@ class Course(TimeStampedModel): """ Course model. """ - key = models.CharField(max_length=255) - name = models.CharField(max_length=255) + key = models.CharField(max_length=255) + name = models.CharField(max_length=255) + organizations = models.ManyToManyField('Organization', through='CourseOrganization') class CourseRun(TimeStampedModel): @@ -25,6 +28,7 @@ class CourseRun(TimeStampedModel): default=None, null=False ) + people = models.ManyToManyField('Person', through='CourseRunPerson') class Organization(TimeStampedModel): @@ -39,3 +43,109 @@ class Person(TimeStampedModel): Person model. """ key = models.CharField(max_length=255) + + +class Image(TimeStampedModel): + """ + Image model. + """ + height = models.IntegerField() + width = models.IntegerField() + src = models.CharField(max_length=255) + description = models.CharField(max_length=255) + + +class Video(TimeStampedModel): + """ + Video model. + """ + image = models.ForeignKey(Image) + type = models.CharField(max_length=255) + src = models.CharField(max_length=255) + description = models.CharField(max_length=255) + + +class Effort(TimeStampedModel): + """ + Effort model. + """ + min = models.IntegerField() + max = models.IntegerField() + + +class LevelType(TimeStampedModel): + """ + LevelType model. + """ + name = models.CharField(max_length=255) + + +class PacingType(TimeStampedModel): + """ + PacingType model. + """ + name = models.CharField(max_length=255) + + +class Subject(TimeStampedModel): + """ + Subject model. + """ + course = models.ManyToManyField(Course) + name = models.CharField(max_length=255) + + +class Prerequisite(TimeStampedModel): + """ + Prerequisite model. + """ + course = models.ManyToManyField(Course) + name = models.CharField(max_length=255) + + +class ExpectedLearningItem(TimeStampedModel): + """ + ExpectedLearningItem model. + """ + value = models.CharField(max_length=255) + course = models.ForeignKey(Course) + index = models.IntegerField() + + +class SyllabusItem(TimeStampedModel): + """ + SyllabusItem model. + """ + parent = models.ForeignKey('self', blank=True, null=True, related_name='children') + course_run = models.ForeignKey(CourseRun) + index = models.IntegerField() + value = models.CharField(max_length=255) + + +class TranscriptLocale(TimeStampedModel): + """ + TranscriptLocale model. + """ + locale = models.ForeignKey(Locale) + course_run = models.ForeignKey(CourseRun) + + +class CourseOrganization(TimeStampedModel): + """ + CourseOrganization model. + """ + course = models.ForeignKey(Course, related_name='relationship') + organization = models.ForeignKey(Organization, related_name='relationship') + type = models.CharField(max_length=100) + + +class CourseRunPerson(TimeStampedModel): + """ + CourseRunPerson model. + """ + course_run = models.ForeignKey(CourseRun, related_name='relationship') + person = models.ForeignKey(Person, related_name='relationship') + type = models.CharField(max_length=100) + index = models.IntegerField() + +