Приглашения пользователей на основе пригласительных ссылок
Мой сценарий таков: у меня есть модель команд, лидеры команд рассылают ссылки приглашения в команду, url schema "domain/{team.id}/{team.name}/" Я использую dj_rest_auth для аутентификации, эти пригласительные ссылки отправляются незарегистрированным пользователям. Когда пользователь нажимает на url, он перенаправляется на страницу регистрации. Теперь мне нужно добавить пользователя в команду (id команды получен в url) после того, как он зарегистрируется, Я не могу понять, как передать id команды в сигнал user_sign_up post_save в allauth, django Sessionstore не работает, так как ключ генерируется каждый раз разный docs here, я новичок в django rest framework. я также посмотрел django globals, но это тоже не помогло. Любая помощь будет очень признательна,
app.views:
from django.contrib.sessions.backends.db import SessionStore
def inviteduser(request, pk, name):
s = SessionStore()
s['team-id'] = pk
s.create()
print(s.session_key)
return redirect('http://localhost:8000/account/registration')
accounts.signals:
from allauth.account.signals import user_signed_up
from django.dispatch import receiver
from core.models import TeamMembers
from django.contrib.sessions.backends.db import SessionStore
@receiver(user_signed_up)
def user_signed_up(request, user, **kwargs):
s = SessionStore(session_key='gm0p279oeqvu385fy28btbyjzhak8a2j')
# if request.session['team-id']:
teamid = s['team-id']
# print(teamid)
teammember = TeamMembers(member_id=user.id, team_id=teamid)
teammember.save()
у меня есть пользовательская модель пользователя и соответствующий пользовательский сериализатор.
account.models:
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.utils.translation import ugettext_lazy as _
class UserManager(BaseUserManager):
"""Define a model manager for User model with no username field."""
use_in_migrations = True
def _create_user(self, email, password, **extra_fields):
"""Create and save a User with the given email and password."""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, **extra_fields):
"""Create and save a regular User with the given email and password."""
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
"""Create and save a SuperUser with the given email and password."""
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **extra_fields)
class User(AbstractUser):
"""User model."""
username = None
first_name = models.CharField(max_length=200, null=False, blank=False)
last_name = models.CharField(max_length=200, null=False, blank=False)
email = models.EmailField(_('email address'), unique=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
accounts.serializer:
from django.db import transaction
from rest_framework import serializers
from dj_rest_auth.registration.serializers import RegisterSerializer
from accounts.models import User
class CustomRegisterSerializer(RegisterSerializer):
email = serializers.EmailField(allow_blank=False, required=True)
first_name = serializers.CharField(max_length=200, allow_blank=False, required=True)
last_name = serializers.CharField(max_length=200, allow_blank=False, required=True)
# Define transaction.atomic to rollback the save operation in case of error
@transaction.atomic
def save(self, request):
user = super().save(request)
user.email = self.data.get('email')
user.first_name = self.data.get('first_name')
user.last_name = self.data.get('last_name')
user.save()
print(request.session.get('team-id'))
return user