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()
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):
"""Extended queryset for User model."""
@ -595,6 +615,8 @@ class UserRole(ProjectBaseMixin):
help_text='A user (REQUESTER) who requests a '
'role change for a USER')
for_team = models.BooleanField(verbose_name=_('is this role for team membership'), default=False)
objects = UserRoleQueryset.as_manager()
class Meta:

View File

@ -174,3 +174,18 @@ class UserCSVSerializer(serializers.ModelSerializer):
'last_ip',
'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>/csv/', views.get_user_csv, name='user-csv'),
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_filters.rest_framework import DjangoFilterBackend
from django.shortcuts import get_object_or_404
from rest_framework import generics, status
from rest_framework import permissions
from rest_framework.authtoken.models import Token
@ -14,6 +15,7 @@ from account import models, filters
from account.models import User
from account.serializers import back as serializers
from account.serializers.common import RoleBaseSerializer
from establishment.models import Establishment
from utils.methods import get_permission_classes
from utils.permissions import IsReviewManager
@ -187,3 +189,16 @@ class UserCSVViewSet(ModelViewSet):
writer.writerow(item.values())
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)