Merge pull request #18316 from edx/thallada/PLAT-1524-on-delete

PLAT-1524: Add on_delete kwarg to ForeignKey & OneToOneFields
This commit is contained in:
Tyler Hallada
2018-06-06 10:38:15 -04:00
committed by GitHub
91 changed files with 293 additions and 275 deletions

View File

@@ -24,7 +24,7 @@ class Migration(migrations.Migration):
('status', models.CharField(default=b'pending', help_text='Status of this API access request', max_length=255, db_index=True, choices=[(b'pending', 'Pending'), (b'denied', 'Denied'), (b'approved', 'Approved')])),
('website', models.URLField(help_text='The URL of the website associated with this API user.')),
('reason', models.TextField(help_text='The reason this user wants to access the API.')),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
options={
'ordering': ('-modified', '-created'),

View File

@@ -50,6 +50,6 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='apiaccessrequest',
name='user',
field=models.OneToOneField(to=settings.AUTH_USER_MODEL),
field=models.OneToOneField(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE),
),
]

View File

@@ -21,7 +21,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='apiaccessrequest',
name='site',
field=models.ForeignKey(default=1, to='sites.Site'),
field=models.ForeignKey(default=1, to='sites.Site', on_delete=models.CASCADE),
preserve_default=False,
),
migrations.AddField(

View File

@@ -15,6 +15,6 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='apiaccessrequest',
name='user',
field=models.OneToOneField(related_name='api_access_request', to=settings.AUTH_USER_MODEL),
field=models.OneToOneField(related_name='api_access_request', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE),
),
]

View File

