diff --git a/join/settings.py b/join/settings.py index 9e22ff6..82d85a2 100644 --- a/join/settings.py +++ b/join/settings.py @@ -45,6 +45,8 @@ CORS_ALLOW_HEADERS = [ # Application definition +AUTH_USER_MODEL = 'user_app.User' + INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', @@ -55,6 +57,7 @@ INSTALLED_APPS = [ 'rest_framework', 'corsheaders', 'task_app', + 'user_app', ] MIDDLEWARE = [ diff --git a/join/urls.py b/join/urls.py index 52248cc..8f61cf7 100644 --- a/join/urls.py +++ b/join/urls.py @@ -2,11 +2,13 @@ from django.contrib import admin 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 router = DefaultRouter() router.register(r'tasks', TaskViewSet) router.register(r'subtasks', SubTaskViewSet) router.register(r'assigned_tasks', AssignedTaskViewSet) +router.register(r'users', UserViewSet) urlpatterns = [ path('admin/', admin.site.urls), diff --git a/user_app/__init__.py b/user_app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/user_app/admin.py b/user_app/admin.py new file mode 100644 index 0000000..d0ff6a3 --- /dev/null +++ b/user_app/admin.py @@ -0,0 +1,25 @@ +from django.contrib import admin +from .models import User + +class UserAdmin(admin.ModelAdmin): + exclude = ('uId',) + list_display = ('first_name', 'last_name', 'email', 'phone', 'initials', 'color', 'status', 'last_login', 'is_active', 'is_staff') + list_filter = ('status', 'is_active', 'is_staff') + search_fields = ('email', 'first_name', 'last_name') + + fieldsets = ( + (None, { + 'fields': ('first_name', 'last_name', 'email', 'phone') + }), + ('Additional Info', { + 'fields': ('initials', 'color', 'status', 'last_login') + }), + ('Permissions', { + 'fields': ('is_active', 'is_staff') + }), + ) + + list_editable = ('is_active', 'is_staff', 'status') + ordering = ('last_name',) + +admin.site.register(User, UserAdmin) \ No newline at end of file diff --git a/user_app/apps.py b/user_app/apps.py new file mode 100644 index 0000000..f2d1d41 --- /dev/null +++ b/user_app/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UserAppConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'user_app' diff --git a/user_app/migrations/__init__.py b/user_app/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/user_app/models.py b/user_app/models.py new file mode 100644 index 0000000..c290c36 --- /dev/null +++ b/user_app/models.py @@ -0,0 +1,53 @@ +from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin, Group, Permission +from django.db import models +import uuid + +def generate_uuid_without_dashes(): + return str(uuid.uuid4()).replace("-", "") + +class UserManager(BaseUserManager): + def create_user(self, email, first_name, password=None): + if not email: + raise ValueError("Users must have an email address") + email = self.normalize_email(email) + user = self.model( + email=email, + first_name=first_name, + ) + user.set_password(password) + user.save(using=self._db) + return user + + def create_superuser(self, email, first_name, password=None): + user = self.create_user(email, first_name, password) + user.is_staff = True + user.is_superuser = True + user.save(using=self._db) + return user + + +class User(AbstractBaseUser, PermissionsMixin): + uId = models.UUIDField(default=uuid.uuid4, unique=True, editable=False) + id = models.CharField(primary_key=True, default=generate_uuid_without_dashes, max_length=32,editable=False, unique=True) + first_name = models.CharField(max_length=50) + last_name = models.CharField(max_length=50) + email = models.EmailField(unique=True) + phone = models.CharField(max_length=20, blank=True, null=True) + initials = models.CharField(max_length=10, blank=True) + color = models.CharField(max_length=20, blank=True) + status = models.BooleanField(default=True) + last_login = models.DateTimeField(blank=True, null=True) + + is_active = models.BooleanField(default=True) + is_staff = models.BooleanField(default=False) + + groups = models.ManyToManyField(Group, related_name="user_app_users", blank=True) + user_permissions = models.ManyToManyField(Permission, related_name="user_app_users_permissions", blank=True) + + objects = UserManager() + + USERNAME_FIELD = 'email' + REQUIRED_FIELDS = ['first_name'] + + def __str__(self): + return self.email \ No newline at end of file diff --git a/user_app/serializers.py b/user_app/serializers.py new file mode 100644 index 0000000..35acfae --- /dev/null +++ b/user_app/serializers.py @@ -0,0 +1,7 @@ +from rest_framework import serializers +from .models import User + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ['id', 'uId', 'first_name', 'last_name', 'email', 'phone', 'initials', 'color', 'status', 'last_login'] \ No newline at end of file diff --git a/user_app/tests.py b/user_app/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/user_app/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/user_app/views.py b/user_app/views.py new file mode 100644 index 0000000..258bd06 --- /dev/null +++ b/user_app/views.py @@ -0,0 +1,7 @@ +from rest_framework import viewsets +from .models import User +from .serializers import UserSerializer + +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all() + serializer_class = UserSerializer \ No newline at end of file