Skip to content

Commit 31863dd

Browse files
committed
userapp views
1 parent 2980431 commit 31863dd

File tree

11 files changed

+260
-1
lines changed

11 files changed

+260
-1
lines changed

src/task_app/admin.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
from django.contrib import admin
2+
from .models import *
23

34
# Register your models here.
5+
admin.site.register(Task)
6+
admin.site.register(Tag)
7+
admin.site.register(Category)
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# Generated by Django 4.2.4 on 2023-08-21 10:30
2+
3+
from django.conf import settings
4+
from django.db import migrations, models
5+
import django.db.models.deletion
6+
import uuid
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
initial = True
12+
13+
dependencies = [
14+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
15+
]
16+
17+
operations = [
18+
migrations.CreateModel(
19+
name="Category",
20+
fields=[
21+
(
22+
"id",
23+
models.BigAutoField(
24+
auto_created=True,
25+
primary_key=True,
26+
serialize=False,
27+
verbose_name="ID",
28+
),
29+
),
30+
("name", models.CharField(max_length=50)),
31+
],
32+
),
33+
migrations.CreateModel(
34+
name="Tag",
35+
fields=[
36+
(
37+
"id",
38+
models.BigAutoField(
39+
auto_created=True,
40+
primary_key=True,
41+
serialize=False,
42+
verbose_name="ID",
43+
),
44+
),
45+
("name", models.CharField(max_length=50)),
46+
],
47+
),
48+
migrations.CreateModel(
49+
name="Task",
50+
fields=[
51+
(
52+
"id",
53+
models.UUIDField(
54+
default=uuid.uuid4,
55+
editable=False,
56+
primary_key=True,
57+
serialize=False,
58+
),
59+
),
60+
("title", models.CharField(max_length=200)),
61+
("description", models.TextField()),
62+
(
63+
"priority",
64+
models.IntegerField(
65+
choices=[(1, "High"), (2, "Medium"), (3, "Low")], default=2
66+
),
67+
),
68+
(
69+
"status",
70+
models.CharField(
71+
choices=[
72+
("To Do", "To Do"),
73+
("In Progress", "In Progress"),
74+
("Done", "Done"),
75+
],
76+
default="To Do",
77+
max_length=20,
78+
),
79+
),
80+
("deadline", models.DateTimeField()),
81+
("created_at", models.DateTimeField(auto_now_add=True)),
82+
("updated_at", models.DateTimeField(auto_now=True)),
83+
(
84+
"category",
85+
models.ForeignKey(
86+
blank=True,
87+
null=True,
88+
on_delete=django.db.models.deletion.SET_NULL,
89+
to="task_app.category",
90+
),
91+
),
92+
("tags", models.ManyToManyField(blank=True, to="task_app.tag")),
93+
(
94+
"user",
95+
models.ForeignKey(
96+
on_delete=django.db.models.deletion.CASCADE,
97+
to=settings.AUTH_USER_MODEL,
98+
),
99+
),
100+
],
101+
),
102+
]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 4.2.4 on 2023-08-22 10:46
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("task_app", "0001_initial"),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name="category",
15+
options={"verbose_name": "Category", "verbose_name_plural": "Categories"},
16+
),
17+
]

src/task_app/models.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,51 @@
11
from django.db import models
2+
from django.contrib.auth import get_user_model
3+
import uuid
24

35
# Create your models here.
6+
7+
class Category(models.Model):
8+
name = models.CharField(max_length=50)
9+
10+
def __str__(self):
11+
return self.name
12+
13+
class Meta:
14+
verbose_name = "Category"
15+
verbose_name_plural = "Categories"
16+
17+
18+
class Tag(models.Model):
19+
name = models.CharField(max_length=50)
20+
21+
def __str__(self):
22+
return self.name
23+
24+
25+
class Task(models.Model):
26+
PRIORITY_CHOICES = (
27+
(1, "High"),
28+
(2, "Medium"),
29+
(3, "Low"),
30+
)
31+
32+
STATUS_CHOICES = (
33+
("To Do", "To Do"),
34+
("In Progress", "In Progress"),
35+
("Done", "Done"),
36+
)
37+
38+
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
39+
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
40+
title = models.CharField(max_length=200)
41+
description = models.TextField()
42+
priority = models.IntegerField(choices=PRIORITY_CHOICES, default=2)
43+
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='To Do')
44+
deadline = models.DateTimeField()
45+
category = models.ForeignKey(Category, null=True, blank=True, on_delete=models.SET_NULL)
46+
tags = models.ManyToManyField(Tag, blank=True)
47+
created_at = models.DateTimeField(auto_now_add=True)
48+
updated_at = models.DateTimeField(auto_now=True)
49+
50+
def __str__(self):
51+
return self.title

