diff --git a/auth_app/views.py b/auth_app/views.py index 1bea24c..aa84dbd 100644 --- a/auth_app/views.py +++ b/auth_app/views.py @@ -7,7 +7,10 @@ from .serializer import LoginSerializer from rest_framework.permissions import IsAuthenticated from django.utils import timezone from .models import ExpiringToken, ExpiringTokenAuthentication +from django.contrib.auth import get_user_model +from user_app.serializers import UserSerializer +User = get_user_model() class LoginView(APIView): serializer_class = LoginSerializer @@ -55,7 +58,25 @@ class LogoutView(APIView): return Response({"error": "No active session or token already expired"}, status=status.HTTP_401_UNAUTHORIZED) token.delete() return Response({"message": "Successfully logged out"}, status=status.HTTP_200_OK) - + +class RegisterView(APIView): + def post(self, request): + email = request.data.get('email') + password = request.data.get('password') + + if User.objects.filter(email=email).exists(): + return Response({'error': 'Email already exists'}, status=status.HTTP_409_CONFLICT) + + serialized = UserSerializer(data=request.data) + if serialized.is_valid(): + user = serialized.save() + user.set_password(password) + user.is_active = True + user.save() + return Response({'message': 'User created.'}, status=status.HTTP_201_CREATED) + + return Response(serialized.errors, status=status.HTTP_400_BAD_REQUEST) + class AuthView(APIView): authentication_classes = [authentication.TokenAuthentication] diff --git a/join/urls.py b/join/urls.py index 823b19d..9fd45ef 100644 --- a/join/urls.py +++ b/join/urls.py @@ -3,7 +3,7 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter from task_app.views import TaskViewSet, SubTaskViewSet, AssignedTaskViewSet from user_app.views import UserViewSet -from auth_app.views import LoginView, LogoutView, AuthView +from auth_app.views import LoginView, LogoutView, AuthView, RegisterView router = DefaultRouter() router.register(r'tasks', TaskViewSet) @@ -18,4 +18,6 @@ urlpatterns = [ path('auth/', AuthView.as_view(), name='auth'), path('auth/login/', LoginView.as_view(), name='login'), path('auth/logout/', LogoutView.as_view(), name='logout'), + path('auth/register/', RegisterView.as_view(), name='register'), + ] \ No newline at end of file diff --git a/user_app/serializers.py b/user_app/serializers.py index 1f56580..6f6d59d 100644 --- a/user_app/serializers.py +++ b/user_app/serializers.py @@ -7,12 +7,19 @@ from djangorestframework_camel_case.render import CamelCaseJSONRenderer def generate_random_color(): return "#" + "".join(random.choices("0123456789ABCDEF", k=6)) +def generate_initials(first_name, last_name): + return f"{first_name[0].upper()}{last_name[0].upper()}" + class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'first_name', 'last_name', 'email', 'phone', 'initials', 'color', 'is_online', 'is_contact_only', 'last_login'] def create(self, validated_data): + first_name = validated_data.get('first_name', '') + last_name = validated_data.get('last_name', '') + validated_data['initials'] = generate_initials(first_name, last_name) + if 'color' not in validated_data: validated_data['color'] = generate_random_color() return super().create(validated_data)