diff --git a/lms/djangoapps/coursewarehistoryextended/fields.py b/lms/djangoapps/coursewarehistoryextended/fields.py index 795449535a..ee5d71a1e5 100644 --- a/lms/djangoapps/coursewarehistoryextended/fields.py +++ b/lms/djangoapps/coursewarehistoryextended/fields.py @@ -3,6 +3,7 @@ Custom fields for use in the coursewarehistoryextended django app. """ from django.db.models.fields import AutoField +from django.db.models.fields.related import OneToOneField class UnsignedBigIntAutoField(AutoField): @@ -24,6 +25,7 @@ class UnsignedBigIntAutoField(AutoField): else: return None + # rel_db_type was added in Django 1.10. For versions before, use UnsignedBigIntOneToOneField. def rel_db_type(self, connection): if connection.settings_dict['ENGINE'] == 'django.db.backends.mysql': return "bigint UNSIGNED" @@ -33,3 +35,20 @@ class UnsignedBigIntAutoField(AutoField): return "BIGSERIAL" else: return None + + +class UnsignedBigIntOneToOneField(OneToOneField): + """ + An unsigned 8-byte integer one-to-one foreign key to a unsigned 8-byte integer id field. + + Should only be necessary for versions of Django < 1.10. + """ + def db_type(self, connection): + if connection.settings_dict['ENGINE'] == 'django.db.backends.mysql': + return "bigint UNSIGNED" + elif connection.settings_dict['ENGINE'] == 'django.db.backends.sqlite3': + return "integer" + elif connection.settings_dict['ENGINE'] == 'django.db.backends.postgresql_psycopg2': + return "BIGSERIAL" + else: + return None diff --git a/lms/djangoapps/grades/migrations/0013_persistentsubsectiongradeoverride.py b/lms/djangoapps/grades/migrations/0013_persistentsubsectiongradeoverride.py index b61db4c3e8..ec060e366e 100644 --- a/lms/djangoapps/grades/migrations/0013_persistentsubsectiongradeoverride.py +++ b/lms/djangoapps/grades/migrations/0013_persistentsubsectiongradeoverride.py @@ -3,6 +3,8 @@ from __future__ import unicode_literals from django.db import migrations, models +from coursewarehistoryextended.fields import UnsignedBigIntOneToOneField + class Migration(migrations.Migration): @@ -21,7 +23,7 @@ class Migration(migrations.Migration): ('possible_all_override', models.FloatField(null=True, blank=True)), ('earned_graded_override', models.FloatField(null=True, blank=True)), ('possible_graded_override', models.FloatField(null=True, blank=True)), - ('grade', models.OneToOneField(related_name='override', to='grades.PersistentSubsectionGrade')), + ('grade', UnsignedBigIntOneToOneField(related_name='override', to='grades.PersistentSubsectionGrade')), ], ), ] diff --git a/lms/djangoapps/grades/models.py b/lms/djangoapps/grades/models.py index 3f4985e8e0..d11a6bdb35 100644 --- a/lms/djangoapps/grades/models.py +++ b/lms/djangoapps/grades/models.py @@ -20,7 +20,7 @@ from lazy import lazy from model_utils.models import TimeStampedModel from opaque_keys.edx.keys import CourseKey, UsageKey -from coursewarehistoryextended.fields import UnsignedBigIntAutoField +from coursewarehistoryextended.fields import UnsignedBigIntAutoField, UnsignedBigIntOneToOneField from eventtracking import tracker from openedx.core.djangoapps.xmodule_django.models import CourseKeyField, UsageKeyField from request_cache import get_cache @@ -693,7 +693,7 @@ class PersistentSubsectionGradeOverride(models.Model): class Meta(object): app_label = "grades" - grade = models.OneToOneField(PersistentSubsectionGrade, related_name='override') + grade = UnsignedBigIntOneToOneField(PersistentSubsectionGrade, related_name='override') # Created/modified timestamps prevent race-conditions when using with async rescoring tasks created = models.DateTimeField(auto_now_add=True, db_index=True)