From 989aed3a5bb029d14d6f69f95528c81ab96713d0 Mon Sep 17 00:00:00 2001 From: shijas Date: Thu, 4 Jun 2026 13:16:03 +0530 Subject: [PATCH 1/5] start django project --- .gitignore | 8 ++ authentication/__init__.py | 0 authentication/admin.py | 3 + authentication/apps.py | 5 ++ authentication/migrations/__init__.py | 0 authentication/models.py | 3 + authentication/tests.py | 3 + authentication/urls.py | 5 ++ authentication/views.py | 3 + bkmyvenue_backend/__init__.py | 0 bkmyvenue_backend/asgi.py | 16 ++++ bkmyvenue_backend/settings.py | 118 ++++++++++++++++++++++++++ bkmyvenue_backend/urls.py | 24 ++++++ bkmyvenue_backend/wsgi.py | 16 ++++ manage.py | 22 +++++ 15 files changed, 226 insertions(+) create mode 100644 .gitignore create mode 100644 authentication/__init__.py create mode 100644 authentication/admin.py create mode 100644 authentication/apps.py create mode 100644 authentication/migrations/__init__.py create mode 100644 authentication/models.py create mode 100644 authentication/tests.py create mode 100644 authentication/urls.py create mode 100644 authentication/views.py create mode 100644 bkmyvenue_backend/__init__.py create mode 100644 bkmyvenue_backend/asgi.py create mode 100644 bkmyvenue_backend/settings.py create mode 100644 bkmyvenue_backend/urls.py create mode 100644 bkmyvenue_backend/wsgi.py create mode 100755 manage.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..eefdaf2fd --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +venv/* + +.env + +*.pyc +__pycache__/ + +db.sqlite3 \ No newline at end of file diff --git a/authentication/__init__.py b/authentication/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/authentication/admin.py b/authentication/admin.py new file mode 100644 index 000000000..8c38f3f3d --- /dev/null +++ b/authentication/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/authentication/apps.py b/authentication/apps.py new file mode 100644 index 000000000..9635c9df5 --- /dev/null +++ b/authentication/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AuthenticationConfig(AppConfig): + name = 'authentication' diff --git a/authentication/migrations/__init__.py b/authentication/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/authentication/models.py b/authentication/models.py new file mode 100644 index 000000000..71a836239 --- /dev/null +++ b/authentication/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/authentication/tests.py b/authentication/tests.py new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ b/authentication/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/authentication/urls.py b/authentication/urls.py new file mode 100644 index 000000000..99d1a53d9 --- /dev/null +++ b/authentication/urls.py @@ -0,0 +1,5 @@ +from django.urls import path + +urlpatterns = [ + path(), +] diff --git a/authentication/views.py b/authentication/views.py new file mode 100644 index 000000000..91ea44a21 --- /dev/null +++ b/authentication/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/bkmyvenue_backend/__init__.py b/bkmyvenue_backend/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/bkmyvenue_backend/asgi.py b/bkmyvenue_backend/asgi.py new file mode 100644 index 000000000..5681fbebe --- /dev/null +++ b/bkmyvenue_backend/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for bkmyvenue_backend project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/6.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bkmyvenue_backend.settings') + +application = get_asgi_application() diff --git a/bkmyvenue_backend/settings.py b/bkmyvenue_backend/settings.py new file mode 100644 index 000000000..3eb9e5459 --- /dev/null +++ b/bkmyvenue_backend/settings.py @@ -0,0 +1,118 @@ +""" +Django settings for bkmyvenue_backend project. + +Generated by 'django-admin startproject' using Django 6.0.6. + +For more information on this file, see +https://docs.djangoproject.com/en/6.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/6.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-smzs+(tun4nb82^$kme5j2w-=9-t-8eav0&ri=76yy3igbp_+t' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'authentication' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'bkmyvenue_backend.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'bkmyvenue_backend.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/6.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/6.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/6.0/howto/static-files/ + +STATIC_URL = 'static/' diff --git a/bkmyvenue_backend/urls.py b/bkmyvenue_backend/urls.py new file mode 100644 index 000000000..ea77a27f1 --- /dev/null +++ b/bkmyvenue_backend/urls.py @@ -0,0 +1,24 @@ +""" +URL configuration for bkmyvenue_backend project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/6.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('authentication/',include('authentication.urls',)), + +] diff --git a/bkmyvenue_backend/wsgi.py b/bkmyvenue_backend/wsgi.py new file mode 100644 index 000000000..70b430499 --- /dev/null +++ b/bkmyvenue_backend/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for bkmyvenue_backend project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/6.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bkmyvenue_backend.settings') + +application = get_wsgi_application() diff --git a/manage.py b/manage.py new file mode 100755 index 000000000..d717ede94 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bkmyvenue_backend.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() From d27e0eb56627fbf5fe7a8b0aca34f5f81c5d3e76 Mon Sep 17 00:00:00 2001 From: shijas Date: Sun, 7 Jun 2026 18:46:00 +0530 Subject: [PATCH 2/5] Implement venue management models and relationships --- {authentication => account}/__init__.py | 0 {authentication => account}/admin.py | 2 + account/apps.py | 5 +++ account/migrations/0001_initial.py | 45 +++++++++++++++++++ account/migrations/0002_alter_user_role.py | 18 ++++++++ .../migrations/__init__.py | 0 account/models.py | 17 +++++++ {authentication => account}/tests.py | 0 account/views.py | 0 authentication/apps.py | 5 --- authentication/models.py | 3 -- authentication/urls.py | 5 --- bkmyvenue_backend/settings.py | 41 +++++------------ bkmyvenue_backend/urls.py | 2 - bookings/__init__.py | 0 bookings/admin.py | 6 +++ bookings/apps.py | 5 +++ bookings/migrations/0001_initial.py | 31 +++++++++++++ bookings/migrations/__init__.py | 0 bookings/models.py | 30 +++++++++++++ bookings/tests.py | 3 ++ {authentication => bookings}/views.py | 0 locations/__init__.py | 0 locations/admin.py | 7 +++ locations/apps.py | 5 +++ locations/migrations/0001_initial.py | 42 +++++++++++++++++ locations/migrations/__init__.py | 0 locations/models.py | 28 ++++++++++++ locations/tests.py | 3 ++ locations/views.py | 3 ++ reviews/__init__.py | 0 reviews/admin.py | 5 +++ reviews/apps.py | 5 +++ reviews/migrations/0001_initial.py | 29 ++++++++++++ reviews/migrations/__init__.py | 0 reviews/models.py | 15 +++++++ reviews/tests.py | 3 ++ reviews/views.py | 3 ++ venues/__init__.py | 0 venues/admin.py | 8 ++++ venues/apps.py | 5 +++ venues/migrations/0001_initial.py | 30 +++++++++++++ ...nue_address_venue_facilities_venueimage.py | 40 +++++++++++++++++ venues/migrations/__init__.py | 0 venues/models.py | 32 +++++++++++++ venues/tests.py | 3 ++ venues/views.py | 3 ++ 47 files changed, 441 insertions(+), 46 deletions(-) rename {authentication => account}/__init__.py (100%) rename {authentication => account}/admin.py (55%) create mode 100644 account/apps.py create mode 100644 account/migrations/0001_initial.py create mode 100644 account/migrations/0002_alter_user_role.py rename {authentication => account}/migrations/__init__.py (100%) create mode 100644 account/models.py rename {authentication => account}/tests.py (100%) create mode 100644 account/views.py delete mode 100644 authentication/apps.py delete mode 100644 authentication/models.py delete mode 100644 authentication/urls.py create mode 100644 bookings/__init__.py create mode 100644 bookings/admin.py create mode 100644 bookings/apps.py create mode 100644 bookings/migrations/0001_initial.py create mode 100644 bookings/migrations/__init__.py create mode 100644 bookings/models.py create mode 100644 bookings/tests.py rename {authentication => bookings}/views.py (100%) create mode 100644 locations/__init__.py create mode 100644 locations/admin.py create mode 100644 locations/apps.py create mode 100644 locations/migrations/0001_initial.py create mode 100644 locations/migrations/__init__.py create mode 100644 locations/models.py create mode 100644 locations/tests.py create mode 100644 locations/views.py create mode 100644 reviews/__init__.py create mode 100644 reviews/admin.py create mode 100644 reviews/apps.py create mode 100644 reviews/migrations/0001_initial.py create mode 100644 reviews/migrations/__init__.py create mode 100644 reviews/models.py create mode 100644 reviews/tests.py create mode 100644 reviews/views.py create mode 100644 venues/__init__.py create mode 100644 venues/admin.py create mode 100644 venues/apps.py create mode 100644 venues/migrations/0001_initial.py create mode 100644 venues/migrations/0002_facility_venue_address_venue_facilities_venueimage.py create mode 100644 venues/migrations/__init__.py create mode 100644 venues/models.py create mode 100644 venues/tests.py create mode 100644 venues/views.py diff --git a/authentication/__init__.py b/account/__init__.py similarity index 100% rename from authentication/__init__.py rename to account/__init__.py diff --git a/authentication/admin.py b/account/admin.py similarity index 55% rename from authentication/admin.py rename to account/admin.py index 8c38f3f3d..cc9849a51 100644 --- a/authentication/admin.py +++ b/account/admin.py @@ -1,3 +1,5 @@ from django.contrib import admin +from .models import User # Register your models here. +admin.site.register(User) diff --git a/account/apps.py b/account/apps.py new file mode 100644 index 000000000..f7b1d19cf --- /dev/null +++ b/account/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AccountConfig(AppConfig): + name = 'account' diff --git a/account/migrations/0001_initial.py b/account/migrations/0001_initial.py new file mode 100644 index 000000000..48f5c86f2 --- /dev/null +++ b/account/migrations/0001_initial.py @@ -0,0 +1,45 @@ +# Generated by Django 6.0.6 on 2026-06-06 10:07 + +import django.contrib.auth.models +import django.contrib.auth.validators +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')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('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')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('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')), + ('role', models.CharField(choices=[('OWNER', 'Owner'), ('CUSTOMER', 'Customer')], default='CUSTOMER', max_length=20)), + ('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, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/account/migrations/0002_alter_user_role.py b/account/migrations/0002_alter_user_role.py new file mode 100644 index 000000000..bfa1f5f5b --- /dev/null +++ b/account/migrations/0002_alter_user_role.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.6 on 2026-06-07 12:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='role', + field=models.CharField(choices=[('ADMIN', 'Admin'), ('OWNER', 'Owner'), ('CUSTOMER', 'Customer')], default='CUSTOMER', max_length=20), + ), + ] diff --git a/authentication/migrations/__init__.py b/account/migrations/__init__.py similarity index 100% rename from authentication/migrations/__init__.py rename to account/migrations/__init__.py diff --git a/account/models.py b/account/models.py new file mode 100644 index 000000000..7f1295bf7 --- /dev/null +++ b/account/models.py @@ -0,0 +1,17 @@ +from django.db import models +from django.contrib.auth.models import AbstractUser + + +# Create your models here. + +class User(AbstractUser): + + class Role(models.TextChoices): + ADMIN = "ADMIN" + OWNER = "OWNER" + CUSTOMER = "CUSTOMER" + + + role = models.CharField(max_length=20,choices=Role.choices,default=Role.CUSTOMER) + + diff --git a/authentication/tests.py b/account/tests.py similarity index 100% rename from authentication/tests.py rename to account/tests.py diff --git a/account/views.py b/account/views.py new file mode 100644 index 000000000..e69de29bb diff --git a/authentication/apps.py b/authentication/apps.py deleted file mode 100644 index 9635c9df5..000000000 --- a/authentication/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class AuthenticationConfig(AppConfig): - name = 'authentication' diff --git a/authentication/models.py b/authentication/models.py deleted file mode 100644 index 71a836239..000000000 --- a/authentication/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/authentication/urls.py b/authentication/urls.py deleted file mode 100644 index 99d1a53d9..000000000 --- a/authentication/urls.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.urls import path - -urlpatterns = [ - path(), -] diff --git a/bkmyvenue_backend/settings.py b/bkmyvenue_backend/settings.py index 3eb9e5459..5fa96c29a 100644 --- a/bkmyvenue_backend/settings.py +++ b/bkmyvenue_backend/settings.py @@ -1,35 +1,15 @@ -""" -Django settings for bkmyvenue_backend project. - -Generated by 'django-admin startproject' using Django 6.0.6. - -For more information on this file, see -https://docs.djangoproject.com/en/6.0/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/6.0/ref/settings/ -""" - from pathlib import Path -# Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-smzs+(tun4nb82^$kme5j2w-=9-t-8eav0&ri=76yy3igbp_+t' -# SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] -# Application definition - INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', @@ -37,7 +17,12 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'authentication' + 'rest_framework', + 'account', + 'locations', + 'venues', + 'bookings', + 'reviews', ] MIDDLEWARE = [ @@ -70,9 +55,6 @@ WSGI_APPLICATION = 'bkmyvenue_backend.wsgi.application' -# Database -# https://docs.djangoproject.com/en/6.0/ref/settings/#databases - DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', @@ -81,8 +63,6 @@ } -# Password validation -# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { @@ -100,8 +80,6 @@ ] -# Internationalization -# https://docs.djangoproject.com/en/6.0/topics/i18n/ LANGUAGE_CODE = 'en-us' @@ -111,8 +89,9 @@ USE_TZ = True +STATIC_URL = 'static/' -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/6.0/howto/static-files/ +MEDIA_URL = '/media/' +MEDIA_ROOT = BASE_DIR / 'media' -STATIC_URL = 'static/' +AUTH_USER_MODEL = "account.User" diff --git a/bkmyvenue_backend/urls.py b/bkmyvenue_backend/urls.py index ea77a27f1..c1f25a326 100644 --- a/bkmyvenue_backend/urls.py +++ b/bkmyvenue_backend/urls.py @@ -19,6 +19,4 @@ urlpatterns = [ path('admin/', admin.site.urls), - path('authentication/',include('authentication.urls',)), - ] diff --git a/bookings/__init__.py b/bookings/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/bookings/admin.py b/bookings/admin.py new file mode 100644 index 000000000..f9b41e9c3 --- /dev/null +++ b/bookings/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from .models import Booking + +# Register your models here. + +admin.site.register(Booking) diff --git a/bookings/apps.py b/bookings/apps.py new file mode 100644 index 000000000..63907ab3b --- /dev/null +++ b/bookings/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class BookingsConfig(AppConfig): + name = 'bookings' diff --git a/bookings/migrations/0001_initial.py b/bookings/migrations/0001_initial.py new file mode 100644 index 000000000..75f4715b5 --- /dev/null +++ b/bookings/migrations/0001_initial.py @@ -0,0 +1,31 @@ +# Generated by Django 6.0.6 on 2026-06-07 08:15 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('venues', '0002_facility_venue_address_venue_facilities_venueimage'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Booking', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('booking_date', models.DateField()), + ('start_time', models.TimeField()), + ('end_time', models.TimeField()), + ('total_amount', models.DecimalField(decimal_places=2, max_digits=10)), + ('status', models.CharField(choices=[('PENDING', 'Pending'), ('CONFIRMED', 'Confirmed'), ('CANCELLED', 'Cancelled')], default='PENDING', max_length=20)), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='venues.venue')), + ], + ), + ] diff --git a/bookings/migrations/__init__.py b/bookings/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/bookings/models.py b/bookings/models.py new file mode 100644 index 000000000..90c8655e3 --- /dev/null +++ b/bookings/models.py @@ -0,0 +1,30 @@ +from django.db import models +from account.models import User +from venues.models import Venue + +# Create your models here. + +class Booking(models.Model): + + + class BookingStatus(models.TextChoices): + PENDING = "PENDING", "Pending" + CONFIRMED = "CONFIRMED", "Confirmed" + CANCELLED = "CANCELLED", "Cancelled" + + customer = models.ForeignKey(User, on_delete=models.CASCADE) + venue = models.ForeignKey(Venue, on_delete=models.CASCADE) + booking_date = models.DateField() + start_time = models.TimeField() + end_time = models.TimeField() + total_amount = models.DecimalField(max_digits=10,decimal_places=2) + status = models.CharField( + max_length=20, + choices=BookingStatus.choices, + default=BookingStatus.PENDING + ) + + def __str__(self): + return f"{self.customer} - {self.venue}" + + diff --git a/bookings/tests.py b/bookings/tests.py new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ b/bookings/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/authentication/views.py b/bookings/views.py similarity index 100% rename from authentication/views.py rename to bookings/views.py diff --git a/locations/__init__.py b/locations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/locations/admin.py b/locations/admin.py new file mode 100644 index 000000000..bdc716e40 --- /dev/null +++ b/locations/admin.py @@ -0,0 +1,7 @@ + +from django.contrib import admin +from .models import State, District, City + +admin.site.register(State) +admin.site.register(District) +admin.site.register(City) \ No newline at end of file diff --git a/locations/apps.py b/locations/apps.py new file mode 100644 index 000000000..33f29e12b --- /dev/null +++ b/locations/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class LocationsConfig(AppConfig): + name = 'locations' diff --git a/locations/migrations/0001_initial.py b/locations/migrations/0001_initial.py new file mode 100644 index 000000000..52b0e313e --- /dev/null +++ b/locations/migrations/0001_initial.py @@ -0,0 +1,42 @@ +# Generated by Django 6.0.6 on 2026-06-06 11:00 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='District', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='State', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='City', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('district', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='locations.district')), + ], + ), + migrations.AddField( + model_name='district', + name='state', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='locations.state'), + ), + ] diff --git a/locations/migrations/__init__.py b/locations/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/locations/models.py b/locations/models.py new file mode 100644 index 000000000..c303d39cd --- /dev/null +++ b/locations/models.py @@ -0,0 +1,28 @@ +from django.db import models + +# Create your models here. +from django.db import models + +class State(models.Model): + name = models.CharField(max_length=100) + + def __str__(self): + return self.name + + +class District(models.Model): + state = models.ForeignKey( + State, + on_delete=models.CASCADE + ) + name = models.CharField(max_length=100) + + def __str__(self): + return self.name + +class City(models.Model): + district = models.ForeignKey(District,on_delete=models.CASCADE) + name = models.CharField(max_length=100) + + def __str__(self): + return self.name diff --git a/locations/tests.py b/locations/tests.py new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ b/locations/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/locations/views.py b/locations/views.py new file mode 100644 index 000000000..91ea44a21 --- /dev/null +++ b/locations/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/reviews/__init__.py b/reviews/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/reviews/admin.py b/reviews/admin.py new file mode 100644 index 000000000..e9350a8c9 --- /dev/null +++ b/reviews/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from .models import Review +# Register your models here. + +admin.site.register(Review) \ No newline at end of file diff --git a/reviews/apps.py b/reviews/apps.py new file mode 100644 index 000000000..485225c45 --- /dev/null +++ b/reviews/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ReviewsConfig(AppConfig): + name = 'reviews' diff --git a/reviews/migrations/0001_initial.py b/reviews/migrations/0001_initial.py new file mode 100644 index 000000000..55c9dabbf --- /dev/null +++ b/reviews/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 6.0.6 on 2026-06-07 08:20 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('venues', '0002_facility_venue_address_venue_facilities_venueimage'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Review', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rating', models.PositiveSmallIntegerField()), + ('comment', models.TextField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='venues.venue')), + ], + ), + ] diff --git a/reviews/migrations/__init__.py b/reviews/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/reviews/models.py b/reviews/models.py new file mode 100644 index 000000000..731b3b1f0 --- /dev/null +++ b/reviews/models.py @@ -0,0 +1,15 @@ +from django.db import models + +from account.models import User +from venues.models import Venue + +class Review(models.Model): + + venue = models.ForeignKey(Venue,on_delete=models.CASCADE) + customer = models.ForeignKey(User,on_delete=models.CASCADE) + rating = models.PositiveSmallIntegerField() + comment = models.TextField() + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"{self.customer} - {self.venue}" diff --git a/reviews/tests.py b/reviews/tests.py new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ b/reviews/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/reviews/views.py b/reviews/views.py new file mode 100644 index 000000000..91ea44a21 --- /dev/null +++ b/reviews/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/venues/__init__.py b/venues/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/venues/admin.py b/venues/admin.py new file mode 100644 index 000000000..9c425ba99 --- /dev/null +++ b/venues/admin.py @@ -0,0 +1,8 @@ +from django.contrib import admin +from .models import Venue, VenueImage,Facility + +# Register your models here. +admin.site.register(Venue) +admin.site.register(Facility) +admin.site.register(VenueImage) + diff --git a/venues/apps.py b/venues/apps.py new file mode 100644 index 000000000..9d33cfd19 --- /dev/null +++ b/venues/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class VenuesConfig(AppConfig): + name = 'venues' diff --git a/venues/migrations/0001_initial.py b/venues/migrations/0001_initial.py new file mode 100644 index 000000000..a7c4785b1 --- /dev/null +++ b/venues/migrations/0001_initial.py @@ -0,0 +1,30 @@ +# Generated by Django 6.0.6 on 2026-06-06 11:42 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('locations', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Venue', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('description', models.TextField()), + ('capacity', models.IntegerField()), + ('price_per_hour', models.DecimalField(decimal_places=2, max_digits=10)), + ('city', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='locations.city')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/venues/migrations/0002_facility_venue_address_venue_facilities_venueimage.py b/venues/migrations/0002_facility_venue_address_venue_facilities_venueimage.py new file mode 100644 index 000000000..074d61c15 --- /dev/null +++ b/venues/migrations/0002_facility_venue_address_venue_facilities_venueimage.py @@ -0,0 +1,40 @@ +# Generated by Django 6.0.6 on 2026-06-07 07:52 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('venues', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Facility', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=225)), + ], + ), + migrations.AddField( + model_name='venue', + name='address', + field=models.TextField(default=''), + preserve_default=False, + ), + migrations.AddField( + model_name='venue', + name='facilities', + field=models.ManyToManyField(to='venues.facility'), + ), + migrations.CreateModel( + name='VenueImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(upload_to='venues/')), + ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='venues.venue')), + ], + ), + ] diff --git a/venues/migrations/__init__.py b/venues/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/venues/models.py b/venues/models.py new file mode 100644 index 000000000..be5e751af --- /dev/null +++ b/venues/models.py @@ -0,0 +1,32 @@ +from django.db import models +from account.models import User +from locations.models import City + +# Create your models here. +class Venue(models.Model): + owner = models.ForeignKey(User,on_delete=models.CASCADE) + city = models.ForeignKey(City, on_delete=models.CASCADE) + name = models.CharField(max_length=100) + address = models.TextField() + description = models.TextField() + capacity = models.IntegerField() + price_per_hour = models.DecimalField(max_digits=10, decimal_places=2) + facilities = models.ManyToManyField('Facility') + + def __str__(self): + return self.name + +class VenueImage(models.Model): + venue = models.ForeignKey(Venue, on_delete=models.CASCADE) + image = models.ImageField(upload_to='venues/') + + def __str__(self): + return self.venue.name + + + +class Facility(models.Model): + name = models.CharField(max_length=225) + + def __str__(self): + return self.name \ No newline at end of file diff --git a/venues/tests.py b/venues/tests.py new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ b/venues/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/venues/views.py b/venues/views.py new file mode 100644 index 000000000..91ea44a21 --- /dev/null +++ b/venues/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. From b28105d64b8c3d30e62017029eb0c192f69aa3ed Mon Sep 17 00:00:00 2001 From: shijas Date: Tue, 9 Jun 2026 20:52:55 +0530 Subject: [PATCH 3/5] feat: create registration serializer and view --- account/Serializers.py | 10 ++++++++++ account/urls.py | 7 +++++++ account/views.py | 10 ++++++++++ bkmyvenue_backend/urls.py | 6 ++++++ bookings/Serializers.py | 0 bookings/urls.py | 0 locations/serializers.py | 9 +++++++++ locations/urls.py | 8 ++++++++ locations/views.py | 11 +++++++++-- reviews/Serializers.py | 0 reviews/urls.py | 0 venues/Serializers.py | 0 venues/models.py | 13 +++++++------ venues/urls.py | 0 14 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 account/Serializers.py create mode 100644 account/urls.py create mode 100644 bookings/Serializers.py create mode 100644 bookings/urls.py create mode 100644 locations/serializers.py create mode 100644 locations/urls.py create mode 100644 reviews/Serializers.py create mode 100644 reviews/urls.py create mode 100644 venues/Serializers.py create mode 100644 venues/urls.py diff --git a/account/Serializers.py b/account/Serializers.py new file mode 100644 index 000000000..67462750c --- /dev/null +++ b/account/Serializers.py @@ -0,0 +1,10 @@ +from rest_framework.serializers import ModelSerializer + +from .models import User + + +class RegisterSerializer(ModelSerializer): + + class Meta: + model = User + fields = '__all__' \ No newline at end of file diff --git a/account/urls.py b/account/urls.py new file mode 100644 index 000000000..8c0ff3f1d --- /dev/null +++ b/account/urls.py @@ -0,0 +1,7 @@ +from django.urls import path + +from .views import RegisterCreateView + +urlpatterns = [ + path('register/',RegisterCreateView.as_view()) +] \ No newline at end of file diff --git a/account/views.py b/account/views.py index e69de29bb..9323321a3 100644 --- a/account/views.py +++ b/account/views.py @@ -0,0 +1,10 @@ +from rest_framework.generics import CreateAPIView + +from .models import User +from .Serializers import RegisterSerializer + + +class RegisterCreateView(CreateAPIView): + serializer_class = RegisterSerializer + + diff --git a/bkmyvenue_backend/urls.py b/bkmyvenue_backend/urls.py index c1f25a326..a3a5bf837 100644 --- a/bkmyvenue_backend/urls.py +++ b/bkmyvenue_backend/urls.py @@ -19,4 +19,10 @@ urlpatterns = [ path('admin/', admin.site.urls), + path('accounts/', include('account.urls')), + path('locations/', include('locations.urls')), + path('venues/', include('venues.urls')), + path('bookings/', include('bookings.urls')), + path('reviews/', include('reviews.urls')) + ] diff --git a/bookings/Serializers.py b/bookings/Serializers.py new file mode 100644 index 000000000..e69de29bb diff --git a/bookings/urls.py b/bookings/urls.py new file mode 100644 index 000000000..e69de29bb diff --git a/locations/serializers.py b/locations/serializers.py new file mode 100644 index 000000000..8e8afd1a6 --- /dev/null +++ b/locations/serializers.py @@ -0,0 +1,9 @@ +from rest_framework.serializers import ModelSerializer + +from .models import State,District,City + +class StateSerializer(ModelSerializer): + + class Meta: + model = State + fields = '__all__' \ No newline at end of file diff --git a/locations/urls.py b/locations/urls.py new file mode 100644 index 000000000..05e60b139 --- /dev/null +++ b/locations/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from .views import StateCreateView + + +urlpatterns = [ + path('states/', StateCreateView.as_view()) +] diff --git a/locations/views.py b/locations/views.py index 91ea44a21..d39cea60c 100644 --- a/locations/views.py +++ b/locations/views.py @@ -1,3 +1,10 @@ -from django.shortcuts import render +from rest_framework.views import Response +from rest_framework.generics import CreateAPIView -# Create your views here. +from .models import State +from .serializers import StateSerializer + + +class StateCreateView(CreateAPIView): + queryset = State + serializer_class = StateSerializer diff --git a/reviews/Serializers.py b/reviews/Serializers.py new file mode 100644 index 000000000..e69de29bb diff --git a/reviews/urls.py b/reviews/urls.py new file mode 100644 index 000000000..e69de29bb diff --git a/venues/Serializers.py b/venues/Serializers.py new file mode 100644 index 000000000..e69de29bb diff --git a/venues/models.py b/venues/models.py index be5e751af..e0ce9f7af 100644 --- a/venues/models.py +++ b/venues/models.py @@ -3,6 +3,12 @@ from locations.models import City # Create your models here. + +class Facility(models.Model): + name = models.CharField(max_length=225) + + def __str__(self): + return self.name class Venue(models.Model): owner = models.ForeignKey(User,on_delete=models.CASCADE) city = models.ForeignKey(City, on_delete=models.CASCADE) @@ -11,7 +17,7 @@ class Venue(models.Model): description = models.TextField() capacity = models.IntegerField() price_per_hour = models.DecimalField(max_digits=10, decimal_places=2) - facilities = models.ManyToManyField('Facility') + facilities = models.ManyToManyField(Facility) def __str__(self): return self.name @@ -25,8 +31,3 @@ def __str__(self): -class Facility(models.Model): - name = models.CharField(max_length=225) - - def __str__(self): - return self.name \ No newline at end of file diff --git a/venues/urls.py b/venues/urls.py new file mode 100644 index 000000000..e69de29bb From 50808d026b68e4f867b1374378e064ead5e70aa2 Mon Sep 17 00:00:00 2001 From: shijas Date: Tue, 16 Jun 2026 17:37:51 +0530 Subject: [PATCH 4/5] add service, facility, and price models for venue management --- venues/models.py | 55 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/venues/models.py b/venues/models.py index e0ce9f7af..0ffb956d8 100644 --- a/venues/models.py +++ b/venues/models.py @@ -3,31 +3,56 @@ from locations.models import City # Create your models here. - -class Facility(models.Model): +class Venue(models.Model): + owner = models.ForeignKey(User, on_delete=models.CASCADE) + City = models.ForeignKey(City,on_delete=models.CASCADE) name = models.CharField(max_length=225) + address = models.TextField() + # price = models.DecimalField(max_digits=10, decimal_places=2) def __str__(self): return self.name -class Venue(models.Model): - owner = models.ForeignKey(User,on_delete=models.CASCADE) - city = models.ForeignKey(City, on_delete=models.CASCADE) - name = models.CharField(max_length=100) - address = models.TextField() - description = models.TextField() + + +class Image(models.Model): + venue = models.ForeignKey(Venue, on_delete=models.CASCADE, related_name='images') + venue_image = models.ImageField(upload_to='media/') + + +class Service(models.Model): + venue = models.ForeignKey(Venue, on_delete=models.CASCADE, related_name='services') + name = models.CharField(max_length=225) capacity = models.IntegerField() - price_per_hour = models.DecimalField(max_digits=10, decimal_places=2) - facilities = models.ManyToManyField(Facility) + choice = models.BooleanField() + amount = models.DecimalField(max_digits=10, decimal_places=2,null=True,blank=True) + def __str__(self): return self.name - -class VenueImage(models.Model): - venue = models.ForeignKey(Venue, on_delete=models.CASCADE) - image = models.ImageField(upload_to='venues/') +class Facility(models.Model): + venue = models.ForeignKey(Venue, on_delete=models.CASCADE, related_name='facilities') + name = models.CharField(max_length=225) + choice = models.BooleanField() + amount = models.DecimalField(max_digits=10, decimal_places=2,null=True,blank=True) + + + def __str__(self): + return self.name + +class Price(models.Model): + venue = models.ForeignKey(Venue,on_delete=models.CASCADE,related_name='prices') + price_verision = models.CharField(max_length=225) + amount = models.DecimalField(max_digits=10, decimal_places=5) + choice = models.BooleanField() + + def __str__(self): - return self.venue.name + return f"{self.price_verision}-{self.venue.name} - ₹{self.amount}" + + + + \ No newline at end of file From 0e4cd5cb91ffd2bcf13a2c7dfae2ab0f6a0daeea Mon Sep 17 00:00:00 2001 From: shijas Date: Tue, 23 Jun 2026 20:44:01 +0530 Subject: [PATCH 5/5] working on account venue --- account/management/commands/create_admin.py | 31 ++++++++ .../0003_user_address_user_phone_no.py | 25 +++++++ account/models.py | 6 +- account/permissions.py | 9 +++ account/views.py | 28 +++++++- bkmyvenue_backend/settings.py | 16 +++++ bkmyvenue_backend/urls.py | 4 +- locations/views.py | 1 - venues/Serializers.py | 40 +++++++++++ venues/admin.py | 6 +- .../0003_rename_city_venue_city_and_more.py | 72 +++++++++++++++++++ ...004_facility_choice_alter_facility_name.py | 24 +++++++ venues/migrations/0005_price.py | 24 +++++++ ...rice_amount_remove_price_night_and_more.py | 58 +++++++++++++++ .../0007_venuemedia_delete_image.py | 26 +++++++ .../migrations/0008_alter_venuemedia_venue.py | 19 +++++ venues/models.py | 9 ++- venues/urls.py | 7 ++ venues/views.py | 15 +++- 19 files changed, 407 insertions(+), 13 deletions(-) create mode 100644 account/management/commands/create_admin.py create mode 100644 account/migrations/0003_user_address_user_phone_no.py create mode 100644 account/permissions.py create mode 100644 venues/migrations/0003_rename_city_venue_city_and_more.py create mode 100644 venues/migrations/0004_facility_choice_alter_facility_name.py create mode 100644 venues/migrations/0005_price.py create mode 100644 venues/migrations/0006_rename_holly_day_price_amount_remove_price_night_and_more.py create mode 100644 venues/migrations/0007_venuemedia_delete_image.py create mode 100644 venues/migrations/0008_alter_venuemedia_venue.py diff --git a/account/management/commands/create_admin.py b/account/management/commands/create_admin.py new file mode 100644 index 000000000..a74376d4e --- /dev/null +++ b/account/management/commands/create_admin.py @@ -0,0 +1,31 @@ +from django.core.management.base import BaseCommand +from django.contrib.auth import get_user_model + + +User = get_user_model() + +class Command(BaseCommand): + + def handle(self, *args, **kwargs): + + username = input("Username: ") + email = input("Email: ") + password = input("Password: ") + confirm_password = input("Confirm Password: ") + + if password != confirm_password: + self.stdout.write(self.style.ERROR("Passwords do not match")) + return + + if User.objects.filter(username=username).exists(): + self.stdout.write("User already exists") + return + + User.objects.create_user( + username=username, + email=email, + password=password, + role="ADMIN" + ) + + self.stdout.write("Admin created successfully") \ No newline at end of file diff --git a/account/migrations/0003_user_address_user_phone_no.py b/account/migrations/0003_user_address_user_phone_no.py new file mode 100644 index 000000000..fcf2cdbea --- /dev/null +++ b/account/migrations/0003_user_address_user_phone_no.py @@ -0,0 +1,25 @@ +# Generated by Django 6.0.6 on 2026-06-22 06:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0002_alter_user_role'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='address', + field=models.TextField(default=1), + preserve_default=False, + ), + migrations.AddField( + model_name='user', + name='phone_no', + field=models.CharField(default=1, max_length=13), + preserve_default=False, + ), + ] diff --git a/account/models.py b/account/models.py index 7f1295bf7..3976dc744 100644 --- a/account/models.py +++ b/account/models.py @@ -11,7 +11,11 @@ class Role(models.TextChoices): OWNER = "OWNER" CUSTOMER = "CUSTOMER" - + role = models.CharField(max_length=20,choices=Role.choices,default=Role.CUSTOMER) + address = models.TextField() + phone_no = models.CharField(max_length=13) + + diff --git a/account/permissions.py b/account/permissions.py new file mode 100644 index 000000000..991d734df --- /dev/null +++ b/account/permissions.py @@ -0,0 +1,9 @@ +from rest_framework.permissions import BasePermission + + +class IsAdminRole(BasePermission): + def has_permission(self, request, view): + return ( + request.user.is_authenticated + and request.user.role_type == request.user.Role.ADMIN + ) diff --git a/account/views.py b/account/views.py index 9323321a3..2abf15f7f 100644 --- a/account/views.py +++ b/account/views.py @@ -1,10 +1,36 @@ from rest_framework.generics import CreateAPIView +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status from .models import User -from .Serializers import RegisterSerializer +from .Serializers import RegisterSerializer,LoginUserSerializer class RegisterCreateView(CreateAPIView): serializer_class = RegisterSerializer + queryset = User.objects.all() + + +class LoginUserView(APIView): + + def post(self, request): + log_serializer = LoginUserSerializer(data=request.data) + print(LoginUserSerializer(data=request.data)) + + if log_serializer.is_valid(): + return Response( + { + "access": log_serializer.validated_data["access"], + "refresh": log_serializer.validated_data["refresh"], + "username": log_serializer.validated_data["user"].username, + }, + status=status.HTTP_200_OK, + ) + return Response(log_serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + + + diff --git a/bkmyvenue_backend/settings.py b/bkmyvenue_backend/settings.py index 5fa96c29a..1fadc48c8 100644 --- a/bkmyvenue_backend/settings.py +++ b/bkmyvenue_backend/settings.py @@ -1,4 +1,5 @@ from pathlib import Path +from datetime import timedelta BASE_DIR = Path(__file__).resolve().parent.parent @@ -17,6 +18,7 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'rest_framework_simplejwt', 'rest_framework', 'account', 'locations', @@ -95,3 +97,17 @@ MEDIA_ROOT = BASE_DIR / 'media' AUTH_USER_MODEL = "account.User" + + +SIMPLE_JWT = { + "ACCESS_TOKEN_LIFETIME": timedelta(minutes=60), + "REFRESH_TOKEN_LIFETIME": timedelta(days=1), + + "AUTH_HEADER_TYPES": ("Bearer",), +} + +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework_simplejwt.authentication.JWTAuthentication', + ) +} \ No newline at end of file diff --git a/bkmyvenue_backend/urls.py b/bkmyvenue_backend/urls.py index a3a5bf837..c0f42c046 100644 --- a/bkmyvenue_backend/urls.py +++ b/bkmyvenue_backend/urls.py @@ -22,7 +22,7 @@ path('accounts/', include('account.urls')), path('locations/', include('locations.urls')), path('venues/', include('venues.urls')), - path('bookings/', include('bookings.urls')), - path('reviews/', include('reviews.urls')) + # path('bookings/', include('bookings.urls')), + # path('reviews/', include('reviews.urls')) ] diff --git a/locations/views.py b/locations/views.py index d39cea60c..8af86807d 100644 --- a/locations/views.py +++ b/locations/views.py @@ -1,4 +1,3 @@ -from rest_framework.views import Response from rest_framework.generics import CreateAPIView from .models import State diff --git a/venues/Serializers.py b/venues/Serializers.py index e69de29bb..f8d1f09fe 100644 --- a/venues/Serializers.py +++ b/venues/Serializers.py @@ -0,0 +1,40 @@ +from rest_framework.serializers import ModelSerializer + +from .models import Venue,Service,Facility,Price,VenueMedia + + +class ServiceSerializer(ModelSerializer): + + class Meta: + model = Service + fields = '__all__' + +class FacilitySerializer(ModelSerializer): + + class Meta: + model = Service + fields = '__all__' + +class VenueMediaSerializer(ModelSerializer): + + class Meta: + model = Service + fields = '__all__' + +class PriceSerializer(ModelSerializer): + + class Meta: + model = Service + fields = '__all__' + + +class VenueSerializer(ModelSerializer): + + media = VenueMediaSerializer(many=True, read_only=True) + services = ServiceSerializer(many=True, read_only=True) + facilities = FacilitySerializer(many=True, read_only=True) + prices = PriceSerializer(many=True, read_only=True) + + class Meta: + model = Venue + fields = '__all__' \ No newline at end of file diff --git a/venues/admin.py b/venues/admin.py index 9c425ba99..5d87e14c6 100644 --- a/venues/admin.py +++ b/venues/admin.py @@ -1,8 +1,10 @@ from django.contrib import admin -from .models import Venue, VenueImage,Facility +from .models import Venue,Facility,Service,Price # Register your models here. admin.site.register(Venue) admin.site.register(Facility) -admin.site.register(VenueImage) +admin.site.register(Service) +admin.site.register(Price) + diff --git a/venues/migrations/0003_rename_city_venue_city_and_more.py b/venues/migrations/0003_rename_city_venue_city_and_more.py new file mode 100644 index 000000000..850fe4b59 --- /dev/null +++ b/venues/migrations/0003_rename_city_venue_city_and_more.py @@ -0,0 +1,72 @@ +# Generated by Django 6.0.6 on 2026-06-15 09:08 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('venues', '0002_facility_venue_address_venue_facilities_venueimage'), + ] + + operations = [ + migrations.RenameField( + model_name='venue', + old_name='city', + new_name='City', + ), + migrations.RenameField( + model_name='venue', + old_name='price_per_hour', + new_name='price', + ), + migrations.RemoveField( + model_name='venue', + name='capacity', + ), + migrations.RemoveField( + model_name='venue', + name='description', + ), + migrations.RemoveField( + model_name='venue', + name='facilities', + ), + migrations.AddField( + model_name='facility', + name='venue', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='facilities', to='venues.venue'), + preserve_default=False, + ), + migrations.AlterField( + model_name='facility', + name='name', + field=models.BooleanField(), + ), + migrations.AlterField( + model_name='venue', + name='name', + field=models.CharField(max_length=225), + ), + migrations.CreateModel( + name='Image', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('venue_image', models.ImageField(upload_to='media/')), + ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='venues.venue')), + ], + ), + migrations.CreateModel( + name='Service', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=225)), + ('capacity', models.IntegerField()), + ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='services', to='venues.venue')), + ], + ), + migrations.DeleteModel( + name='VenueImage', + ), + ] diff --git a/venues/migrations/0004_facility_choice_alter_facility_name.py b/venues/migrations/0004_facility_choice_alter_facility_name.py new file mode 100644 index 000000000..cd022bcba --- /dev/null +++ b/venues/migrations/0004_facility_choice_alter_facility_name.py @@ -0,0 +1,24 @@ +# Generated by Django 6.0.6 on 2026-06-15 09:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('venues', '0003_rename_city_venue_city_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='facility', + name='choice', + field=models.BooleanField(default=1), + preserve_default=False, + ), + migrations.AlterField( + model_name='facility', + name='name', + field=models.CharField(max_length=225), + ), + ] diff --git a/venues/migrations/0005_price.py b/venues/migrations/0005_price.py new file mode 100644 index 000000000..d72ea4a68 --- /dev/null +++ b/venues/migrations/0005_price.py @@ -0,0 +1,24 @@ +# Generated by Django 6.0.6 on 2026-06-16 04:04 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('venues', '0004_facility_choice_alter_facility_name'), + ] + + operations = [ + migrations.CreateModel( + name='Price', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('holly_day', models.DecimalField(decimal_places=5, max_digits=10)), + ('seasons_day', models.DecimalField(decimal_places=5, max_digits=10)), + ('night', models.DecimalField(decimal_places=5, max_digits=10)), + ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='prices', to='venues.venue')), + ], + ), + ] diff --git a/venues/migrations/0006_rename_holly_day_price_amount_remove_price_night_and_more.py b/venues/migrations/0006_rename_holly_day_price_amount_remove_price_night_and_more.py new file mode 100644 index 000000000..746633046 --- /dev/null +++ b/venues/migrations/0006_rename_holly_day_price_amount_remove_price_night_and_more.py @@ -0,0 +1,58 @@ +# Generated by Django 6.0.6 on 2026-06-16 06:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('venues', '0005_price'), + ] + + operations = [ + migrations.RenameField( + model_name='price', + old_name='holly_day', + new_name='amount', + ), + migrations.RemoveField( + model_name='price', + name='night', + ), + migrations.RemoveField( + model_name='price', + name='seasons_day', + ), + migrations.RemoveField( + model_name='venue', + name='price', + ), + migrations.AddField( + model_name='facility', + name='amount', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True), + ), + migrations.AddField( + model_name='price', + name='choice', + field=models.BooleanField(default=1), + preserve_default=False, + ), + migrations.AddField( + model_name='price', + name='price_verision', + field=models.CharField(default=1, max_length=225), + preserve_default=False, + ), + migrations.AddField( + model_name='service', + name='amount', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True), + ), + migrations.AddField( + model_name='service', + name='choice', + field=models.BooleanField(default=1), + preserve_default=False, + ), + ] diff --git a/venues/migrations/0007_venuemedia_delete_image.py b/venues/migrations/0007_venuemedia_delete_image.py new file mode 100644 index 000000000..5ce350faf --- /dev/null +++ b/venues/migrations/0007_venuemedia_delete_image.py @@ -0,0 +1,26 @@ +# Generated by Django 6.0.6 on 2026-06-22 11:19 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('venues', '0006_rename_holly_day_price_amount_remove_price_night_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='VenueMedia', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(upload_to='media/images/')), + ('video', models.FileField(upload_to='media/videos/')), + ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='venues.venue')), + ], + ), + migrations.DeleteModel( + name='Image', + ), + ] diff --git a/venues/migrations/0008_alter_venuemedia_venue.py b/venues/migrations/0008_alter_venuemedia_venue.py new file mode 100644 index 000000000..a50159f32 --- /dev/null +++ b/venues/migrations/0008_alter_venuemedia_venue.py @@ -0,0 +1,19 @@ +# Generated by Django 6.0.6 on 2026-06-22 11:22 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('venues', '0007_venuemedia_delete_image'), + ] + + operations = [ + migrations.AlterField( + model_name='venuemedia', + name='venue', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='media', to='venues.venue'), + ), + ] diff --git a/venues/models.py b/venues/models.py index 0ffb956d8..d253afe01 100644 --- a/venues/models.py +++ b/venues/models.py @@ -8,15 +8,14 @@ class Venue(models.Model): City = models.ForeignKey(City,on_delete=models.CASCADE) name = models.CharField(max_length=225) address = models.TextField() - # price = models.DecimalField(max_digits=10, decimal_places=2) def __str__(self): return self.name - -class Image(models.Model): - venue = models.ForeignKey(Venue, on_delete=models.CASCADE, related_name='images') - venue_image = models.ImageField(upload_to='media/') +class VenueMedia(models.Model): + venue = models.ForeignKey(Venue, on_delete=models.CASCADE, related_name='media') + image = models.ImageField(upload_to="media/images/") + video = models.FileField(upload_to="media/videos/") class Service(models.Model): diff --git a/venues/urls.py b/venues/urls.py index e69de29bb..0f8eb284f 100644 --- a/venues/urls.py +++ b/venues/urls.py @@ -0,0 +1,7 @@ +from django.urls import path + +from .views import VenueListCreateView + +urlpatterns = [ + path('venue/', VenueListCreateView.as_view()), +] \ No newline at end of file diff --git a/venues/views.py b/venues/views.py index 91ea44a21..9929b5df0 100644 --- a/venues/views.py +++ b/venues/views.py @@ -1,3 +1,16 @@ -from django.shortcuts import render +from rest_framework.response import Response +from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView + +from .Serializers import VenueSerializer +from .models import Venue + # Create your views here. + +class VenueListCreateView(ListCreateAPIView): + queryset = Venue.objects.all() + serializer_class = VenueSerializer + +class VenueDetailView(RetrieveUpdateDestroyAPIView): + queryset = Venue.objects.all() + serializer_class = VenueSerializer \ No newline at end of file