@@ -32,7 +32,7 @@ class ApiAccessRequest(TimeStampedModel):
(DENIED, _('Denied')),
(APPROVED, _('Approved')),
)
user = models.OneToOneField(User, related_name='api_access_request')
user = models.OneToOneField(User, related_name='api_access_request', on_delete=models.CASCADE)
status = models.CharField(
max_length=255,
choices=STATUS_CHOICES,
@@ -44,7 +44,7 @@ class ApiAccessRequest(TimeStampedModel):
reason = models.TextField(help_text=_('The reason this user wants to access the API.'))
company_name = models.CharField(max_length=255, default='')
company_address = models.CharField(max_length=255, default='')
site = models.ForeignKey(Site)
site = models.ForeignKey(Site, on_delete=models.CASCADE)
contacted = models.BooleanField(default=False)
class Meta:

View File

@@ -25,7 +25,7 @@ class Migration(migrations.Migration):
('course_key', CourseKeyField(max_length=255, db_index=True)),
('usage_key', UsageKeyField(max_length=255, db_index=True)),
('_path', jsonfield.fields.JSONField(help_text=b'Path in course tree to the block', db_column=b'path')),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
),
migrations.CreateModel(
@@ -46,7 +46,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='bookmark',
name='xblock_cache',
field=models.ForeignKey(to='bookmarks.XBlockCache'),
field=models.ForeignKey(to='bookmarks.XBlockCache', on_delete=models.CASCADE),
),
migrations.AlterUniqueTogether(
name='bookmark',

View File

@@ -42,12 +42,12 @@ class Bookmark(TimeStampedModel):
"""
Bookmarks model.
"""
user = models.ForeignKey(User, db_index=True)
user = models.ForeignKey(User, db_index=True, on_delete=models.CASCADE)
course_key = CourseKeyField(max_length=255, db_index=True)
usage_key = UsageKeyField(max_length=255, db_index=True)
_path = JSONField(db_column='path', help_text='Path in course tree to the block')
xblock_cache = models.ForeignKey('bookmarks.XBlockCache')
xblock_cache = models.ForeignKey('bookmarks.XBlockCache', on_delete=models.CASCADE)
class Meta(object):
"""

View File

@@ -54,7 +54,7 @@ class Migration(migrations.Migration):
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')),
('course_overview', models.ForeignKey(related_name='tabs', to='course_overviews.CourseOverview', on_delete=models.CASCADE)),
],
),
]

View File

@@ -21,7 +21,7 @@ class Migration(migrations.Migration):
('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, verbose_name='modified', editable=False)),
('small_url', models.TextField(default=b'', blank=True)),
('large_url', models.TextField(default=b'', blank=True)),
('course_overview', models.OneToOneField(related_name='image_set', to='course_overviews.CourseOverview')),
('course_overview', models.OneToOneField(related_name='image_set', to='course_overviews.CourseOverview', on_delete=models.CASCADE)),
],
options={
'abstract': False,

View File

@@ -708,7 +708,7 @@ class CourseOverviewTab(models.Model):
Model for storing and caching tabs information of a course.
"""
tab_id = models.CharField(max_length=50)
course_overview = models.ForeignKey(CourseOverview, db_index=True, related_name="tabs")
course_overview = models.ForeignKey(CourseOverview, db_index=True, related_name="tabs", on_delete=models.CASCADE)
class CourseOverviewImageSet(TimeStampedModel):
@@ -779,7 +779,8 @@ class CourseOverviewImageSet(TimeStampedModel):
interested in extending this functionality.
"""
course_overview = models.OneToOneField(CourseOverview, db_index=True, related_name="image_set")
course_overview = models.OneToOneField(CourseOverview, db_index=True, related_name="image_set",
on_delete=models.CASCADE)
small_url = models.TextField(blank=True, default="")
large_url = models.TextField(blank=True, default="")

View File

@@ -55,23 +55,23 @@ class Migration(migrations.Migration):
('group_id', models.IntegerField(help_text=b'contains the id of a specific group within the cohorted partition')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('course_user_group', models.OneToOneField(to='course_groups.CourseUserGroup')),
('course_user_group', models.OneToOneField(to='course_groups.CourseUserGroup', on_delete=models.CASCADE)),
],
),
migrations.AddField(
model_name='coursecohort',
name='course_user_group',
field=models.OneToOneField(related_name='cohort', to='course_groups.CourseUserGroup'),
field=models.OneToOneField(related_name='cohort', to='course_groups.CourseUserGroup', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='cohortmembership',
name='course_user_group',
field=models.ForeignKey(to='course_groups.CourseUserGroup'),
field=models.ForeignKey(to='course_groups.CourseUserGroup', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='cohortmembership',
name='user',
field=models.ForeignKey(to=settings.AUTH_USER_MODEL),
field=models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE),
),
migrations.AlterUniqueTogether(
name='courseusergroup',

View File

@@ -18,7 +18,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('email', models.CharField(db_index=True, max_length=255, blank=True)),
('course_id', CourseKeyField(max_length=255)),
('course_user_group', models.ForeignKey(to='course_groups.CourseUserGroup')),
('course_user_group', models.ForeignKey(to='course_groups.CourseUserGroup', on_delete=models.CASCADE)),
],
),
migrations.AlterUniqueTogether(

View File

@@ -70,8 +70,8 @@ class CourseUserGroup(models.Model):
class CohortMembership(models.Model):
"""Used internally to enforce our particular definition of uniqueness"""
course_user_group = models.ForeignKey(CourseUserGroup)
user = models.ForeignKey(User)
course_user_group = models.ForeignKey(CourseUserGroup, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
course_id = CourseKeyField(max_length=255)
previous_cohort = None
@@ -155,7 +155,7 @@ class CourseUserGroupPartitionGroup(models.Model):
"""
Create User Partition Info.
"""
course_user_group = models.OneToOneField(CourseUserGroup)
course_user_group = models.OneToOneField(CourseUserGroup, on_delete=models.CASCADE)
partition_id = models.IntegerField(
help_text="contains the id of a cohorted partition in this course"
)
@@ -209,7 +209,8 @@ class CourseCohort(models.Model):
"""
This model represents cohort related info.
"""
course_user_group = models.OneToOneField(CourseUserGroup, unique=True, related_name='cohort')
course_user_group = models.OneToOneField(CourseUserGroup, unique=True, related_name='cohort',
on_delete=models.CASCADE)
RANDOM = 'random'
MANUAL = 'manual'
@@ -246,6 +247,6 @@ class UnregisteredLearnerCohortAssignments(DeletableByUserValue, models.Model):
class Meta(object):
unique_together = (('course_id', 'email'), )
course_user_group = models.ForeignKey(CourseUserGroup)
course_user_group = models.ForeignKey(CourseUserGroup, on_delete=models.CASCADE)
email = models.CharField(blank=True, max_length=255, db_index=True)
course_id = CourseKeyField(max_length=255)

View File

@@ -35,7 +35,7 @@ class Migration(migrations.Migration):
('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, verbose_name='modified', editable=False)),
('username', models.CharField(max_length=255, db_index=True)),
('deadline', models.DateTimeField(default=openedx.core.djangoapps.credit.models.default_deadline_for_credit_eligibility, help_text='Deadline for purchasing and requesting credit.')),
('course', models.ForeignKey(related_name='eligibilities', to='credit.CreditCourse')),
('course', models.ForeignKey(related_name='eligibilities', to='credit.CreditCourse', on_delete=models.CASCADE)),
],
options={
'verbose_name_plural': 'Credit eligibilities',
@@ -73,8 +73,8 @@ class Migration(migrations.Migration):
('username', models.CharField(max_length=255, db_index=True)),
('parameters', jsonfield.fields.JSONField()),
('status', models.CharField(default=b'pending', max_length=255, choices=[(b'pending', b'Pending'), (b'approved', b'Approved'), (b'rejected', b'Rejected')])),
('course', models.ForeignKey(related_name='credit_requests', to='credit.CreditCourse')),
('provider', models.ForeignKey(related_name='credit_requests', to='credit.CreditProvider')),
('course', models.ForeignKey(related_name='credit_requests', to='credit.CreditCourse', on_delete=models.CASCADE)),
('provider', models.ForeignKey(related_name='credit_requests', to='credit.CreditProvider', on_delete=models.CASCADE)),
],
options={
'get_latest_by': 'created',
@@ -92,7 +92,7 @@ class Migration(migrations.Migration):
('order', models.PositiveIntegerField(default=0)),
('criteria', jsonfield.fields.JSONField()),
('active', models.BooleanField(default=True)),
('course', models.ForeignKey(related_name='credit_requirements', to='credit.CreditCourse')),
('course', models.ForeignKey(related_name='credit_requirements', to='credit.CreditCourse', on_delete=models.CASCADE)),
],
options={
'ordering': ['order'],
@@ -107,7 +107,7 @@ class Migration(migrations.Migration):
('username', models.CharField(max_length=255, db_index=True)),
('status', models.CharField(max_length=32, choices=[(b'satisfied', b'satisfied'), (b'failed', b'failed'), (b'declined', b'declined')])),
('reason', jsonfield.fields.JSONField(default={})),
('requirement', models.ForeignKey(related_name='statuses', to='credit.CreditRequirement')),
('requirement', models.ForeignKey(related_name='statuses', to='credit.CreditRequirement', on_delete=models.CASCADE)),
],
),
migrations.CreateModel(

View File

@@ -284,7 +284,7 @@ class CreditRequirement(TimeStampedModel):
may need to determine whether a user has satisfied the requirement.
"""
course = models.ForeignKey(CreditCourse, related_name="credit_requirements")
course = models.ForeignKey(CreditCourse, related_name="credit_requirements", on_delete=models.CASCADE)
namespace = models.CharField(max_length=255)
name = models.CharField(max_length=255)
display_name = models.CharField(max_length=255, default="")
@@ -427,7 +427,7 @@ class CreditRequirementStatus(TimeStampedModel):
)
username = models.CharField(max_length=255, db_index=True)
requirement = models.ForeignKey(CreditRequirement, related_name="statuses")
requirement = models.ForeignKey(CreditRequirement, related_name="statuses", on_delete=models.CASCADE)
status = models.CharField(max_length=32, choices=REQUIREMENT_STATUS_CHOICES)
# Include additional information about why the user satisfied or failed
@@ -543,7 +543,7 @@ def default_deadline_for_credit_eligibility(): # pylint: disable=invalid-name
class CreditEligibility(TimeStampedModel):
""" A record of a user's eligibility for credit for a specific course. """
username = models.CharField(max_length=255, db_index=True)
course = models.ForeignKey(CreditCourse, related_name="eligibilities")
course = models.ForeignKey(CreditCourse, related_name="eligibilities", on_delete=models.CASCADE)
# Deadline for when credit eligibility will expire.
# Once eligibility expires, users will no longer be able to purchase
@@ -656,8 +656,8 @@ class CreditRequest(TimeStampedModel):
uuid = models.CharField(max_length=32, unique=True, db_index=True)
username = models.CharField(max_length=255, db_index=True)
course = models.ForeignKey(CreditCourse, related_name="credit_requests")
provider = models.ForeignKey(CreditProvider, related_name="credit_requests")
course = models.ForeignKey(CreditCourse, related_name="credit_requests", on_delete=models.CASCADE)
provider = models.ForeignKey(CreditProvider, related_name="credit_requests", on_delete=models.CASCADE)
parameters = JSONField()
REQUEST_STATUS_PENDING = "pending"

