roo roo roo down the river we go...

This commit is contained in:
2025-10-24 21:47:45 -05:00
parent 31f3ba08c2
commit bb115e8665
18 changed files with 699 additions and 8 deletions

0
users/__init__.py Normal file
View File

43
users/models.py Normal file
View File

@@ -0,0 +1,43 @@
from django.contrib.auth.models import AbstractUser
from django.db import models
from tenants.models import Tenant
class User(AbstractUser):
"""
Custom User model that extends Django's AbstractUser.
Supports multi-tenancy by linking users to specific tenants.
"""
tenant = models.ForeignKey(
Tenant,
on_delete=models.CASCADE,
related_name='users',
null=True,
blank=True
)
is_job_seeker = models.BooleanField(default=False)
is_employer = models.BooleanField(default=False)
is_tenant_admin = models.BooleanField(default=False)
is_global_admin = models.BooleanField(default=False)
# Additional fields for job seekers
resume = models.FileField(upload_to='resumes/', null=True, blank=True)
bio = models.TextField(max_length=1000, blank=True)
phone_number = models.CharField(max_length=15, blank=True)
# Additional fields for employers
company_name = models.CharField(max_length=200, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.username} ({self.email})"
def get_full_name(self):
"""
Return the user's full name.
"""
if self.first_name and self.last_name:
return f"{self.first_name} {self.last_name}"
return self.username

15
users/serializers.py Normal file
View File

@@ -0,0 +1,15 @@
from rest_framework import serializers
from django.contrib.auth.models import User
from .models import User as CustomUser
class UserSerializer(serializers.ModelSerializer):
"""
Serializer for the User model.
"""
class Meta:
model = CustomUser
fields = ('id', 'username', 'email', 'first_name', 'last_name', 'is_job_seeker',
'is_employer', 'is_tenant_admin', 'is_global_admin', 'bio', 'phone_number',
'company_name', 'created_at', 'updated_at')
read_only_fields = ('id', 'created_at', 'updated_at')

8
users/urls.py Normal file
View File

@@ -0,0 +1,8 @@
from django.urls import path
from . import views
urlpatterns = [
path('', views.UserListView.as_view(), name='user-list'),
path('<int:pk>/', views.UserDetailView.as_view(), name='user-detail'),
path('current/', views.current_user, name='current-user'),
]

33
users/views.py Normal file
View File

@@ -0,0 +1,33 @@
from django.shortcuts import render
from rest_framework import generics, permissions
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import User
from .serializers import UserSerializer
class UserListView(generics.ListAPIView):
"""
API view to retrieve list of users.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
class UserDetailView(generics.RetrieveAPIView):
"""
API view to retrieve a single user.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
@api_view(['GET'])
def current_user(request):
"""
API endpoint to retrieve the current user's profile.
"""
serializer = UserSerializer(request.user)
return Response(serializer.data)