diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 39bb88d..fdd89df 100644 Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 65aa3aa..995d448 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 9e99135..7033f55 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/migrations/0002_clubmembership.py b/core/migrations/0002_clubmembership.py new file mode 100644 index 0000000..cc1dd06 --- /dev/null +++ b/core/migrations/0002_clubmembership.py @@ -0,0 +1,28 @@ +# Generated by Django 5.2.7 on 2025-12-08 02:30 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='ClubMembership', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date_joined', models.DateTimeField(auto_now_add=True)), + ('club', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.club')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('user', 'club')}, + }, + ), + ] diff --git a/core/migrations/__pycache__/0002_clubmembership.cpython-311.pyc b/core/migrations/__pycache__/0002_clubmembership.cpython-311.pyc new file mode 100644 index 0000000..da9122b Binary files /dev/null and b/core/migrations/__pycache__/0002_clubmembership.cpython-311.pyc differ diff --git a/core/models.py b/core/models.py index ac43acf..b2a11e3 100644 --- a/core/models.py +++ b/core/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.contrib.auth.models import User class Club(models.Model): name = models.CharField(max_length=100) @@ -21,4 +22,15 @@ class BookRecommendation(models.Model): created_at = models.DateTimeField(auto_now_add=True) def __str__(self): - return f"{self.book_title} recommended for {self.club.name}" \ No newline at end of file + return f"{self.book_title} recommended for {self.club.name}" + +class ClubMembership(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + club = models.ForeignKey(Club, on_delete=models.CASCADE) + date_joined = models.DateTimeField(auto_now_add=True) + + class Meta: + unique_together = ('user', 'club') + + def __str__(self): + return f"{self.user.username} joined {self.club.name}" \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index c701a32..4ed9b2c 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -26,6 +26,9 @@
diff --git a/core/urls.py b/core/urls.py index fcada4d..8e6ace1 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,10 +1,11 @@ from django.urls import path from . import views -from .views import signup_view, login_view, logout_view +from .views import signup_view, login_view, logout_view, club_list urlpatterns = [ path('', views.index, name='index'), path('signup/', signup_view, name='signup'), path('login/', login_view, name='login'), path('logout/', logout_view, name='logout'), + path('clubs/', club_list, name='club_list'), ] \ No newline at end of file diff --git a/core/views.py b/core/views.py index a9eef7b..c4f7524 100644 --- a/core/views.py +++ b/core/views.py @@ -1,5 +1,6 @@ from django.shortcuts import render, redirect -from .models import Club, BookRecommendation +from .models import Club, BookRecommendation, ClubMembership +from django.db import IntegrityError import random def index(request): @@ -39,7 +40,8 @@ def index(request): 'captcha_error': captcha_error, }) -from django.contrib.auth import login, logout +from django.contrib.auth import login, logout, get_user +from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import AuthenticationForm from .forms import SignUpForm @@ -68,4 +70,21 @@ def login_view(request): def logout_view(request): if request.method == 'POST': logout(request) - return redirect('/') \ No newline at end of file + return redirect('/') + +@login_required +def club_list(request): + if request.method == 'POST': + club_id = request.POST.get('club_id') + club = Club.objects.get(id=club_id) + user = get_user(request) + try: + ClubMembership.objects.create(user=user, club=club) + message = f"You have successfully joined {club.name}." + except IntegrityError: + message = f"You are already a member of {club.name}." + clubs = Club.objects.all() + return render(request, 'core/club_list.html', {'clubs': clubs, 'message': message}) + + clubs = Club.objects.all() + return render(request, 'core/club_list.html', {'clubs': clubs}) \ No newline at end of file