View File

@@ -30,7 +30,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('rule_type', models.CharField(default=b'blacklist', help_text='Whether to include or exclude the given course. If whitelist countries are specified, then ONLY users from whitelisted countries will be able to access the course. If blacklist countries are specified, then users from blacklisted countries will NOT be able to access the course.', max_length=255, choices=[(b'whitelist', b'Whitelist (allow only these countries)'), (b'blacklist', b'Blacklist (block these countries)')])),
('country', models.ForeignKey(help_text='The country to which this rule applies.', to='embargo.Country')),
('country', models.ForeignKey(help_text='The country to which this rule applies.', to='embargo.Country', on_delete=models.CASCADE)),
],
),
migrations.CreateModel(
@@ -95,7 +95,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='countryaccessrule',
name='restricted_course',
field=models.ForeignKey(help_text='The course to which this rule applies.', to='embargo.RestrictedCourse'),
field=models.ForeignKey(help_text='The course to which this rule applies.', to='embargo.RestrictedCourse', on_delete=models.CASCADE),
),
migrations.AlterUniqueTogether(
name='countryaccessrule',

View File

@@ -428,12 +428,14 @@ class CountryAccessRule(models.Model):
restricted_course = models.ForeignKey(
"RestrictedCourse",
help_text=ugettext_lazy(u"The course to which this rule applies.")
help_text=ugettext_lazy(u"The course to which this rule applies."),
on_delete=models.CASCADE,
)
country = models.ForeignKey(
"Country",
help_text=ugettext_lazy(u"The country to which this rule applies.")
help_text=ugettext_lazy(u"The country to which this rule applies."),
on_delete=models.CASCADE,
)
CACHE_KEY = u"embargo.allowed_countries.{course_key}"

View File

@@ -24,7 +24,7 @@ class Migration(migrations.Migration):
('internal_password', models.CharField(max_length=31, blank=True)),
('dtcreated', models.DateTimeField(auto_now_add=True, verbose_name=b'creation date')),
('dtsignup', models.DateTimeField(null=True, verbose_name=b'signup date')),
('user', models.OneToOneField(null=True, to=settings.AUTH_USER_MODEL)),
('user', models.OneToOneField(null=True, to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
),
migrations.AlterUniqueTogether(

View File

@@ -26,7 +26,7 @@ class ExternalAuthMap(models.Model):
external_credentials = models.TextField(blank=True) # JSON dictionary
external_email = models.CharField(max_length=255, db_index=True)
external_name = models.CharField(blank=True, max_length=255, db_index=True)
user = models.OneToOneField(User, unique=True, db_index=True, null=True)
user = models.OneToOneField(User, unique=True, db_index=True, null=True, on_delete=models.CASCADE)
internal_password = models.CharField(blank=True, max_length=31) # randomly generated
dtcreated = models.DateTimeField('creation date', auto_now_add=True)
dtsignup = models.DateTimeField('signup date', null=True) # set after signup

View File

@@ -16,7 +16,7 @@ class Migration(migrations.Migration):
name='RestrictedApplication',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('application', models.ForeignKey(to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL)),
('application', models.ForeignKey(to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL, on_delete=models.CASCADE)),
],
),
]

