This commit is contained in:
2026-02-26 11:06:14 +07:00
parent a397405f65
commit 1bf515ae76
29 changed files with 926 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.
+5
View File
@@ -0,0 +1,5 @@
from django.apps import AppConfig
class UserProfileConfig(AppConfig):
name = 'user_profile'
+3
View File
@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.
+13
View File
@@ -0,0 +1,13 @@
from rest_framework.permissions import BasePermission, SAFE_METHODS
class TargetIsStaff(BasePermission):
message = "Hanya bisa memodifikasi user staff."
def has_permission(self, request, view):
if request.method in SAFE_METHODS:
return bool(request.user and request.user.is_authenticated)
return bool(request.user and request.user.is_staff)
def has_object_permission(self, request, view, obj):
return bool(request.user.is_staff and obj.is_staff)
+72
View File
@@ -0,0 +1,72 @@
from django.contrib.auth import get_user_model
from rest_framework import serializers
User = get_user_model()
from django.contrib.auth import get_user_model
from rest_framework import serializers
User = get_user_model()
class UserCreateSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'id',
'username',
'email',
'password',
'first_name',
'last_name',
]
extra_kwargs = {
'password': {'write_only': True}
}
def create(self, validated_data):
password = validated_data.pop('password')
user = User(**validated_data)
user.set_password(password)
user.is_staff = True
user.save()
return user
class UserRetrieveSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'id',
'username',
'email',
'first_name',
'last_name',
'is_active',
'is_staff',
'is_superuser',
'date_joined',
'last_login',
]
read_only_fields = fields
class UserUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'id',
'username',
'email',
'first_name',
'last_name',
]
class UserUpdatePasswordSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'id',
'password',
]
extra_kwargs = {
'password': {'write_only': True}
}
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+11
View File
@@ -0,0 +1,11 @@
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from user_profile import views
urlpatterns = [
path('users/', views.UserList.as_view()),
path('users/<int:pk>/', views.UserDetail.as_view()),
path('users/<int:pk>/password/', views.UserPasswordUpdate.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)
+41
View File
@@ -0,0 +1,41 @@
from rest_framework import filters, generics, permissions
from django.contrib.auth import get_user_model
from user_profile.permissions import TargetIsStaff
from user_profile import serializers
from django_filters.rest_framework import DjangoFilterBackend
User = get_user_model()
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = serializers.UserCreateSerializer
permission_classes = [TargetIsStaff]
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
search_fields = ['username', 'email', 'first_name', 'last_name']
filterset_fields = ['username', 'email', 'first_name', 'last_name']
ordering_fields = '__all__'
def get_serializer_class(self):
serializer_class = self.serializer_class
if self.request.method == 'GET':
serializer_class = serializers.UserRetrieveSerializer
return serializer_class
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = serializers.UserUpdateSerializer
permission_classes = [TargetIsStaff]
def get_serializer_class(self):
serializer_class = self.serializer_class
if self.request.method == 'GET':
serializer_class = serializers.UserRetrieveSerializer
return serializer_class
class UserPasswordUpdate(generics.UpdateAPIView):
queryset = User.objects.all()
serializer_class = serializers.UserUpdatePasswordSerializer
permission_classes = [TargetIsStaff]