Skip to content

Commit

Permalink
Merge pull request #13 from rkshaon/rkshaon
Browse files Browse the repository at this point in the history
backend: user app
  • Loading branch information
rkshaon authored Sep 6, 2024
2 parents 5fa4497 + 350058b commit b9c2a2f
Show file tree
Hide file tree
Showing 13 changed files with 144 additions and 2 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/backend_lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ on:

jobs:
lint:
name: Flake8 Lint
name: Run Flake8 Lint
runs-on: ubuntu-latest

steps:
Expand Down
2 changes: 2 additions & 0 deletions backend/BookShelf/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user_api',
]

MIDDLEWARE = [
Expand Down Expand Up @@ -121,3 +122,4 @@
# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
AUTH_USER_MODEL = 'user_api.User'
Binary file modified backend/db.sqlite3
Binary file not shown.
4 changes: 3 additions & 1 deletion backend/requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
Django
Django==5.1.1
djangorestframework==3.15.2

Empty file added backend/user_api/__init__.py
Empty file.
15 changes: 15 additions & 0 deletions backend/user_api/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from django.contrib import admin

from user_api.models import User


@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = (
'id', 'username', 'email', 'role', 'is_active',
'is_staff', 'is_superuser',
)
list_display_links = ('id', 'username', 'email')
list_filter = ('role', 'is_active', 'is_staff')
search_fields = ('username', 'email')
readonly_fields = ('id',)
6 changes: 6 additions & 0 deletions backend/user_api/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class UserApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'user_api'
43 changes: 43 additions & 0 deletions backend/user_api/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Generated by Django 5.1.1 on 2024-09-06 09:40

import django.utils.timezone
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
]

operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('email', models.EmailField(max_length=254, unique=True)),
('username', models.CharField(blank=True, max_length=50, null=True, unique=True)),
('role', models.PositiveIntegerField(choices=[(1, 'Admin'), (2, 'Moderator'), (3, 'Reader')], default=3)),
('added_date_time', models.DateTimeField(auto_now_add=True)),
('updated_date_time', models.DateTimeField(auto_now=True)),
('is_private', models.BooleanField(default=False)),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
],
options={
'verbose_name': 'user',
'verbose_name_plural': 'users',
'abstract': False,
},
),
]
17 changes: 17 additions & 0 deletions backend/user_api/migrations/0002_remove_user_is_private.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 5.1.1 on 2024-09-06 09:45

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('user_api', '0001_initial'),
]

operations = [
migrations.RemoveField(
model_name='user',
name='is_private',
),
]
Empty file.
51 changes: 51 additions & 0 deletions backend/user_api/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from django.db import models
from django.contrib.auth.models import AbstractUser, BaseUserManager


class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)

if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')

return self.create_user(email, password, **extra_fields)


class User(AbstractUser):
ROLE_CHOICES = (
(1, 'Admin'),
(2, 'Moderator'),
(3, 'Reader'),
)

email = models.EmailField(unique=True)
username = models.CharField(
max_length=50,
unique=True,
blank=True,
null=True) # Optional username
role = models.PositiveIntegerField(choices=ROLE_CHOICES, default=3)
added_date_time = models.DateTimeField(auto_now_add=True)
updated_date_time = models.DateTimeField(auto_now=True)

objects = UserManager()

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username', 'role']

def __str__(self):
return self.email
3 changes: 3 additions & 0 deletions backend/user_api/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
3 changes: 3 additions & 0 deletions backend/user_api/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.shortcuts import render

# Create your views here.

0 comments on commit b9c2a2f

Please sign in to comment.