View File

@@ -18,7 +18,7 @@ class RestrictedApplication(models.Model):
so that they cannot be used to call into APIs.
"""
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL, null=False)
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL, null=False, on_delete=models.CASCADE)
def __unicode__(self):
"""

View File

@@ -22,7 +22,7 @@ class Migration(migrations.Migration):
('active', models.BooleanField(default=True, help_text='Indicates if this schedule is actively used')),
('start', models.DateTimeField(help_text='Date this schedule went into effect')),
('upgrade_deadline', models.DateTimeField(help_text='Deadline by which the learner must upgrade to a verified seat', null=True, blank=True)),
('enrollment', models.OneToOneField(to='student.CourseEnrollment')),
('enrollment', models.OneToOneField(to='student.CourseEnrollment', on_delete=models.CASCADE)),
],
options={
'verbose_name': 'Schedule',

View File

@@ -25,7 +25,7 @@ class Migration(migrations.Migration):
('enqueue_recurring_nudge', models.BooleanField(default=False)),
('deliver_recurring_nudge', models.BooleanField(default=False)),
('changed_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, editable=False, to=settings.AUTH_USER_MODEL, null=True, verbose_name='Changed by')),
('site', models.ForeignKey(to='sites.Site')),
('site', models.ForeignKey(to='sites.Site', on_delete=models.CASCADE)),
],
options={
'ordering': ('-change_date',),

View File

@@ -16,7 +16,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('experience_type', models.PositiveSmallIntegerField(default=0, choices=[(0, b'Recurring Nudge and Upgrade Reminder'), (1, b'Course Updates')])),
('schedule', models.OneToOneField(related_name='experience', to='schedules.Schedule')),
('schedule', models.OneToOneField(related_name='experience', to='schedules.Schedule', on_delete=models.CASCADE)),
],
),
]

