Регистрацией пользователей в проекте управляет приложение django-registration==2.0.4. В миграции производится привязка пользователя к объекту модели и отправка письма с ссылкой активации аккаунта, если пользователя пришлось создать:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.conf import settings
from django.contrib.auth import hashers
from django.contrib.auth import models
from django.core import signing
from django.db import migrations
from django.template.loader import render_to_string
u""" Миграция выполняет создание объектов пользователей и их
подключение к заказу в случае их отсутствия в нём. Для каждого
созданного пользователя выполняется отправка письма с ссылкой для
активации аккаунта."""
REGISTRATION_SALT = getattr(settings, 'REGISTRATION_SALT', 'registration')
email_body_template = 'registration/activation_email.txt'
email_subject_template = 'registration/activation_email_subject.txt'
class FakeSite:
@property
def domain(self):
return u'example.ru'
fake_site = FakeSite()
def send_activation_email(user, raw_password):
context = {
'activation_key': signing.dumps(obj=getattr(user, 'username'), salt=REGISTRATION_SALT),
'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS,
'site': fake_site,
'username': user.email,
'password': raw_password
}
subject = render_to_string(email_subject_template, context)
subject = ''.join(subject.splitlines())
message = render_to_string(email_body_template, context)
try:
user_model = models.User.objects.get(email=user.email)
except models.User.MultipleObjectsReturned:
user_model = models.User.objects.filter(email=user.email)[0]
user_model.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
def migrate(app_registry, schema_editor):
PrintRequest = app_registry.get_model('order', 'PrintRequest')
User = app_registry.get_model('auth', 'User')
hasher = hashers.PBKDF2PasswordHasher()
for order in PrintRequest.objects.exclude(customer__isnull=False):
user, is_created = User.objects.get_or_create(username=order.name, email=order.email)
if is_created:
user.is_active = False
raw_password = 'random_password_here'
user.password = hasher.encode(password=raw_password, salt='example.ru')
user.save()
send_activation_email(user, raw_password)
order.customer = user
order.save()
class Migration(migrations.Migration):
dependencies = [
('order', '0006_auto_20160324_0024'),
('auth', '0006_require_contenttypes_0002'),
]
operations = [
migrations.RunPython(migrate, migrations.RunPython.noop),
]