Skip to content

Commit 12fe2a2

Browse files
django workshop initial
1 parent c8033fe commit 12fe2a2

15 files changed

Lines changed: 159 additions & 16 deletions

File tree

client/package-lock.json

Lines changed: 0 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ dependencies = [
1212
"gunicorn~=23.0",
1313
"python-dotenv~=1.0",
1414
"psycopg[binary,pool]~=3.2.13",
15+
"djangorestframework-simplejwt>=5.5.1",
1516
]
1617

1718
[dependency-groups]

server/server/settings.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"rest_framework",
4949
"corsheaders",
5050
"healthcheck",
51+
"user_profile",
5152
]
5253

5354
MIDDLEWARE = [
@@ -70,6 +71,12 @@
7071

7172
ROOT_URLCONF = "server.urls"
7273

74+
REST_FRAMEWORK = {
75+
"DEFAULT_AUTHENTICATION_CLASSES": (
76+
"rest_framework.authentication.SessionAuthentication",
77+
"rest_framework_simplejwt.authentication.JWTAuthentication",
78+
),
79+
}
7380
TEMPLATES = [
7481
{
7582
"BACKEND": "django.template.backends.django.DjangoTemplates",

server/server/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,13 @@
1717

1818
from django.contrib import admin
1919
from django.urls import include, path
20+
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
2021

2122
urlpatterns = [
2223
path("admin/", admin.site.urls),
24+
path("api-auth/", include("rest_framework.urls")),
25+
path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
26+
path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh_view"),
2327
path("api/healthcheck/", include("healthcheck.urls")),
28+
path("api/user/", include("user_profile.urls")),
2429
]

server/user_profile/__init__.py

Whitespace-only changes.

server/user_profile/admin.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from django.contrib import admin
2+
3+
from .models import Profile
4+
5+
# Register your models here.
6+
7+
admin.site.register(Profile)

server/user_profile/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class UserProfileConfig(AppConfig):
5+
default_auto_field = 'django.db.models.BigAutoField'
6+
name = 'user_profile'
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 5.2.8 on 2025-11-29 06:32
2+
3+
import django.db.models.deletion
4+
from django.conf import settings
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
initial = True
11+
12+
dependencies = [
13+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
14+
]
15+
16+
operations = [
17+
migrations.CreateModel(
18+
name='Profile',
19+
fields=[
20+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21+
('bio', models.TextField()),
22+
('age', models.PositiveBigIntegerField(null=True)),
23+
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
24+
],
25+
),
26+
]

server/user_profile/migrations/__init__.py

Whitespace-only changes.

server/user_profile/models.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from django.contrib.auth import get_user_model
2+
from django.db import models
3+
from django.db.models.signals import post_save
4+
from django.dispatch import receiver
5+
6+
User = get_user_model()
7+
8+
# Create your models here.
9+
10+
class Profile(models.Model):
11+
user = models.OneToOneField(User, on_delete=models.CASCADE)
12+
bio = models.TextField()
13+
age = models.PositiveBigIntegerField(null=True)
14+
15+
def __str__(self):
16+
return f"Profile: { self.user.username}"
17+
18+
19+
@receiver(post_save, sender =User)
20+
def create_or_update_user_profile(sender, instance, created, **kwargs):
21+
Profile.objects.get_or_create(user = instance)

0 commit comments

Comments
 (0)