src/task_app/permissions.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# permissions.py
2+
from rest_framework import permissions
3+
4+
class IsTaskOwner(permissions.BasePermission):
5+
def has_object_permission(self, request, view, obj):
6+
return obj.user == request.user

src/task_app/serializers.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from rest_framework import serializers
2+
from .models import Task, Category, Tag
3+
4+
5+
class TaskSerializer(serializers.ModelSerializer):
6+
class Meta:
7+
model = Task
8+
fields = "__all__"
9+
10+
11+
class CategorySerializer(serializers.ModelSerializer):
12+
class Meta:
13+
model = Category
14+
fields = "__all__"
15+
16+
17+
class TagSerializer(serializers.ModelSerializer):
18+
class Meta:
19+
model = Tag
20+
fields = "__all__"

src/task_app/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.urls import path
2+
from .views import *
3+
4+
urlpatterns = [
5+
path("task/", TaskView.as_view(), name="tasks")
6+
]

src/task_app/views.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,57 @@
11
from django.shortcuts import render
2+
from .serializers import *
3+
from rest_framework.response import Response
4+
from .models import Task
5+
from rest_framework.views import APIView
6+
from rest_framework import status
7+
from django.contrib.auth import get_user_model
8+
from rest_framework.permissions import IsAdminUser
9+
from django.http import Http404
10+
11+
212

313
# Create your views here.
14+
class TaskView(APIView):
15+
"""
16+
list all task or create a new task
17+
"""
18+
def get(self, request, format=None):
19+
tasks = Task.objects.all()
20+
serializer = TaskSerializer(tasks, many=True)
21+
return Response(serializer.data)
22+
23+
def post(self, request, format=None):
24+
serializer = TaskSerializer(data=request.data)
25+
if serializer.is_valid():
26+
serializer.save()
27+
return Response(serializer.data, status=status.HTTP_201_CREATED)
28+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
29+
30+
31+
class TaskDetail(APIView):
32+
"""
33+
Retrieve, update or delete a snippet instance.
34+
"""
35+
def get_object(self, pk):
36+
try:
37+
return Task.objects.get(pk=pk)
38+
except Task.DoesNotExist:
39+
raise Http404
40+
41+
def get(self, request, pk, format=None):
42+
task = self.get_object(pk)
43+
serializer = TaskSerializer(task)
44+
return Response(serializer.data)
45+
46+
def put(self, request, pk, format=None):
47+
task = self.get_object(pk)
48+
serializer = TaskSerializer(task, data=request.data)
49+
if serializer.is_valid():
50+
serializer.save()
51+
return Response(serializer.data)
52+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
53+
54+
def delete(self, request, pk, format=None):
55+
task = self.get_object(pk)
56+
task.delete()
57+
return Response(status=status.HTTP_204_NO_CONTENT)

src/taskflow/settings.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@
135135
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
136136
'UPDATE_LAST_LOGIN': True,
137137
'SIGNING_KEY': env('SIGNING_KEY'),
138-
# It will work instead of the default serializer(TokenObtainPairSerializer).
139138
"TOKEN_OBTAIN_SERIALIZER": "user_app.serializers.MyTokenObtainPairSerializer",
140139
}
141140

src/taskflow/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@
2020
urlpatterns = [
2121
path("admin/", admin.site.urls),
2222
path("api/user/", include("user_app.urls")),
23+
path("api/task/", include("task_app.urls")),
2324
]

0 commit comments

Comments
 (0)