invite team member route

This commit is contained in:
Kuroshini 2020-02-04 18:22:03 +03:00
parent 2db59131a8
commit fc0cf3e25b
4 changed files with 54 additions and 0 deletions

View File

@ -113,6 +113,26 @@ class UserManager(BaseUserManager):
obj.save() obj.save()
return obj return obj
def invite_for_team(self, email: str, establishment: Establishment):
created = False
user = User.objects.filter(email=email).first()
if user is None:
from utils.methods import string_random
user = self.make(email, string_random(), True, string_random())
created = True
if created:
pass # TODO: send email with password reset and role id
else:
pass # TODO: send email-notification with role activation link
user_role_defaults = {'for_team': True, 'state': UserRole.PENDING}
role, is_role_created = Role.objects.get_or_create(role=Role.ESTABLISHMENT_ADMINISTRATOR)
user_role, is_user_role_created = UserRole.objects.get_or_create(user=user, establishment=establishment,
role=role, defaults=user_role_defaults)
if not is_user_role_created:
from rest_framework.serializers import ValidationError
raise ValidationError({'detail': f'User with this role already exists. State: {user_role.state}'})
return user
class UserQuerySet(models.QuerySet): class UserQuerySet(models.QuerySet):
"""Extended queryset for User model.""" """Extended queryset for User model."""
@ -595,6 +615,8 @@ class UserRole(ProjectBaseMixin):
help_text='A user (REQUESTER) who requests a ' help_text='A user (REQUESTER) who requests a '
'role change for a USER') 'role change for a USER')
for_team = models.BooleanField(verbose_name=_('is this role for team membership'), default=False)
objects = UserRoleQueryset.as_manager() objects = UserRoleQueryset.as_manager()
class Meta: class Meta:

View File

@ -174,3 +174,18 @@ class UserCSVSerializer(serializers.ModelSerializer):
'last_ip', 'last_ip',
'roles_list', 'roles_list',
] ]
class InviteTeamSerializer(serializers.ModelSerializer):
email = serializers.EmailField(required=True, allow_blank=False, allow_null=False)
class Meta:
model = models.User
fields = (
'id',
'email',
)
def create(self, validated_data):
establishment = self.context['view'].kwargs['establishment']
return models.User.objects.invite_for_team(validated_data['email'], establishment)

View File

@ -13,4 +13,6 @@ urlpatterns = [
path('user/<int:id>/', views.UserRUDView.as_view(), name='user-rud'), path('user/<int:id>/', views.UserRUDView.as_view(), name='user-rud'),
path('user/<int:id>/csv/', views.get_user_csv, name='user-csv'), path('user/<int:id>/csv/', views.get_user_csv, name='user-csv'),
path('user/csv/', views.UserCSVViewSet.as_view({'get': 'to_csv'}), name='user-csv-list'), path('user/csv/', views.UserCSVViewSet.as_view({'get': 'to_csv'}), name='user-csv-list'),
path('team/invite/<int:establishment_id>', views.EstablishmentTeamInviteView.as_view(),
name='invite-to-establishment-team'),
] ]

View File

@ -3,6 +3,7 @@ from datetime import datetime
from django.http import HttpResponse, HttpResponseNotFound from django.http import HttpResponse, HttpResponseNotFound
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from django.shortcuts import get_object_or_404
from rest_framework import generics, status from rest_framework import generics, status
from rest_framework import permissions from rest_framework import permissions
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
@ -14,6 +15,7 @@ from account import models, filters
from account.models import User from account.models import User
from account.serializers import back as serializers from account.serializers import back as serializers
from account.serializers.common import RoleBaseSerializer from account.serializers.common import RoleBaseSerializer
from establishment.models import Establishment
from utils.methods import get_permission_classes from utils.methods import get_permission_classes
from utils.permissions import IsReviewManager from utils.permissions import IsReviewManager
@ -187,3 +189,16 @@ class UserCSVViewSet(ModelViewSet):
writer.writerow(item.values()) writer.writerow(item.values())
return response return response
class EstablishmentTeamInviteView(generics.CreateAPIView):
"""View to invite new team member by email"""
queryset = User.objects.all()
# permission_classes = get_permission_classes()
from rest_framework.permissions import AllowAny
permission_classes = (AllowAny, )
serializer_class = serializers.InviteTeamSerializer
def create(self, request, *args, **kwargs):
self.kwargs['establishment'] = get_object_or_404(klass=Establishment, pk=self.kwargs['establishment_id'])
return super().create(request, *args, **kwargs)