diff --git a/users/admin.py b/users/admin.py index df8be79..d717d58 100644 --- a/users/admin.py +++ b/users/admin.py @@ -6,7 +6,7 @@ from rest_framework_simplejwt.tokens import RefreshToken class CustomUserAdmin(UserAdmin): model = CustomUser - list_display = ('email', 'name', 'grade', 'is_active', 'is_staff', 'jwt_preview') + list_display = ('email', 'name', 'grade', 'desc', 'is_active', 'is_staff', 'jwt_preview') list_filter = ('grade', 'is_active', 'is_staff') search_fields = ('email', 'name') ordering = ('email',) @@ -15,7 +15,7 @@ class CustomUserAdmin(UserAdmin): fieldsets = ( (None, {'fields': ('email', 'password')}), - ('Personal Info', {'fields': ('name', 'grade')}), + ('Personal Info', {'fields': ('name', 'grade', 'desc')}), ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), ('Important dates', {'fields': ('last_login', 'created_at')}), ('JWT Token Preview', {'fields': ('jwt_preview',)}), # ✅ 별도 섹션으로 추가 @@ -25,7 +25,8 @@ class CustomUserAdmin(UserAdmin): (None, { 'classes': ('wide',), 'fields': ( - 'email', 'name', 'grade', 'password1', 'password2', + 'email', 'name', 'grade', 'desc', + 'password1', 'password2', 'is_active', 'is_staff', 'is_superuser' ), }), diff --git a/users/migrations/0002_customuser_desc.py b/users/migrations/0002_customuser_desc.py new file mode 100644 index 0000000..f0622d3 --- /dev/null +++ b/users/migrations/0002_customuser_desc.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.14 on 2025-05-17 13:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='customuser', + name='desc', + field=models.TextField(blank=True, null=True, verbose_name='설명'), + ), + ] diff --git a/users/models.py b/users/models.py index 09ffb7d..ba268d0 100644 --- a/users/models.py +++ b/users/models.py @@ -35,6 +35,8 @@ class CustomUser(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) name = models.CharField(max_length=255) grade = models.CharField(max_length=20, choices=GRADE_CHOICES, default='user') + desc = models.TextField(blank=True, null=True, verbose_name="설명") + is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) diff --git a/users/serializers.py b/users/serializers.py index e4bae34..f174945 100644 --- a/users/serializers.py +++ b/users/serializers.py @@ -7,7 +7,7 @@ class RegisterSerializer(serializers.ModelSerializer): class Meta: model = CustomUser - fields = ('email', 'name', 'password', 'grade') + fields = ('email', 'name', 'password', 'grade', 'desc') def create(self, validated_data): password = validated_data.pop('password') diff --git a/users/views.py b/users/views.py index 093f96c..c300af4 100644 --- a/users/views.py +++ b/users/views.py @@ -21,6 +21,14 @@ class MeView(APIView): user = request.user serializer = RegisterSerializer(user) return Response(serializer.data) + + def put(self, request): + user = request.user + serializer = RegisterSerializer(user, data=request.data, partial=True) # ✅ 부분 수정 허용 + if serializer.is_valid(): + serializer.save() + return Response(serializer.data) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class CustomTokenObtainPairView(TokenObtainPairView): serializer_class = CustomTokenObtainPairSerializer \ No newline at end of file diff --git a/version b/version index fa3de58..99d85ec 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.0.5 \ No newline at end of file +0.0.6 \ No newline at end of file