Merge remote-tracking branch 'origin/release' into dj18-release-merge
Conflicts: common/djangoapps/util/testing.py lms/djangoapps/instructor/views/api.py lms/djangoapps/teams/tests/test_views.py openedx/core/djangoapps/programs/models.py openedx/core/djangoapps/user_api/accounts/tests/test_views.py requirements/edx/github.txt
This commit is contained in:
@@ -22,7 +22,3 @@ with the appropriate course key. The use cases for this app include things like
|
||||
a user enrollment dashboard, a course metadata API, or a course marketing
|
||||
page.
|
||||
"""
|
||||
|
||||
# importing signals is necessary to activate signal handler, which invalidates
|
||||
# the CourseOverview cache every time a course is published
|
||||
import openedx.core.djangoapps.content.course_overviews.signals # pylint: disable=unused-import
|
||||
|
||||
@@ -1,70 +1,60 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.utils.timezone
|
||||
import model_utils.fields
|
||||
import xmodule_django.models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding model 'CourseOverview'
|
||||
db.create_table('course_overviews_courseoverview', (
|
||||
('id', self.gf('xmodule_django.models.CourseKeyField')(max_length=255, primary_key=True, db_index=True)),
|
||||
('_location', self.gf('xmodule_django.models.UsageKeyField')(max_length=255)),
|
||||
('display_name', self.gf('django.db.models.fields.TextField')(null=True)),
|
||||
('display_number_with_default', self.gf('django.db.models.fields.TextField')()),
|
||||
('display_org_with_default', self.gf('django.db.models.fields.TextField')()),
|
||||
('start', self.gf('django.db.models.fields.DateTimeField')(null=True)),
|
||||
('end', self.gf('django.db.models.fields.DateTimeField')(null=True)),
|
||||
('advertised_start', self.gf('django.db.models.fields.TextField')(null=True)),
|
||||
('course_image_url', self.gf('django.db.models.fields.TextField')()),
|
||||
('facebook_url', self.gf('django.db.models.fields.TextField')(null=True)),
|
||||
('social_sharing_url', self.gf('django.db.models.fields.TextField')(null=True)),
|
||||
('end_of_course_survey_url', self.gf('django.db.models.fields.TextField')(null=True)),
|
||||
('certificates_display_behavior', self.gf('django.db.models.fields.TextField')(null=True)),
|
||||
('certificates_show_before_end', self.gf('django.db.models.fields.BooleanField')(default=False)),
|
||||
('has_any_active_web_certificate', self.gf('django.db.models.fields.BooleanField')(default=False)),
|
||||
('cert_name_short', self.gf('django.db.models.fields.TextField')()),
|
||||
('cert_name_long', self.gf('django.db.models.fields.TextField')()),
|
||||
('lowest_passing_grade', self.gf('django.db.models.fields.DecimalField')(max_digits=5, decimal_places=2)),
|
||||
('mobile_available', self.gf('django.db.models.fields.BooleanField')(default=False)),
|
||||
('visible_to_staff_only', self.gf('django.db.models.fields.BooleanField')(default=False)),
|
||||
('_pre_requisite_courses_json', self.gf('django.db.models.fields.TextField')()),
|
||||
))
|
||||
db.send_create_signal('course_overviews', ['CourseOverview'])
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting model 'CourseOverview'
|
||||
db.delete_table('course_overviews_courseoverview')
|
||||
|
||||
|
||||
models = {
|
||||
'course_overviews.courseoverview': {
|
||||
'Meta': {'object_name': 'CourseOverview'},
|
||||
'_location': ('xmodule_django.models.UsageKeyField', [], {'max_length': '255'}),
|
||||
'_pre_requisite_courses_json': ('django.db.models.fields.TextField', [], {}),
|
||||
'advertised_start': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'cert_name_long': ('django.db.models.fields.TextField', [], {}),
|
||||
'cert_name_short': ('django.db.models.fields.TextField', [], {}),
|
||||
'certificates_display_behavior': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'certificates_show_before_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'course_image_url': ('django.db.models.fields.TextField', [], {}),
|
||||
'display_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'display_number_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'display_org_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'end_of_course_survey_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'facebook_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'has_any_active_web_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('xmodule_django.models.CourseKeyField', [], {'max_length': '255', 'primary_key': 'True', 'db_index': 'True'}),
|
||||
'lowest_passing_grade': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
|
||||
'mobile_available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'social_sharing_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'visible_to_staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_overviews']
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CourseOverview',
|
||||
fields=[
|
||||
('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, verbose_name='created', editable=False)),
|
||||
('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, verbose_name='modified', editable=False)),
|
||||
('version', models.IntegerField()),
|
||||
('id', xmodule_django.models.CourseKeyField(max_length=255, serialize=False, primary_key=True, db_index=True)),
|
||||
('_location', xmodule_django.models.UsageKeyField(max_length=255)),
|
||||
('display_name', models.TextField(null=True)),
|
||||
('display_number_with_default', models.TextField()),
|
||||
('display_org_with_default', models.TextField()),
|
||||
('start', models.DateTimeField(null=True)),
|
||||
('end', models.DateTimeField(null=True)),
|
||||
('advertised_start', models.TextField(null=True)),
|
||||
('course_image_url', models.TextField()),
|
||||
('facebook_url', models.TextField(null=True)),
|
||||
('social_sharing_url', models.TextField(null=True)),
|
||||
('end_of_course_survey_url', models.TextField(null=True)),
|
||||
('certificates_display_behavior', models.TextField(null=True)),
|
||||
('certificates_show_before_end', models.BooleanField(default=False)),
|
||||
('cert_html_view_enabled', models.BooleanField(default=False)),
|
||||
('has_any_active_web_certificate', models.BooleanField(default=False)),
|
||||
('cert_name_short', models.TextField()),
|
||||
('cert_name_long', models.TextField()),
|
||||
('lowest_passing_grade', models.DecimalField(null=True, max_digits=5, decimal_places=2)),
|
||||
('days_early_for_beta', models.FloatField(null=True)),
|
||||
('mobile_available', models.BooleanField(default=False)),
|
||||
('visible_to_staff_only', models.BooleanField(default=False)),
|
||||
('_pre_requisite_courses_json', models.TextField()),
|
||||
('enrollment_start', models.DateTimeField(null=True)),
|
||||
('enrollment_end', models.DateTimeField(null=True)),
|
||||
('enrollment_domain', models.TextField(null=True)),
|
||||
('invitation_only', models.BooleanField(default=False)),
|
||||
('max_student_enrollments_allowed', models.IntegerField(null=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='CourseOverviewTab',
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||
('tab_id', models.CharField(max_length=50)),
|
||||
('course_overview', models.ForeignKey(related_name='tabs', to='course_overviews.CourseOverview')),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding field 'CourseOverview.days_early_for_beta'
|
||||
|
||||
# The default value for the days_early_for_beta column is null. However,
|
||||
# for courses already in the table that have a non-null value for
|
||||
# days_early_for_beta, this would be invalid. So, we must clear the
|
||||
# table before adding the new column.
|
||||
|
||||
db.clear_table('course_overviews_courseoverview')
|
||||
db.add_column('course_overviews_courseoverview', 'days_early_for_beta',
|
||||
self.gf('django.db.models.fields.FloatField')(null=True),
|
||||
keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting field 'CourseOverview.days_early_for_beta'
|
||||
db.delete_column('course_overviews_courseoverview', 'days_early_for_beta')
|
||||
|
||||
|
||||
models = {
|
||||
'course_overviews.courseoverview': {
|
||||
'Meta': {'object_name': 'CourseOverview'},
|
||||
'_location': ('xmodule_django.models.UsageKeyField', [], {'max_length': '255'}),
|
||||
'_pre_requisite_courses_json': ('django.db.models.fields.TextField', [], {}),
|
||||
'advertised_start': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'cert_name_long': ('django.db.models.fields.TextField', [], {}),
|
||||
'cert_name_short': ('django.db.models.fields.TextField', [], {}),
|
||||
'certificates_display_behavior': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'certificates_show_before_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'course_image_url': ('django.db.models.fields.TextField', [], {}),
|
||||
'days_early_for_beta': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
|
||||
'display_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'display_number_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'display_org_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'end_of_course_survey_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'facebook_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'has_any_active_web_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('xmodule_django.models.CourseKeyField', [], {'max_length': '255', 'primary_key': 'True', 'db_index': 'True'}),
|
||||
'lowest_passing_grade': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
|
||||
'mobile_available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'social_sharing_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'visible_to_staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_overviews']
|
||||
@@ -1,58 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding field 'CourseOverview.cert_html_view_enabled'
|
||||
|
||||
# The default value for the cert_html_view_eanbled column is False.
|
||||
# However, for courses in the table for which cert_html_view_enabled
|
||||
# should be True, this would be invalid. So, we must clear the
|
||||
# table before adding the new column.
|
||||
|
||||
db.clear_table('course_overviews_courseoverview')
|
||||
db.add_column('course_overviews_courseoverview', 'cert_html_view_enabled',
|
||||
self.gf('django.db.models.fields.BooleanField')(default=False),
|
||||
keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting field 'CourseOverview.cert_html_view_enabled'
|
||||
db.delete_column('course_overviews_courseoverview', 'cert_html_view_enabled')
|
||||
|
||||
|
||||
models = {
|
||||
'course_overviews.courseoverview': {
|
||||
'Meta': {'object_name': 'CourseOverview'},
|
||||
'_location': ('xmodule_django.models.UsageKeyField', [], {'max_length': '255'}),
|
||||
'_pre_requisite_courses_json': ('django.db.models.fields.TextField', [], {}),
|
||||
'advertised_start': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'cert_html_view_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'cert_name_long': ('django.db.models.fields.TextField', [], {}),
|
||||
'cert_name_short': ('django.db.models.fields.TextField', [], {}),
|
||||
'certificates_display_behavior': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'certificates_show_before_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'course_image_url': ('django.db.models.fields.TextField', [], {}),
|
||||
'days_early_for_beta': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
|
||||
'display_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'display_number_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'display_org_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'end_of_course_survey_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'facebook_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'has_any_active_web_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('xmodule_django.models.CourseKeyField', [], {'max_length': '255', 'primary_key': 'True', 'db_index': 'True'}),
|
||||
'lowest_passing_grade': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2'}),
|
||||
'mobile_available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'social_sharing_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'visible_to_staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_overviews']
|
||||
@@ -1,49 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Changing field 'CourseOverview.lowest_passing_grade'
|
||||
db.alter_column('course_overviews_courseoverview', 'lowest_passing_grade', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=5, decimal_places=2))
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Changing field 'CourseOverview.lowest_passing_grade'
|
||||
db.alter_column('course_overviews_courseoverview', 'lowest_passing_grade', self.gf('django.db.models.fields.DecimalField')(default=0.5, max_digits=5, decimal_places=2))
|
||||
|
||||
models = {
|
||||
'course_overviews.courseoverview': {
|
||||
'Meta': {'object_name': 'CourseOverview'},
|
||||
'_location': ('xmodule_django.models.UsageKeyField', [], {'max_length': '255'}),
|
||||
'_pre_requisite_courses_json': ('django.db.models.fields.TextField', [], {}),
|
||||
'advertised_start': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'cert_html_view_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'cert_name_long': ('django.db.models.fields.TextField', [], {}),
|
||||
'cert_name_short': ('django.db.models.fields.TextField', [], {}),
|
||||
'certificates_display_behavior': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'certificates_show_before_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'course_image_url': ('django.db.models.fields.TextField', [], {}),
|
||||
'days_early_for_beta': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
|
||||
'display_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'display_number_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'display_org_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'end_of_course_survey_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'facebook_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'has_any_active_web_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('xmodule_django.models.CourseKeyField', [], {'max_length': '255', 'primary_key': 'True', 'db_index': 'True'}),
|
||||
'lowest_passing_grade': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '5', 'decimal_places': '2'}),
|
||||
'mobile_available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'social_sharing_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'visible_to_staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_overviews']
|
||||
@@ -1,94 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# The default values for these new columns may not match the actual
|
||||
# values of courses already present in the table. To ensure that the
|
||||
# cached values are correct, we must clear the table before adding any
|
||||
# new columns.
|
||||
db.clear_table('course_overviews_courseoverview')
|
||||
|
||||
# Adding field 'CourseOverview.enrollment_start'
|
||||
db.add_column('course_overviews_courseoverview', 'enrollment_start',
|
||||
self.gf('django.db.models.fields.DateTimeField')(null=True),
|
||||
keep_default=False)
|
||||
|
||||
# Adding field 'CourseOverview.enrollment_end'
|
||||
db.add_column('course_overviews_courseoverview', 'enrollment_end',
|
||||
self.gf('django.db.models.fields.DateTimeField')(null=True),
|
||||
keep_default=False)
|
||||
|
||||
# Adding field 'CourseOverview.enrollment_domain'
|
||||
db.add_column('course_overviews_courseoverview', 'enrollment_domain',
|
||||
self.gf('django.db.models.fields.TextField')(null=True),
|
||||
keep_default=False)
|
||||
|
||||
# Adding field 'CourseOverview.invitation_only'
|
||||
db.add_column('course_overviews_courseoverview', 'invitation_only',
|
||||
self.gf('django.db.models.fields.BooleanField')(default=False),
|
||||
keep_default=False)
|
||||
|
||||
# Adding field 'CourseOverview.max_student_enrollments_allowed'
|
||||
db.add_column('course_overviews_courseoverview', 'max_student_enrollments_allowed',
|
||||
self.gf('django.db.models.fields.IntegerField')(null=True),
|
||||
keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting field 'CourseOverview.enrollment_start'
|
||||
db.delete_column('course_overviews_courseoverview', 'enrollment_start')
|
||||
|
||||
# Deleting field 'CourseOverview.enrollment_end'
|
||||
db.delete_column('course_overviews_courseoverview', 'enrollment_end')
|
||||
|
||||
# Deleting field 'CourseOverview.enrollment_domain'
|
||||
db.delete_column('course_overviews_courseoverview', 'enrollment_domain')
|
||||
|
||||
# Deleting field 'CourseOverview.invitation_only'
|
||||
db.delete_column('course_overviews_courseoverview', 'invitation_only')
|
||||
|
||||
# Deleting field 'CourseOverview.max_student_enrollments_allowed'
|
||||
db.delete_column('course_overviews_courseoverview', 'max_student_enrollments_allowed')
|
||||
|
||||
|
||||
models = {
|
||||
'course_overviews.courseoverview': {
|
||||
'Meta': {'object_name': 'CourseOverview'},
|
||||
'_location': ('xmodule_django.models.UsageKeyField', [], {'max_length': '255'}),
|
||||
'_pre_requisite_courses_json': ('django.db.models.fields.TextField', [], {}),
|
||||
'advertised_start': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'cert_html_view_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'cert_name_long': ('django.db.models.fields.TextField', [], {}),
|
||||
'cert_name_short': ('django.db.models.fields.TextField', [], {}),
|
||||
'certificates_display_behavior': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'certificates_show_before_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'course_image_url': ('django.db.models.fields.TextField', [], {}),
|
||||
'days_early_for_beta': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
|
||||
'display_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'display_number_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'display_org_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'end_of_course_survey_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'enrollment_domain': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'enrollment_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'enrollment_start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'facebook_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'has_any_active_web_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('xmodule_django.models.CourseKeyField', [], {'max_length': '255', 'primary_key': 'True', 'db_index': 'True'}),
|
||||
'invitation_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'lowest_passing_grade': ('django.db.models.fields.DecimalField', [], {'max_digits': '5', 'decimal_places': '2', 'null': 'True'}),
|
||||
'max_student_enrollments_allowed': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||
'mobile_available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'social_sharing_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'visible_to_staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_overviews']
|
||||
@@ -1,75 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding field 'CourseOverview.created'
|
||||
db.add_column('course_overviews_courseoverview', 'created',
|
||||
self.gf('model_utils.fields.AutoCreatedField')(default=datetime.datetime.now),
|
||||
keep_default=False)
|
||||
|
||||
# Adding field 'CourseOverview.modified'
|
||||
db.add_column('course_overviews_courseoverview', 'modified',
|
||||
self.gf('model_utils.fields.AutoLastModifiedField')(default=datetime.datetime.now),
|
||||
keep_default=False)
|
||||
|
||||
# Adding field 'CourseOverview.version'
|
||||
db.add_column('course_overviews_courseoverview', 'version',
|
||||
self.gf('django.db.models.fields.IntegerField')(default=0),
|
||||
keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting field 'CourseOverview.created'
|
||||
db.delete_column('course_overviews_courseoverview', 'created')
|
||||
|
||||
# Deleting field 'CourseOverview.modified'
|
||||
db.delete_column('course_overviews_courseoverview', 'modified')
|
||||
|
||||
# Deleting field 'CourseOverview.version'
|
||||
db.delete_column('course_overviews_courseoverview', 'version')
|
||||
|
||||
|
||||
models = {
|
||||
'course_overviews.courseoverview': {
|
||||
'Meta': {'object_name': 'CourseOverview'},
|
||||
'_location': ('xmodule_django.models.UsageKeyField', [], {'max_length': '255'}),
|
||||
'_pre_requisite_courses_json': ('django.db.models.fields.TextField', [], {}),
|
||||
'advertised_start': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'cert_html_view_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'cert_name_long': ('django.db.models.fields.TextField', [], {}),
|
||||
'cert_name_short': ('django.db.models.fields.TextField', [], {}),
|
||||
'certificates_display_behavior': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'certificates_show_before_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'course_image_url': ('django.db.models.fields.TextField', [], {}),
|
||||
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'days_early_for_beta': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
|
||||
'display_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'display_number_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'display_org_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'end_of_course_survey_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'enrollment_domain': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'enrollment_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'enrollment_start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'facebook_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'has_any_active_web_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('xmodule_django.models.CourseKeyField', [], {'max_length': '255', 'primary_key': 'True', 'db_index': 'True'}),
|
||||
'invitation_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'lowest_passing_grade': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '5', 'decimal_places': '2'}),
|
||||
'max_student_enrollments_allowed': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||
'mobile_available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'social_sharing_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'version': ('django.db.models.fields.IntegerField', [], {}),
|
||||
'visible_to_staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_overviews']
|
||||
@@ -1,68 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding model 'CourseOverviewTab'
|
||||
db.create_table('course_overviews_courseoverviewtab', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('tab_id', self.gf('django.db.models.fields.CharField')(max_length=50)),
|
||||
('course_overview', self.gf('django.db.models.fields.related.ForeignKey')(related_name='tabs', to=orm['course_overviews.CourseOverview'])),
|
||||
))
|
||||
db.send_create_signal('course_overviews', ['CourseOverviewTab'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting model 'CourseOverviewTab'
|
||||
db.delete_table('course_overviews_courseoverviewtab')
|
||||
|
||||
|
||||
models = {
|
||||
'course_overviews.courseoverview': {
|
||||
'Meta': {'object_name': 'CourseOverview'},
|
||||
'_location': ('xmodule_django.models.UsageKeyField', [], {'max_length': '255'}),
|
||||
'_pre_requisite_courses_json': ('django.db.models.fields.TextField', [], {}),
|
||||
'advertised_start': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'cert_html_view_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'cert_name_long': ('django.db.models.fields.TextField', [], {}),
|
||||
'cert_name_short': ('django.db.models.fields.TextField', [], {}),
|
||||
'certificates_display_behavior': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'certificates_show_before_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'course_image_url': ('django.db.models.fields.TextField', [], {}),
|
||||
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'days_early_for_beta': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
|
||||
'display_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'display_number_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'display_org_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'end_of_course_survey_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'enrollment_domain': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'enrollment_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'enrollment_start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'facebook_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'has_any_active_web_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('xmodule_django.models.CourseKeyField', [], {'max_length': '255', 'primary_key': 'True', 'db_index': 'True'}),
|
||||
'invitation_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'lowest_passing_grade': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '5', 'decimal_places': '2'}),
|
||||
'max_student_enrollments_allowed': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||
'mobile_available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'social_sharing_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'version': ('django.db.models.fields.IntegerField', [], {}),
|
||||
'visible_to_staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
||||
},
|
||||
'course_overviews.courseoverviewtab': {
|
||||
'Meta': {'object_name': 'CourseOverviewTab'},
|
||||
'course_overview': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tabs'", 'to': "orm['course_overviews.CourseOverview']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'tab_id': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_overviews']
|
||||
@@ -1,63 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Foreign keys aren't enforced by default on our version of SQLite3, and
|
||||
# trying to delete them will throw an error. See:
|
||||
# http://south.aeracode.org/ticket/775
|
||||
if db.backend_name != 'sqlite3':
|
||||
db.delete_foreign_key('course_overviews_courseoverviewtab', 'course_overview_id')
|
||||
|
||||
def backwards(self, orm):
|
||||
pass
|
||||
|
||||
models = {
|
||||
'course_overviews.courseoverview': {
|
||||
'Meta': {'object_name': 'CourseOverview'},
|
||||
'_location': ('xmodule_django.models.UsageKeyField', [], {'max_length': '255'}),
|
||||
'_pre_requisite_courses_json': ('django.db.models.fields.TextField', [], {}),
|
||||
'advertised_start': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'cert_html_view_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'cert_name_long': ('django.db.models.fields.TextField', [], {}),
|
||||
'cert_name_short': ('django.db.models.fields.TextField', [], {}),
|
||||
'certificates_display_behavior': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'certificates_show_before_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'course_image_url': ('django.db.models.fields.TextField', [], {}),
|
||||
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'days_early_for_beta': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
|
||||
'display_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'display_number_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'display_org_with_default': ('django.db.models.fields.TextField', [], {}),
|
||||
'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'end_of_course_survey_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'enrollment_domain': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'enrollment_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'enrollment_start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'facebook_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'has_any_active_web_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('xmodule_django.models.CourseKeyField', [], {'max_length': '255', 'primary_key': 'True', 'db_index': 'True'}),
|
||||
'invitation_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'lowest_passing_grade': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '5', 'decimal_places': '2'}),
|
||||
'max_student_enrollments_allowed': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||
'mobile_available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'social_sharing_url': ('django.db.models.fields.TextField', [], {'null': 'True'}),
|
||||
'start': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'version': ('django.db.models.fields.IntegerField', [], {}),
|
||||
'visible_to_staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
||||
},
|
||||
'course_overviews.courseoverviewtab': {
|
||||
'Meta': {'object_name': 'CourseOverviewTab'},
|
||||
'course_overview': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tabs'", 'to': "orm['course_overviews.CourseOverview']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'tab_id': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_overviews']
|
||||
@@ -2,7 +2,7 @@
|
||||
Declaration of CourseOverview model
|
||||
"""
|
||||
import json
|
||||
from django.db import models
|
||||
from django.db import models, transaction
|
||||
|
||||
from django.db.models.fields import BooleanField, DateTimeField, DecimalField, TextField, FloatField, IntegerField
|
||||
from django.db.utils import IntegrityError
|
||||
@@ -31,6 +31,9 @@ class CourseOverview(TimeStampedModel):
|
||||
a course as part of a user dashboard or enrollment API.
|
||||
"""
|
||||
|
||||
class Meta(object):
|
||||
app_label = 'course_overviews'
|
||||
|
||||
# IMPORTANT: Bump this whenever you modify this model and/or add a migration.
|
||||
VERSION = 2
|
||||
|
||||
@@ -57,9 +60,9 @@ class CourseOverview(TimeStampedModel):
|
||||
|
||||
# Certification data
|
||||
certificates_display_behavior = TextField(null=True)
|
||||
certificates_show_before_end = BooleanField()
|
||||
cert_html_view_enabled = BooleanField()
|
||||
has_any_active_web_certificate = BooleanField()
|
||||
certificates_show_before_end = BooleanField(default=False)
|
||||
cert_html_view_enabled = BooleanField(default=False)
|
||||
has_any_active_web_certificate = BooleanField(default=False)
|
||||
cert_name_short = TextField()
|
||||
cert_name_long = TextField()
|
||||
|
||||
@@ -68,8 +71,8 @@ class CourseOverview(TimeStampedModel):
|
||||
|
||||
# Access parameters
|
||||
days_early_for_beta = FloatField(null=True)
|
||||
mobile_available = BooleanField()
|
||||
visible_to_staff_only = BooleanField()
|
||||
mobile_available = BooleanField(default=False)
|
||||
visible_to_staff_only = BooleanField(default=False)
|
||||
_pre_requisite_courses_json = TextField() # JSON representation of list of CourseKey strings
|
||||
|
||||
# Enrollment details
|
||||
@@ -111,7 +114,7 @@ class CourseOverview(TimeStampedModel):
|
||||
end = course.end
|
||||
max_student_enrollments_allowed = course.max_student_enrollments_allowed
|
||||
if isinstance(course.id, CCXLocator):
|
||||
from ccx.utils import get_ccx_from_ccx_locator # pylint: disable=import-error
|
||||
from lms.djangoapps.ccx.utils import get_ccx_from_ccx_locator
|
||||
ccx = get_ccx_from_ccx_locator(course.id)
|
||||
display_name = ccx.display_name
|
||||
start = ccx.start
|
||||
@@ -179,11 +182,12 @@ class CourseOverview(TimeStampedModel):
|
||||
if isinstance(course, CourseDescriptor):
|
||||
course_overview = cls._create_from_course(course)
|
||||
try:
|
||||
course_overview.save()
|
||||
CourseOverviewTab.objects.bulk_create([
|
||||
CourseOverviewTab(tab_id=tab.tab_id, course_overview=course_overview)
|
||||
for tab in course.tabs
|
||||
])
|
||||
with transaction.atomic():
|
||||
course_overview.save()
|
||||
CourseOverviewTab.objects.bulk_create([
|
||||
CourseOverviewTab(tab_id=tab.tab_id, course_overview=course_overview)
|
||||
for tab in course.tabs
|
||||
])
|
||||
except IntegrityError:
|
||||
# There is a rare race condition that will occur if
|
||||
# CourseOverview.get_from_id is called while a
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
"""Code run at server start up to initialize the course_overviews app."""
|
||||
|
||||
# Importing signals is necessary to activate signal handler, which invalidates
|
||||
# the CourseOverview cache every time a course is published.
|
||||
import openedx.core.djangoapps.content.course_overviews.signals # pylint: disable=unused-import
|
||||
@@ -367,13 +367,31 @@ class CourseOverviewTestCase(ModuleStoreTestCase):
|
||||
with mock.patch(
|
||||
'openedx.core.djangoapps.content.course_overviews.models.CourseOverview._get_pk_val'
|
||||
) as mock_get_pk_val:
|
||||
|
||||
mock_get_pk_val.return_value = None
|
||||
# This method was not present in django 1.4. Django 1.8 calls this method if
|
||||
# _get_pk_val returns None. This method will return empty str if there is no
|
||||
# default value present. So mock it to avoid returning the empty str as primary key
|
||||
# value. Due to empty str, model.save will do an update instead of insert which is
|
||||
# incorrect and get exception in
|
||||
# common.djangoapps.xmodule_django.models.OpaqueKeyField.get_prep_value
|
||||
with mock.patch('django.db.models.Field.get_pk_value_on_save') as mock_get_pk_value_on_save:
|
||||
|
||||
# verify the CourseOverview is loaded successfully both times,
|
||||
# including after an IntegrityError exception the 2nd time
|
||||
for _ in range(2):
|
||||
self.assertIsInstance(CourseOverview.get_from_id(course.id), CourseOverview)
|
||||
mock_get_pk_value_on_save.return_value = None
|
||||
|
||||
# The CourseOverviewTab entries can't get properly created when the CourseOverview used as a
|
||||
# foreign key has a None 'id' - the bulk_create raises an IntegrityError. Mock out the
|
||||
# CourseOverviewTab creation, as those record creations aren't what is being tested in this test.
|
||||
# This mocking makes the first get_from_id() succeed with no IntegrityError - the 2nd one raises
|
||||
# an IntegrityError for the reason listed above.
|
||||
with mock.patch(
|
||||
'openedx.core.djangoapps.content.course_overviews.models.CourseOverviewTab.objects.bulk_create'
|
||||
) as mock_bulk_create:
|
||||
mock_bulk_create.return_value = None
|
||||
|
||||
# Verify the CourseOverview is loaded successfully both times,
|
||||
# including after an IntegrityError exception the 2nd time.
|
||||
for _ in range(2):
|
||||
self.assertIsInstance(CourseOverview.get_from_id(course.id), CourseOverview)
|
||||
|
||||
def test_course_overview_version_update(self):
|
||||
"""
|
||||
|
||||
@@ -99,7 +99,7 @@ class CourseStructureApiTests(ModuleStoreTestCase):
|
||||
"""
|
||||
Verify that course_structure returns info for entire course.
|
||||
"""
|
||||
with mock.patch(self.MOCK_CACHE, cache.get_cache(backend='default')):
|
||||
with mock.patch(self.MOCK_CACHE, cache.caches['default']):
|
||||
with self.assertNumQueries(3):
|
||||
structure = course_structure(self.course.id)
|
||||
|
||||
@@ -110,7 +110,7 @@ class CourseStructureApiTests(ModuleStoreTestCase):
|
||||
|
||||
self.assertDictEqual(structure, expected)
|
||||
|
||||
with mock.patch(self.MOCK_CACHE, cache.get_cache(backend='default')):
|
||||
with mock.patch(self.MOCK_CACHE, cache.caches['default']):
|
||||
with self.assertNumQueries(2):
|
||||
course_structure(self.course.id)
|
||||
|
||||
@@ -120,7 +120,7 @@ class CourseStructureApiTests(ModuleStoreTestCase):
|
||||
"""
|
||||
block_types = ['html', 'video']
|
||||
|
||||
with mock.patch(self.MOCK_CACHE, cache.get_cache(backend='default')):
|
||||
with mock.patch(self.MOCK_CACHE, cache.caches['default']):
|
||||
with self.assertNumQueries(3):
|
||||
structure = course_structure(self.course.id, block_types=block_types)
|
||||
|
||||
@@ -131,7 +131,7 @@ class CourseStructureApiTests(ModuleStoreTestCase):
|
||||
|
||||
self.assertDictEqual(structure, expected)
|
||||
|
||||
with mock.patch(self.MOCK_CACHE, cache.get_cache(backend='default')):
|
||||
with mock.patch(self.MOCK_CACHE, cache.caches['default']):
|
||||
with self.assertNumQueries(2):
|
||||
course_structure(self.course.id, block_types=block_types)
|
||||
|
||||
|
||||
@@ -1,38 +1,28 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.utils.timezone
|
||||
import model_utils.fields
|
||||
import util.models
|
||||
import xmodule_django.models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding model 'CourseStructure'
|
||||
db.create_table('course_structures_coursestructure', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('created', self.gf('model_utils.fields.AutoCreatedField')(default=datetime.datetime.now)),
|
||||
('modified', self.gf('model_utils.fields.AutoLastModifiedField')(default=datetime.datetime.now)),
|
||||
('course_id', self.gf('xmodule_django.models.CourseKeyField')(unique=True, max_length=255, db_index=True)),
|
||||
('structure_json', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
|
||||
))
|
||||
db.send_create_signal('course_structures', ['CourseStructure'])
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting model 'CourseStructure'
|
||||
db.delete_table('course_structures_coursestructure')
|
||||
|
||||
|
||||
models = {
|
||||
'course_structures.coursestructure': {
|
||||
'Meta': {'object_name': 'CourseStructure'},
|
||||
'course_id': ('xmodule_django.models.CourseKeyField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
|
||||
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'structure_json': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_structures']
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CourseStructure',
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||
('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, verbose_name='created', editable=False)),
|
||||
('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, verbose_name='modified', editable=False)),
|
||||
('course_id', xmodule_django.models.CourseKeyField(unique=True, max_length=255, verbose_name=b'Course ID', db_index=True)),
|
||||
('structure_json', util.models.CompressedTextField(null=True, verbose_name=b'Structure JSON', blank=True)),
|
||||
('discussion_id_map_json', util.models.CompressedTextField(null=True, verbose_name=b'Discussion ID Map JSON', blank=True)),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding field 'CourseStructure.discussion_id_map_json'
|
||||
db.add_column('course_structures_coursestructure', 'discussion_id_map_json',
|
||||
self.gf('django.db.models.fields.TextField')(null=True, blank=True),
|
||||
keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting field 'CourseStructure.discussion_id_map_json'
|
||||
db.delete_column('course_structures_coursestructure', 'discussion_id_map_json')
|
||||
|
||||
|
||||
models = {
|
||||
'course_structures.coursestructure': {
|
||||
'Meta': {'object_name': 'CourseStructure'},
|
||||
'course_id': ('xmodule_django.models.CourseKeyField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
|
||||
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'discussion_id_map_json': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
|
||||
'structure_json': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['course_structures']
|
||||
@@ -18,6 +18,10 @@ class CourseStructure(TimeStampedModel):
|
||||
"""
|
||||
The CourseStructure model is an aggregated representation of the course content tree
|
||||
"""
|
||||
|
||||
class Meta(object):
|
||||
app_label = 'course_structures'
|
||||
|
||||
course_id = CourseKeyField(max_length=255, db_index=True, unique=True, verbose_name='Course ID')
|
||||
|
||||
# Right now the only thing we do with the structure doc is store it and
|
||||
|
||||
Reference in New Issue
Block a user