View File

@@ -8,7 +8,7 @@ from config_models.models import ConfigurationModel
class Schedule(TimeStampedModel):
enrollment = models.OneToOneField('student.CourseEnrollment', null=False)
enrollment = models.OneToOneField('student.CourseEnrollment', null=False, on_delete=models.CASCADE)
active = models.BooleanField(
default=True,
help_text=_('Indicates if this schedule is actively used')
@@ -38,7 +38,7 @@ class Schedule(TimeStampedModel):
class ScheduleConfig(ConfigurationModel):
KEY_FIELDS = ('site',)
site = models.ForeignKey(Site)
site = models.ForeignKey(Site, on_delete=models.CASCADE)
create_schedules = models.BooleanField(default=False)
enqueue_recurring_nudge = models.BooleanField(default=False)
deliver_recurring_nudge = models.BooleanField(default=False)
@@ -55,5 +55,5 @@ class ScheduleExperience(models.Model):
(1, 'course_updates', 'Course Updates')
)
schedule = models.OneToOneField(Schedule, related_name='experience')
schedule = models.OneToOneField(Schedule, related_name='experience', on_delete=models.CASCADE)
experience_type = models.PositiveSmallIntegerField(choices=EXPERIENCES, default=EXPERIENCES.default)

View File

@@ -19,7 +19,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('values', jsonfield.fields.JSONField(blank=True)),
('site', models.OneToOneField(related_name='configuration', to='sites.Site')),
('site', models.OneToOneField(related_name='configuration', to='sites.Site', on_delete=models.CASCADE)),
],
),
migrations.CreateModel(
@@ -29,7 +29,7 @@ class Migration(migrations.Migration):
('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)),
('values', jsonfield.fields.JSONField(blank=True)),
('site', models.ForeignKey(related_name='configuration_histories', to='sites.Site')),
('site', models.ForeignKey(related_name='configuration_histories', to='sites.Site', on_delete=models.CASCADE)),
],
options={
'ordering': ('-modified', '-created'),

View File

@@ -23,7 +23,7 @@ class SiteConfiguration(models.Model):
site (OneToOneField): one to one field relating each configuration to a single site
values (JSONField): json field to store configurations for a site
"""
site = models.OneToOneField(Site, related_name='configuration')
site = models.OneToOneField(Site, related_name='configuration', on_delete=models.CASCADE)
enabled = models.BooleanField(default=False, verbose_name="Enabled")
values = JSONField(
null=False,
@@ -122,7 +122,7 @@ class SiteConfigurationHistory(TimeStampedModel):
site (ForeignKey): foreign-key to django Site
values (JSONField): json field to store configurations for a site
"""
site = models.ForeignKey(Site, related_name='configuration_histories')
site = models.ForeignKey(Site, related_name='configuration_histories', on_delete=models.CASCADE)
enabled = models.BooleanField(default=False, verbose_name="Enabled")
values = JSONField(
null=False,

View File

@@ -16,7 +16,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('theme_dir_name', models.CharField(max_length=255)),
('site', models.ForeignKey(related_name='themes', to='sites.Site')),
('site', models.ForeignKey(related_name='themes', to='sites.Site', on_delete=models.CASCADE)),
],
),
]

View File

