diff --git a/server/accounts/__init__.py b/server/accounts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/accounts/admin.py b/server/accounts/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/server/accounts/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/server/accounts/apps.py b/server/accounts/apps.py new file mode 100644 index 0000000..3e3c765 --- /dev/null +++ b/server/accounts/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AccountsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'accounts' diff --git a/server/accounts/migrations/0001_initial.py b/server/accounts/migrations/0001_initial.py new file mode 100644 index 0000000..8c36273 --- /dev/null +++ b/server/accounts/migrations/0001_initial.py @@ -0,0 +1,42 @@ +# Generated by Django 5.2.8 on 2025-12-07 15:20 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Organisation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('host', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Users', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rating', models.SmallIntegerField(blank=True, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='account', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Members', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.organisation')), + ('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.users')), + ], + ), + ] diff --git a/server/accounts/migrations/__init__.py b/server/accounts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/accounts/models.py b/server/accounts/models.py new file mode 100644 index 0000000..0203480 --- /dev/null +++ b/server/accounts/models.py @@ -0,0 +1,36 @@ +from django.db import models +from django.contrib.auth import get_user_model + + +# Create your models here. + + +User = get_user_model() + + +class Users(models.Model): + user = models.OneToOneField( + User, + on_delete=models.CASCADE, + related_name="account", + ) + rating = models.SmallIntegerField(null=True, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + + + +class Organisation(models.Model): + host = models.ForeignKey(User, on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True) + + + +class Members(models.Model): + owner = models.ForeignKey(Organisation, on_delete=models.CASCADE) + member = models.ForeignKey(Users, on_delete=models.CASCADE) + + + + + + diff --git a/server/accounts/tests.py b/server/accounts/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/server/accounts/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/accounts/views.py b/server/accounts/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/server/accounts/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/server/bookings/__init__.py b/server/bookings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/bookings/admin.py b/server/bookings/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/server/bookings/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/server/bookings/apps.py b/server/bookings/apps.py new file mode 100644 index 0000000..2b3d34c --- /dev/null +++ b/server/bookings/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BookingsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'bookings' diff --git a/server/bookings/migrations/0001_initial.py b/server/bookings/migrations/0001_initial.py new file mode 100644 index 0000000..56166fe --- /dev/null +++ b/server/bookings/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 5.2.8 on 2025-12-07 15:21 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('accounts', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Inventory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255)), + ('description', models.TextField()), + ('quantity', models.SmallIntegerField()), + ('avaliable', models.BooleanField(default=True)), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.organisation')), + ], + ), + migrations.CreateModel( + name='Loan', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('loan_start', models.DateTimeField(auto_now_add=True)), + ('loan_end', models.DateTimeField()), + ('host', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.organisation')), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bookings.inventory')), + ('requester', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.users')), + ], + ), + ] diff --git a/server/bookings/migrations/__init__.py b/server/bookings/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/bookings/models.py b/server/bookings/models.py new file mode 100644 index 0000000..10dc8b9 --- /dev/null +++ b/server/bookings/models.py @@ -0,0 +1,26 @@ +from django.db import models +from accounts.models import Users, Organisation +# Create your models here. + + + + +class Inventory(models.Model): + owner = models.ForeignKey(Organisation, on_delete=models.CASCADE) + title = models.CharField(max_length=255) + description = models.TextField() + quantity = models.SmallIntegerField(null=False) + avaliable = models.BooleanField(default=True) + + +class Loan(models.Model): + host = models.ForeignKey(Organisation, on_delete=models.CASCADE) + requester = models.ForeignKey(Users, on_delete=models.CASCADE) + item = models.ForeignKey(Inventory, on_delete=models.CASCADE) + loan_start = models.DateTimeField(auto_now_add=True) + loan_end = models.DateTimeField(null=False, blank=False) + + + + + diff --git a/server/bookings/tests.py b/server/bookings/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/server/bookings/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/bookings/views.py b/server/bookings/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/server/bookings/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/server/hosts/__init__.py b/server/hosts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/hosts/admin.py b/server/hosts/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/server/hosts/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/server/hosts/apps.py b/server/hosts/apps.py new file mode 100644 index 0000000..e4ebb4f --- /dev/null +++ b/server/hosts/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HostsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'hosts' diff --git a/server/hosts/migrations/__init__.py b/server/hosts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/hosts/models.py b/server/hosts/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/server/hosts/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/server/hosts/tests.py b/server/hosts/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/server/hosts/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/hosts/urls.py b/server/hosts/urls.py new file mode 100644 index 0000000..d861d76 --- /dev/null +++ b/server/hosts/urls.py @@ -0,0 +1,10 @@ +from django.urls import path +from . import views + + +app_name = "hosts" + +urlpatterns = [ + path("", views.HostHomePage.as_view(), name="hosts-homepage"), + path("Createclub", views.HostCreateClub.as_view(), name="hosts-createclub") +] \ No newline at end of file diff --git a/server/hosts/views.py b/server/hosts/views.py new file mode 100644 index 0000000..f4430bb --- /dev/null +++ b/server/hosts/views.py @@ -0,0 +1,19 @@ +from django.shortcuts import render +from rest_framework.views import APIView +from rest_framework.response import Response + + +class HostHomePage(APIView): + def get(self, request): + return Response({"endpoint": "Hosts HomePage", "status": "working"}) + + + +class HostCreateClub(APIView): + def get(self, request): + return Response({"endpoint": "Hosts CreateClub", "status": "working"}) + + + + +# Create your views here. diff --git a/server/requesters/__init__.py b/server/requesters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/requesters/admin.py b/server/requesters/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/server/requesters/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/server/requesters/apps.py b/server/requesters/apps.py new file mode 100644 index 0000000..0469d78 --- /dev/null +++ b/server/requesters/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class RequestersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'requesters' + + diff --git a/server/requesters/migrations/__init__.py b/server/requesters/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/requesters/models.py b/server/requesters/models.py new file mode 100644 index 0000000..c3dcb83 --- /dev/null +++ b/server/requesters/models.py @@ -0,0 +1,11 @@ +from django.db import models + + + + + + + + + +# Create your models here. diff --git a/server/requesters/tests.py b/server/requesters/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/server/requesters/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/requesters/urls.py b/server/requesters/urls.py new file mode 100644 index 0000000..9b7f290 --- /dev/null +++ b/server/requesters/urls.py @@ -0,0 +1,11 @@ +from django.urls import path +from . import views + + +app_name = "requesters" + +urlpatterns = [ + path("", views.RequesterHomePage.as_view(), name="requesters-homepage"), + path("Myitems", views.RequesterItemPage.as_view(), name="requesters-itempage") + +] \ No newline at end of file diff --git a/server/requesters/views.py b/server/requesters/views.py new file mode 100644 index 0000000..e508a49 --- /dev/null +++ b/server/requesters/views.py @@ -0,0 +1,18 @@ +from django.shortcuts import render +from rest_framework import generics +from rest_framework.views import APIView +from rest_framework.response import Response + + +class RequesterHomePage(APIView): + def get(self, request): + return Response({"endpoint": "Requesters HomePage", "status": "working"}) + + +class RequesterItemPage(APIView): + def get(self, request): + return Response({"endpoint": "Requesters ItemPage", "status": "working"}) + + + +# Create your views here. diff --git a/server/server/settings.py b/server/server/settings.py index 1da957f..d9a01fd 100644 --- a/server/server/settings.py +++ b/server/server/settings.py @@ -48,7 +48,11 @@ "rest_framework", "corsheaders", "healthcheck", - "user_profile" + "user_profile", + "accounts", + "bookings", + "hosts", + "requesters" ] MIDDLEWARE = [ diff --git a/server/server/urls.py b/server/server/urls.py index 72d8cf9..5617c7e 100644 --- a/server/server/urls.py +++ b/server/server/urls.py @@ -25,5 +25,8 @@ path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"), path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), path("api/healthcheck/", include("healthcheck.urls")), - path("api/user/", include("user_profile.urls")) + path("api/user/", include("user_profile.urls")), + path("api/requesters/", include("requesters.urls")), + path("api/hosts/", include("hosts.urls")), + ] diff --git a/server/user_profile/models.py b/server/user_profile/models.py index 173efb2..1182df2 100644 --- a/server/user_profile/models.py +++ b/server/user_profile/models.py @@ -11,7 +11,9 @@ User = get_user_model() class Profile(models.Model): - user = models.OneToOneField(User, on_delete=models.CASCADE) + user = models.OneToOneField(User, + on_delete=models.CASCADE, + related_name='profile') bio = models.TextField(blank=True) age = models.PositiveIntegerField(null=True, blank=True) diff --git a/server/user_profile/views.py b/server/user_profile/views.py index edbd78c..9e6ce1e 100644 --- a/server/user_profile/views.py +++ b/server/user_profile/views.py @@ -1,7 +1,7 @@ from django.shortcuts import render from rest_framework import generics, permissions from rest_framework.response import Response -from rest_framework.views import APIView +from rest_framework.views import APIView from .models import User, Profile from .serializers import ProfileSerializer, UserSerializer