diff --git a/main/api_views.py b/main/api_views.py index f3ff637..4cc2345 100644 --- a/main/api_views.py +++ b/main/api_views.py @@ -1,7 +1,7 @@ # main/api_views.py from rest_framework import viewsets -from .models import Project, Task -from .serializers import ProjectSerializer, TaskSerializer +from .models import Project, Task, RegisteredUser +from .serializers import ProjectSerializer, TaskSerializer, UserRegistrationSerializer class ProjectViewSet(viewsets.ModelViewSet): queryset = Project.objects.all() @@ -10,3 +10,31 @@ class ProjectViewSet(viewsets.ModelViewSet): class TaskViewSet(viewsets.ModelViewSet): queryset = Task.objects.all() serializer_class = TaskSerializer + + +class AccountViewSet(viewsets.ModelViewSet): + queryset = RegisteredUser.objects.all() + serializer_class = UserRegistrationSerializer + +class UserRegistrationView(APIView): + def post(self, request): + serializer = UserRegistrationSerializer(data=request.data) + if serializer.is_valid(): + user = serializer.save() + return Response({"id": user.id, "username": user.username}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +class UserLoginView(APIView): + def post(self, request): + username = request.data.get('username') + password = request.data.get('password') + user = authenticate(request, username=username, password=password) + if user is not None: + login(request, user) + return Response({"message"}: "Login successful"}, status=status.HTTP_200_OK) + return Response({error}: "Invalid credentials", status=status.HTTP_401_UNAUTHORIZED) + +class UserLogoutView(APIView): + def post(self, request): + logout(request) + return Response({"message": "Logout successful"}, status=status.HTTP_200_OK) diff --git a/main/models.py b/main/models.py index 41249c4..33438ee 100644 --- a/main/models.py +++ b/main/models.py @@ -5,6 +5,11 @@ from django.contrib.auth.models import User from django.db import models from django.conf import settings +class RegisteredUser(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) + def __str__(self): + return self.user.username + class Profile(models.Model): ROLE_CHOICES = [ ('Application Admin', 'Application Admin'), @@ -45,4 +50,6 @@ class Task(models.Model): updated_at = models.DateTimeField(auto_now=True) def __str__(self): - return self.name \ No newline at end of file + return self.name + + diff --git a/main/serializers.py b/main/serializers.py index 17c24a1..9a252a8 100644 --- a/main/serializers.py +++ b/main/serializers.py @@ -1,5 +1,17 @@ from rest_framework import serializers -from .models import Project, Task +from .models import Project, Task, RegisteredUser + +class UserRegistrationSerializer(serializers.ModelSerializer): + class Meta: + model = RegisteredUser + fields = ('username', 'password', 'email') + extra_kwargs = {'password': {'write_only': True}} + + def create(self, validated_data): + user = RegisteredUser(**validated_data) + user = set_password(validated_data['password']) + user.save() + return user class ProjectSerializer(serializers.ModelSerializer): class Meta: diff --git a/main/urls.py b/main/urls.py index 24e9f6f..5234d63 100644 --- a/main/urls.py +++ b/main/urls.py @@ -2,17 +2,18 @@ from .views import create_project, project_dashboard, create_task from django.urls import path, include from rest_framework.routers import DefaultRouter -from .api_views import ProjectViewSet, TaskViewSet +from .api_views import ProjectViewSet, TaskViewSet, UserRegistrationView, UserLoginView, UserLogoutView router = DefaultRouter() router.register(r'projects', ProjectViewSet) router.register(r'tasks', TaskViewSet) +router.register(r'accounts', AccountViewSet) urlpatterns = [ path('api/', include(router.urls)), -# path('login/', login_view, name='login'), -# path('logout/', logout_view, name='logout'), -# path('welcome/', welcome_view, name='welcome'), + path('accounts/login/', UserLoginView, name='login'), + path('accounts/logout/', UserLogoutView, name='logout'), + path('accounts/register/', UserRegisterView, name='welcome'), path('projects/create/', create_project, name='create_project'), path('projects//', project_dashboard, name='project_dashboard'), path('projects//tasks/create/', create_task, name='create_task'), diff --git a/main/views.py b/main/views.py index 744e124..7d40222 100644 --- a/main/views.py +++ b/main/views.py @@ -4,6 +4,8 @@ from django.contrib.auth.decorators import login_required from .models import Project, Task from .forms import ProjectForm, TaskForm + +# create project @login_required def create_project(request): if request.method == 'POST': @@ -27,7 +29,7 @@ def create_project(request): form = ProjectForm() return render(request, 'create_project.html', {'form': form}) -# main/views.py +# Load project as current focus @login_required def load_project(request): if request.method == 'POST': @@ -37,12 +39,14 @@ def load_project(request): return render(request, 'load_project.html', {'projects': projects}) +# Active projects @login_required def project_dashboard(request, project_id): project = get_object_or_404(Project, id=project_id) tasks = project.tasks.all() return render(request, 'project_dashboard.html', {'project': project, 'tasks': tasks}) +# Create task in current focus project - if no project chosen default project for user is focus @login_required def create_task(request, project_id): project = get_object_or_404(Project, id=project_id)