@@ -12,7 +12,7 @@ class SiteTheme(models.Model):
`site` field is foreignkey to django Site model
`theme_dir_name` contains directory name having Site's theme
"""
site = models.ForeignKey(Site, related_name='themes')
site = models.ForeignKey(Site, related_name='themes', on_delete=models.CASCADE)
theme_dir_name = models.CharField(max_length=255)
def __unicode__(self):

View File

@@ -23,7 +23,7 @@ class Migration(migrations.Migration):
('key', models.CharField(max_length=255, db_index=True)),
('course_id', CourseKeyField(max_length=255, db_index=True)),
('value', models.TextField()),
('user', models.ForeignKey(related_name='+', to=settings.AUTH_USER_MODEL)),
('user', models.ForeignKey(related_name='+', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
),
migrations.CreateModel(
@@ -35,7 +35,7 @@ class Migration(migrations.Migration):
('key', models.CharField(max_length=255, db_index=True)),
('org', models.CharField(max_length=255, db_index=True)),
('value', models.TextField()),
('user', models.ForeignKey(related_name='+', to=settings.AUTH_USER_MODEL)),
('user', models.ForeignKey(related_name='+', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
),
migrations.CreateModel(
@@ -44,7 +44,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('key', models.CharField(db_index=True, max_length=255, validators=[django.core.validators.RegexValidator(b'[-_a-zA-Z0-9]+')])),
('value', models.TextField()),
('user', models.ForeignKey(related_name='preferences', to=settings.AUTH_USER_MODEL)),
('user', models.ForeignKey(related_name='preferences', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
),
migrations.AlterUniqueTogether(

View File

@@ -35,7 +35,7 @@ class RetirementStateError(Exception):
class UserPreference(models.Model):
"""A user's preference, stored as generic text to be processed by client"""
KEY_REGEX = r"[-_a-zA-Z0-9]+"
user = models.ForeignKey(User, db_index=True, related_name="preferences")
user = models.ForeignKey(User, db_index=True, related_name="preferences", on_delete=models.CASCADE)
key = models.CharField(max_length=255, db_index=True, validators=[RegexValidator(KEY_REGEX)])
value = models.TextField()
@@ -113,7 +113,7 @@ class UserCourseTag(models.Model):
Per-course user tags, to be used by various things that want to store tags about
the user. Added initially to store assignment to experimental groups.
"""
user = models.ForeignKey(User, db_index=True, related_name="+")
user = models.ForeignKey(User, db_index=True, related_name="+", on_delete=models.CASCADE)
key = models.CharField(max_length=255, db_index=True)
course_id = CourseKeyField(max_length=255, db_index=True)
value = models.TextField()
@@ -129,7 +129,7 @@ class UserOrgTag(TimeStampedModel, DeletableByUserValue): # pylint: disable=mod
Allows settings to be configured at an organization level.
"""
user = models.ForeignKey(User, db_index=True, related_name="+")
user = models.ForeignKey(User, db_index=True, related_name="+", on_delete=models.CASCADE)
key = models.CharField(max_length=255, db_index=True)
org = models.CharField(max_length=255, db_index=True)
value = models.TextField()
@@ -173,7 +173,7 @@ class UserRetirementRequest(TimeStampedModel):
Users that have requested to cancel their retirement before retirement begins can be removed.
All other retired users persist in this table forever.
"""
user = models.OneToOneField(User)
user = models.OneToOneField(User, on_delete=models.CASCADE)
class Meta(object):
verbose_name = 'User Retirement Request'
@@ -203,14 +203,14 @@ class UserRetirementStatus(TimeStampedModel):
"""
Tracks the progress of a user's retirement request
"""
user = models.OneToOneField(User)
user = models.OneToOneField(User, on_delete=models.CASCADE)
original_username = models.CharField(max_length=150, db_index=True)
original_email = models.EmailField(db_index=True)
original_name = models.CharField(max_length=255, blank=True, db_index=True)
retired_username = models.CharField(max_length=150, db_index=True)
retired_email = models.EmailField(db_index=True)
current_state = models.ForeignKey(RetirementState, related_name='current_state')
last_state = models.ForeignKey(RetirementState, blank=True, related_name='last_state')
current_state = models.ForeignKey(RetirementState, related_name='current_state', on_delete=models.CASCADE)
last_state = models.ForeignKey(RetirementState, blank=True, related_name='last_state', on_delete=models.CASCADE)
responses = models.TextField()
class Meta(object):