Skip to content

Instantly share code, notes, and snippets.

@empeje
Last active August 1, 2023 18:49
Show Gist options
  • Save empeje/37320132d5ab08e5b42dc85e540ed724 to your computer and use it in GitHub Desktop.
Save empeje/37320132d5ab08e5b42dc85e540ed724 to your computer and use it in GitHub Desktop.
Override django-rest-passwordreset for CockroachDB
# -*- coding: utf-8 -*-
# Generated by Django 1.10.6 on 2017-03-13 17:53
from __future__ import unicode_literals
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="ResetPasswordToken",
fields=[
(
"created_at",
models.DateTimeField(
auto_now_add=True, verbose_name="When was this token generated"
),
),
(
"id",
models.CharField(
max_length=64,
primary_key=True,
serialize=False,
verbose_name="Id",
auto_created=True,
),
),
(
"ip_address",
models.GenericIPAddressField(
default="127.0.0.1",
verbose_name="The IP address of this session",
),
),
(
"user_agent",
models.CharField(
default="", max_length=256, verbose_name="HTTP User Agent"
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="password_reset_tokens",
to=settings.AUTH_USER_MODEL,
verbose_name="The User which is associated to this password reset token",
),
),
],
options={
"verbose_name_plural": "Password Reset Tokens",
"verbose_name": "Password Reset Token",
},
),
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import django
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
def populate_auto_incrementing_pk_field(apps, schema_editor):
ResetPasswordToken = apps.get_model(
"django_rest_passwordreset", "ResetPasswordToken"
)
# Generate values for the new id column
for i, o in enumerate(ResetPasswordToken.objects.all()):
o.id = i + 1
o.save()
def get_migrations_for_django_before_21():
return [
# add a new id field (without primary key information)
migrations.AddField(
model_name="resetpasswordtoken",
name="id",
field=models.IntegerField(null=True),
preserve_default=True,
),
# fill the new pk field
migrations.RunPython(
populate_auto_incrementing_pk_field, migrations.RunPython.noop
),
# add primary key information to id field
migrations.AlterField(
model_name="resetpasswordtoken",
name="id",
field=models.AutoField(primary_key=True, serialize=False),
),
# remove primary key information from 'key' field
migrations.AlterField(
model_name="resetpasswordtoken",
name="key",
field=models.CharField(
db_index=True, max_length=64, unique=True, verbose_name="Key"
),
),
]
def get_migrations_for_django_21_and_newer():
return [
# remove primary key information from 'key' field
# README: need add migrations manually from django_rest_rest_passwordreset for cockroach compatibility
# README: commented for cockroachdb
# migrations.AlterField(
# model_name='resetpasswordtoken',
# name='key',
# field=models.CharField(db_index=True, primary_key=False, max_length=64, unique=True, verbose_name='Key'),
# ),
# add a new id field
migrations.AddField(
model_name="resetpasswordtoken",
name="key",
field=models.CharField(
max_length=64, primary_key=False, serialize=False, verbose_name="Key"
),
preserve_default=False,
),
migrations.RunPython(
populate_auto_incrementing_pk_field, migrations.RunPython.noop
),
]
def get_migrations_based_on_django_version():
"""
Returns the proper migrations based on the current Django Version
Unfortunatley, Django 2.1 introduced a breaking change with switching PK from one model to another, see
https://code.djangoproject.com/ticket/29790
:return:
"""
django_version = django.VERSION
if (django_version[0] >= 2 and django_version[1] >= 1) or django_version[0] >= 3:
return get_migrations_for_django_21_and_newer()
return get_migrations_for_django_before_21()
class Migration(migrations.Migration):
dependencies = [
(
"django_rest_passwordreset",
"0001_initial",
),
]
operations = get_migrations_based_on_django_version()
# 0001_initial.py
                (
+                    "key",
-                    "id",
                    models.CharField(
                        max_length=64,
                        primary_key=True,
                        serialize=False,
-                        verbose_name="Key",
+                        verbose_name="Id",
+                        auto_created=True,
                    ),
                ),
def get_migrations_for_django_21_and_newer():
    return [
-        # remove primary key information from 'key' field
-        migrations.AlterField(
-            model_name='resetpasswordtoken',
-            name='key',
-            field=models.CharField(db_index=True, primary_key=False, max_length=64, unique=True, verbose_name='Key'),
-        ),
-        # add a new id field
        migrations.AddField(
            model_name='resetpasswordtoken',
-            name='id',
+            name='key',
-            field=models.AutoField(primary_key=True, serialize=False),
+            field=models.CharField(
                max_length=64, primary_key=False, serialize=False, verbose_name="Key"
            ),
            preserve_default=False,
        ),
        migrations.RunPython(
            populate_auto_incrementing_pk_field,
            migrations.RunPython.noop
        ),
    ]
MIGRATION_MODULES = {
"django_rest_passwordreset": "app.override_django_rest_passwordreset"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment